class KuberKit::Shell::SshSession

Constants

SshSessionError

Attributes

host[R]
port[R]
session[R]
user[R]

Public Class Methods

new(host:, user:, port:) click to toggle source
# File lib/kuber_kit/shell/ssh_session.rb, line 8
def initialize(host:, user:, port:)
  @host = host
  @user = user
  @port = port
  @session = Net::SSH.start(host, user, {port: port})
end

Public Instance Methods

connected?() click to toggle source
# File lib/kuber_kit/shell/ssh_session.rb, line 15
def connected?
  !!@session
end
disconnect() click to toggle source
# File lib/kuber_kit/shell/ssh_session.rb, line 19
def disconnect
  return unless connected?
  @session.close
  @session = nil
end
exec!(command) click to toggle source
# File lib/kuber_kit/shell/ssh_session.rb, line 25
def exec!(command)
  stdout_data = ''
  stderr_data = ''
  exit_code = nil
  channel = session.open_channel do |ch|
    ch.exec(command) do |ch, success|
      if !success
        raise SshSessionError, "Shell command failed: #{command}\r\n#{stdout_data}\r\n#{stderr_data}"
      end

      channel.on_data do |ch,data|
        stdout_data += data
      end

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

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

  channel.wait
  session.loop

  stdout_data = stdout_data.chomp.strip

  if exit_code != 0
    raise SshSessionError, "Shell command failed: #{command}\r\n#{stdout_data}\r\n#{stderr_data}"
  end

  stdout_data
rescue Net::SSH::Exception => e
  raise SshSessionError, "Shell command failed: #{command}\r\n#{e.message}"
end