fab-user
[Top][All Lists]
Advanced

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

Re: [Fab-user] Putting Folders


From: Bruno Clermont
Subject: Re: [Fab-user] Putting Folders
Date: Tue, 1 Feb 2011 08:27:16 -0500

# here is my library I wrote for that (look for putdir function)
# never tested on Windows

import os
import tempfile
import tarfile
import uuid
import logging

import fabric.api
import fabric.operations
import fabric.contrib.files
import fabric.context_managers

def mktemp(prefix='/tmp'):
    "return a random remote filename"
    return '/'.join((prefix, str(uuid.uuid4())))

def change_permissions(filename, uid=None, gid=None, mode=None,
                       recursive=False):
    "change uid and gid of specified file"

    def command(command, option, filename):
        "run command with options recursively or not"
        if recursive:
            template = '%s -R %s %s'
        else:
            template = '%s %s %s'
        fabric.operations.run(template % (command, option, filename))

    if fabric.contrib.files.exists(filename):
        logging.debug("Found remote file '%s', change permissions", filename)
        if uid:
            command('chown', uid, filename)
        if gid:
            command('chgrp', gid, filename)
        if mode:
            command('chmod', mode, filename)
    else:
        logging.warning("Can't change ownership of '%s', file does not exists",
                        filename)

def putdir(directory, target, uid=None, gid=None):
    "copy specified directory content to remote target directory"
    if not os.path.exists(directory):
        raise IOError("Invalid directory '%s'" % directory)
    if not os.path.isdir(directory):
        raise IOError("'%s' is not a directory" % directory)

    tmp_tar = tempfile.mkstemp()
    filename = tmp_tar[1]
    curdir = os.path.abspath(os.curdir)
    os.chdir(directory)

    contents = os.listdir(directory)

    tarfh = tarfile.open(filename, 'w:bz2')
    for content in contents:
        tarfh.add(content)
    tarfh.close()
    os.chdir(curdir)

    remote_filename = mktemp()
    fabric.operations.put(filename, remote_filename)
    os.unlink(filename)
    if not fabric.contrib.files.exists(target):
        fabric.operations.run("mkdir %s" % target)
    with fabric.context_managers.cd(target):
        fabric.operations.run("tar -xjf %s" % remote_filename)
        for content in contents:
            change_permissions(content, uid, gid, recursive=True)
    fabric.operations.run('rm -f %s' % remote_filename)

# vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4



reply via email to

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