Method: Capistrano::SSH.connection_strategy
- Defined in:
- lib/capistrano/ssh.rb
.connection_strategy(server, options = {}, &block) ⇒ Object
Abstracts the logic for establishing an SSH connection (which includes testing for connection failures and retrying with a password, and so forth, mostly made complicated because of the fact that some of these variables might be lazily evaluated and try to do something like prompt the user, which should only happen when absolutely necessary.
This will yield the hostname, username, and a hash of connection options to the given block, which should return a new connection.
48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
# File 'lib/capistrano/ssh.rb', line 48 def self.connection_strategy(server, ={}, &block) methods = [ %w(publickey hostbased), %w(password keyboard-interactive) ] password_value = nil # construct the hash of ssh options that should be passed more-or-less # directly to Net::SSH. This will be the general ssh options, merged with # the server-specific ssh-options. = ([:ssh_options] || {}).merge(server.[:ssh_options] || {}) # load any SSH configuration files that were specified in the SSH options. This # will load from ~/.ssh/config and /etc/ssh_config by default (see Net::SSH # for details). Merge the explicitly given ssh_options over the top of the info # from the config file. = Net::SSH.configuration_for(server.host, .fetch(:config, true)).merge() # Once we've loaded the config, we don't need Net::SSH to do it again. [:config] = false [:verbose] = :debug if [:verbose] && [:verbose] > 0 user = server.user || [:user] || [:username] || [:user] || ServerDefinition.default_user port = server.port || [:port] || [:port] # the .ssh/config file might have changed the host-name on us host = .fetch(:host_name, server.host) [:port] = port if port # delete these, since we've determined which username to use by this point .delete(:username) .delete(:user) begin = .merge( :password => password_value, :auth_methods => [:auth_methods] || methods.shift ) yield host, user, rescue Net::SSH::AuthenticationFailed raise if methods.empty? || [:auth_methods] password_value = [:password] retry end end |