Compare commits

...

No commits in common. "c8" and "a8-beta" have entirely different histories.
c8 ... a8-beta

12 changed files with 57 additions and 2247 deletions

4
.gitignore vendored
View File

@ -1,2 +1,2 @@
SOURCES/sos-4.11.2.tar.gz
SOURCES/sos-audit-0.3-1.tgz
SOURCES/sos-4.5.0.tar.gz
SOURCES/sos-audit-0.3.tgz

View File

@ -1,2 +1,2 @@
d8d5e3e1eb124345417341ef9e9aa84f5cae609f SOURCES/sos-4.11.2.tar.gz
00752b68ec5e1141192a9dab7d44377b8d637bf7 SOURCES/sos-audit-0.3-1.tgz
d5e166c75250aef01c86a3a9d8c9fcc8db335f4e SOURCES/sos-4.5.0.tar.gz
9d478b9f0085da9178af103078bbf2fd77b0175a SOURCES/sos-audit-0.3.tgz

View File

@ -1,167 +0,0 @@
--- a/sos/report/plugins/coredump.py
+++ b/sos/report/plugins/coredump.py
@@ -72,8 +72,8 @@
cdump = line.split()
pid = cdump[4]
exe = cdump[-2]
- if regex := self.get_option("executable"):
- if not re.search(regex, exe, re.I):
+ if self.get_option("executable"):
+ if not re.search(self.get_option("executable"), exe, re.I):
continue
cinfo = self.collect_cmd_output(f"coredumpctl info {pid}")
if cinfo['status'] != 0:
--- a/sos/collector/sosnode.py
+++ b/sos/collector/sosnode.py
@@ -372,7 +372,8 @@
for line in result.splitlines():
if not is_list:
try:
- if ls := line.split():
+ ls = line.split()
+ if ls:
res.append(ls[0])
except Exception as err:
self.log_debug(f"Error parsing sos help: {err}")
--- a/sos/report/plugins/mongodb.py 2026-07-02 09:06:03.860609746 +0200
+++ b/sos/report/plugins/mongodb.py 2026-07-02 09:08:00.003595562 +0200
@@ -87,10 +87,13 @@
)
def setup(self):
- if get_juju_info := self.path_exists('/var/lib/juju/db'):
+ get_juju_info = self.path_exists('/var/lib/juju/db')
+ if get_juju_info:
self.db_folder = "/var/lib/juju/db"
- elif get_juju_info := self.path_exists('/var/snap/juju-db/curent/db'):
- self.db_folder = "/var/snap/juju-db/current/db"
+ else:
+ get_juju_info = self.path_exists('/var/snap/juju-db/current/db')
+ if get_juju_info:
+ self.db_folder = "/var/snap/juju-db/current/db"
super().setup()
--- a/sos/report/plugins/loki.py 2025-11-24 11:20:56.237814760 +0100
+++ b/sos/report/plugins/loki.py 2025-11-24 11:28:37.466603011 +0100
@@ -143,7 +143,8 @@
if self.get_option("collect-logs"):
endpoint = self.get_option("endpoint") or "http://localhost:3100"
self.labels = []
- if labels_option := self.get_option("labels"):
+ labels_option = self.get_option("labels")
+ if labels_option:
if isinstance(labels_option, str) and labels_option:
self.labels.extend(labels_option.split(":"))
--- a/sos/cleaner/__init__.py
+++ b/sos/cleaner/__init__.py
@@ -40,6 +40,8 @@ from sos.utilities import (get_human_rea
# an auxiliary method to kick off child processes over its instances
def _obfuscate_arc_files(arc, input_queue, output_queue):
+ arc.soslog = logging.getLogger('sos')
+ arc.ui_log = logging.getLogger('sos_ui')
while True:
try:
file = input_queue.get()
--- a/sos/cleaner/__init__.py 2026-07-01 13:45:34.298955340 +0200
+++ b/sos/cleaner/__init__.py 2026-07-01 13:47:15.978445308 +0200
@@ -795,6 +795,9 @@
# sentinel mark. That triggers the child processes to report back
# to output_queue some stats, and finish.
files_obfuscated_count = total_sub_count = removed_file_count = 0
+ # two nullification required before processes cloning
+ archive.soslog = None
+ archive.ui_log = None
input_queue = multiprocessing.Queue()
output_queue = multiprocessing.Queue()
--- a/sos/collector/sosnode.py 2026-04-02 10:15:34.743009569 +0200
+++ b/sos/collector/sosnode.py 2026-04-02 10:17:42.557250748 +0200
@@ -163,7 +163,8 @@
if not self._sudo_binary:
_bin = self.opts.sudo_binary.split('/')[-1]
# verify the provided binary is at least in our PATH
- if ret := self.run_command(f"command -v {_bin}"):
+ ret = self.run_command(f"command -v {_bin}")
+ if ret:
if not ret['status'] == 0:
err = f"Privilege escalation command not in PATH: {_bin}"
self.log_error(err)
--- a/sos/report/plugins/logs.py 2026-04-02 10:19:59.641196712 +0200
+++ b/sos/report/plugins/logs.py 2026-04-02 10:20:28.313299348 +0200
@@ -38,7 +38,8 @@
# this WILL break on anything other than basic echos
# as shown in the rsyslog documentation
if _ent.startswith('echo '):
- if envc := os.getenv(_ent.split()[1].strip(' $`')):
+ envc = os.getenv(_ent.split()[1].strip(' $`'))
+ if envc:
confs += glob.glob(envc)
else:
confs += glob.glob(_ent)
--- a/sos/report/plugins/charmed_cruise_control.py 2026-07-16 13:00:22.269714807 +0200
+++ b/sos/report/plugins/charmed_cruise_control.py 2026-07-16 13:01:56.710522628 +0200
@@ -35,7 +35,8 @@
) as f:
content = f.read().strip()
- if match := re.match(r"balancer: (?P<pwd>\w+),ADMIN", content):
+ match = re.match(r"balancer: (?P<pwd>\w+),ADMIN", content)
+ if match:
pwd = match.group("pwd")
return f"-u balancer:{pwd}"
--- a/sos/report/plugins/__init__.py
+++ b/sos/report/plugins/__init__.py
@@ -3262,7 +3262,10 @@
# skip forbidden paths; since we might recursivelly copied
# whole directory, we must find the forbidden files in dest
# path and delete the unwanted
- base_dir = dest.removesuffix(f"{path.lstrip('/')}")
+ _suffix = path.lstrip('/')
+ base_dir = (dest[:-len(_suffix)]
+ if dest.endswith(_suffix) and _suffix
+ else dest)
for relname in [file.relative_to(base_dir).as_posix()
for file in Path(dest).rglob('*')]:
absname = f"/{relname}"
--- a/sos/cleaner/__init__.py
+++ b/sos/cleaner/__init__.py
@@ -846,6 +846,8 @@
# *all* mapping.all(item) methods - so replaying this will
# generate the right datasets!
archive.load_parser_entries()
+ archive.soslog = logging.getLogger('sos')
+ archive.ui_log = logging.getLogger('sos_ui')
try:
self.obfuscate_directory_names(archive)
--- a/sos/report/plugins/charmed_mongodb.py 2026-07-16 14:48:09.639484635 +0200
+++ b/sos/report/plugins/charmed_mongodb.py 2026-07-16 14:49:02.337015148 +0200
@@ -122,8 +122,8 @@
encoding="utf-8",
) as f:
data = yaml.safe_load(f)
-
- if sharding_conf := data.get("sharding", {}):
+ sharding_conf = data.get("sharding", {})
+ if sharding_conf:
role = sharding_conf.get("clusterRole", "")
return self._match_role(role)
@@ -144,7 +144,8 @@
return None
data = yaml.safe_load(result.get("output", ""))
- if sharding_conf := data.get("sharding", {}):
+ sharding_conf = data.get("sharding", {})
+ if sharding_conf:
role = sharding_conf.get("clusterRole", "")
return self._match_role(role)

File diff suppressed because it is too large Load Diff

View File

@ -1,27 +0,0 @@
--- /dev/null 2025-10-28 14:11:21.494784405 +0100
+++ sos-4.10.1/bin/sosreport 2025-12-04 08:46:53.277857061 +0100
@@ -0,0 +1,5 @@
+#!/bin/bash
+echo "sosreport binary is deprecated, use 'sos report' instead"
+exec sos report "$@"
+
+# vim:ts=4 et sw=4
--- /dev/null 2025-10-28 14:11:21.494784405 +0100
+++ sos-4.10.1/bin/sos-collector 2025-12-04 08:48:04.661880220 +0100
@@ -0,0 +1,5 @@
+#!/bin/bash
+echo "sos-collector binary is deprecated, use 'sos collector' instead"
+exec sos collector "$@"
+
+# vim:ts=4 et sw=4
--- sos-4.10.1/setup.py 2025-04-15 15:17:21.938635468 +0200
+++ sos-4.10.1/setup.py 2025-04-15 15:17:41.328198501 +0200
@@ -34,7 +34,7 @@
maintainer_email='jacob.r.hunsaker@gmail.com',
url='https://github.com/sosreport/sos',
license="GPLv2+",
- scripts=['bin/sos'],
+ scripts=['bin/sos', 'bin/sosreport', 'bin/sos-collector'],
data_files=data_files,
packages=find_packages(include=['sos', 'sos.*'])
)

View File

@ -1,121 +0,0 @@
diff --git a/sos/upload/targets/__init__.py b/sos/upload/targets/__init__.py
index 9e905e1063..6f72d963ea 100644
--- a/sos/upload/targets/__init__.py
+++ b/sos/upload/targets/__init__.py
@@ -540,36 +540,7 @@ def upload_sftp(self, user=None, password=None, user_dir=None):
raise Exception("Unable to connect via SFTP to "
f"{self.get_upload_url_string()}")
- # user_dir indicates that we need to switch into a specific user
- # directory. If ChRootDirectory is set, this happens automatically
- # so check if the PWD contains the user. If it does, we are
- # already in the user directory so set user_dir to None
- if user_dir:
- user_match = False
- ret.sendline('pwd')
- pwd_expects = [
- 'sftp>',
- 'Invalid command.',
- pexpect.TIMEOUT,
- pexpect.EOF
- ]
- pwd_cmd = ret.expect(pwd_expects, timeout=10) == 0
- if pwd_cmd:
- # Extract the path from child.before
- raw_output = ret.before
- user_match = re.search(user, raw_output)
- else:
- self.ui_log.warning("This server does not support the PWD "
- "command - unable to verify user "
- "directory. Attempting upload without "
- "changing to user directory.")
- user_dir = None
-
- if user_match:
- user_dir = None
-
# certain implementations require file to be put in the user dir
- # so we prepend the user directory to the file path
put_cmd = (
f"put {self.upload_archive_name} "
f"{f'{user_dir}/' if user_dir else ''}"
diff --git a/sos/upload/targets/redhat.py b/sos/upload/targets/redhat.py
index 636a645fe6..0cfb80eecd 100644
--- a/sos/upload/targets/redhat.py
+++ b/sos/upload/targets/redhat.py
@@ -158,7 +158,6 @@ def upload_sftp(self, user=None, password=None, user_dir=None):
" for obtaining SFTP auth token.")
_token = None
_user = None
- _user_dir = None
# We may have a device token already if we attempted
# to upload via http but the upload failed. So
@@ -192,7 +191,6 @@ def upload_sftp(self, user=None, password=None, user_dir=None):
# credentials are valid
_user = json.loads(ret.text)['username']
_token = json.loads(ret.text)['token']
- _user_dir = f"/users/{_user}"
else:
self.ui_log.debug(
f"DEBUG: auth attempt failed (status: {ret.status_code}): "
@@ -220,7 +218,7 @@ def upload_sftp(self, user=None, password=None, user_dir=None):
)
if _user and _token:
return super().upload_sftp(user=_user, password=_token,
- user_dir=_user_dir)
+ user_dir=_user)
raise Exception("Could not retrieve valid or anonymous credentials")
def check_file_too_big(self, archive):
--
2.47.0
--- a/sos/upload/targets/__init__.py 2025-09-16 19:57:27.294642506 +0200
+++ b/sos/upload/targets/__init__.py 2025-09-16 19:59:44.498573843 +0200
@@ -465,7 +465,7 @@
self.upload_password or
self._upload_password)
- def upload_sftp(self, user=None, password=None, user_dir=None):
+ def upload_sftp(self, user=None, password=None):
"""Attempts to upload the archive to an SFTP location.
Due to the lack of well maintained, secure, and generally widespread
@@ -540,13 +540,10 @@
raise Exception("Unable to connect via SFTP to "
f"{self.get_upload_url_string()}")
- # certain implementations require file to be put in the user dir
- put_cmd = (
- f"put {self.upload_archive_name} "
- f"{f'{user_dir}/' if user_dir else ''}"
- f"{self._get_sftp_upload_name()}"
- )
+ put_cmd = (f'put {self.upload_archive_name} '
+ f'{self._get_sftp_upload_name()}')
ret.sendline(put_cmd)
+
put_expects = [
'100%',
pexpect.TIMEOUT,
--- a/sos/upload/targets/redhat.py 2025-09-16 19:57:36.804628207 +0200
+++ b/sos/upload/targets/redhat.py 2025-09-16 20:00:52.578728154 +0200
@@ -145,7 +145,7 @@
return fname
# pylint: disable=too-many-branches
- def upload_sftp(self, user=None, password=None, user_dir=None):
+ def upload_sftp(self, user=None, password=None):
"""Override the base upload_sftp to allow for setting an on-demand
generated anonymous login for the RH SFTP server if a username and
password are not given
@@ -217,8 +217,7 @@
f"{anon.status_code}): {anon.json()}"
)
if _user and _token:
- return super().upload_sftp(user=_user, password=_token,
- user_dir=_user)
+ return super().upload_sftp(user=_user, password=_token)
raise Exception("Could not retrieve valid or anonymous credentials")
def check_file_too_big(self, archive):

View File

@ -1,37 +0,0 @@
From 2fab657e3909f76e31bc6c56a5ad26f86a9925e5 Mon Sep 17 00:00:00 2001
From: Pavel Moravec <pmoravec@redhat.com>
Date: Tue, 23 Jun 2026 17:17:01 +0200
Subject: [PATCH] [foreman-installer] Scrub secrets in CLI arg dumps
Installer logs dump CLI args we need to scrub.
Closes: #4367
Signed-off-by: Pavel Moravec <pmoravec@redhat.com>
---
sos/report/plugins/foreman_installer.py | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/sos/report/plugins/foreman_installer.py b/sos/report/plugins/foreman_installer.py
index f55cde23..89eef2e4 100644
--- a/sos/report/plugins/foreman_installer.py
+++ b/sos/report/plugins/foreman_installer.py
@@ -54,11 +54,12 @@ class ForemanInstaller(Plugin, DebianPlugin, UbuntuPlugin):
r"::(.*(token|secret|key|passw).*)\") value:) "
r"(.*)")
self.do_path_regex_sub(install_logs, logs_debug_reg, r"\1 \2 ********")
- # also hide passwords in yet different formats
+ # also hide passwords in yet different formats, including CLI arg dumps
self.do_path_regex_sub(
install_logs,
- r"password(\", \"|=|\" value: \"|\": \")(.*?)(\", \".*|\"]]|\"|$)",
- r"password\1********\3")
+ r"((?:password|consumer-key|consumer-secret|key-secret|secret-key|"
+ r"oauth-key|oauth-secret)(?:\", \"|\": \"|=))([^\"\n]*)(\"|$)",
+ r"\1********\3")
self.do_path_regex_sub(
"/var/log/foreman-installer/foreman-proxy*",
r"(\s*proxy_password\s=) (.*)",
--
2.54.0

View File

@ -1,97 +0,0 @@
From 5e7a01d9df2bc4e1f2659ace959ea52228ee1eee Mon Sep 17 00:00:00 2001
From: akumari <akumari@redhat.com>
Date: Wed, 1 Jul 2026 09:26:52 +0530
Subject: [PATCH 1/2] [foremanctl] Enable plugin for containerized deployments
The plugin required foremanctl package which doesn't exist in
containerized mode. Add container detection to enable the plugin
and collect foremanctl health diagnostics for support cases.
Signed-off-by: akumari <akumari@redhat.com>
---
sos/report/plugins/foremanctl.py | 29 +++++++++++++++++++++++++----
1 file changed, 25 insertions(+), 4 deletions(-)
diff --git a/sos/report/plugins/foremanctl.py b/sos/report/plugins/foremanctl.py
index 1b6ba4a4..0425cc05 100644
--- a/sos/report/plugins/foremanctl.py
+++ b/sos/report/plugins/foremanctl.py
@@ -19,6 +19,7 @@ class Foremanctl(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin):
plugin_name = 'foremanctl'
profiles = ('sysmgmt',)
packages = ('foremanctl', )
+ containers = ('foreman', 'foreman-proxy',)
def setup(self):
self.add_copy_spec([
@@ -29,14 +30,34 @@ class Foremanctl(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin):
self.add_cmd_output([
"foremanctl features",
+ "foremanctl health",
])
self.add_dir_listing(["/var/lib/foremanctl/"], recursive=True)
def postproc(self):
- self.do_path_regex_sub("/var/lib/foremanctl/parameters.yaml",
- r"(foreman_initial_admin_password:\s*)(.*)",
- r"\1********")
-
+ # Scrub passwords, credentials, tokens, secrets, and keys
+ self.do_path_regex_sub(
+ "/var/lib/foremanctl/parameters.yaml",
+ r"((.*)?(passw|cred|token|secret|key).*(\:\s|=))(.*)",
+ r"\1********")
+
+ # Scrub passwords from foremanctl logs - Pattern 1: key=value format
+ self.do_path_regex_sub(
+ "/var/log/foremanctl/foremanctl.*log*",
+ r"((passw|cred|token|secret|key)\w*\s*=\s*)(.*?)(\s|,|\"|'|$)",
+ r"\1********\4")
+
+ # Scrub passwords from foremanctl logs - Pattern 2: "password something" format
+ self.do_path_regex_sub(
+ "/var/log/foremanctl/foremanctl.*log*",
+ r"(password\s+)(.*?)(\s|,|\"|$)",
+ r"\1********\3")
+
+ # Scrub admin credentials in username:password format
+ self.do_path_regex_sub(
+ "/var/log/foremanctl/foremanctl.*log*",
+ r"(Admin credentials:\s+\w+:)(.*?)(\"|,|$)",
+ r"\1********\3")
# vim: set et ts=4 sw=4 :
--
2.54.0
From 3b6bbcb819e05aecf0fec4767588ea0376c9f218 Mon Sep 17 00:00:00 2001
From: akumari <akumari@redhat.com>
Date: Tue, 7 Jul 2026 14:06:40 +0530
Subject: [PATCH 2/2] [valkey] Add container support for containerized
deployments
Adds container support to the valkey plugin to enable it
for containerized deployments using foremanctl/quadlet.
Signed-off-by: akumari <akumari@redhat.com>
---
sos/report/plugins/valkey.py | 1 +
1 file changed, 1 insertion(+)
diff --git a/sos/report/plugins/valkey.py b/sos/report/plugins/valkey.py
index 26a74a56..f7b49253 100644
--- a/sos/report/plugins/valkey.py
+++ b/sos/report/plugins/valkey.py
@@ -19,6 +19,7 @@ class Valkey(Plugin, IndependentPlugin):
profiles = ('services',)
packages = ('valkey',)
+ containers = ('valkey',)
var_puppet_gen = "/var/lib/config-data/puppet-generated/valkey"
--
2.54.0

View File

@ -1,74 +0,0 @@
From 6085b2580173a7a43de8b541584c82481c617aa2 Mon Sep 17 00:00:00 2001
From: asadawar <asadawar@users.noreply.github.com>
Date: Mon, 27 Jul 2026 17:50:42 +0530
Subject: [PATCH] [policies] Prefer most specific policy when multiple match
When multiple policies within the same module return True from
check(), the policy loader now selects the most specific one
(deepest in the class hierarchy) instead of whichever happens
to sort first alphabetically.
Previously, import_policy() returned classes sorted by name via
inspect.getmembers(), and load() picked the first match. This
caused RHELPolicy to always win over RedHatCoreOSPolicy inside
a toolbox container on RHCOS, because uppercase 'H' sorts before
lowercase 'e' in ASCII. Both policies return True in that context
(RHEL for the container's /etc/redhat-release, RHCOS for the
host's /host/etc/os-release), but the more specific RHCOS policy
was never reached.
This has existed since RedHatCoreOSPolicy was introduced in 2019
(commit fa06bc09c95c) but was never visible because RHCOS had no
behavioral differences from RHEL until the archive naming change
in commit 0e919b6.
The fix collects all matching policies from a module and sorts by
MRO depth (descending), so a subclass is always preferred over
its parent. This is safe because a subclass that returns True from
check() is by definition a more precise match than its parent.
Assisted-by: Claude Code <https://claude.ai/code>
Signed-off-by: asadawar <asadawar@users.noreply.github.com>
---
sos/policies/__init__.py | 18 +++++++++++-------
1 file changed, 11 insertions(+), 7 deletions(-)
diff --git a/sos/policies/__init__.py b/sos/policies/__init__.py
index 35b3a532..b4920e82 100644
--- a/sos/policies/__init__.py
+++ b/sos/policies/__init__.py
@@ -29,20 +29,24 @@ def import_policy(name):
return None
-def load(cache={}, sysroot=None, init=None, probe_runtime=True,
+def load(cache=None, sysroot=None, init=None, probe_runtime=True,
remote_exec=None, remote_check=''):
+ if cache is None:
+ cache = {}
if 'policy' in cache:
return cache.get('policy')
import sos.policies.distros
helper = ImporterHelper(sos.policies.distros)
+ matches = []
for module in helper.get_modules():
- for policy in import_policy(module):
- if policy.check(remote=remote_check):
- cache['policy'] = policy(sysroot=sysroot, init=init,
- probe_runtime=probe_runtime,
- remote_exec=remote_exec)
- break
+ matches.extend([policy for policy in (import_policy(module) or [])
+ if policy.check(remote=remote_check)])
+ if matches:
+ matches.sort(key=lambda p: len(p.__mro__), reverse=True)
+ cache['policy'] = matches[0](sysroot=sysroot, init=init,
+ probe_runtime=probe_runtime,
+ remote_exec=remote_exec)
if sys.platform != 'linux':
raise Exception("SoS is not supported on this platform")
--
2.55.0

View File

@ -1,90 +0,0 @@
From d94095e55d69d5e4135df0193c9726c2789526ab Mon Sep 17 00:00:00 2001
From: Pavel Moravec <pmoravec@redhat.com>
Date: Wed, 29 Jul 2026 10:46:25 +0200
Subject: [PATCH] [processor] Limit /sys/devices/system/cpu/cpu* subdirs
collected
For systems with >500 CPUs, collecting all such directories means
millions of files to be collected, what excessivelly slows down the
plugin until its timeout.
Limit the default number of such directories to 64, configurable via a
plugin option.
Resolves: #4399
Signed-off-by: Pavel Moravec <pmoravec@redhat.com>
---
sos/report/plugins/processor.py | 41 ++++++++++++++++++++++++++++++++-
1 file changed, 40 insertions(+), 1 deletion(-)
diff --git a/sos/report/plugins/processor.py b/sos/report/plugins/processor.py
index 9375b5a1..593bd36b 100644
--- a/sos/report/plugins/processor.py
+++ b/sos/report/plugins/processor.py
@@ -6,7 +6,9 @@
#
# See the LICENSE file in the source distribution for further information.
-from sos.report.plugins import Plugin, IndependentPlugin, SoSPredicate
+import re
+from sos.report.plugins import (Plugin, IndependentPlugin, SoSPredicate,
+ PluginOpt)
from sos.policies.distros.ubuntu import UbuntuPolicy
@@ -18,6 +20,11 @@ class Processor(Plugin, IndependentPlugin):
profiles = ('system', 'hardware', 'memory')
files = ('/proc/cpuinfo',)
packages = ('cpufreq-utils', 'cpuid')
+ option_list = [
+ PluginOpt('max_cpu_dirs', default=64, val_type=int,
+ desc='Maximum number of cpu[0-9]+ directories '
+ 'to collect from /sys/devices/system/cpu'),
+ ]
cpu_kmods = []
@@ -43,7 +50,39 @@ class Processor(Plugin, IndependentPlugin):
# copy /sys/devices/system/cpu/cpuX with separately applied sizelimit
# this is required for systems with tens/hundreds of CPUs where the
# cumulative directory size exceeds 25MB or even 100MB.
+ # Limit cpu[0-9]* directories to avoid excessive collection.
+ # All non-cpu* directories are always collected.
+ max_cpu_dirs = self.get_option('max_cpu_dirs')
+ if max_cpu_dirs < 0:
+ self._log_info(f"Invalid max_cpu_dirs={max_cpu_dirs} value "
+ f"provided, replacing by 0."
+ )
+ max_cpu_dirs = 0
cdirs = self.listdir('/sys/devices/system/cpu')
+
+ if len(cdirs) > max_cpu_dirs:
+ # separate cpu from non-cpu, then limit cpu dirs
+ cpu_pattern = re.compile(r'cpu(\d+)')
+ cpu_dirs = []
+ other_dirs = []
+
+ for cdir in cdirs:
+ if cpu_pattern.fullmatch(cdir):
+ cpu_dirs.append(cdir)
+ else:
+ other_dirs.append(cdir)
+
+ # Only limit if cpu_dirs specifically exceeds max
+ if len(cpu_dirs) > max_cpu_dirs:
+ self._log_info(
+ f"Limiting cpu directories from {len(cpu_dirs)} to "
+ f"{max_cpu_dirs} (use '-k processor.max_cpu_dirs=N' "
+ f"to change)."
+ )
+ cpu_dirs = sorted(cpu_dirs)[:max_cpu_dirs]
+
+ cdirs = other_dirs + cpu_dirs
+
self.add_copy_spec([
self.path_join('/sys/devices/system/cpu', cdir) for cdir in cdirs
])
--
2.55.0

View File

@ -0,0 +1,33 @@
diff -aruN sos-4.3/sos/policies/distros/redhat.py sos-4.3.alma/sos/policies/distros/redhat.py
--- sos-4.3/sos/policies/distros/redhat.py 2022-02-15 07:20:20.000000000 +0300
+++ sos-4.3.alma/sos/policies/distros/redhat.py 2022-10-10 11:40:12.000000000 +0300
@@ -434,6 +434,14 @@
vendor = "CentOS"
vendor_urls = [('Community Website', 'https://www.centos.org/')]
+class AlmaLinuxPolicy(RHELPolicy):
+ distro = "AlmaLinux"
+ vendor = "AlmaLinux OS Foundation"
+ vendor_urls = [
+ ('Distribution Website', 'https://www.almalinux.org/'),
+ ('Commercial Support', 'https://tuxcare.com/linux-support-services/')
+ ]
+
class RedHatAtomicPolicy(RHELPolicy):
distro = "Red Hat Atomic Host"
@@ -591,6 +599,14 @@
vendor = "CentOS"
vendor_urls = [('Community Website', 'https://www.centos.org/')]
+class AlmaLinuxAtomicPolicy(RedHatAtomicPolicy):
+ distro = "AlmaLinux Atomic Host"
+ vendor = "AlmaLinux OS Foundation"
+ vendor_urls = [
+ ('Distribution Website', 'https://www.almalinux.org/'),
+ ('Commercial Support', 'https://tuxcare.com/linux-support-services/')
+ ]
+
class FedoraPolicy(RedHatPolicy):
"""

View File

@ -1,35 +1,31 @@
%{!?python_sitelib: %define python_sitelib %(%{__python} -c "from distutils.sysconfig import get_python_lib; print get_python_lib()")}
%global auditversion 0.3-1
%global auditversion 0.3
Summary: A set of tools to gather troubleshooting information from a system
Name: sos
Version: 4.11.2
Release: 4%{?dist}
Version: 4.5.0
Release: 1%{?dist}.alma
Group: Applications/System
Source0: https://github.com/sosreport/sos/archive/%{version}/sos-%{version}.tar.gz
Source1: sos-audit-%{auditversion}.tgz
License: GPL-2.0-or-later
License: GPLv2+
BuildArch: noarch
Url: https://github.com/sosreport/sos
BuildRequires: python3-devel
BuildRequires: gettext
BuildRequires: python3-setuptools
Requires: bzip2
Requires: xz
Requires: python3-requests
Requires: python3-setuptools
Recommends: python3-magic
Recommends: python3-pexpect
Recommends: python3-pyyaml
Conflicts: vdsm < 4.40
Obsoletes: sos-collector
Patch1: 0001-python3-walrus-operator-and-rhel8-changes-only.patch
Patch2: 0002-remove-unsupported-python36-plugins.patch
Patch3: 0003-sosreport-binary.patch
Patch4: 0004-revert-PR4092-and-PR4275.patch
Patch5: 0005-foreman-installer-Scrub-secrets-in-CLI-arg-dumps.patch
Patch6: 0006-foremanctl-valkey-PR4376.patch
Patch7: 0007-policies-Prefer-most-specific-policy-when-multiple-m.patch
Patch8: 0008-processor-Limit-sys-devices-system-cpu-cpu-subdirs-c.patch
# AlmaLinux patches
Patch1000: sos-almalinux-branding.patch
%description
Sos is a set of tools that gathers information about system
@ -40,25 +36,17 @@ support technicians and developers.
%prep
%setup -qn %{name}-%{version}
%setup -T -D -a1 -q
%patch -P 1 -p1
%patch -P 2 -p1
%patch -P 3 -p1
%patch -P 4 -p1
%patch -P 5 -p1
%patch -P 6 -p1
%patch -P 7 -p1
%patch -P 8 -p1
# AlmaLinux patches
%patch1000 -p1
%build
%py3_build
%install
%py3_install '--install-scripts=%{_sbindir}'
rm -f %{buildroot}/usr/config/sos.conf
rm -f %{buildroot}/usr/config/tmpfilesd-sos-rh.conf
install -Dm644 %{name}.conf %{buildroot}%{_sysconfdir}/%{name}/%{name}.conf
install -d -m 755 %{buildroot}%{_sysconfdir}/tmpfiles.d/
install -m 644 tmpfiles/tmpfilesd-sos-rh.conf %{buildroot}%{_sysconfdir}/tmpfiles.d/%{name}.conf
%find_lang %{name} || echo 0
@ -71,17 +59,17 @@ mkdir -p %{buildroot}%{_sysconfdir}/sos/{cleaner,presets.d,extras.d,groups.d}
# internationalization is currently broken. Uncomment this line once fixed.
# %%files -f %%{name}.lang
%files
%{_sbindir}/sos
%{_sbindir}/sosreport
%{_sbindir}/sos
%{_sbindir}/sos-collector
%dir /etc/sos/presets.d
%dir /etc/sos/extras.d
%dir /etc/sos/groups.d
/etc/tmpfiles.d/%{name}.conf
%{python3_sitelib}/*
%{_mandir}/man1/sosreport.1.gz
%{_mandir}/man1/sos-clean.1.gz
%{_mandir}/man1/sos-upload.1.gz
%{_mandir}/man1/sos-collect.1.gz
%{_mandir}/man1/sos-collector.1.gz
%{_mandir}/man1/sos-help.1.gz
%{_mandir}/man1/sos-mask.1.gz
%{_mandir}/man1/sos-report.1.gz
@ -91,10 +79,11 @@ mkdir -p %{buildroot}%{_sysconfdir}/sos/{cleaner,presets.d,extras.d,groups.d}
%license LICENSE
%config(noreplace) %{_sysconfdir}/sos/sos.conf
%config(noreplace) %{_sysconfdir}/sos/cleaner
%config /usr/config/sos.conf
%package audit
Summary: Audit use of some commands for support purposes
License: GPL-2.0-or-later
License: GPLv2+
Group: Application/System
%description audit
@ -117,173 +106,10 @@ of the system. Currently storage and filesystem commands are audited.
%{_mandir}/man8/sos-audit.sh.8.gz
%ghost /etc/audit/rules.d/40-sos-filesystem.rules
%ghost /etc/audit/rules.d/40-sos-storage.rules
%license LICENSE
%changelog
* Wed Aug 05 2026 Jan Jansky <jjansky@redhat.com> = 4.11.2-4
- Update to 4.11.2-4
* Fri Jul 17 2026 Jan Jansky <jjansky@redhat.com> = 4.11.2-2
- Update to 4.11.2-2
* Wed Jul 15 2026 Jan Jansky <jjansky@redhat.com> = 4.11.2-1
- Update to 4.11.2-1
* Thu Apr 02 2026 Jan Jansky <jjansky@redhat.com> = 4.11.0-1
- Update to 4.11.0-1
Resolves: RHEL-157813
* Thu Feb 26 2026 Jan Jansky <jjansky@redhat.com> = 4.10.2-2
- Update to 4.10.2-2
Resolves: RHEL-142630
* Thu Jan 22 2026 Jan Jansky <jjansky@redhat.com> = 4.10.2-1
- Update to 4.10.2-1
Resolves: RHEL-142630
* Fri Dec 05 2025 Jan Jansky <jjansky@redhat.com> = 4.10.1-2
- Fixing sosreport and sos-collector binary
Resolves: RHEL-121468
* Tue Nov 25 2025 Jan Jansky <jjansky@redhat.com> = 4.10.1-1
- Update to 4.10.1-1
Resolves: RHEL-121468
* Tue Sep 23 2025 Jan Jansky <jjansky@redhat.com> = 4.10.0-4
- Update to 4.10.0-4
Resolves: RHEL-112413
* Wed Sep 17 2025 Jan Jansky <jjansky@redhat.com> = 4.10.0-2
- Update to 4.10.0-2
Resolves: RHEL-112413
* Thu Aug 21 2025 Jan Jansky <jjansky@redhat.com> = 4.10.0-1
- Update to 4.10.0
Resolves: RHEL-110499
* Fri Jul 04 2025 Jan Jansky <jjansky@redhat.com> = 4.9.2-1
- Update to 4.9.2 in RHEL 8
Resolves: RHEL-101716
* Fri May 30 2025 Jan Jansky <jjansky@redhat.com> = 4.9.1-2
- Update to 4.9.1-2 in RHEL 8
Resolves: RHEL-86645
* Tue Apr 15 2025 Jan Jansky <jjansky@redhat.com> = 4.9.1-1
- Update to 4.9.1 in RHEL 8
Resolves: RHEL-86645
* Tue Jan 07 2025 Jan Jansky <jjansky@redhat.com> = 4.8.2-1
- Update to 4.8.2 in RHEL 8
Resolves: RHEL-72941
* Wed Oct 23 2024 Jan Jansky <jjansky@redhat.com> = 4.8.1-1
- Update to 4.8.1 in RHEL 8
Resolves: RHEL-64160
* Fri Sep 27 2024 Jan Jansky <jjansky@redhat.com> = 4.8.0-3
- Added credentials obfuscation from multiple files
Resolves: RHEL-58097
* Sat Sep 14 2024 Pierguido Lambri <plambri@redhat.com> = 4.8.0-2
- Resolves: RHEL-22732
Fix wrong formatting
* Mon Sep 09 2024 Pierguido Lambri <plambri@redhat.com> = 4.8.0-1
- New upstream release
Resolves: RHEL-58097
* Wed Aug 21 2024 Pavel Moravec <pmoravec@redhat.com> = 4.7.2-2
- reverting RHEL-22732 patch due to regressions
Resolves: RHEL-49779
* Fri Jun 21 2024 Pierguido Lambri <plambri@redhat.com> = 4.7.2-1
- New upstream release
Resolves: RHEL-40871
Resolves: RHEL-33703
Resolves: RHEL-22732
* Thu May 09 2024 Pavel Moravec <pmoravec@redhat.com> = 4.7.1-3
- [archive] Fix get_archive_root after files reordering
Resolves: RHEL-35945
* Mon Apr 08 2024 Jan Jansky <jjansky@redhat.com> = 4.7.1-1
- rebase to upstream 4.7.1
Resolves: RHEL-32104
* Tue Feb 20 2024 Jan Jansky <jjansky@redhat.com> = 4.7.0-1
- rebase to upstream 4.7.0
Resolves: RHEL-26111
* Thu Jan 11 2024 Pavel Moravec <pmoravec@redhat.com> = 4.6.1-1
- rebase to upstream 4.6.1
Resolves: RHEL-21173
- [redhat] Change authentication method for RHEL
Resolves: RHEL-21177
* Wed Oct 18 2023 Pavel Moravec <pmoravec@redhat.com> = 4.6.0-5
[pulpcore] Scrub AUTH_LDAP_BIND_PASSWORD value
Resolves: RHEL-13697
* Tue Oct 17 2023 Pavel Moravec <pmoravec@redhat.com> = 4.6.0-4
- [pulp] Fix dynaconf obfuscation and add AUTH_LDAP_BIND_PASSWORD
Resolves: RHEL-13697
* Fri Sep 01 2023 Pavel Moravec <pmoravec@redhat.com> = 4.6.0-2
- [openshift_ovn] Collect additional ovnkube node logs
Resolves: SUPDEV145
* Wed Aug 23 2023 Jan Jansky <jjansky@redhat.com> = 4.6.0-1
- [cleaner] Use data filter for extraction
Resolves: bz2218873
* Thu Jul 27 2023 Pavel Moravec <pmoravec@redhat.com> = 4.5.6-1
- Rebase sos to 4.5.6
Resolves: bz2226724
* Fri Jul 14 2023 Jan Jansky <jjansky@redhat.com> = 4.5.5-2
- Adding patch for mac obfuscation
Resolves: bz2218279
Resolves: bz2216608
Resolves: bz2207562
* Mon Jul 03 2023 Jan Jansky <jjansky@redhat.com> = 4.5.5-1
- [clean] Respect permissions of sanitised files
Resolves: bz2218279
- [plugin] Fix exception when calling os.makedirs
Resolves: bz2216608
- [cleaner] Enhance trailing characters list after AMC address
Resolves: bz2207562
* Thu Jun 01 2023 Pavel Moravec <pmoravec@redhat.com> = 4.5.4-1
- [plugins] collect strings before commands
Resolves: bz2203141
- [collector] collect report from primary node if in node_list
Resolves: bz2186460
- [powerpc] collect invscout logs
Resolves: bz2210543
- [rhc] New plugin for RHC
Resolves: bz2196649
* Fri May 05 2023 Jan Jansky <jjansky@redhat.com> = 4.5.3-1
- [report] Ignore case when scrubbing via do_file_sub
Resolves: bz2143272
- [subscription_manager] Scrub proxy passwords from repo_server_val
Resolves: bz2177282
- [virsh] Scrub passwords in virt-manager logs
Resolves: bz2184062
* Wed Mar 08 2023 Pavel Moravec <pmoravec@redhat.com> = 4.5.1-3
- Rebase on upstream 4.5.1
Resolves: bz2175806
- [composer] Capure /etc/osbuild-composer file
Resolves: bz2169776
- [ostree] Collect "ostree fsck" under plugin specific opt
Resolves: bz2161533
- [iprconfig] guard whole plugin by sg kmod predicate
Resolves: bz2176086
- [cleaner] dont clean sys_tmp from final_path
Resolves: bz2176218
* Wed Mar 29 2023 Eduard Abdullin <eabdullin@almalinux.org> - 4.5.0-1.alma
- AlmaLinux changes
* Tue Feb 07 2023 Pavel Moravec <pmoravec@redhat.com> = 4.5.0-1
- Rebase on upstream 4.5.0