fab-user
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Fab-user] road to 0.1.0


From: Jeff Forcier
Subject: Re: [Fab-user] road to 0.1.0
Date: Sun, 13 Jul 2008 00:03:20 -0400

On Sat, Jul 12, 2008 at 6:11 PM, Jeff Forcier <address@hidden> wrote:

> From here, I'll probably poke at this a bit more and try to clean it
> up a bit, or forge ahead and see about getting capturing implemented.

Apologies for replying to myself a second time :) but as of this email
the HEAD of my 'execution' branch contains an implementation of
capturing via return value for run() and sudo().

Specifically, _try_run_operation() has been updated to accept either
the original 'signature' of a single Boolean value, *or* a two-tuple
of captured stdout + the boolean. run() and sudo() then return that
two-tuple, and _try_run_operation() uses the boolean for normal
failure testing, then returns the output if there was any.

Thus, operations that return these two-tuples will effectively return
their stdout when used in a fab command, but will also respect the
failure settings vis-a-vis warning/aborting.

With this and the 'deep' mode working, I've successfully implemented
the command that's been my immediate use-case/goal throughout my
journeys with Capistrano and then Fabric (see below) and it works fine
:D This also means that if this functionality ends up in mainline
Fabric in some form, it will have a big leg up over Capistrano for
anyone else who wants to use "deployment" tools in this fashion.

Finally, in writing the command below, I notice that mixing set/get
with normal Python variables gets kind of icky when you need to use
both in the same string, so that's something I might ponder for later.
That, and giving users better control over the output of the
operations -- my command ends up being very verbose, where one would
rather see mostly/only their own print statements.

Regards,
Jeff

set(
    fab_hosts=['address@hidden', 'localhost'],
    fab_mode="deep",
    fab_fail='warn'
)

def deluser():
    "Archive and delete a user."
    prompt('username', 'User to delete')
    # Only run if exact username found + has homedir
    user_line = run('grep "^$(username):" /etc/passwd')
    if user_line:
        homedir = user_line.split(':')[5]
        if not homedir or not run('ls -d %s' % homedir):
            print("%s has no home directory on %s! Aborting for this host."
                % (get('username'), get('fab_host')))
            return
        # Check size of homedir
        size = sudo('du -sm %s | cut -f1' % homedir).strip()
        if size and int(size) < 200:
            # Archive home dir
            set(archive='$(username).tgz')
            sudo('tar czf /tmp/$(archive) %s' % homedir)
            # Copy it locally
            download('/tmp/$(archive)', '/tmp/$(archive)')
            # Remove user
            # sudo('deluser --remove-home $(username)')
        else:
            print("%s's home directory on %s is %s MB; aborting
deletion for this host." % (get('username'), get('fab_host'), size))




reply via email to

[Prev in Thread] Current Thread [Next in Thread]