module Gusteau::SSH

Public Instance Methods

conn() click to toggle source
# File lib/gusteau/ssh.rb, line 9
def conn
  @conn ||= begin
    opts = { :port => port }
    opts.update(:password => password) if @password
    log "#setting up ssh connection #{@user}@#{host}, #{opts.inspect})" do
      Net::SSH.start(host, @user, opts)
    end
  end
end
send_command(cmd) click to toggle source
# File lib/gusteau/ssh.rb, line 19
def send_command(cmd)
  exit_code = -1
  conn.open_channel do |ch|
    ch.exec(prepared_cmd cmd) do |_, success|
      if success
        ch.on_data { |_,data| puts data }
        ch.on_extended_data { |_,_,data| $stderr.puts data }
        ch.on_request("exit-status") { |_,data| exit_code = data.read_long }
      else
        raise "FAILED to execute command: #{cmd.inspect}"
      end
    end
  end
  conn.loop
  exit_code == 0
end
send_files(files, dest_dir, strip_c = nil) click to toggle source
# File lib/gusteau/ssh.rb, line 36
def send_files(files, dest_dir, strip_c = nil)
  strip_arg = strip_c ? "--strip-components=#{strip_c}" : ''

  conn.open_channel { |ch|
    ch.exec(prepared_cmd "tar zxf - -C #{dest_dir} #{strip_arg}")
    ch.send_data(compressed_tar_stream(files))
    ch.eof!
  }.wait
end

Private Instance Methods

prepared_cmd(cmd) click to toggle source
# File lib/gusteau/ssh.rb, line 48
def prepared_cmd(cmd)
  user == 'root' ? cmd : "sudo -- sh -c '#{cmd}'"
end