From: Alfredo Deza Date: Wed, 4 Dec 2013 17:10:52 +0000 (-0500) Subject: create a clean rsync API to push files X-Git-Tag: 0.0.13~3 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=5b5beca4cb97733d517aa9f188ff982cc2ccf00a;p=remoto.git create a clean rsync API to push files --- diff --git a/remoto/rsync.py b/remoto/rsync.py new file mode 100644 index 0000000..3445098 --- /dev/null +++ b/remoto/rsync.py @@ -0,0 +1,44 @@ +from .lib import execnet +from .connection import Connection, FakeRemoteLogger + + +class _RSync(execnet.RSync): + """ + Inherits from ``execnet.RSync`` so that we can log nicely with the user + logger instance (if any) back with the ``_report_send_file`` method + """ + + def __init__(self, sourcedir, callback=None, verbose=True, logger=None): + self.logger = logger + super(_RSync, self).__init__(sourcedir, callback, verbose) + + def _report_send_file(self, gateway, modified_rel_path): + if self._verbose: + self.logger.info("syncing file: %s" % modified_rel_path) + + +def rsync(hosts, source, destination, logger=None, sudo=False): + """ + Grabs the hosts (or single host), creates the connection object for each + and set the rsync execnet engine to push the files. + + It assumes that all of the destinations for the different hosts is the + same. This deviates from what execnet does because it has the flexibility + to push to different locations. + """ + logger = logger or FakeRemoteLogger() + sync = _RSync(source, logger=logger) + + # setup_targets + if not isinstance(hosts, list): + hosts = [hosts] + + for host in hosts: + conn = Connection( + host, + logger, + sudo, + ) + sync.add_target(conn.gateway, destination) + + return sync.send()