Hi Jamis,
I have another feature request for you. I have a deployment where I
have a series of tasks that get executed on various machines, but I
need to login to those machines with public key auth with different
user ids. In this particular scenario, using sudo does not really work
as needed. What I want to do is something like:
run "some_command", :as => 'root'
which temporarily changes the 'user' variable for the duration of the
execution of the task.
I accomplish this by aliasing the run method as follows:
module CapistranoExt
class Configuration
module Actions
module Invocation
def self.append_features(base)
super
base.extend(ClassMethods)
base.class_eval do
alias_method_chain :run, :user
end
end
module ClassMethods
end
# TODO: this really only works if the authentication method is
# publickey, since the password is cached from a call to the
# proc to read it. Need to have a mechanism to cache that per
# user, and set it appropriately in here (if we need to
support
# this mechanism with password-based auth).
def run_with_user(cmd, options={}, &block)
u = fetch(:user)
as = options.delete(:as) || u
begin
set :user, as
run_without_user(cmd, options, &block)
ensure
set :user, u
end
end
end
end
end
end
This also requires a change to the following method in connections.rb
(from Cap 2.0.100):
def safely_establish_connection_to(server, failures=nil)
if fetch(:ssh_options)[:no_session_cache]
sessions[server].close if sessions[server]
sessions[server] = connection_factory.connect_to(server)
else
sessions[server] ||= connection_factory.connect_to(server)
end
rescue Exception => err
raise unless failures
failures << { :server => server, :error => err }
end
Then I set ssh_options[:no_session_cache] to true in my cap deployment
file, and everything works fine.
Per my comments in the code, there is a problem in that this only
works for non-password auth for now, since the password is obtained in
a Proc and I did not add code to cache it per user. This could
probably be done with a few more additions.
It's probably a little inefficient. I looked to see if there was a way
to drop the session only if the username had changed, but I don't
think net/ssh exposes that field.
Anyway, if you think you'd be willing to add something like this, I
could probably clean it up and just give you a patch.
Thanks,
Joe
--~--~---------~--~----~------------~-------~--~----~
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at http://groups.google.com/group/capistrano
-~----------~----~----~----~------~----~------~--~---