# -*- coding: utf-8; -*- ################################################################################ # # Rattail -- Retail Software Framework # Copyright © 2010-2018 Lance Edgar # # This file is part of Rattail. # # Rattail is free software: you can redistribute it and/or modify it under the # terms of the GNU General Public License as published by the Free Software # Foundation, either version 3 of the License, or (at your option) any later # version. # # Rattail is distributed in the hope that it will be useful, but WITHOUT ANY # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more # details. # # You should have received a copy of the GNU General Public License along with # Rattail. If not, see . # ################################################################################ """ Fabric library for Backup app """ from __future__ import unicode_literals, absolute_import import os import datetime from rattail_fabric2 import python, exists, make_deploy, mkdir, UNSPECIFIED deploy_generic = make_deploy(__file__) def deploy_backup_everything(c, **context): """ Deploy the generic `backup-everything` script """ context.setdefault('envname', 'backup') context.setdefault('user', 'rattail') deploy_generic(c, 'backup/backup-everything.mako', '/usr/local/bin/backup-everything', mode='0700', context=context, use_sudo=True) def deploy_backup_app(c, deploy, envname, mkvirtualenv=True, user='rattail', config=None, context={}, everything=None, crontab=None, runat=UNSPECIFIED): """ Make an app which can run backups for the server. """ if not config: path = '{}/rattail.conf'.format(envname) if deploy.local_exists(path): config = path else: raise ValueError("Must provide config path for backup app") if runat is UNSPECIFIED: runat = datetime.time(0) # defaults to midnight # virtualenv if mkvirtualenv: python.mkvirtualenv(c, envname, python='/usr/bin/python3') envpath = '/srv/envs/{}'.format(envname) c.sudo('chown -R {}: {}'.format(user, envpath)) mkdir(c, os.path.join(envpath, 'src'), use_sudo=True, runas_user=user) c.sudo("bash -l -c 'workon {} && pip install --upgrade pip'".format(envname), user=user) # rattail if not exists(c, os.path.join(envpath, 'src/rattail')): c.sudo('git clone https://rattailproject.org/git/rattail.git {}/src/rattail'.format(envpath), user=user) c.sudo("bash -l -c 'cd {}/src/rattail && git pull'".format(envpath), user=user) deploy_generic(c, 'backup/git-exclude', os.path.join(envpath, 'src/rattail/.git/info/exclude'), use_sudo=True, owner=user) c.sudo("bash -l -c 'workon {} && cdvirtualenv && bin/pip install --upgrade --upgrade-strategy eager src/rattail'".format(envname), user=user) # config c.sudo("bash -l -c 'workon {} && cdvirtualenv && rattail make-appdir'".format(envname), user=user) deploy(c, config, os.path.join(envpath, 'app/rattail.conf'), owner=user, mode='0600', use_sudo=True) c.sudo("bash -l -c 'workon {} && cdvirtualenv && bin/rattail -c app/rattail.conf make-config -T quiet -O app/'".format(envname), user=user) c.sudo("bash -l -c 'workon {} && cdvirtualenv && bin/rattail -c app/rattail.conf make-config -T silent -O app/'".format(envname), user=user) # backup-everything script everything_context = dict(context) everything_context['envname'] = envname everything_context['user'] = user if everything: deploy(c, everything, '/usr/local/bin/backup-everything', mode='0700', context=everything_context, use_sudo=True) else: deploy_backup_everything(c, **everything_context) # crontab if runat: crontab_context = dict(context) crontab_context['envname'] = envname crontab_context['pretty_time'] = runat.strftime('%I:%M %p') crontab_context['cron_time'] = runat.strftime('%M %H') if crontab: deploy(c, crontab, '/etc/cron.d/backup', context=crontab_context, use_sudo=True) else: deploy_generic(c, 'backup/crontab.mako', '/etc/cron.d/backup', context=crontab_context, use_sudo=True)