summaryrefslogtreecommitdiffstats
path: root/planetlab/pssh/bin/prsync
diff options
context:
space:
mode:
authorthibauth <thibauth@30fcff6e-8de6-41c7-acce-77ff6d1dd07b>2011-08-01 16:05:49 +0000
committerthibauth <thibauth@30fcff6e-8de6-41c7-acce-77ff6d1dd07b>2011-08-01 16:05:49 +0000
commit3bb7785b59ef92278b24f2636b5250b07ce788ee (patch)
tree44679a6548631ff2f278bcf941cdb6c56349cdf5 /planetlab/pssh/bin/prsync
parenta33698d5d7d4bb49fadb4e29daef0d6d58c7c2fc (diff)
downloadpacemaker-3bb7785b59ef92278b24f2636b5250b07ce788ee.tar.gz
Planetlab utilities
git-svn-id: https://scm.gforge.inria.fr/svn/pacemaker@50 30fcff6e-8de6-41c7-acce-77ff6d1dd07b
Diffstat (limited to 'planetlab/pssh/bin/prsync')
-rwxr-xr-xplanetlab/pssh/bin/prsync125
1 files changed, 125 insertions, 0 deletions
diff --git a/planetlab/pssh/bin/prsync b/planetlab/pssh/bin/prsync
new file mode 100755
index 0000000..b66443b
--- /dev/null
+++ b/planetlab/pssh/bin/prsync
@@ -0,0 +1,125 @@
+#!/usr/bin/env python
+# -*- Mode: python -*-
+
+# Copyright (c) 2009, Andrew McNabb
+# Copyright (c) 2003-2008, Brent N. Chun
+
+"""Parallel rsync to the set of nodes in hosts.txt.
+
+For each node, we essentially do a rsync -rv -e ssh local user@host:remote.
+Note that remote must be an absolute path.
+"""
+
+import os
+import re
+import sys
+
+parent, bindir = os.path.split(os.path.dirname(os.path.abspath(sys.argv[0])))
+if os.path.exists(os.path.join(parent, 'psshlib')):
+ sys.path.insert(0, parent)
+
+from psshlib import psshutil
+from psshlib.task import Task
+from psshlib.manager import Manager, FatalError
+from psshlib.cli import common_parser, common_defaults
+
+def option_parser():
+ parser = common_parser()
+ parser.usage = "%prog [OPTIONS] -h hosts.txt local remote"
+ parser.epilog = ("Example: prsync -r -h hosts.txt -l irb2 foo " +
+ "/home/irb2/foo")
+
+ parser.add_option('-r', '--recursive', dest='recursive',
+ action='store_true', help='recusively copy directories (OPTIONAL)')
+ parser.add_option('-a', '--archive', dest='archive', action='store_true',
+ help='use rsync -a (archive mode) (OPTIONAL)')
+ parser.add_option('-z', '--compress', dest='compress', action='store_true',
+ help='use rsync compression (OPTIONAL)')
+ parser.add_option('-S', '--ssh-args', metavar="ARGS", dest='ssh_args',
+ action='store', help='extra arguments for ssh')
+
+ return parser
+
+def parse_args():
+ parser = option_parser()
+ defaults = common_defaults()
+ parser.set_defaults(**defaults)
+ opts, args = parser.parse_args()
+
+ if len(args) < 1:
+ parser.error('Paths not specified.')
+
+ if len(args) < 2:
+ parser.error('Remote path not specified.')
+
+ if len(args) > 2:
+ parser.error('Extra arguments given after the remote path.')
+
+ if not opts.host_files and not opts.host_strings:
+ parser.error('Hosts not specified.')
+
+ return opts, args
+
+def do_prsync(hosts, local, remote, opts):
+ if opts.outdir and not os.path.exists(opts.outdir):
+ os.makedirs(opts.outdir)
+ if opts.errdir and not os.path.exists(opts.errdir):
+ os.makedirs(opts.errdir)
+ manager = Manager(opts)
+ for host, port, user in hosts:
+ ssh = ['ssh']
+ if opts.options:
+ ssh += ['-o', opts.options]
+ if port:
+ ssh += ['-p', port]
+ if opts.ssh_args:
+ ssh += [opts.ssh_args]
+
+ cmd = ['rsync', '-e', ' '.join(ssh)]
+ if opts.verbose:
+ cmd.append('-v')
+ if opts.recursive:
+ cmd.append('-r')
+ if opts.archive:
+ cmd.append('-a')
+ if opts.compress:
+ cmd.append('-z')
+ if opts.extra:
+ cmd.extend(opts.extra)
+ cmd.append(local)
+ if user:
+ cmd.append('%s@%s:%s' % (user, host, remote))
+ else:
+ cmd.append('%s:%s' % (host, remote))
+ t = Task(host, port, user, cmd, opts)
+ manager.add_task(t)
+ try:
+ statuses = manager.run()
+ except FatalError:
+ sys.exit(1)
+
+ if min(statuses) < 0:
+ # At least one process was killed.
+ sys.exit(3)
+ for status in statuses:
+ if status != 0:
+ sys.exit(4)
+
+if __name__ == "__main__":
+ opts, args = parse_args()
+ local = args[0]
+ remote = args[1]
+ if not re.match("^/", remote):
+ print("Remote path %s must be an absolute path" % remote)
+ sys.exit(3)
+ try:
+ hosts = psshutil.read_host_files(opts.host_files,
+ default_user=opts.user)
+ except IOError:
+ _, e, _ = sys.exc_info()
+ sys.stderr.write('Could not open hosts file: %s\n' % e.strerror)
+ sys.exit(1)
+ if opts.host_strings:
+ for s in opts.host_strings:
+ hosts.extend(psshutil.parse_host_string(s, default_user=opts.user))
+ do_prsync(hosts, local, remote, opts)