blob: 8269fada676a48d27182a32b27695d2268c5c6e0 [file] [log] [blame]
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