[Top][All Lists]
[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