fab-user
[Top][All Lists]
Advanced

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

Fwd: [Fab-user] Putting Folders


From: Kevin Horn
Subject: Fwd: [Fab-user] Putting Folders
Date: Tue, 1 Mar 2011 14:29:17 -0600

Of course, this was supposed to go to the list...

Kevin Horn

---------- Forwarded message ----------
From: Kevin Horn <address@hidden>
Date: Tue, Mar 1, 2011 at 2:28 PM
Subject: Re: [Fab-user] Putting Folders
To: Bruno Clermont <address@hidden>


On Tue, Feb 1, 2011 at 7:27 AM, Bruno Clermont <address@hidden> wrote:
# 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



Here's a version I use to move files from a Windows machine to a Linux server:
https://bitbucket.org/khorn/lore2sphinx/src/71729e79b94b/put_dir.py

I think it might be modified from an older version of Bruno's code above.

It's not very generic, but it works for me. YMMV.

Kevin Horn


reply via email to

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