Source code for fab_deploy.crontab

# coding: utf-8
from __future__ import with_statement

from fabric.api import task, settings, hide, run, puts, env

__all__ = ['set_content', 'add_line', 'puts_content', 'remove_line',
           'update_line', 'add_management', 'get_content']

sentinel = object()

def _marker(marker):
    return ' # MARKER:%s' % marker if marker is not sentinel else ''

@task
def get_content(hide_stdout=False):

    if hide_stdout:
        _hide = hide('warnings', 'stdout')
    else:
        _hide = hide('warnings')

    with settings(_hide, warn_only=True):
        output = run('crontab -l')
        return output if output.succeeded else ''

@task
[docs]def set_content(content): """ Sets crontab content """ run("echo '%s'|crontab -" % content)
@task
[docs]def puts_content(): """ Shows current crontab """ puts(get_content(hide_stdout=True))
@task
[docs]def add_line(content, marker=sentinel): """ Adds line to crontab. Line can be appended with special marker comment so it'll be possible to reliably remove or update it later. """ old_crontab = get_content(hide_stdout=True) marker = _marker(marker) set_content(old_crontab + '\n' + content + marker) return marker
@task
[docs]def remove_line(marker): """ Removes a line added and marked using add_line. """ marker = _marker(marker) lines = [line for line in get_content(hide_stdout=True).splitlines() if line and not line.endswith(marker)] set_content("\n".join(lines))
@task
[docs]def update_line(content, marker): """ Adds or updates a line in crontab. """ remove_line(marker) return add_line(content, marker)
@task
[docs]def add_management(when, command, marker=sentinel): """ Adds django management command to crontab. * ``when`` - crontab's 'when' part (m h dom mon dow) * ``command`` - django management command (with all options) * ``marker`` - unique marker for future command updating or removing Example:: $ fab crontab_add_management:"0 0 * * *","cleanup" """ marker = command if marker is sentinel else marker interpreter = "%s/bin/python" % env.conf.ENV_DIR manage = "%s/manage.py" % env.conf.PROJECT_DIR crontab_line = "%s %s %s %s" % (when, interpreter, manage, command) return update_line(crontab_line, marker)