def copy(hosts, src, dst, opts=Options()): """ Copies from the local node to a set of remote hosts hosts: [(host, port, user)...] src: local path dst: remote path opts: CopyOptions (optional) Returns {host: (rc, stdout, stdin) | Error} """ 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(limit=opts.limit, timeout=opts.timeout, askpass=opts.askpass, outdir=opts.outdir, errdir=opts.errdir, callbacks=_CopyOutputBuilder()) for host, port, user in _expand_host_port_user(hosts): cmd = _build_copy_cmd(host, port, user, src, dst, opts) t = Task(host, port, user, cmd, stdin=opts.input_stream, verbose=opts.verbose, quiet=opts.quiet, print_out=opts.print_out, inline=opts.inline, inline_stdout=opts.inline_stdout, default_user=opts.default_user) manager.add_task(t) try: return manager.run() except FatalError as err: raise IOError(str(err))
def call(hosts, cmdline, opts=Options()): """ Executes the given command on a set of hosts, collecting the output Returns {host: (rc, stdout, stdin) | Error} """ 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(limit=opts.limit, timeout=opts.timeout, askpass=opts.askpass, outdir=opts.outdir, errdir=opts.errdir, callbacks=_CallOutputBuilder()) for host, port, user in _expand_host_port_user(hosts): cmd = _build_call_cmd(host, port, user, cmdline, options=opts.ssh_options, extra=opts.ssh_extra) t = Task(host, port, user, cmd, stdin=opts.input_stream, verbose=opts.verbose, quiet=opts.quiet, print_out=opts.print_out, inline=opts.inline, inline_stdout=opts.inline_stdout, default_user=opts.default_user) manager.add_task(t) try: return manager.run() except FatalError as err: raise IOError(str(err))
def do_pssh(l, opts): ''' Adapted from psshlib. Perform command across list of hosts. l = [(host, command), ...] ''' 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) user = "" port = "" hosts = [] for host, cmdline in l: cmd = [ 'ssh', host, '-o', 'PasswordAuthentication=no', '-o', 'SendEnv=PARALLAX_NODENUM', '-o', 'StrictHostKeyChecking=no' ] if hasattr(opts, 'options'): for opt in opts.options: cmd += ['-o', opt] if user: cmd += ['-l', user] if port: cmd += ['-p', port] if os.path.exists(SSH_KEY_CRMSH): cmd += ['-i', SSH_KEY_CRMSH] if hasattr(opts, 'extra'): cmd.extend(opts.extra) if cmdline: cmd.append(cmdline) hosts.append(host) t = Task(host, port, user, cmd, stdin=opts.input_stream, verbose=opts.verbose, quiet=opts.quiet, print_out=opts.print_out, inline=opts.inline, inline_stdout=opts.inline_stdout, default_user=opts.default_user) manager.add_task(t) try: return manager.run() # returns a list of exit codes except FatalError: common_err("SSH to nodes failed") show_output(opts.errdir, hosts, "stderr") return False
def do_pssh(l, opts): ''' Adapted from psshlib. Perform command across list of hosts. l = [(host, command), ...] ''' 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) user = "" port = "" hosts = [] for host, cmdline in l: cmd = ['ssh', host, '-o', 'PasswordAuthentication=no', '-o', 'SendEnv=PSSH_NODENUM', '-o', 'StrictHostKeyChecking=no'] if hasattr(opts, 'options'): for opt in opts.options: cmd += ['-o', opt] if user: cmd += ['-l', user] if port: cmd += ['-p', port] if hasattr(opts, 'extra'): cmd.extend(opts.extra) if cmdline: cmd.append(cmdline) hosts.append(host) t = Task(host, port, user, cmd, stdin=opts.input_stream, verbose=opts.verbose, quiet=opts.quiet, print_out=opts.print_out, inline=opts.inline, inline_stdout=opts.inline_stdout, default_user=opts.default_user) manager.add_task(t) try: return manager.run() # returns a list of exit codes except FatalError: common_err("pssh to nodes failed") show_output(opts.errdir, hosts, "stderr") return False
def slurp(hosts, src, dst, opts=Options()): """ Copies from the remote node to the local node hosts: [(host, port, user)...] src: remote path dst: local path opts: CopyOptions (optional) Returns {host: (rc, stdout, stdin, localpath) | Error} """ if os.path.isabs(dst): raise ValueError("slurp: Destination must be a relative path") localdirs = _slurp_make_local_dirs(hosts, dst, 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(limit=opts.limit, timeout=opts.timeout, askpass=opts.askpass, outdir=opts.outdir, errdir=opts.errdir, callbacks=_SlurpOutputBuilder(localdirs)) for host, port, user in _expand_host_port_user(hosts): localpath = localdirs[host] cmd = _build_slurp_cmd(host, port, user, src, localpath, opts) t = Task(host, port, user, cmd, stdin=opts.input_stream, verbose=opts.verbose, quiet=opts.quiet, print_out=opts.print_out, inline=opts.inline, inline_stdout=opts.inline_stdout, default_user=opts.default_user) manager.add_task(t) try: return manager.run() except FatalError as err: raise IOError(str(err))