forked from OSchip/llvm-project
62 lines
1.9 KiB
Python
62 lines
1.9 KiB
Python
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
|