class Dockerploy::SSHClient

Wrapper for shell command over ssh

Attributes

host[RW]
password[RW]
port[RW]
username[RW]

Public Class Methods

new(host, username, password, port = 22) click to toggle source
# File lib/dockerploy/ssh_client.rb, line 8
def initialize(host, username, password, port = 22)
  @host = host
  @username = username
  @password = password
  @port = port
end

Public Instance Methods

command(command) click to toggle source
# File lib/dockerploy/ssh_client.rb, line 15
def command(command)
  exit_code = nil
  Dockerploy.logger.info sprintf('From server: %s Running: %s', @host, command)
  with_ssh(command) do |c, ssh|
    Dockerploy.logger.info 'Output: '
    ssh.open_channel do |channel|
      channel.exec(c) do |_, success|
        abort "FAILED: couldn't execute command (ssh.channel.exec)" unless success

        channel.on_data do |_, data|
          print data
        end

        channel.on_extended_data do |_, _, data|
          print data
        end

        channel.on_request('exit-status') do |_, data|
          exit_code = data.read_long
        end
      end
      ssh.loop
    end
  end

  result = exit_code == 0
  Dockerploy.logger.info sprintf('Exit Code: %d', exit_code) unless result
  result
end

Private Instance Methods

with_ssh(command, &block) click to toggle source
# File lib/dockerploy/ssh_client.rb, line 47
def with_ssh(command, &block)
  Net::SSH.start(@host, @username, password: @password, port: @port) do |ssh|
    block.call(command, ssh)
  end
end