class Bosh::Deployer::RemoteTunnel

Attributes

logger[R]
ssh_server[R]
wait[R]

Public Class Methods

new(ssh_server, wait, logger) click to toggle source
# File lib/bosh/deployer/remote_tunnel.rb, line 5
def initialize(ssh_server, wait, logger)
  @ssh_server = ssh_server
  @wait = wait
  @logger = logger
end

Public Instance Methods

create(ip, port) click to toggle source
# File lib/bosh/deployer/remote_tunnel.rb, line 11
def create(ip, port)
  return if sessions[port]

  loop until ssh_server.readable?(ip)

  # sshd is up, sleep while host keys are generated
  Kernel.sleep(wait)

  loop do
    session = ssh_server.start_session(ip)

    if session
      sessions[port] = session
      break
    end
  end

  sessions[port].forward.remote(port, '127.0.0.1', port)
  logger.info("SSH forwarding for port #{port} started: OK")

  monitor_session(port)
  cleanup_at_exit
end

Private Instance Methods

cleanup_at_exit() click to toggle source
# File lib/bosh/deployer/remote_tunnel.rb, line 55
def cleanup_at_exit
  Kernel.at_exit do
    status = $!.is_a?(::SystemExit) ? $!.status : nil
    close_ssh_sessions
    exit status if status
  end
end
close_ssh_sessions() click to toggle source
# File lib/bosh/deployer/remote_tunnel.rb, line 63
def close_ssh_sessions
  sessions.each_value { |s| s.close }
end
monitor_session(port) click to toggle source
# File lib/bosh/deployer/remote_tunnel.rb, line 39
def monitor_session(port)
  Thread.new do
    while sessions[port]
      begin
        sessions[port].loop { true }
      rescue IOError => e
        logger.debug(
          "SSH session #{sessions[port].inspect} " +
            "forwarding for port #{port} terminated: #{e.inspect}"
        )
        sessions.delete(port)
      end
    end
  end
end
sessions() click to toggle source
# File lib/bosh/deployer/remote_tunnel.rb, line 67
def sessions
  @sessions ||= {}
end