Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package crmsh for openSUSE:Factory checked in at 2024-08-20 16:14:10 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/crmsh (Old) and /work/SRC/openSUSE:Factory/.crmsh.new.2698 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "crmsh" Tue Aug 20 16:14:10 2024 rev:341 rq:1194792 version:5.0.0+20240812.49aeacfa Changes: -------- --- /work/SRC/openSUSE:Factory/crmsh/crmsh.changes 2024-08-05 17:22:56.815234377 +0200 +++ /work/SRC/openSUSE:Factory/.crmsh.new.2698/crmsh.changes 2024-08-20 16:14:23.888653283 +0200 @@ -1,0 +2,13 @@ +Mon Aug 12 12:58:02 UTC 2024 - xli...@suse.com + +- Update to version 5.0.0+20240812.49aeacfa: + * Dev: Add option core.add_advised_op_values, default value is 'yes' + * Dev: Rename variable 'add_default_op_values' to 'add_advised_op_values' + +------------------------------------------------------------------- +Tue Aug 06 08:10:09 UTC 2024 - alex_burla...@gmx.de + +- Update to version 5.0.0+20240806.7e270329: + * Dev: scripts/health/collect: use ansible to get sysinfo + +------------------------------------------------------------------- Old: ---- crmsh-5.0.0+20240731.2abacf27.tar.bz2 New: ---- crmsh-5.0.0+20240812.49aeacfa.tar.bz2 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ crmsh.spec ++++++ --- /var/tmp/diff_new_pack.EDX7F1/_old 2024-08-20 16:14:24.464676926 +0200 +++ /var/tmp/diff_new_pack.EDX7F1/_new 2024-08-20 16:14:24.468677091 +0200 @@ -36,7 +36,7 @@ Summary: High Availability cluster command-line interface License: GPL-2.0-or-later Group: %{pkg_group} -Version: 5.0.0+20240731.2abacf27 +Version: 5.0.0+20240812.49aeacfa Release: 0 URL: http://crmsh.github.io Source0: %{name}-%{version}.tar.bz2 ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.EDX7F1/_old 2024-08-20 16:14:24.512678896 +0200 +++ /var/tmp/diff_new_pack.EDX7F1/_new 2024-08-20 16:14:24.516679060 +0200 @@ -9,7 +9,7 @@ </service> <service name="tar_scm"> <param name="url">https://github.com/ClusterLabs/crmsh.git</param> - <param name="changesrevision">2abacf273fa8804ad537d8338127b93e30bf2a49</param> + <param name="changesrevision">697716cd3b27ea6437aaee8e428d785fa6303818</param> </service> </servicedata> (No newline at EOF) ++++++ crmsh-5.0.0+20240731.2abacf27.tar.bz2 -> crmsh-5.0.0+20240812.49aeacfa.tar.bz2 ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/crmsh-5.0.0+20240731.2abacf27/crmsh/cibconfig.py new/crmsh-5.0.0+20240812.49aeacfa/crmsh/cibconfig.py --- old/crmsh-5.0.0+20240731.2abacf27/crmsh/cibconfig.py 2024-07-31 08:38:07.000000000 +0200 +++ new/crmsh-5.0.0+20240812.49aeacfa/crmsh/cibconfig.py 2024-08-12 14:28:46.000000000 +0200 @@ -854,7 +854,7 @@ output: XML, obj_type, obj_id """ node = None - default_op_values = False + advised_op_values = False default_promotable_meta = False comments = [] if isinstance(cli, str): @@ -864,12 +864,12 @@ else: # should be a pre-tokenized list utils.auto_convert_role = True if len(cli) >= 3 and cli[0] == "primitive" and cli[2].startswith("@"): - default_op_values = False + advised_op_values = False default_promotable_meta = False else: - default_op_values = True + advised_op_values = config.core.add_advised_op_values default_promotable_meta = True - node = parse.parse(cli, comments=comments, ignore_empty=False, add_default_op_values=default_op_values) + node = parse.parse(cli, comments=comments, ignore_empty=False, add_advised_op_values=advised_op_values) if node is False: return None, None, None elif node is None: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/crmsh-5.0.0+20240731.2abacf27/crmsh/config.py new/crmsh-5.0.0+20240812.49aeacfa/crmsh/config.py --- old/crmsh-5.0.0+20240731.2abacf27/crmsh/config.py 2024-07-31 08:38:07.000000000 +0200 +++ new/crmsh-5.0.0+20240812.49aeacfa/crmsh/config.py 2024-08-12 14:28:46.000000000 +0200 @@ -256,6 +256,7 @@ 'ignore_missing_metadata': opt_boolean('no'), 'report_tool_options': opt_string(''), 'lock_timeout': opt_string('120'), + 'add_advised_op_values': opt_boolean('yes'), 'OCF_1_1_SUPPORT': opt_boolean('yes'), 'obscure_pattern': opt_string('passw*') }, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/crmsh-5.0.0+20240731.2abacf27/crmsh/parse.py new/crmsh-5.0.0+20240812.49aeacfa/crmsh/parse.py --- old/crmsh-5.0.0+20240731.2abacf27/crmsh/parse.py 2024-07-31 08:38:07.000000000 +0200 +++ new/crmsh-5.0.0+20240812.49aeacfa/crmsh/parse.py 2024-08-12 14:28:46.000000000 +0200 @@ -170,13 +170,13 @@ self.begin(cmd, min_args=min_args) return self.match_dispatch(errmsg="Unknown command") - def do_parse(self, cmd, ignore_empty, add_default_op_values): + def do_parse(self, cmd, ignore_empty, add_advised_op_values): """ Called by CliParser. Calls parse() Parsers should pass their return value through this method. """ self.ignore_empty = ignore_empty - self.add_default_op_values = add_default_op_values + self.add_advised_op_values = add_advised_op_values out = self.parse(cmd) if self.has_tokens(): self.err("Unknown arguments: " + ' '.join(self._cmd[self._currtok:])) @@ -661,7 +661,7 @@ """ Add default operation actions advised values """ - if not self.add_default_op_values or out.tag != "primitive": + if not self.add_advised_op_values or out.tag != "primitive": return ra_inst = ra.RAInfo(out.get('class'), out.get('type'), out.get('provider')) ra_actions_dict = ra_inst.actions() @@ -753,7 +753,7 @@ inst_attrs = xmlutil.child(container_node, name) # set meaningful id for port-mapping and storage-mapping # when the bundle is newly created - if self.add_default_op_values: + if self.add_advised_op_values: id_str = f"{bundle_id}_{name.replace('-', '_')}_{index}" inst_attrs.set('id', id_str) child_flag = True @@ -1794,7 +1794,7 @@ return ret -def parse(s, comments=None, ignore_empty=True, add_default_op_values=False): +def parse(s, comments=None, ignore_empty=True, add_advised_op_values=False): ''' Input: a list of tokens (or a CLI format string). Return: a cibobject @@ -1840,7 +1840,7 @@ return False try: - ret = parser.do_parse(s, ignore_empty, add_default_op_values) + ret = parser.do_parse(s, ignore_empty, add_advised_op_values) if ret is not None and len(comments) > 0: if ret.tag in constants.defaults_tags: xmlutil.stuff_comments(ret[0], comments) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/crmsh-5.0.0+20240731.2abacf27/crmsh/utils.py new/crmsh-5.0.0+20240812.49aeacfa/crmsh/utils.py --- old/crmsh-5.0.0+20240731.2abacf27/crmsh/utils.py 2024-07-31 08:38:07.000000000 +0200 +++ new/crmsh-5.0.0+20240812.49aeacfa/crmsh/utils.py 2024-08-12 14:28:46.000000000 +0200 @@ -24,6 +24,7 @@ import gzip import bz2 import lzma +import json from pathlib import Path from contextlib import contextmanager, closing from stat import S_ISBLK @@ -3137,4 +3138,27 @@ Check if the time value contains unit """ return re.search(r'^\d+[a-z]+$', time_value) is not None + + +def ansible_installed(): + return shutil.which('ansible') + + +def ansible_facts(module_name) -> dict: + proc = subprocess.run(['ansible', '-m', module_name, 'localhost'] + , capture_output=True, text=True) + out = proc.stdout + # output format 'localhost | SUCCESS => { json...' + bracket_pos = out.find('{') + if bracket_pos == -1: + logger.error("Parsing ansible output.") + return {} + is_ok = out[:bracket_pos].find('SUCCESS =>') + if is_ok == -1: + logger.error("Failure calling ansible module.") + return {} + # get the json part + out = out[bracket_pos:] + json_tree = json.loads(out) + return json_tree['ansible_facts'] # vim:ts=4:sw=4:et: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/crmsh-5.0.0+20240731.2abacf27/etc/crm.conf.in new/crmsh-5.0.0+20240812.49aeacfa/etc/crm.conf.in --- old/crmsh-5.0.0+20240731.2abacf27/etc/crm.conf.in 2024-07-31 08:38:07.000000000 +0200 +++ new/crmsh-5.0.0+20240812.49aeacfa/etc/crm.conf.in 2024-08-12 14:28:46.000000000 +0200 @@ -20,6 +20,7 @@ ; ignore_missing_metadata = no ; report_tool_options = ; lock_timeout = 120 +; add_advised_op_values = yes ; set OCF_1_1_SUPPORT to yes is to fully turn on OCF 1.1 feature once the corresponding CIB detected. ; OCF_1_1_SUPPORT = yes diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/crmsh-5.0.0+20240731.2abacf27/scripts/health/collect.py new/crmsh-5.0.0+20240812.49aeacfa/scripts/health/collect.py --- old/crmsh-5.0.0+20240731.2abacf27/scripts/health/collect.py 2024-07-31 08:38:07.000000000 +0200 +++ new/crmsh-5.0.0+20240812.49aeacfa/scripts/health/collect.py 2024-08-12 14:28:46.000000000 +0200 @@ -10,6 +10,7 @@ import crmsh.log crmsh.log.setup_logging() from crmsh.report import utils +import crmsh.utils data = crm_script.get_input() @@ -32,6 +33,27 @@ def sys_info(): + with open('/proc/uptime') as f: + uptime = f.read().split() + + if crmsh.utils.ansible_installed(): + facts = crmsh.utils.ansible_facts('setup') + + return {'system': facts.get("ansible_system"), + 'node': facts.get("ansible_hostname"), + 'release': facts.get("ansible_kernel"), + 'version': facts.get("ansible_kernel_version"), + 'machine': facts.get("ansible_machine"), + 'processor': facts.get("ansible_architecture"), + 'distname': facts.get("ansible_distribution"), + 'user': facts.get("ansible_user_id"), + 'hostname': facts.get("ansible_nodename"), + 'uptime': facts.get("ansible_uptime_seconds"), + 'idletime': uptime[1], # :( not in ansible setup module + 'loadavg': facts.get("ansible_loadavg").get("15m") # 15 minute average + } + + # if ansible is not installed, do it like before sysname, nodename, release, version, machine = os.uname() # The first three columns measure CPU and IO utilization of the # last one, five, and 15 minute periods. The fourth column shows @@ -41,8 +63,8 @@ distname = utils.get_distro_info() hostname = os.uname()[1] - uptime = open('/proc/uptime').read().split() - loadavg = open('/proc/loadavg').read().split() + with open('/proc/loadavg') as f: + loadavg = f.read().split() return {'system': system, 'node': node, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/crmsh-5.0.0+20240731.2abacf27/utils/crm_rpmcheck.py new/crmsh-5.0.0+20240812.49aeacfa/utils/crm_rpmcheck.py --- old/crmsh-5.0.0+20240731.2abacf27/utils/crm_rpmcheck.py 2024-07-31 08:38:07.000000000 +0200 +++ new/crmsh-5.0.0+20240812.49aeacfa/utils/crm_rpmcheck.py 2024-08-12 14:28:46.000000000 +0200 @@ -7,6 +7,7 @@ import json import subprocess import shutil +from crmsh import utils def run(cmd): proc = subprocess.Popen(cmd, @@ -23,10 +24,8 @@ """ Gathers version and release information about a package. """ - if shutil.which('ansible'): - rc, data = ansible_package_data(pkg) - if rc == 0: - return data + if utils.ansible_installed(): + return ansible_package_data(pkg) if shutil.which('rpm'): return rpm_package_data(pkg) @@ -36,36 +35,23 @@ return {'name': pkg, 'error': "unknown package manager"} + _packages = None -def ansible_package_data(pkg) -> tuple[int, dict]: +def ansible_package_data(pkg) -> dict: """ Gathers version and release information about a package. Using ansible. """ + # if _packages is None, then get it global _packages if not _packages: - # if _packages is None, then get it - rc, out, err = run(['ansible', '-m', 'package_facts', 'localhost']) - if rc == -1: - return -1, {} - # output format 'localhost | SUCCESS => { json...' - bracket_pos = out.find('{') - if bracket_pos == -1: - return -1, {} - is_ok = out[:bracket_pos].find('SUCCESS =>') - if is_ok == -1: - return -1, {} - - # get the json part - out = out[bracket_pos:] - json_tree = json.loads(out) - # get _packages - _packages = json_tree['ansible_facts']['packages'] - - if pkg not in _packages: - return 0, {'name': pkg, 'error': "package not installed"} - else: - return 0, _packages[pkg][0] + facts = utils.ansible_facts('package_facts') + _packages = facts.get('packages') + + if _packages and pkg in _packages: + return _packages[pkg][0] + + return {'name': pkg, 'error': "package not installed"} def rpm_package_data(pkg):