class Spectre::SSH::SSHConnection

Public Class Methods

new(host, username, opts, logger) click to toggle source
# File lib/spectre/ssh.rb, line 11
def initialize host, username, opts, logger
  opts[:non_interactive] = true

  @__logger = logger
  @__host = host
  @__username = username
  @__opts = opts
  @__session = nil
  @__exit_code = nil
  @__output = ''
end

Public Instance Methods

can_connect?() click to toggle source
# File lib/spectre/ssh.rb, line 43
def can_connect?
  @__output = nil

  begin
    connect!
    @__session.open_channel.close
    @__output = "successfully connected to #{@__host} with user #{@__username}"
    @__exit_code = 0
    return true
  rescue Exception => e
    @__logger.error e.message
    @__output = "unable to connect to #{@__host} with user #{@__username}"
    @__exit_code = 1
  end

  return false
end
close() click to toggle source
# File lib/spectre/ssh.rb, line 38
def close
  return unless @__session and not @__session.closed?
  @__session.close
end
connect!() click to toggle source
# File lib/spectre/ssh.rb, line 33
def connect!
  return unless @__session == nil or @__session.closed?
  @__session = Net::SSH.start(@__host, @__username, @__opts)
end
exec(command) click to toggle source
# File lib/spectre/ssh.rb, line 61
def exec command
  connect!

  log_str = "#{@__session.options[:user]}@#{@__session.host} -p #{@__session.options[:port]} #{command}"

  @channel = @__session.open_channel do |channel|
    channel.exec(command) do |ch, success|
      abort "could not execute #{command} on #{@__session.host}" unless success

      @__output = ''

      channel.on_data do |ch, data|
        @__output += data
      end

      channel.on_extended_data do |ch,type,data|
        @__output += data
      end

      channel.on_request('exit-status') do |ch, data|
        @__exit_code = data.read_long
      end

      # channel.on_request('exit-signal') do |ch, data|
      #   exit_code = data.read_long
      # end
    end

  end

  @channel.wait
  @__session.loop

  log_str += "\n" + @__output
  @__logger.info log_str
end
exit_code() click to toggle source
# File lib/spectre/ssh.rb, line 102
def exit_code
  @__exit_code
end
file_exists(path) click to toggle source
# File lib/spectre/ssh.rb, line 23
def file_exists path
  exec "ls #{path}"
  exit_code == 0
end
output() click to toggle source
# File lib/spectre/ssh.rb, line 98
def output
  @__output
end
owner_of(path) click to toggle source
# File lib/spectre/ssh.rb, line 28
def owner_of path
  exec "stat -c %U #{path}"
  output.chomp
end