class Worker

Public Class Methods

new(hostname: nil, username: nil, password: nil, pkey_password: nil, sudo_password: nil, command: nil, block: nil, header_max_length: nil, debug: nil) click to toggle source
# File lib/worker.rb, line 2
def initialize(hostname: nil, username: nil, password: nil, pkey_password: nil, sudo_password: nil, command: nil, block: nil, header_max_length: nil, debug: nil)
  @hostname       = hostname
  @username       = username
  @password       = password
  @pkey_password  = pkey_password
  @sudo_password  = sudo_password
  @command        = command
  @block          = block

  @header_begin   = hostname
  @header_padding = header_max_length ? " " * (header_max_length - hostname.length) : ""
  @header_end     = " -- "
  @util           = Util.new(debug)
end

Public Instance Methods

go() click to toggle source
# File lib/worker.rb, line 18
def go
  @util.show_summary(self)

  result = ''
  @header = @header_begin + @header_padding + @header_end

  begin
    Net::SSH.start(@hostname, @username, :password => @password, :passphrase => @pkey_password, :non_interactive => true) do |ssh|
      channel = ssh.open_channel do |channel, success|

        # request a pseudo TTY formatted to screen width
        cols = %x{tput cols}.chomp.to_i - @header.length
        channel.request_pty(opts={:term=>'xterm',:chars_wide => cols})

        @util.dbg("sending command: #{@command}")
        channel.exec(@command)

        channel.on_data do |channel, data|

          attempts = 0

          if attempts >= 2
            raise 'failed to connect -- too many attempts'
          end

          if data =~ /Sorry, try again/
            raise 'failed to connect -- incorrect sudo password'
          end

          if data =~ /#{@username}@#{@hostname}'s password:/
            raise 'failed to connect -- password failed'
          end

          if data =~ /^\[sudo\] password for / and attempts == 0
            if @sudo_password
              channel.send_data "#{@sudo_password}\n"
            elsif @password
              channel.send_data "#{@password}\n"
            else
              raise 'failed to connect -- no sudo_password or password defined'
            end
            attempts += 1
            @util.dbg("attempts: #{attempts}")
          elsif data =~ /^\[sudo\] password for / and attempts == 1
            channel.send_data "#{@password}\n"
            attempts += 1
            @util.dbg("attempts: #{attempts}")
          end

          unless @block
            @util.display_data(@header, data)
          else
            result += data.to_s
          end

        end

      end

      channel.wait

      if @block
        @util.display_data(@header, result)
        puts "\n"
      end

    end#start

  rescue SocketError => e
    @util.display_error(e)
    puts "Failed to connect to #{@hostname}\n".red

  rescue RuntimeError => e
    @util.display_error(e)
    puts "#{@hostname} -- incorrect password, failed to connect".red

  rescue => e
    @util.display_error(e)

  end

end
to_s() click to toggle source
# File lib/worker.rb, line 102
def to_s
  "Worker: {hostname:'#{@hostname}',username:'#{@username}',password:'#{@password}',command:'#{@command}',block:'#{@block}'"
end