ruby-qa/lib/host.rb

93 lines
2.2 KiB
Ruby
Raw Normal View History

2024-06-10 02:16:20 +00:00
module RubyQA
require 'net/ssh'
class Host
DEFAULT_HOSTDATA={
:hostname => "",
:ip => "",
:port => 22,
2024-06-29 01:13:45 +00:00
:user => ENV["USER"],
2024-06-10 02:16:20 +00:00
:password => "",
:site => "",
:cluster => false,
:sudo_password => "",
}
attr_accessor *DEFAULT_HOSTDATA.keys
attr_reader :client, :data, :resources
def initialize( data = {} )
@resources = Hash.new
@data = DEFAULT_HOSTDATA.merge data
## Verifying the (Needed) variables are set to valid values (and/or can be resolved to valid values)
verify_data
## initialize client for usage tests
init_client
end
def init_client
2024-06-29 01:13:45 +00:00
begin
if @data[:password]
@client = Net::SSH.start(@data[:ip], @data[:user], password: @data[:password])
else
@client = Net::SSH.start(@data[:ip], @data[:user])
end
rescue SocketError
raise "Failed to make ssh client for #{@data[:hostname]}"
end
2024-06-10 02:16:20 +00:00
end
def exec (command)
@client.exec!(command)
end
def [](key)
@data[key]
end
def name
if @data[:hostname] != ""
return @data[:hostname]
elsif @resources['facts'].data['networking']['hostname'] != ""
return @resources['facts'].data['networking']['hostname']
else
return @data[:ip]
end
end
def add_resource (object)
## If the requirements are met by the host, add the resource
if object::REQUIREMENTS.all?{|key,val| @data[key] == val}
resource = object.new(self)
@resources[resource.name]=resource
end
end
def update_resources
@resources.each_value(&:gather)
end
def verify_data
if @data[:ip].empty?
if not @data[:hostname].empty?
begin
@data[:ip] = Resolv.getaddress(@data[:hostname])
rescue Resolv::ResolvError => error
raise "Host: Hostname provided, but did not resolve to IP"
end
else
raise "Host: No hostname or IP provided"
end
end
if @data[:user].empty?
raise ArgumentError, "Host: User not provided"
end
end
end
end