diff --git a/lib/host.rb b/lib/host.rb index 8d22e6f..f98aecd 100644 --- a/lib/host.rb +++ b/lib/host.rb @@ -10,6 +10,7 @@ module RubyQA :site => "", :cluster => false, :sudo_password => "", + :runner => SSH_Runner } attr_accessor *DEFAULT_HOSTDATA.keys @@ -20,28 +21,16 @@ module RubyQA @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 - 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 + @client = @data[:runner].new(@data) end def exec (command) - @client.exec!(command) + @client.exec(command) + end + + def exec_sudo (command) + @client.exec_sudo(command) end def [](key) @@ -69,24 +58,5 @@ module RubyQA 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 diff --git a/lib/runner.rb b/lib/runner.rb new file mode 100644 index 0000000..73d190b --- /dev/null +++ b/lib/runner.rb @@ -0,0 +1,78 @@ +module RubyQA + class CommandRunner + # Handles creating an interface for running arbitrary commands on a host/target + # + # To basically provide a unified interface to run commands via different methods (ssh, telnet, etc) + # Params: + # - ip + # - hostname (optional) + def initialize (data) + @data = data + verify_data + initialize_runner + 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 + client_validations + end + + def client_validations + # Handles client specific validations (port-connect test, etc) + end + + def exec (command) + run_command(command) + end + + def exec_sudo(command) + if @data[:password].empty? + raise "Password was not provided for host" + end + new_command = <$command_file </dev/null +rm $command_file +else +#{command} +fi +EOT + run_command(new_command) + end + end + + + class SSH_Runner < CommandRunner + def initialize_runner + 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 + end + + def run_command(command) + @client.exec!(command).strip + end + end + +end