class Net::SSH::Gateway

Public Class Methods

run(gname,guser,name,user,command,gopts={},opts={}) click to toggle source
# File lib/mobilize-ssh/extensions/net-ssh-gateway.rb, line 2
def self.run(gname,guser,name,user,command,gopts={},opts={})
  gate = self
  gateway = gate.new(gname,guser,gopts)
  response = nil
  gateway.ssh(name,user,opts) do |ssh|
    #from http://stackoverflow.com/questions/3386233/how-to-get-exit-status-with-rubys-netssh-library
    stdout_data = ""
    stderr_data = ""
    exit_code = nil
    exit_signal = nil
    ssh.open_channel do |channel|
      channel.exec(command) do |chan, success|
        unless success
          abort "FAILED: couldn't execute command (ssh.channel.exec)"
        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

        channel.on_request("exit-signal") do |ch, data|
          exit_signal = data.read_long
        end
      end
    end
    ssh.loop
    response = {'stdout'=>stdout_data, 'stderr'=>stderr_data, 'exit_code'=>exit_code, 'exit_signal'=>exit_signal}
  end
  response
end
sync(gname,guser,name,user,from_path,to_path,gopts={},opts={}) click to toggle source
# File lib/mobilize-ssh/extensions/net-ssh-gateway.rb, line 39
def self.sync(gname,guser,name,user,from_path,to_path,gopts={},opts={})
  gateway = self.new(gname,guser,gopts)
  gateway.scp(name,user,opts) do |scp|
    scp.upload!(from_path,to_path,:recursive=>true)
  end
  return true
end

Public Instance Methods

scp(name, user, opts={}, &block) click to toggle source

allow scp through gateway

# File lib/mobilize-ssh/extensions/net-ssh-gateway.rb, line 47
def scp(name, user, opts={}, &block)
  local_port = open(name, opts[:port] || 22)
  begin
    Net::SCP.start("127.0.0.1", user, opts.merge(:port => local_port), &block)
  ensure
    close(local_port) if block || $!
  end
end