1
0
Fork 0
mirror of https://github.com/capistrano/capistrano synced 2023-03-27 23:21:18 -04:00

Allow password to be reentered on sudo if it was entered incorrectly

git-svn-id: http://svn.rubyonrails.org/rails/tools/switchtower@3371 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
This commit is contained in:
Jamis Buck 2006-01-02 03:21:40 +00:00
parent 77e1d1e6ae
commit 829fb7d8ed
4 changed files with 36 additions and 5 deletions

View file

@ -1,5 +1,7 @@
*SVN* *SVN*
* Allow password to be reentered on sudo if it was entered incorrectly
* Use && as the command separator for the checkouts, so that errors are caught early. * Use && as the command separator for the checkouts, so that errors are caught early.
* Ping each SSH connection every 1s during command processing so that long-running commands don't cause the connection to timeout. * Ping each SSH connection every 1s during command processing so that long-running commands don't cause the connection to timeout.
@ -18,7 +20,7 @@
* Added ssh_options variable to configure the SSH connection parameters #2734 [jerrett@bravenet.com] * Added ssh_options variable to configure the SSH connection parameters #2734 [jerrett@bravenet.com]
* Require Net::SSH 1.0.3 * Require Net::SSH 1.0.5
*0.9.0* (October 18th, 2005) *0.9.0* (October 18th, 2005)

View file

@ -167,7 +167,7 @@ module SwitchTower
cmd = "cat > #{path}" cmd = "cat > #{path}"
cmd << " && chmod #{options[:mode].to_s(8)} #{path}" if options[:mode] cmd << " && chmod #{options[:mode].to_s(8)} #{path}" if options[:mode]
run(cmd, options.merge(:data => data + "\n\4")) do |ch, stream, out| run(cmd, options.merge(:data => data + "\n\4")) do |ch, stream, out|
logger.important out, "#{stream} :: #{ch[:host]}" if out == :err logger.important out, "#{stream} :: #{ch[:host]}" if stream == :err
end end
end end
end end
@ -180,9 +180,23 @@ module SwitchTower
logger.debug(out, "#{stream} :: #{ch[:host]}") logger.debug(out, "#{stream} :: #{ch[:host]}")
end end
# in order to prevent _each host_ from prompting when the password was
# wrong, let's track which host prompted first and only allow subsequent
# prompts from that host.
prompt_host = nil
run "sudo #{command}", options do |ch, stream, out| run "sudo #{command}", options do |ch, stream, out|
if out =~ /^Password:/ if out =~ /^Password:/
ch.send_data "#{password}\n" ch.send_data "#{password}\n"
elsif out =~ /try again/
if prompt_host.nil? || prompt_host == ch[:host]
prompt_host = ch[:host]
logger.important out, "#{stream} :: #{ch[:host]}"
# reset the password to it's original value and prepare for another
# pass (the reset allows the password prompt to be attempted again
# if the password variable was originally a proc (the default)
set :password, self[:original_value][:password] || self[:password]
end
else else
block.call(ch, stream, out) block.call(ch, stream, out)
end end

View file

@ -38,6 +38,9 @@ module SwitchTower
@variables = {} @variables = {}
@now = Time.now.utc @now = Time.now.utc
# for preserving the original value of Proc-valued variables
set :original_value, Hash.new
set :application, nil set :application, nil
set :repository, nil set :repository, nil
set :gateway, nil set :gateway, nil
@ -63,10 +66,14 @@ module SwitchTower
alias :[]= :set alias :[]= :set
# Access a named variable. If the value of the variable is a Proc instance, # Access a named variable. If the value of the variable responds_to? :call,
# the proc will be invoked and the return value cached and returned. # #call will be invoked (without parameters) and the return value cached
# and returned.
def [](variable) def [](variable)
set variable, @variables[variable].call if Proc === @variables[variable] if @variables[variable].respond_to?(:call)
self[:original_value][variable] = @variables[variable]
set variable, @variables[variable].call
end
@variables[variable] @variables[variable]
end end

View file

@ -207,4 +207,12 @@ class ConfigurationTest < Test::Unit::TestCase
@config.set :scm, :subversion @config.set :scm, :subversion
assert_equal "SwitchTower::SCM::Subversion", @config.source.class.name assert_equal "SwitchTower::SCM::Subversion", @config.source.class.name
end end
def test_get_proc_variable_sets_original_value_hash
@config.set :proc, Proc.new { "foo" }
assert_nil @config[:original_value][:proc]
assert_equal "foo", @config[:proc]
assert_not_nil @config[:original_value][:proc]
assert @config[:original_value][:proc].respond_to?(:call)
end
end end