The upload/download helpers (including put/get) cannot execute as any  
user other than the user that the connections are using. This means  
you need to resort to either chowning the uploaded files, or  
specifying a different connection when doing uploads:

   role :app, "app1"
   role :safe_app, "[EMAIL PROTECTED]"

   task :upload_something, :roles => :app do
     upload "/from/here", "/to/here", :roles => :safe_app
   end

The chown approach is probably the DRYer of the two.

- Jamis

On May 3, 2008, at 3:24 PM, [EMAIL PROTECTED] wrote:

>
> Cool, so I’ve rewritten my recipes to assume that we’re always  
> logging-
> in as a sudoer.
>
> Is there a way to execute `put` or use any of the deplyoment
> strategies as a specific user, or should I just be chown-ing the
> results to my non-sudoer afterwards, if I want to maintain the state
> where the entire app is owned by the nonsudoing 'mongrel' user (so I
> don’t run into permissions issues down the road)?
>
> Thanks again,
> Edward
>
> On May 1, 2:25 pm, Jamis Buck <[EMAIL PROTECTED]> wrote:
>> We run the mongrels as a different (non-sudoer) user. You can
>> accomplish that lots of ways, but one way is to set :use_sudo to true
>> (the default), and :runner to the name of the user you want running
>> your processes (it defaults to "app"). Then, deploy:start will try to
>> do the right thing.
>>
>> - Jamis
>>
>> On May 1, 2008, at 11:09 AM, [EMAIL PROTECTED] wrote:
>>
>>
>>
>>> Mmmm.... bowel-reaching...
>>
>>> Ok, that’s what I figured would end up happening and leads me to  
>>> think
>>> that I’m fundamentally doing something wrong.
>>
>>> I had thought that it’d be more secure if the user running the
>>> mongrels/owning all the Rails app files was not a sudoer. Does that
>>> make sense?
>>
>>> I suppose where this gets tricky is when you bring monit into the
>>> equation and require the user-shifting to occur so that sudo-ing can
>>> actually happen.
>>
>>> Is it silly that I’m trying to do this sort of thing? What kind of
>>> approach would you recommend?
>>
>>> Thanks again for your patience,
>>> Edward
>>
>>> On May 1, 12:44 pm, Jamis Buck <[EMAIL PROTECTED]> wrote:
>>>> The simplest thing is to just make sure the entire deploy is done
>>>> by a
>>>> sudoer. If that's not possible for whatever reason, then you have  
>>>> to
>>>> reach into the bowels of capistrano to unplug the cached  
>>>> connections.
>>>> (This, by the way, is really really not recommended, and the
>>>> implementation could change without notice at any time and leave  
>>>> your
>>>> recipes high and dry. You've been warned!)
>>
>>>>    servers = find_servers_for_task(current_task)
>>>>    teardown_connections_to(servers)
>>
>>>> - Jamis
>>
>>>> On May 1, 2008, at 10:31 AM, [EMAIL PROTECTED] wrote:
>>
>>>>> 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
>>
>>>>  smime.p7s
>>>> 3KDownload...
>>
>> read more »
>>
>>  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