]> git-server-git.apps.pok.os.sepia.ceph.com Git - remoto.git/commitdiff
create a clean rsync API to push files
authorAlfredo Deza <alfredo@deza.pe>
Wed, 4 Dec 2013 17:10:52 +0000 (12:10 -0500)
committerAlfredo Deza <alfredo@deza.pe>
Wed, 4 Dec 2013 17:10:52 +0000 (12:10 -0500)
remoto/rsync.py [new file with mode: 0644]

diff --git a/remoto/rsync.py b/remoto/rsync.py
new file mode 100644 (file)
index 0000000..3445098
--- /dev/null
@@ -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()