summaryrefslogtreecommitdiff
path: root/utils/sync-source/lib/transfer/rsync.py
diff options
context:
space:
mode:
Diffstat (limited to 'utils/sync-source/lib/transfer/rsync.py')
-rw-r--r--utils/sync-source/lib/transfer/rsync.py60
1 files changed, 60 insertions, 0 deletions
diff --git a/utils/sync-source/lib/transfer/rsync.py b/utils/sync-source/lib/transfer/rsync.py
new file mode 100644
index 0000000000000..7a89344b69915
--- /dev/null
+++ b/utils/sync-source/lib/transfer/rsync.py
@@ -0,0 +1,60 @@
+import os.path
+import pprint
+import subprocess
+import sys
+
+import transfer.protocol
+
+
+class RsyncOverSsh(transfer.protocol.Protocol):
+ def __init__(self, options, config):
+ super(RsyncOverSsh, self).__init__(options, config)
+ self.ssh_config = config.get_value("ssh")
+
+ def build_rsync_command(self, transfer_spec, dry_run):
+ dest_path = os.path.join(
+ self.ssh_config["root_dir"],
+ transfer_spec.dest_path)
+ flags = "-avz"
+ if dry_run:
+ flags += "n"
+ cmd = [
+ "rsync",
+ flags,
+ "-e",
+ "ssh -p {}".format(self.ssh_config["port"]),
+ "--rsync-path",
+ # The following command needs to know the right way to do
+ # this on the dest platform - ensures the target dir exists.
+ "mkdir -p {} && rsync".format(dest_path)
+ ]
+
+ # Add source dir exclusions
+ if transfer_spec.exclude_paths:
+ for exclude_path in transfer_spec.exclude_paths:
+ cmd.append("--exclude")
+ cmd.append(exclude_path)
+
+ cmd.extend([
+ "--delete",
+ transfer_spec.source_path + "/",
+ "{}@{}:{}".format(
+ self.ssh_config["user"],
+ self.ssh_config["dest_host"],
+ dest_path)])
+ return cmd
+
+ def transfer(self, transfer_specs, dry_run):
+ if self.options.verbose:
+ printer = pprint.PrettyPrinter()
+ for spec in transfer_specs:
+ printer.pprint(spec)
+
+ for spec in transfer_specs:
+ cmd = self.build_rsync_command(spec, dry_run)
+ if self.options.verbose:
+ print "executing the following command:\n{}".format(cmd)
+ result = subprocess.call(
+ cmd, stdin=sys.stdin, stdout=sys.stdout, stderr=sys.stderr)
+ if result != 0:
+ return result