Hi Jamis,

Sorry to re-open this thread, but it turns out that I was thinking
about it wrong earlier (and just wanted to make it clear if someone
stumbles upon this thread later).

I switched my default deploy task to look like this:

  task :default do
    update
    switch_to_sudoer
    puts "Sudo-ing user is now: #{user}"                # reports that
'edwardog' is the current user
    run "logger `whoami` is trying to restart mongrels" # reports that
'mongrel' is the current user.
    restart                                             # attempts to
run as 'mongrel'
  end

and I realize now that what might be happening is that the connection
is persisting after the update task.

How do I call to have the connection closed and re-established as the
sudoer? Should I just be doing something more like

  task :switch_to_sudoer do
    # Set regular_user and sudoer if they haven't been set already
    if regular_user.nil? && sudoer.nil?
      set(:regular_user, user)
      set(:sudoer, Capistrano::CLI.ui.ask("Please enter the name of a
user you can sudo with: "))
    end

    set(:user, sudoer)
    run "su #{sudoer} -"
  end

  task :switch_to_regular_user do
    if regular_user
      set(:user, regular_user)
      run "exit"
    end
  end

and hoping that the password input for the `su` command is magically
caught and read by Capistrano/Highline?

Sorry about the extra bother,
Edward

On May 1, 9:05 am, "[EMAIL PROTECTED]" <[EMAIL PROTECTED]> wrote:
> Ah, ok, yeah, that makes a little more sense. Cool.
>
> Thanks again Jamis.
>
> On Apr 30, 6:38 pm, Jamis Buck <[EMAIL PROTECTED]> wrote:
>
> > In that case, you can lose the proc--all the proc does is defer the
> > actual prompt until it is actually needed, but in this case, you
> > _know_ you're going to need it, so you might as well prompt earlier
> > than later:
>
> >    task :switch_to_sudoer do
> >       set :user, Capistrano::CLI.ui.ask("...")
> >    end
>
> > - Jamis
>
> > On Apr 30, 2008, at 4:18 PM, [EMAIL PROTECTED] wrote:
>
> > > Yep. That’s what I ended up doing:
>
> > >  task :switch_to_sudoer do
> > >    set :user, Proc.new { Capistrano::CLI.ui.ask("Please enter the
> > > name of a user you can sudo with: ") }
> > >  end
>
> > > and calling it before any monit-related task.
>
> > > (I tried putting all my monit-stuff under a :monit namespace, and
> > > having a "before :monit, :switch_to_sudoer", but it didn’t take. Ah,
> > > well. Not a big deal. I'm just happy that it's worked out so far.)
>
> > > My more serious problem turned out to be the silent error which I
> > > ended up attributing to monit misconfiguration (or rather, forgetting
> > > to rsync something locally).
>
> > > Thanks for all the help Jamis!
>
> > > On Apr 30, 5:59 pm, Jamis Buck <[EMAIL PROTECTED]> wrote:
> > >> It should be sufficient to set the user like this, outside of any
> > >> task:
>
> > >>    set(:user) do
> > >>      Capistrano::CLI.ui.ask("What user do you want to log in as")
> > >>    end
>
> > >> Or, if you always know the user name in advance:
>
> > >>    set :user, "bob"
>
> > >> - Jamis
>
> > >> On Apr 30, 2008, at 3:21 PM, [EMAIL PROTECTED] wrote:
>
> > >>> Ok, so I think my issue here is actually that I’d like to set
> > >>> that :user variable before the login to the server so I can
> > >>> specify a
> > >>> sudoer. As you say, using a -u flag with sudo doesn’t help if I'm
> > >>> logged-in as a non-sudoer.
>
> > >>> Should I be doing something like a before_deploy hook that sets
> > >>> the :user variable then?
>
> > >>> On Apr 30, 1:30 pm, Jamis Buck <[EMAIL PROTECTED]> wrote:
> > >>>> The :user variable does not have any effect on sudo. It only
> > >>>> controls
> > >>>> who you are logging into your servers as, and who you are doing
> > >>>> your
> > >>>> SCM operations as. To specify a specific user when sudo'ing, give
> > >>>> the :as option:
>
> > >>>>    my_sudo_user = "bob"
> > >>>>    sudo "...", :as => my_sudo_user
>
> > >>>> That will translate (effectively) to "sudo -u bob ..."
>
> > >>>> - Jamis
>
> > >>>> On Apr 30, 2008, at 10:46 AM, [EMAIL PROTECTED] wrote:
>
> > >>>>> I'm unable to get both a sudoer's username and password while
> > >>>>> running
> > >>>>> a $ cap deploy. I *can* get either the username or the password,
> > >>>>> but
> > >>>>> not both. Here's the code:
>
> > >>>>> set :user, "mongrel"
> > >>>>> set :group, "mongrel"
>
> > >>>>> ...
>
> > >>>>> namespace :deploy do
> > >>>>>  desc "restart mongrels using monit"
> > >>>>>  task :restart, :roles => :app, :except => { :no_release => true }
> > >>>>> do
> > >>>>>    deploy.monit.mongrel.restart
> > >>>>>  end
>
> > >>>>>  # 
> > >>>>> Fromhttp://www.almostserio.us/articles/2007/10/08/monit-and-capistrano
> > >>>>>  namespace :monit do
> > >>>>>    namespace :mongrel do
> > >>>>>      [ :stop, :start, :restart ].each do |t|
> > >>>>>        desc "#{t.to_s.capitalize} mongrel using monit"
> > >>>>>        task t, :roles => :app do
> > >>>>>          set :user, Proc.new { Capistrano::CLI.ui.ask("Please
> > >>>>> enter
> > >>>>> the name of a user you can sudo with: ") }
> > >>>>>          sudo "monit -g wuntoo_mongrel #{t.to_s} all"
> > >>>>>        end
> > >>>>>      end
> > >>>>>    end
> > >>>>> ...
> > >>>>> end
>
> > >>>>> My setup here is where the regular deploying user is named
> > >>>>> 'mongrel',
> > >>>>> so that when the svn export is executed, the results are owned by
> > >>>>> the
> > >>>>> 'mongrel' user, and are eventually executed by 'mongrel'.
>
> > >>>>> (Yes, I know the name sucks, and I'll be changing it soon.)
>
> > >>>>> My problem here is that the monit processes can only be
> > >>>>> manipulated by
> > >>>>> root, so I’ve got to sudo every time I want to mess with it, like
> > >>>>> when
> > >>>>> I’m restarting the mongrel processes it monitors.
>
> > >>>>> So I thought I’d be able to just set the :user to be a sudoer
> > >>>>> prior to
> > >>>>> running the 'sudo' method, and things would be peachy.
>
> > >>>>> However, the CLI method is only executed *sometimes*.
>
> > >>>>> $ cap deploy:monit:mongrel:restart    # I get asked for the
> > >>>>> sudoer's
> > >>>>> username
> > >>>>> $ cap deploy:restart                  # I don't get asked
> > >>>>> $ cap deploy                          # I don't get asked
>
> > >>>>> So I asked my friend John, who tells me that I should try leaving
> > >>>>> the
> > >>>>> Proc.new out, and I end up changing my code to
>
> > >>>>> ...
>
> > >>>>> task t, :roles => :app do
> > >>>>>  user = Capistrano::CLI.ui.ask("Please enter the name of a user
> > >>>>> you
> > >>>>> can sudo with: ")
> > >>>>>  set :user, user
> > >>>>>  sudo "monit -g wuntoo_mongrel #{t.to_s} all"
> > >>>>> end
>
> > >>>>> ...
>
> > >>>>> Now I get:
>
> > >>>>> $ cap deploy:monit:mongrel:restart
> > >>>>>    triggering start callbacks for `deploy:monit:mongrel:restart'
> > >>>>>  * executing `production'
> > >>>>> *** Deploying to the   PRODUCTION   server!
> > >>>>>  * executing `deploy:monit:mongrel:restart'
> > >>>>> Please enter the name of a user you can sudo with: edwardog
> > >>>>>  * executing "sudo -p 'sudo password: ' monit -g wuntoo_mongrel
> > >>>>> restart all"
> > >>>>>    servers: ["foo.com"]
> > >>>>>    [wuntoo.com] executing command
> > >>>>> Password:
> > >>>>> ** [out :: foo.com]
> > >>>>>    command finished
>
> > >>>>> So at this point, I’m thinking that it’s worked, and I’m golden.
>
> > >>>>> Nope! It turns out to be failing silently, and -v or -vvv doesn’t
> > >>>>> have
> > >>>>> any effect.
>
> > >>>>> What gives? Is there any way I can see what it’s doing?
>
> > >>>>  smime.p7s
> > >>>> 3KDownload
>
> > >>  smime.p7s
> > >> 3KDownload
>
> >  smime.p7s
> > 3KDownload
--~--~---------~--~----~------------~-------~--~----~
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at http://groups.google.com/group/capistrano
-~----------~----~----~----~------~----~------~--~---

Reply via email to