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