Class: Kitchen::SSH
- Inherits:
-
Object
- Object
- Kitchen::SSH
- Defined in:
- lib/kitchen/ssh.rb
Overview
Class to help establish SSH connections, issue remote commands, and transfer files between a local system and remote node.
Instance Method Summary collapse
-
#exec(cmd) ⇒ Object
Execute a command on the remote host.
-
#initialize(hostname, username, options = {}) {|self| ... } ⇒ SSH
constructor
Constructs a new SSH object.
-
#login_command ⇒ LoginCommand
Builds a LoginCommand which can be used to open an interactive session on the remote host.
-
#shutdown ⇒ Object
Shuts down the session connection, if it is still active.
-
#upload!(local, remote, options = {}, &progress) ⇒ Object
Uploads a local file to remote host.
-
#upload_path!(local, remote, options = {}, &progress) ⇒ Object
Uploads a recursive directory to remote host.
-
#wait ⇒ Object
Blocks until the remote host's SSH TCP port is listening.
Constructor Details
#initialize(hostname, username, options = {}) {|self| ... } ⇒ SSH
Constructs a new SSH object.
63 64 65 66 67 68 69 70 71 72 73 |
# File 'lib/kitchen/ssh.rb', line 63 def initialize(hostname, username, = {}) @hostname = hostname @username = username @options = .dup @logger = @options.delete(:logger) || ::Logger.new(STDOUT) if block_given? yield self shutdown end end |
Instance Method Details
#exec(cmd) ⇒ Object
Execute a command on the remote host.
79 80 81 82 83 84 85 86 |
# File 'lib/kitchen/ssh.rb', line 79 def exec(cmd) logger.debug("[SSH] #{self} (#{cmd})") exit_code = exec_with_exit(cmd) if exit_code != 0 raise SSHFailed, "SSH exited (#{exit_code}) for command: [#{cmd}]" end end |
#login_command ⇒ LoginCommand
Builds a LoginCommand which can be used to open an interactive session on the remote host.
140 141 142 143 144 145 146 147 148 149 150 151 152 153 |
# File 'lib/kitchen/ssh.rb', line 140 def login_command args = %W[ -o UserKnownHostsFile=/dev/null ] args += %W[ -o StrictHostKeyChecking=no ] args += %W[ -o IdentitiesOnly=yes ] if [:keys] args += %W[ -o LogLevel=#{logger.debug? ? "VERBOSE" : "ERROR"} ] if .key?(:forward_agent) args += %W[ -o ForwardAgent=#{[:forward_agent] ? "yes" : "no"} ] end Array([:keys]).each { |ssh_key| args += %W[ -i #{ssh_key} ] } args += %W[ -p #{port} ] args += %W[ #{username}@#{hostname} ] LoginCommand.new(["ssh", *args]) end |
#shutdown ⇒ Object
Shuts down the session connection, if it is still active.
122 123 124 125 126 127 128 129 |
# File 'lib/kitchen/ssh.rb', line 122 def shutdown return if @session.nil? logger.debug("[SSH] closing connection to #{self}") session.shutdown! ensure @session = nil end |
#upload!(local, remote, options = {}, &progress) ⇒ Object
Uploads a local file to remote host.
95 96 97 98 99 100 101 102 103 104 105 |
# File 'lib/kitchen/ssh.rb', line 95 def upload!(local, remote, = {}, &progress) if progress.nil? progress = lambda { |_ch, name, sent, total| if sent == total logger.debug("Uploaded #{name} (#{total} bytes)") end } end session.scp.upload!(local, remote, , &progress) end |
#upload_path!(local, remote, options = {}, &progress) ⇒ Object
Uploads a recursive directory to remote host.
115 116 117 118 119 |
# File 'lib/kitchen/ssh.rb', line 115 def upload_path!(local, remote, = {}, &progress) = { :recursive => true }.merge() upload!(local, remote, , &progress) end |
#wait ⇒ Object
Blocks until the remote host's SSH TCP port is listening.
132 133 134 |
# File 'lib/kitchen/ssh.rb', line 132 def wait logger.info("Waiting for #{hostname}:#{port}...") until test_ssh end |