Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package pssh for openSUSE:Factory checked in at 2026-10-23 20:29:57 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/pssh (Old) and /work/SRC/openSUSE:Factory/.pssh.new.2252680 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "pssh" Fri Oct 23 20:29:57 2026 rev:6 rq:1392036 version:2.3.6 Changes: -------- --- /work/SRC/openSUSE:Factory/pssh/pssh.changes 2025-12-16 16:03:53.638169991 +0100 +++ /work/SRC/openSUSE:Factory/.pssh.new.2252680/pssh.changes 2026-10-23 20:31:38.538989836 +0200 @@ -1,0 +2,22 @@ +Sun Oct 11 14:05:58 UTC 2026 - Andrea Manzini <[email protected]> + +- Update to 2.3.6 (was git snapshot 2.3.4+git10.d4909c9): + * Add pscp --download to fetch files from the hosts in parallel + * Add pssh --no-headers and prsync --inline + * Print error output on stderr when using the print option (-P) + * Fix IPv6 host addresses, port handling and hostname case +- Use the upstream v2.3.6 release tag tarball instead of a tar_scm + snapshot: + * Add pssh-2.3.6.tar.gz + * Remove pssh-2.3.4+git10.d4909c9.tar.xz, _service, _servicedata +- Install the man pages in %install: upstream's setup.cfg no + longer installs them +- Add %check smoke test (--version of each command); upstream's + test/test.py needs live ssh hosts +- Rebase patches for the new sources: + * 0002-Add-quiet-option.patch + * 0003-Fix-order-of-command-statuses-returned-by-the-Manage.patch + * 0008-openSUSE-add-C-pcmk_nodes-option-to-get-list-of-node.patch +- Spec cleanup: drop Group tags and the pkg_version define + +------------------------------------------------------------------- Old: ---- _service _servicedata pssh-2.3.4+git10.d4909c9.tar.xz New: ---- pssh-2.3.6.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ pssh.spec ++++++ --- /var/tmp/diff_new_pack.JZg8Vo/_old 2026-10-23 20:31:39.297021625 +0200 +++ /var/tmp/diff_new_pack.JZg8Vo/_new 2026-10-23 20:31:39.300021751 +0200 @@ -1,7 +1,7 @@ # # spec file for package pssh # -# Copyright (c) 2025 SUSE LLC +# Copyright (c) 2026 SUSE LLC and contributors # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -16,20 +16,17 @@ # -%define pkg_version 2.3.4 %define pythons python3 %if ! %{defined python3_sitelib} -%define python3_sitelib /usr/lib/python3.6/site-packages/ +%define python3_sitelib %{_prefix}/lib/python3.6/site-packages/ %endif - Name: pssh -Version: 2.3.4+git10.d4909c9 +Version: 2.3.6 Release: 0 Summary: Parallel SSH to control large numbers of Machines simultaneously License: BSD-3-Clause -Group: Productivity/Clustering/Computing URL: https://github.com/lilydjwg/pssh -Source: pssh-%{version}.tar.xz +Source: https://github.com/lilydjwg/pssh/archive/v%{version}.tar.gz#/%{name}-%{version}.tar.gz # PATCH-FIX-OPENSUSE 0001-Remove-shebangs-from-library-files.patch [email protected] -- remove # shebangs from library files Patch1: 0001-Remove-shebangs-from-library-files.patch @@ -62,7 +59,6 @@ %package -n python-pssh Summary: Python Module for Parallel SSH -Group: Development/Libraries/Python Requires: openssh Requires: rsync @@ -81,8 +77,17 @@ %install %pyproject_install +# setup.cfg (2.3.5+) no longer installs the man pages +install -Dpm 0644 -t %{buildroot}%{_mandir}/man1 man/man1/*.1 %fdupes %{buildroot}%{python3_sitelib} +%check +# upstream's test/test.py needs live ssh hosts: smoke-test the CLIs only +export PYTHONPATH=%{buildroot}%{python3_sitelib} +for t in pssh pscp prsync pslurp pnuke; do + %{buildroot}%{_bindir}/$t --version +done + %files %doc AUTHORS ChangeLog %license COPYING @@ -104,6 +109,6 @@ %files -n python-pssh %license COPYING %doc AUTHORS ChangeLog -%{python3_sitelib}/%{name}-%{pkg_version}.dist-info +%{python3_sitelib}/%{name}-%{version}.dist-info %{python3_sitelib}/%{name}lib ++++++ 0002-Add-quiet-option.patch ++++++ --- /var/tmp/diff_new_pack.JZg8Vo/_old 2026-10-23 20:31:39.324022758 +0200 +++ /var/tmp/diff_new_pack.JZg8Vo/_new 2026-10-23 20:31:39.327022884 +0200 @@ -9,8 +9,6 @@ psshlib/task.py | 16 +++++++++++----- 3 files changed, 25 insertions(+), 7 deletions(-) -diff --git a/man/man1/pssh.1 b/man/man1/pssh.1 -index e50efc78e84e..122e253793d8 100644 --- a/man/man1/pssh.1 +++ b/man/man1/pssh.1 @@ -7,7 +7,7 @@ pssh \(em parallel ssh program @@ -22,7 +20,7 @@ .RB [ \-h .IR hosts_file ] .RB [ \-H -@@ -31,7 +31,7 @@ pssh \(em parallel ssh program +@@ -33,7 +33,7 @@ pssh \(em parallel ssh program .I command ... .B pssh \-I @@ -31,7 +29,7 @@ .RB [ \-h .IR hosts_file ] .RB [ \-H -@@ -237,6 +237,15 @@ and +@@ -252,6 +252,15 @@ and options. .TP @@ -47,11 +45,9 @@ .B \-I .PD 0 .TP -diff --git a/psshlib/cli.py b/psshlib/cli.py -index c342cde47dad..58bd9332ce3d 100644 --- a/psshlib/cli.py +++ b/psshlib/cli.py -@@ -45,6 +45,8 @@ def common_parser(): +@@ -47,6 +47,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)') @@ -60,7 +56,7 @@ 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', -@@ -66,6 +68,7 @@ def common_defaults(**kwargs): +@@ -70,6 +72,7 @@ def common_defaults(**kwargs): ('errdir', 'PSSH_ERRDIR'), ('timeout', 'PSSH_TIMEOUT'), ('verbose', 'PSSH_VERBOSE'), @@ -68,11 +64,9 @@ ('print_out', 'PSSH_PRINT'), ('askpass', 'PSSH_ASKPASS'), ('inline', 'PSSH_INLINE'), -diff --git a/psshlib/task.py b/psshlib/task.py -index f8052563f9e9..0c74db517ae4 100644 --- a/psshlib/task.py +++ b/psshlib/task.py -@@ -56,6 +56,7 @@ class Task(object): +@@ -60,6 +60,7 @@ class Task(object): # Set options. self.verbose = opts.verbose @@ -80,7 +74,7 @@ try: self.print_out = bool(opts.print_out) except AttributeError: -@@ -188,7 +189,10 @@ class Task(object): +@@ -199,7 +200,10 @@ class Task(object): buf = os.read(fd, BUFFER_SIZE) if buf: if self.inline or self.inline_stdout: @@ -92,28 +86,25 @@ if self.outfile: self.writer.write(self.outfile, buf) if self.print_out: -@@ -264,10 +268,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))) +@@ -282,10 +286,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))) + else: + stderr = '' # 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: -@@ -286,3 +291,4 @@ class Task(object): +@@ -306,3 +311,4 @@ class Task(object): except AttributeError: sys.stdout.write(self.errorbuffer) +# vim:ts=4:sw=4:et: --- -1.8.4 - ++++++ 0003-Fix-order-of-command-statuses-returned-by-the-Manage.patch ++++++ --- /var/tmp/diff_new_pack.JZg8Vo/_old 2026-10-23 20:31:39.340023429 +0200 +++ /var/tmp/diff_new_pack.JZg8Vo/_new 2026-10-23 20:31:39.343023555 +0200 @@ -7,19 +7,17 @@ psshlib/manager.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) -diff --git a/psshlib/manager.py b/psshlib/manager.py -index 7dbf4e377116..06e1cf31a010 100644 --- a/psshlib/manager.py +++ b/psshlib/manager.py -@@ -8,6 +8,7 @@ +@@ -8,6 +8,7 @@ import signal import sys import threading import queue +import copy from psshlib.askpass_server import PasswordServer - from psshlib import psshutil -@@ -42,6 +43,7 @@ + +@@ -41,6 +42,7 @@ class Manager(object): self.next_nodenum = 0 self.numnodes = 0 self.tasks = [] @@ -27,7 +25,7 @@ self.running = [] self.done = [] -@@ -49,6 +51,7 @@ +@@ -48,6 +50,7 @@ class Manager(object): def run(self): """Processes tasks previously added with add_task.""" @@ -35,7 +33,7 @@ try: if self.outdir or self.errdir: writer = Writer(self.outdir, self.errdir, self.fileappend) -@@ -87,7 +90,7 @@ +@@ -86,7 +89,7 @@ class Manager(object): writer.signal_quit() writer.join() ++++++ 0008-openSUSE-add-C-pcmk_nodes-option-to-get-list-of-node.patch ++++++ --- /var/tmp/diff_new_pack.JZg8Vo/_old 2026-10-23 20:31:39.360024268 +0200 +++ /var/tmp/diff_new_pack.JZg8Vo/_new 2026-10-23 20:31:39.363024393 +0200 @@ -14,8 +14,6 @@ psshlib/psshutil.py | 30 ++++++++++++++++++++++++++++++ 7 files changed, 49 insertions(+), 5 deletions(-) -diff --git a/bin/pnuke b/bin/pnuke -index 884ac25a1d35..ec314f3858e8 100755 --- a/bin/pnuke +++ b/bin/pnuke @@ -40,7 +40,7 @@ def parse_args(): @@ -34,11 +32,9 @@ + if opts.pcmk_nodes: + hosts += psshutil.get_pcmk_nodes() do_pnuke(hosts, pattern, opts) -diff --git a/bin/prsync b/bin/prsync -index 5e25786a90e8..d7868c87a945 100755 --- a/bin/prsync +++ b/bin/prsync -@@ -52,7 +52,7 @@ def parse_args(): +@@ -55,7 +55,7 @@ def parse_args(): if len(args) < 2: parser.error('Remote path not specified.') @@ -47,18 +43,16 @@ parser.error('Hosts not specified.') return opts, args -@@ -117,4 +117,6 @@ if __name__ == "__main__": +@@ -131,4 +131,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 d569be7d5404..4408913ce077 100755 --- a/bin/pscp +++ b/bin/pscp -@@ -47,7 +47,7 @@ def parse_args(): +@@ -52,7 +52,7 @@ def parse_args(): if len(args) < 2: parser.error('Remote path not specified.') @@ -67,18 +61,16 @@ parser.error('Hosts not specified.') return opts, args -@@ -102,4 +102,6 @@ if __name__ == "__main__": +@@ -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_pscp(hosts, localargs, remote, opts) -diff --git a/bin/pslurp b/bin/pslurp -index c7dece656f1b..0f17b5bc87d9 100755 --- a/bin/pslurp +++ b/bin/pslurp -@@ -52,7 +52,7 @@ def parse_args(): +@@ -51,7 +51,7 @@ def parse_args(): if len(args) > 2: parser.error('Extra arguments given after the local path.') @@ -87,18 +79,16 @@ parser.error('Hosts not specified.') return opts, args -@@ -126,4 +126,6 @@ if __name__ == "__main__": +@@ -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_pslurp(hosts, remote, local, opts) -diff --git a/bin/pssh b/bin/pssh -index 5b6c2a5e4661..cf02f40c2fbd 100755 --- a/bin/pssh +++ b/bin/pssh -@@ -54,7 +54,7 @@ def parse_args(): +@@ -55,7 +55,7 @@ def parse_args(): if len(args) == 0 and not opts.send_input: parser.error('Command not specified.') @@ -107,7 +97,7 @@ parser.error('Hosts not specified.') return opts, args -@@ -112,6 +112,10 @@ if __name__ == "__main__": +@@ -113,6 +113,10 @@ if __name__ == "__main__": _, e, _ = sys.exc_info() sys.stderr.write('Could not open hosts file: %s\n' % e.strerror) sys.exit(1) @@ -118,8 +108,6 @@ 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 611fadb6eb16..09e2571f3c6c 100644 --- a/psshlib/cli.py +++ b/psshlib/cli.py @@ -31,6 +31,8 @@ def common_parser(): @@ -131,11 +119,9 @@ 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 6c67f667637e..274b3b92546c 100644 --- a/psshlib/psshutil.py +++ b/psshlib/psshutil.py -@@ -5,6 +5,7 @@ +@@ -4,6 +4,7 @@ import re import sys import fnmatch @@ -143,8 +129,8 @@ 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) +@@ -99,4 +100,31 @@ def parse_host(host, default_user=None, + host = host[1:-1] return (host, port, user) +def get_pcmk_nodes(): @@ -175,15 +161,4 @@ + 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: --- -1.8.4 -
