Hello community, here is the log from the commit of package pssh for openSUSE:Factory checked in at 2012-02-16 12:26:40 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/pssh (Old) and /work/SRC/openSUSE:Factory/.pssh.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "pssh", Maintainer is "[email protected]" Changes: -------- --- /work/SRC/openSUSE:Factory/pssh/pssh.changes 2012-01-09 21:44:15.000000000 +0100 +++ /work/SRC/openSUSE:Factory/.pssh.new/pssh.changes 2012-02-16 12:26:42.000000000 +0100 @@ -1,0 +2,9 @@ +Tue Feb 14 03:15:49 UTC 2012 - [email protected] + +- exit gracefully when pacemaker is not running (--pcmk_nodes) +- update --quiet option to suppress all status output +- add /usr/bin to the search path for pssh-askpass +- add -C (--pcmk_nodes) option (get host names from cluster: crm_node -l) +- add -q (--quiet) option (suppresses status output) + +------------------------------------------------------------------- New: ---- pssh_askpass_dir.patch pssh_pcmk_nodes.patch pssh_quiet.patch ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ pssh.spec ++++++ --- /var/tmp/diff_new_pack.bqEtHM/_old 2012-02-16 12:26:43.000000000 +0100 +++ /var/tmp/diff_new_pack.bqEtHM/_new 2012-02-16 12:26:43.000000000 +0100 @@ -24,6 +24,9 @@ Source: http://parallel-ssh.googlecode.com/files/pssh-%{version}.tar.gz Patch1: pssh-remove_shebangs.patch Patch2: pssh-man_dir.patch +Patch3: pssh_quiet.patch +Patch4: pssh_pcmk_nodes.patch +Patch5: pssh_askpass_dir.patch Url: http://code.google.com/p/parallel-ssh/ BuildRoot: %{_tmppath}/%{name}-%{version}-build BuildRequires: python-devel @@ -64,6 +67,9 @@ %setup -q %patch1 %patch2 +%patch3 -p1 +%patch4 -p1 +%patch5 -p1 %build %__python ./setup.py build ++++++ pssh_askpass_dir.patch ++++++ diff --git a/psshlib/askpass_client.py b/psshlib/askpass_client.py index 5dc6dc6..2ab67ba 100644 --- a/psshlib/askpass_client.py +++ b/psshlib/askpass_client.py @@ -26,6 +26,7 @@ import textwrap bin_dir = os.path.dirname(os.path.abspath(sys.argv[0])) askpass_bin_path = os.path.join(bin_dir, 'pssh-askpass') ASKPASS_PATHS = (askpass_bin_path, + '/usr/bin/pssh-askpass', '/usr/libexec/pssh/pssh-askpass', '/usr/local/libexec/pssh/pssh-askpass', '/usr/lib/pssh/pssh-askpass', ++++++ pssh_pcmk_nodes.patch ++++++ commit 9341f843f7eff49da9e909b9b0c87c9d5396155e Author: Dejan Muhamedagic <[email protected]> Date: Mon Aug 15 14:24:35 2011 +0200 add -C/--pcmk_nodes option to get list of nodes from Pacemaker diff --git a/bin/pnuke b/bin/pnuke index 2b4feb5..a0eabdc 100755 --- a/bin/pnuke +++ b/bin/pnuke @@ -40,7 +40,7 @@ def parse_args(): if len(args) > 1: parser.error('Extra arguments given after the pattern.') - if not opts.host_files and not opts.host_strings: + if not opts.host_files and not opts.host_strings and not opts.pcmk_nodes: parser.error('Hosts not specified.') return opts, args @@ -90,4 +90,6 @@ if __name__ == "__main__": if opts.host_strings: for s in opts.host_strings: hosts.extend(psshutil.parse_host_string(s, default_user=opts.user)) + if opts.pcmk_nodes: + hosts += psshutil.get_pcmk_nodes() do_pnuke(hosts, pattern, opts) diff --git a/bin/prsync b/bin/prsync index b66443b..85c4959 100755 --- a/bin/prsync +++ b/bin/prsync @@ -55,7 +55,7 @@ def parse_args(): if len(args) > 2: parser.error('Extra arguments given after the remote path.') - if not opts.host_files and not opts.host_strings: + if not opts.host_files and not opts.host_strings and not opts.pcmk_nodes: parser.error('Hosts not specified.') return opts, args @@ -122,4 +122,6 @@ if __name__ == "__main__": if opts.host_strings: for s in opts.host_strings: hosts.extend(psshutil.parse_host_string(s, default_user=opts.user)) + if opts.pcmk_nodes: + hosts += psshutil.get_pcmk_nodes() do_prsync(hosts, local, remote, opts) diff --git a/bin/pscp b/bin/pscp index 3caf455..4f8c56b 100755 --- a/bin/pscp +++ b/bin/pscp @@ -47,7 +47,7 @@ def parse_args(): if len(args) < 2: parser.error('Remote path not specified.') - if not opts.host_files and not opts.host_strings: + if not opts.host_files and not opts.host_strings and not opts.pcmk_nodes: parser.error('Hosts not specified.') return opts, args @@ -105,4 +105,6 @@ if __name__ == "__main__": if opts.host_strings: for s in opts.host_strings: hosts.extend(psshutil.parse_host_string(s, default_user=opts.user)) + if opts.pcmk_nodes: + hosts += psshutil.get_pcmk_nodes() do_pscp(hosts, localargs, remote, opts) diff --git a/bin/pslurp b/bin/pslurp index 5797e7c..2336a15 100755 --- a/bin/pslurp +++ b/bin/pslurp @@ -52,7 +52,7 @@ def parse_args(): if len(args) > 2: parser.error('Extra arguments given after the local path.') - if not opts.host_files and not opts.host_strings: + if not opts.host_files and not opts.host_strings and not opts.pcmk_nodes: parser.error('Hosts not specified.') return opts, args @@ -126,4 +126,6 @@ if __name__ == "__main__": if opts.host_strings: for s in opts.host_strings: hosts.extend(psshutil.parse_host_string(s, default_user=opts.user)) + if opts.pcmk_nodes: + hosts += psshutil.get_pcmk_nodes() do_pslurp(hosts, remote, local, opts) diff --git a/bin/pssh b/bin/pssh index f9af471..25daa9c 100755 --- a/bin/pssh +++ b/bin/pssh @@ -51,7 +51,7 @@ def parse_args(): if len(args) == 0 and not opts.send_input: parser.error('Command not specified.') - if not opts.host_files and not opts.host_strings: + if not opts.host_files and not opts.host_strings and not opts.pcmk_nodes: parser.error('Hosts not specified.') return opts, args @@ -109,6 +109,10 @@ if __name__ == "__main__": _, e, _ = sys.exc_info() sys.stderr.write('Could not open hosts file: %s\n' % e.strerror) sys.exit(1) + if opts.pcmk_nodes: + hosts = psshutil.get_pcmk_nodes() + if not hosts: + sys.exit(1) if opts.host_strings: for s in opts.host_strings: hosts.extend(psshutil.parse_host_string(s, default_user=opts.user)) diff --git a/psshlib/cli.py b/psshlib/cli.py index e11645a..e950581 100644 --- a/psshlib/cli.py +++ b/psshlib/cli.py @@ -28,6 +28,8 @@ def common_parser(): parser.add_option('-H', '--host', dest='host_strings', action='append', metavar='HOST_STRING', help='additional host entries ("[user@]host[:port]")') + parser.add_option('-C', '--pcmk_nodes', dest='pcmk_nodes', action='store_true', + help='get nodes from pacemaker') parser.add_option('-l', '--user', dest='user', help='username (OPTIONAL)') parser.add_option('-p', '--par', dest='par', type='int', diff --git a/psshlib/psshutil.py b/psshlib/psshutil.py index ae1a24c..0700ef5 100644 --- a/psshlib/psshutil.py +++ b/psshlib/psshutil.py @@ -4,6 +4,7 @@ import fcntl import string import sys +import subprocess HOST_FORMAT = 'Host format is [user@]host[:port] [user]' @@ -98,6 +99,33 @@ def parse_host(host, default_user=None, default_port=None): host, port = host.rsplit(':', 1) return (host, port, user) +def get_pcmk_nodes(): + """Get the list of nodes from crm_node -l. + + Returns a list of (host, port, user) triples. + """ + hosts = [] + if subprocess.call("which crm_node >/dev/null 2>&1", shell=True) != 0: + sys.stderr.write('crm_node not available\n') + return hosts + cmd = "crm_node -l" + p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE) + try: + outp = p.communicate()[0] + p.wait() + rc = p.returncode + except IOError, msg: + sys.stderr.write('%s failed: %s\n' % (cmd,msg)) + return hosts + if rc != 0: + sys.stderr.write('%s failed: exit code %d\n' % (cmd,rc)) + return hosts + for s in outp.split('\n'): + a = s.split() + if len(a) != 3: + continue + hosts.append((a[1], None, None)) + return hosts def set_cloexec(filelike): """Sets the underlying filedescriptor to automatically close on exec. @@ -106,3 +134,5 @@ def set_cloexec(filelike): not require the close_fds option. """ fcntl.fcntl(filelike.fileno(), fcntl.FD_CLOEXEC, 1) + +# vim:ts=4:sw=4:et: ++++++ pssh_quiet.patch ++++++ commit f0c10276e6bfd3f61648d0a19a5d1d1c194c4080 Author: Dejan Muhamedagic <[email protected]> Date: Mon Aug 8 16:50:04 2011 +0200 add --quiet option diff --git a/man/man1/pssh.1 b/man/man1/pssh.1 index bb1b4d3..fcc40bd 100644 --- a/man/man1/pssh.1 +++ b/man/man1/pssh.1 @@ -7,7 +7,7 @@ pssh \(em parallel ssh program .SH SYNOPSIS .B pssh -.RB [ \-vAiIP ] +.RB [ \-vqAiIP ] .RB [ \-h .IR hosts_file ] .RB [ \-H @@ -31,7 +31,7 @@ pssh \(em parallel ssh program .I command ... .B pssh \-I -.RB [ \-vAiIP ] +.RB [ \-vqAiIP ] .RB [ \-h .IR hosts_file ] .RB [ \-H @@ -224,6 +224,15 @@ and options. .TP +.B \-q +.PD 0 +.TP +.B \-\-quiet +Don't print status messages. With +.B \-i +prepend host names to the output. + +.TP .B \-I .PD 0 .TP diff --git a/psshlib/cli.py b/psshlib/cli.py index 1686ba9..e11645a 100644 --- a/psshlib/cli.py +++ b/psshlib/cli.py @@ -42,6 +42,8 @@ def common_parser(): metavar='OPTION', help='SSH option (OPTIONAL)') parser.add_option('-v', '--verbose', dest='verbose', action='store_true', help='turn on warning and diagnostic messages (OPTIONAL)') + parser.add_option('-q', '--quiet', dest='quiet', action='store_true', + help='turn off informational and status messages (OPTIONAL)') parser.add_option('-A', '--askpass', dest='askpass', action='store_true', help='Ask for a password (OPTIONAL)') parser.add_option('-x', '--extra-args', action='callback', type='string', @@ -63,6 +65,7 @@ def common_defaults(**kwargs): ('errdir', 'PSSH_ERRDIR'), ('timeout', 'PSSH_TIMEOUT'), ('verbose', 'PSSH_VERBOSE'), + ('quiet', 'PSSH_QUIET'), ('print_out', 'PSSH_PRINT'), ('askpass', 'PSSH_ASKPASS'), ('inline', 'PSSH_INLINE'), diff --git a/psshlib/task.py b/psshlib/task.py index 28136bf..2fe362a 100644 --- a/psshlib/task.py +++ b/psshlib/task.py @@ -56,6 +56,7 @@ class Task(object): # Set options. self.verbose = opts.verbose + self.quiet = opts.quiet try: self.print_out = bool(opts.print_out) except AttributeError: @@ -183,7 +184,10 @@ class Task(object): buf = os.read(fd, BUFFER_SIZE) if buf: if self.inline: - self.outputbuffer += buf + if self.quiet: + self.outputbuffer += "%s: %s" % (self.host, buf) + else: + self.outputbuffer += buf if self.outfile: self.writer.write(self.outfile, buf) if self.print_out: @@ -259,10 +263,11 @@ class Task(object): failure = "[FAILURE]" stderr = "Stderr: " host = self.pretty_host - if self.failures: - print(' '.join((progress, tstamp, failure, host, error))) - else: - print(' '.join((progress, tstamp, success, host))) + if not self.quiet: + if self.failures: + print(' '.join((progress, tstamp, failure, host, error))) + else: + print(' '.join((progress, tstamp, success, host))) # NOTE: The extra flushes are to ensure that the data is output in # the correct order with the C implementation of io. if self.outputbuffer: @@ -281,3 +286,4 @@ class Task(object): except AttributeError: sys.stdout.write(self.errorbuffer) +# vim:ts=4:sw=4:et: -- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
