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:
		
							parent
							
								
									77e1d1e6ae
								
							
						
					
					
						commit
						829fb7d8ed
					
				
					 4 changed files with 36 additions and 5 deletions
				
			
		| 
						 | 
					@ -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)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue