def download_zodb(config):
    """Download ZODB part of Zope's data from the server."""
    folder = config.get('zeo', {}).get('dir') or err('Folder must be set!')
    user = config.get('user') or err('Application user must be set!')

    if not confirm('This will overwrite your local Data.fs. Are you sure you '
                   'want to continue?'):
        api.abort('ZODB download cancelled.')

    api.local('mkdir -p var_tmp/filestorage')

    # Backup current Data.fs.
    if os.path.exists('var_tmp/filestorage/Data.fs'):
        api.local('mv var_tmp/filestorage/Data.fs var_tmp/filestorage/Data.fs.bak')

    with api.settings(sudo_user=user):

        # Remove temporary Data.fs file from previous downloads.
        if exists('/tmp/Data.fs', use_sudo=True):
            api.sudo('rm -rf /tmp/Data.fs')

        # Downlaod Data.fs from server.
        with api.cd(folder):
            api.sudo('rsync -a var/filestorage/Data.fs /tmp/Data.fs')
            api.sudo('chmod 0644 /tmp/Data.fs')
            api.get('/tmp/Data.fs', 'var_tmp/filestorage/Data.fs')
def upload_blob(config):
    """Upload blob part of Zope's data to the server."""
    folder = config.get('zeo', {}).get('dir') or err('Folder must be set!')
    user = config.get('user') or err('Application user must be set!')

    if not confirm('This will overwrite your remote blob files. Are you sure '
                   'you want to continue?', default=False):
        api.abort('Blob upload cancelled.')

    api.sudo('mkdir -p /tmp/upload', user=user)

    with api.lcd('var_tmp'):
        api.local('tar czf blobstorage_upload.tgz blobstorage')
        api.put('blobstorage_upload.tgz', '/tmp/upload/blobstorage.tgz',
                use_sudo=True)

    api.sudo('chown %s /tmp/upload/blobstorage.tgz' % user)
    with api.cd('/tmp/upload'):
        api.sudo('tar xzf blobstorage.tgz', user=user)

    with api.settings(sudo_user=user):
        with api.cd(folder):
            # Backup current blob files.
            if exists('var/blobstorage', use_sudo=True):
                api.sudo('mv var/blobstorage var/blobstorage_bak')
            api.sudo('mv /tmp/upload/blobstorage var')
def backup(config):
    """Perform a backup of Zope's data on the server."""
    folder = config.get('zeo', {}).get('dir') or err('Folder must be set!')
    user = config.get('user') or err('Application user must be set!')

    with api.settings(sudo_user=user):
        # Do snapshot backup.
        with api.cd(folder):
            api.sudo('./bin/snapshotbackup')
def run_buildout(folder=None, user=None, config=None):
    """Run the buildout."""
    config = config or err('Need application config.')
    folder = folder or config.get('app', {}).get('dir')
    folder = folder or err('Folder must be set!')
    user = user or config.get('user') or err('Required user must be set!')
    with api.settings(sudo_user=user):
        # Run buildout.
        with api.cd(folder):
            api.sudo('./bin/buildout')
def update_dev_packes(folder=None, user=None, config=None):
    """Update the development packages."""
    config = config or err('Need application config.')
    folder = folder or config.get('app', {}).get('dir')
    folder = folder or err('Folder must be set!')
    user = user or config.get('user') or err('Required user must be set!')
    with api.settings(sudo_user=user):
        # Update buildout src packages.
        with api.cd(folder):
            if exists('./bin/develop', use_sudo=True):
                api.sudo('./bin/develop up -f')
def backup_dev_packages(folder=None, user=None, config=None):
    """Backup the development packages."""
    config = config or err('Need application config.')
    folder = folder or config.get('app', {}).get('dir')
    folder = folder or err('Folder must be set!')
    user = user or config.get('user') or err('Required user must be set!')
    with api.settings(sudo_user=user):
        # Backup buildout src packages.
        with api.cd(folder):
            if exists('src', use_sudo=True):
                now = datetime.now().strftime('%Y-%m-%d_%H-%M-%S')
                backup_folder = 'src_backups/%s' % now
                api.sudo('mkdir -p %s' % backup_folder)
                api.sudo('mv ./src/* %s' % backup_folder, warn_only=True)
def upload_zodb(config):
    """Upload ZODB part of Zope's data to the server."""
    folder = config.get('zeo', {}).get('dir') or err('Folder must be set!')
    user = config.get('user') or err('Application user must be set!')

    if not confirm('This will overwrite your remote Data.fs. Are you sure you '
                   'want to continue?', default=False):
        api.abort('ZODB upload cancelled.')

    api.sudo('mkdir -p /tmp/upload', user=user)

    api.put('var_tmp/filestorage/Data.fs', '/tmp/upload/Data.fs', use_sudo=True)
    api.sudo('chown %s /tmp/upload/Data.fs' % user)

    with api.settings(sudo_user=user):
        with api.cd(folder):
            # Backup current Data.fs.
            if exists('var/filestorage/Data.fs', use_sudo=True):
                api.sudo('mv %(fsdir)s/Data.fs %(fsdir)s/Data.fs.bak' % dict(
                    fsdir='var/filestorage',
                ))
            api.sudo('mv /tmp/upload/Data.fs var/filestorage/Data.fs')
def download_blobs(config):
    """Download blob part of Zope's data from the server."""
    folder = config.get('zeo', {}).get('dir') or err('Folder must be set!')
    user = config.get('user') or err('Application user must be set!')

    if not confirm('This will overwrite your local blob files. Are you sure '
                   'you want to continue?'):
        api.abort('Blob download cancelled.')

    # Remove local blob files backup.
    if os.path.exists('var_tmp/blobstorage_bak'):
        api.local('rm -rf var_tmp/blobstorage_bak')

    # Backup current blob files.
    if os.path.exists('var_tmp/blobstorage'):
        api.local('mv var_tmp/blobstorage var_tmp/blobstorage_bak')

    with api.settings(sudo_user=user):

        # Remove temporary blob files from previous downloads.
        if exists('/tmp/blobstorage', use_sudo=True):
            api.sudo('rm -rf /tmp/blobstorage')

        if exists('/tmp/blobstorage.tgz', use_sudo=True):
            api.sudo('rm -rf /tmp/blobstorage.tgz')

        # Download blob files from server.
        with api.cd(folder):
            api.sudo('rsync -a ./var/blobstorage /tmp/')

        with api.cd('/tmp'):
            api.sudo('tar czf blobstorage.tgz blobstorage')
            api.get('/tmp/blobstorage.tgz', './var_tmp/blobstorage.tgz')

        with api.lcd('var_tmp'):
            api.local('tar xzf blobstorage.tgz')