Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package crmsh for openSUSE:Factory checked in at 2026-06-15 19:50:13 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/crmsh (Old) and /work/SRC/openSUSE:Factory/.crmsh.new.1981 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "crmsh" Mon Jun 15 19:50:13 2026 rev:412 rq:1359524 version:5.1.0+20260615.8409ea5a Changes: -------- --- /work/SRC/openSUSE:Factory/crmsh/crmsh.changes 2026-06-10 16:19:08.661342715 +0200 +++ /work/SRC/openSUSE:Factory/.crmsh.new.1981/crmsh.changes 2026-06-15 19:53:51.513621227 +0200 @@ -1,0 +2,16 @@ +Mon Jun 15 10:14:21 UTC 2026 - [email protected] + +- Update to version 5.1.0+20260615.8409ea5a: + * Dev: bootstrap: add a warning about deprecating unencrypted/unauthenticated knet transport (jsc#PED-16433) + * Dev: bootstrap: update warning about deprecating legacy transports (jsc#PED-16433) + +------------------------------------------------------------------- +Thu Jun 11 07:56:57 UTC 2026 - [email protected] + +- Update to version 5.1.0+20260611.7998ffe4: + * Dev: help: Refactor to encapsulate alias help logic in subclass + * Dev: help: Give the correct level index to fuzzy search for topic help + * Dev: help: Show alias command info + * Dev: crm.8.adoc: Improve crm.8.adoc + +------------------------------------------------------------------- Old: ---- crmsh-5.1.0+20260610.968f62d8.tar.bz2 New: ---- crmsh-5.1.0+20260615.8409ea5a.tar.bz2 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ crmsh.spec ++++++ --- /var/tmp/diff_new_pack.tsYeQz/_old 2026-06-15 19:53:54.113730293 +0200 +++ /var/tmp/diff_new_pack.tsYeQz/_new 2026-06-15 19:53:54.129730963 +0200 @@ -41,7 +41,7 @@ Summary: High Availability cluster command-line interface License: GPL-2.0-or-later Group: %{pkg_group} -Version: 5.1.0+20260610.968f62d8 +Version: 5.1.0+20260615.8409ea5a Release: 0 URL: http://crmsh.github.io Source0: %{name}-%{version}.tar.bz2 ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.tsYeQz/_old 2026-06-15 19:53:54.353740360 +0200 +++ /var/tmp/diff_new_pack.tsYeQz/_new 2026-06-15 19:53:54.409742709 +0200 @@ -9,7 +9,7 @@ </service> <service name="tar_scm"> <param name="url">https://github.com/ClusterLabs/crmsh.git</param> - <param name="changesrevision">b3a04e59685c33f4cb2f70929483e9157a39d557</param> + <param name="changesrevision">69bca8d37b097414990f2291b69f39f6bdb1d8a2</param> </service> </servicedata> (No newline at EOF) ++++++ crmsh-5.1.0+20260610.968f62d8.tar.bz2 -> crmsh-5.1.0+20260615.8409ea5a.tar.bz2 ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/crmsh-5.1.0+20260610.968f62d8/crmsh/bootstrap.py new/crmsh-5.1.0+20260615.8409ea5a/crmsh/bootstrap.py --- old/crmsh-5.1.0+20260610.968f62d8/crmsh/bootstrap.py 2026-06-10 12:28:20.000000000 +0200 +++ new/crmsh-5.1.0+20260615.8409ea5a/crmsh/bootstrap.py 2026-06-15 11:35:01.000000000 +0200 @@ -1464,9 +1464,28 @@ if _context.transport != 'knet': logger.warning( - 'Transport %s does not support encryption and message authentication. Corosync traffic will be in cleartext.', + 'Transport %s is deprecated and does not support encryption and message authentication. ' + 'Corosync traffic will be in cleartext. Encryption will be enforced in future versions.', _context.transport, ) + else: + cipher = _context.profiles_dict.get('corosync.totem.crypto_cipher') + hash_algo = _context.profiles_dict.get('corosync.totem.crypto_hash') + secauth = _context.profiles_dict.get('corosync.totem.secauth') + + is_encrypted = True + if secauth == 'on': + if cipher == 'none' or hash_algo == 'none': + is_encrypted = False + else: + if not cipher or cipher == 'none' or not hash_algo or hash_algo == 'none': + is_encrypted = False + + if not is_encrypted: + logger.warning( + 'It is deprecated to disable knet encryption/authentication. ' + 'Corosync traffic will be in cleartext. Encryption will be enforced in future versions.' + ) config_corosync_conf() adjust_corosync_parameters_according_to_profiles() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/crmsh-5.1.0+20260610.968f62d8/crmsh/help.py new/crmsh-5.1.0+20260615.8409ea5a/crmsh/help.py --- old/crmsh-5.1.0+20260610.968f62d8/crmsh/help.py 2026-06-10 12:28:20.000000000 +0200 +++ new/crmsh-5.1.0+20260615.8409ea5a/crmsh/help.py 2026-06-15 11:35:01.000000000 +0200 @@ -77,13 +77,12 @@ class HelpEntry(object): - def __init__(self, short_help, long_help='', alias_for=None, generated=False): + def __init__(self, short_help, long_help='', generated=False): if short_help: self.short = short_help[0].upper() + short_help[1:] else: self.short = 'Help' self._long_help = long_help - self.alias_for = alias_for self.generated = generated @property @@ -94,8 +93,8 @@ def long_help(self, value): self._long_help = value - def is_alias(self): - return self.alias_for is not None + def get_prefix(self): + return '' def paginate(self): ''' @@ -111,10 +110,7 @@ if not long_help.startswith('\n'): long_help = '\n' + long_help - prefix = '' - if self.is_alias(): - prefix = helpfilter("(Redirected from `%s` to `%s`)\n" % self.alias_for) - + prefix = self.get_prefix() utils.page_string(short_help + '\n' + prefix + long_help) def __str__(self): @@ -126,15 +122,37 @@ return str(self) +class AliasHelpEntry(HelpEntry): + """ + Represents an alias help entry. + Delegates long_help to the target HelpEntry to preserve lazy loading. + """ + def __init__(self, target: HelpEntry, alias_for: str, alias_name: str): + super().__init__(target.short, generated=target.generated) + self.target = target + self.alias_for = alias_for + self.alias_name = alias_name + + @property + def long_help(self): + return self.target.long_help + + def get_prefix(self): + helpfilter = HelpFilter() + msg_alias = f"Command `{self.alias_name}` is an alias for `{self.alias_for}`" + msg_deprecated = f"`{self.alias_name}` is deprecated and will be removed in a future release" + return helpfilter(f"({msg_alias}. {msg_deprecated})\n") + + class LazyHelpEntryFromCli(HelpEntry): """lazy load from cli --help""" def __init__( self, short_help: str, cmd_args: typing.Sequence[str], - alias_for=None, generated=False, + generated=False, ): - super().__init__(short_help, '', alias_for, generated) + super().__init__(short_help, '', generated) self._cmd_args = cmd_args @functools.cached_property @@ -169,7 +187,7 @@ HELP_FILE = os.path.join(config.path.sharedir, 'crm.8.adoc') -_DEFAULT = HelpEntry('No help available', long_help='', alias_for=None, generated=True) +_DEFAULT = HelpEntry('No help available', long_help='', generated=True) _REFERENCE_RE = re.compile(r'<<[^,]+,(.+)>>') # loaded on demand @@ -339,8 +357,8 @@ else: raise ValueError(f"Unknown property '{property_name}'") return None - else: - topic = levels[0].lower() + elif len(levels) <= 2: + topic = levels[-1].lower() t = utils.fuzzy_get(_TOPICS, topic) if t: return t @@ -441,9 +459,20 @@ "add help for aliases" for name, childinfo in childinfo.children.items(): if name in help_node.children: + if name != childinfo.name: # Skip alias entries during canonical traversal + continue fixup_help_aliases(help_node.children[name], childinfo) for alias in childinfo.aliases: - help_node.children[alias] = help_node.children[name] + target = help_node.children[name] + help_node.children[alias] = SubcommandTreeNode( + alias, + AliasHelpEntry( + target.help, + alias_for=target.name, + alias_name=alias + ), + target.children + ) return def fixup_topics(): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/crmsh-5.1.0+20260610.968f62d8/doc/crm.8.adoc new/crmsh-5.1.0+20260615.8409ea5a/doc/crm.8.adoc --- old/crmsh-5.1.0+20260610.968f62d8/doc/crm.8.adoc 2026-06-10 12:28:20.000000000 +0200 +++ new/crmsh-5.1.0+20260615.8409ea5a/doc/crm.8.adoc 2026-06-15 11:35:01.000000000 +0200 @@ -1837,6 +1837,8 @@ unban <rsc> ............... +Note: `migrate` is an alias for `move` command, `unmigrate`, `unban` are aliases for `clear` command. + [[cmdhelp.resource.constraints,Show constraints affecting a resource]] ==== `constraints` @@ -3263,7 +3265,7 @@ ************************** [[cmdhelp.configure.get_property,Get property value]] -==== `get-property` +==== `get_property` Show the value of the given property. If the value is not set, the command will print the default value for the property, if known. @@ -3275,19 +3277,19 @@ property sets with different rule expressions, the output of this command is undefined. -Pass the argument +-t+ or +--true+ to `get-property` to translate +Pass the argument +-t+ or +--true+ to `get_property` to translate the argument value into +true+ or +false+. If the value is not set, the command will print +false+. Usage: ............... -get-property [-t|--true] [<name>] +get_property [-t|--true] [<name>] ............... Example: ............... -get-property fencing-enabled -get-property -t maintenance-mode +get_property fencing-enabled +get_property -t maintenance-mode ............... [[cmdhelp.configure.graph,generate a directed graph]] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/crmsh-5.1.0+20260610.968f62d8/test/features/bootstrap_options.feature new/crmsh-5.1.0+20260615.8409ea5a/test/features/bootstrap_options.feature --- old/crmsh-5.1.0+20260610.968f62d8/test/features/bootstrap_options.feature 2026-06-10 12:28:20.000000000 +0200 +++ new/crmsh-5.1.0+20260615.8409ea5a/test/features/bootstrap_options.feature 2026-06-15 11:35:01.000000000 +0200 @@ -172,7 +172,8 @@ Given Cluster service is "stopped" on "hanode1" Given Cluster service is "stopped" on "hanode2" When Run "crm cluster init -y -t udpu" on "hanode1" - Then Cluster service is "started" on "hanode1" + Then Except "Transport udpu is deprecated and does not support encryption and message authentication. Corosync traffic will be in cleartext. Encryption will be enforced in future versions." in stderr + And Cluster service is "started" on "hanode1" When Run "crm cluster join -c hanode1 -y" on "hanode2" Then Cluster service is "started" on "hanode2" Then Cluster is using "udpu" transport mode @@ -182,7 +183,8 @@ Given Cluster service is "stopped" on "hanode1" Given Cluster service is "stopped" on "hanode2" When Run "crm cluster init -y -t udp" on "hanode1" - Then Cluster service is "started" on "hanode1" + Then Except "Transport udp is deprecated and does not support encryption and message authentication. Corosync traffic will be in cleartext. Encryption will be enforced in future versions." in stderr + And Cluster service is "started" on "hanode1" When Run "crm cluster join -c hanode1 -y" on "hanode2" Then Cluster service is "started" on "hanode2" Then Cluster is using "udp" transport mode diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/crmsh-5.1.0+20260610.968f62d8/test/unittests/test_bootstrap.py new/crmsh-5.1.0+20260615.8409ea5a/test/unittests/test_bootstrap.py --- old/crmsh-5.1.0+20260610.968f62d8/test/unittests/test_bootstrap.py 2026-06-10 12:28:20.000000000 +0200 +++ new/crmsh-5.1.0+20260615.8409ea5a/test/unittests/test_bootstrap.py 2026-06-15 11:35:01.000000000 +0200 @@ -1579,6 +1579,75 @@ mock.call(None, f"systemctl is-failed {constants.PCMK_SERVICE}") ]) + @mock.patch('crmsh.bootstrap.logger.warning') + @mock.patch('crmsh.bootstrap.adjust_corosync_parameters_according_to_profiles') + @mock.patch('crmsh.bootstrap.config_corosync_conf') + @mock.patch('crmsh.bootstrap.init_corosync_auth') + @mock.patch('os.path.exists') + def test_init_corosync_warning_non_knet(self, mock_exists, mock_auth, mock_conf, mock_adjust, mock_warning): + mock_exists.return_value = False + bootstrap._context = mock.Mock(transport='udpu') + bootstrap.init_corosync() + mock_warning.assert_called_once_with( + 'Transport %s is deprecated and does not support encryption and message authentication. ' + 'Corosync traffic will be in cleartext. Encryption will be enforced in future versions.', + 'udpu', + ) + + @mock.patch('crmsh.bootstrap.logger.warning') + @mock.patch('crmsh.bootstrap.adjust_corosync_parameters_according_to_profiles') + @mock.patch('crmsh.bootstrap.config_corosync_conf') + @mock.patch('crmsh.bootstrap.init_corosync_auth') + @mock.patch('os.path.exists') + def test_init_corosync_no_warning_knet(self, mock_exists, mock_auth, mock_conf, mock_adjust, mock_warning): + mock_exists.return_value = False + profiles = { + 'corosync.totem.crypto_cipher': 'aes256', + 'corosync.totem.crypto_hash': 'sha256', + 'corosync.totem.secauth': None + } + bootstrap._context = mock.Mock(transport='knet', profiles_dict=profiles) + bootstrap.init_corosync() + mock_warning.assert_not_called() + + @mock.patch('crmsh.bootstrap.logger.warning') + @mock.patch('crmsh.bootstrap.adjust_corosync_parameters_according_to_profiles') + @mock.patch('crmsh.bootstrap.config_corosync_conf') + @mock.patch('crmsh.bootstrap.init_corosync_auth') + @mock.patch('os.path.exists') + def test_init_corosync_knet_warning_disabled(self, mock_exists, mock_auth, mock_conf, mock_adjust, mock_warning): + mock_exists.return_value = False + profiles = { + 'corosync.totem.crypto_cipher': 'none', + 'corosync.totem.crypto_hash': 'sha256', + 'corosync.totem.secauth': None + } + bootstrap._context = mock.Mock(transport='knet', profiles_dict=profiles) + bootstrap.init_corosync() + mock_warning.assert_called_once_with( + 'It is deprecated to disable knet encryption/authentication. ' + 'Corosync traffic will be in cleartext. Encryption will be enforced in future versions.' + ) + + @mock.patch('crmsh.bootstrap.logger.warning') + @mock.patch('crmsh.bootstrap.adjust_corosync_parameters_according_to_profiles') + @mock.patch('crmsh.bootstrap.config_corosync_conf') + @mock.patch('crmsh.bootstrap.init_corosync_auth') + @mock.patch('os.path.exists') + def test_init_corosync_knet_warning_secauth_on_but_none(self, mock_exists, mock_auth, mock_conf, mock_adjust, mock_warning): + mock_exists.return_value = False + profiles = { + 'corosync.totem.crypto_cipher': 'none', + 'corosync.totem.crypto_hash': 'sha256', + 'corosync.totem.secauth': 'on' + } + bootstrap._context = mock.Mock(transport='knet', profiles_dict=profiles) + bootstrap.init_corosync() + mock_warning.assert_called_once_with( + 'It is deprecated to disable knet encryption/authentication. ' + 'Corosync traffic will be in cleartext. Encryption will be enforced in future versions.' + ) + class TestValidation(unittest.TestCase): """
