summaryrefslogtreecommitdiff
path: root/utils/sync-source/lib
diff options
context:
space:
mode:
Diffstat (limited to 'utils/sync-source/lib')
-rw-r--r--utils/sync-source/lib/transfer/__init__.py0
-rw-r--r--utils/sync-source/lib/transfer/protocol.py7
-rw-r--r--utils/sync-source/lib/transfer/rsync.py60
-rw-r--r--utils/sync-source/lib/transfer/transfer_spec.py11
4 files changed, 78 insertions, 0 deletions
diff --git a/utils/sync-source/lib/transfer/__init__.py b/utils/sync-source/lib/transfer/__init__.py
new file mode 100644
index 0000000000000..e69de29bb2d1d
--- /dev/null
+++ b/utils/sync-source/lib/transfer/__init__.py
diff --git a/utils/sync-source/lib/transfer/protocol.py b/utils/sync-source/lib/transfer/protocol.py
new file mode 100644
index 0000000000000..6a4e6e0a3a454
--- /dev/null
+++ b/utils/sync-source/lib/transfer/protocol.py
@@ -0,0 +1,7 @@
+class Protocol(object):
+ def __init__(self, options, config):
+ self.options = options
+ self.config = config
+
+ def transfer(transfer_specs, dry_run):
+ raise "transfer must be overridden by transfer implementation"
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
diff --git a/utils/sync-source/lib/transfer/transfer_spec.py b/utils/sync-source/lib/transfer/transfer_spec.py
new file mode 100644
index 0000000000000..cc76c70bf41c0
--- /dev/null
+++ b/utils/sync-source/lib/transfer/transfer_spec.py
@@ -0,0 +1,11 @@
+class TransferSpec(object):
+ def __init__(self, source_path, exclude_paths, dest_path):
+ self.source_path = source_path
+ self.exclude_paths = exclude_paths
+ self.dest_path = dest_path
+
+ def __repr__(self):
+ fmt = (
+ "TransferSpec(source_path='{}', exclude_paths='{}', "
+ "dest_path='{}')")
+ return fmt.format(self.source_path, self.exclude_paths, self.dest_path)