From c4957b9ee98bab29b3acca1acf7225e11b03557f Mon Sep 17 00:00:00 2001 From: Jake Hunsaker Date: Mon, 10 Jun 2024 16:22:21 -0400 Subject: [PATCH] [Plugin] Standardize directory listings with new method This commit adds a new `add_dir_listing()` wrapper method to standardize the collection of directory content listings across plugins. By default this will use the `ls` command, and will use `tree` if the `tree` parameter is set to `True`. This wrapper is not intended to replace directory listing that are handlded by other components with their own `ls` functionality (e.g. `npm ls` in the `npm` plugin). Additionally this does not replace the direct calling of `ls` when used with `Plugin.exec_cmd()` to take some action based on the output of the `ls` command. Signed-off-by: Jake Hunsaker --- sos/report/plugins/__init__.py | 39 +++++++++++++++++++++++ sos/report/plugins/aap_controller.py | 11 ++++--- sos/report/plugins/aap_eda.py | 10 +++--- sos/report/plugins/aap_gateway.py | 8 ++--- sos/report/plugins/aap_hub.py | 8 ++--- sos/report/plugins/aap_receptor.py | 8 ++--- sos/report/plugins/apparmor.py | 9 +++--- sos/report/plugins/apport.py | 2 +- sos/report/plugins/block.py | 5 +-- sos/report/plugins/boot.py | 9 +++--- sos/report/plugins/crio.py | 3 +- sos/report/plugins/docker.py | 2 +- sos/report/plugins/docker_distribution.py | 2 +- sos/report/plugins/ds.py | 2 +- sos/report/plugins/etcd.py | 3 +- sos/report/plugins/filesys.py | 2 +- sos/report/plugins/foreman.py | 8 +++-- sos/report/plugins/grub2.py | 1 - sos/report/plugins/insights.py | 4 +-- sos/report/plugins/ipa.py | 3 +- sos/report/plugins/juju.py | 8 ++--- sos/report/plugins/kdump.py | 6 ++-- sos/report/plugins/kernel.py | 2 +- sos/report/plugins/libraries.py | 6 ++-- sos/report/plugins/libvirt.py | 2 +- sos/report/plugins/logs.py | 2 +- sos/report/plugins/mssql.py | 2 +- sos/report/plugins/openstack_ironic.py | 10 +++--- sos/report/plugins/openstack_neutron.py | 2 +- sos/report/plugins/opensvc.py | 2 +- sos/report/plugins/openvswitch.py | 12 ++++--- sos/report/plugins/ovirt.py | 2 +- sos/report/plugins/ovn_central.py | 4 +-- sos/report/plugins/pam.py | 3 +- sos/report/plugins/podman.py | 8 ++--- sos/report/plugins/powerpc.py | 4 +-- sos/report/plugins/pulpcore.py | 2 +- sos/report/plugins/puppet.py | 7 ++-- sos/report/plugins/qpid.py | 3 +- sos/report/plugins/rhui.py | 3 +- sos/report/plugins/rpm.py | 2 +- sos/report/plugins/services.py | 7 ++-- sos/report/plugins/smartcard.py | 4 ++- sos/report/plugins/snapper.py | 3 +- sos/report/plugins/ssh.py | 3 +- sos/report/plugins/systemd.py | 3 +- sos/report/plugins/tftpserver.py | 4 +-- sos/report/plugins/vdsm.py | 13 +++++--- tests/report_tests/basic_report_tests.py | 10 ++++++ 49 files changed, 175 insertions(+), 103 deletions(-) diff --git a/sos/report/plugins/__init__.py b/sos/report/plugins/__init__.py index 74ade1fb37..18371e3946 100644 --- a/sos/report/plugins/__init__.py +++ b/sos/report/plugins/__init__.py @@ -2011,6 +2011,45 @@ def _add_cmd_output(self, **kwargs): else: self.log_skipped_cmd(soscmd.cmd, pred, changes=soscmd.changes) + def add_dir_listing(self, paths, tree=False, recursive=False, chroot=True, + env=None, sizelimit=None, pred=None, subdir=None, + tags=[], runas=None, container=None, + suggest_filename=None): + """ + Used as a way to standardize our collections of directory listings, + either as an output of `ls` or `tree` depending on if the `tree` + parameter is set to `True`. + + This is ultimately a wrapper around `add_cmd_output()` and supports + several, but not all, of the options for that method. + + :param paths: The path(s) to collect a listing for + :type paths: ``str`` or a ``list`` of ``str``s + + :param tree: Collect output with `tree` instead of `ls` + :type tree: ``bool`` (default: False) + + :param recursive: Recursively list directory contents with `ls` + :type recursive: ``bool`` (default: False) + """ + if isinstance(paths, str): + paths = [paths] + + paths = [p for p in paths if self.path_exists(p)] + + if not tree: + options = f"alhZ{'R' if recursive else ''}" + else: + options = 'lhp' + + for path in paths: + self.add_cmd_output( + f"{'tree' if tree else 'ls'} -{options} {path}", + chroot=chroot, env=env, sizelimit=sizelimit, pred=pred, + subdir=subdir, tags=tags, container=container, runas=runas, + suggest_filename=suggest_filename + ) + def add_cmd_output(self, cmds, suggest_filename=None, root_symlink=None, timeout=None, stderr=True, chroot=True, runat=None, env=None, binary=False, diff --git a/sos/report/plugins/aap_controller.py b/sos/report/plugins/aap_controller.py index 48d082d65c..62a52a3949 100644 --- a/sos/report/plugins/aap_controller.py +++ b/sos/report/plugins/aap_controller.py @@ -56,13 +56,16 @@ def setup(self): "/var/lib/awx/venv/awx/bin/pip freeze -l", "/var/lib/awx/venv/ansible/bin/pip freeze", "/var/lib/awx/venv/ansible/bin/pip freeze -l", - "tree -d /var/lib/awx", - "ls -ll /var/lib/awx", - "ls -ll /var/lib/awx/venv", - "ls -ll /etc/tower", "umask -p", ]) + self.add_dir_listing([ + '/var/lib/awx', + '/var/lib/awx/venv', + '/etc/tower', + ]) + self.add_dir_listing('/var/lib/awx', tree=True) + def postproc(self): # remove database password jreg = r"(\s*\'PASSWORD\'\s*:(\s))(?:\"){1,}(.+)(?:\"){1,}" diff --git a/sos/report/plugins/aap_eda.py b/sos/report/plugins/aap_eda.py index ef0b436562..6c7a018c97 100644 --- a/sos/report/plugins/aap_eda.py +++ b/sos/report/plugins/aap_eda.py @@ -35,11 +35,11 @@ def setup(self): "/etc/ansible-automation-platform/eda/server.key", ]) - self.add_cmd_output([ - "aap-eda-manage --version", # eda version - "ls -alhR /etc/ansible-automation-platform/", - "ls -alhR /var/log/ansible-automation-platform/", - ]) + self.add_cmd_output("aap-eda-manage --version") + self.add_dir_listing([ + "/etc/ansible-automation-platform/", + "/var/log/ansible-automation-platform/", + ], recursive=True) self.add_cmd_output("su - eda -c 'export'", suggest_filename="eda_export") diff --git a/sos/report/plugins/aap_gateway.py b/sos/report/plugins/aap_gateway.py index fffc6c1746..206a341b34 100644 --- a/sos/report/plugins/aap_gateway.py +++ b/sos/report/plugins/aap_gateway.py @@ -35,11 +35,9 @@ def setup(self): "/etc/ansible-automation-platform/gateway/*.cert", ]) - self.add_cmd_output([ - "aap-gateway-manage list_services", - "ls -ll /etc/ansible-automation-platform/", - "ls -ll /etc/ansible-automation-platform/gateway/", - ]) + self.add_cmd_output("aap-gateway-manage list_services") + self.add_dir_listing("/etc/ansible-automation-platform/", + recursive=True) def postproc(self): # remove database password diff --git a/sos/report/plugins/aap_hub.py b/sos/report/plugins/aap_hub.py index bfbebfc335..f10b984e14 100644 --- a/sos/report/plugins/aap_hub.py +++ b/sos/report/plugins/aap_hub.py @@ -29,9 +29,9 @@ def setup(self): ]) - self.add_cmd_output([ - "ls -alhR /etc/ansible-automation-platform/", - "ls -alhR /var/log/ansible-automation-platform/", - ]) + self.add_dir_listing([ + "/etc/ansible-automation-platform/", + "/var/log/ansible-automation-platform/", + ], recursive=True) # vim: set et ts=4 sw=4 : diff --git a/sos/report/plugins/aap_receptor.py b/sos/report/plugins/aap_receptor.py index d6232f4443..ab4865d6c9 100644 --- a/sos/report/plugins/aap_receptor.py +++ b/sos/report/plugins/aap_receptor.py @@ -40,10 +40,10 @@ def setup(self): "/etc/receptor/*key.pem" ]) - self.add_cmd_output([ - "ls -llZ /etc/receptor", - "ls -llZ /var/run/receptor", - "ls -llZ /var/run/awx-receptor" + self.add_dir_listing([ + "/etc/receptor", + "/var/run/receptor", + "/var/run/awx-receptor" ]) for s in glob.glob('/var/run/*receptor/*.sock'): diff --git a/sos/report/plugins/apparmor.py b/sos/report/plugins/apparmor.py index 5c2ad6fe21..be3b98ca02 100644 --- a/sos/report/plugins/apparmor.py +++ b/sos/report/plugins/apparmor.py @@ -29,10 +29,11 @@ def setup(self): "/etc/apparmor.d/abstractions" ]) - self.add_cmd_output([ - "apparmor_status", - "ls -alh /etc/apparmor.d/abstractions", - "ls -alh /etc/apparmor.d/libvirt", + self.add_cmd_output("apparmor_status") + + self.add_dir_listing([ + '/etc/apparmor.d/abstractions', + '/etc/apparmor.d/libvirt' ]) # vim: set et ts=4 sw=4 : diff --git a/sos/report/plugins/apport.py b/sos/report/plugins/apport.py index b908ab510e..5afb8efd5b 100644 --- a/sos/report/plugins/apport.py +++ b/sos/report/plugins/apport.py @@ -33,7 +33,7 @@ def setup(self): "gdbus call -y -d com.ubuntu.WhoopsiePreferences \ -o /com/ubuntu/WhoopsiePreferences \ -m com.ubuntu.WhoopsiePreferences.GetIdentifier") - self.add_cmd_output("ls -alhR /var/crash/") + self.add_dir_listing('/var/crash', recursive=True) self.add_cmd_output("bash -c 'grep -B 50 -m 1 ProcMaps /var/crash/*'") # vim: set et ts=4 sw=4 : diff --git a/sos/report/plugins/block.py b/sos/report/plugins/block.py index ca0a7aef48..5085fc8857 100644 --- a/sos/report/plugins/block.py +++ b/sos/report/plugins/block.py @@ -25,15 +25,16 @@ def setup(self): '/sys/block/.*/queue/scheduler': 'scheduler' }) + self.add_dir_listing('/dev', tags=['ls_dev'], recursive=True) + self.add_dir_listing('/sys/block', recursive=True) + self.add_cmd_output("blkid -c /dev/null", tags="blkid") - self.add_cmd_output("ls -lanR /dev", tags="ls_dev") self.add_cmd_output("lsblk", tags="lsblk") self.add_cmd_output("lsblk -O -P", tags="lsblk_pairs") self.add_cmd_output([ "lsblk -t", "lsblk -D", "blockdev --report", - "ls -lanR /sys/block", "losetup -a", ]) diff --git a/sos/report/plugins/boot.py b/sos/report/plugins/boot.py index 7b83ea0bbf..6e81e023e2 100644 --- a/sos/report/plugins/boot.py +++ b/sos/report/plugins/boot.py @@ -33,16 +33,17 @@ def setup(self): "/boot/yaboot.conf" ]) - self.add_cmd_output("ls -lanR /boot", tags="ls_boot") - self.add_cmd_output("ls -lanR /sys/firmware", - tags="ls_sys_firmware") + self.add_dir_listing('/boot', tags=['ls_boot'], recursive=True) + self.add_dir_listing('/sys/firmware/', tags=['ls_sys_firmware'], + recursive=True) + self.add_dir_listing(['/initrd.img', '/boot/initrd.img']) + self.add_cmd_output("lsinitrd", tags="lsinitrd") self.add_cmd_output("mokutil --sb-state", tags="mokutil_sbstate") self.add_cmd_output([ "efibootmgr -v", - "ls -l /initrd.img /boot/initrd.img", "lsinitramfs -l /initrd.img", "lsinitramfs -l /boot/initrd.img" ]) diff --git a/sos/report/plugins/crio.py b/sos/report/plugins/crio.py index e5a4ba4350..488a5f36aa 100644 --- a/sos/report/plugins/crio.py +++ b/sos/report/plugins/crio.py @@ -46,10 +46,11 @@ def setup(self): ]) self.add_cmd_output([ - "ls -alhR /etc/cni", "crio config" ]) + self.add_dir_listing('/etc/cni', recursive=True) + # base cri-o installation does not require cri-tools, which is what # supplies the crictl utility self.set_cmd_predicate(SoSPredicate(self, packages=['cri-tools'])) diff --git a/sos/report/plugins/docker.py b/sos/report/plugins/docker.py index 366ce92de2..8caddd6112 100644 --- a/sos/report/plugins/docker.py +++ b/sos/report/plugins/docker.py @@ -44,7 +44,7 @@ def setup(self): ]) self.add_journal(units="docker") - self.add_cmd_output("ls -alhR /etc/docker") + self.add_dir_listing('/etc/docker', recursive=True) self.set_cmd_predicate(SoSPredicate(self, services=["docker"])) diff --git a/sos/report/plugins/docker_distribution.py b/sos/report/plugins/docker_distribution.py index 31301092e0..3958e8a5b2 100644 --- a/sos/report/plugins/docker_distribution.py +++ b/sos/report/plugins/docker_distribution.py @@ -25,7 +25,7 @@ def setup(self): for line in file: if 'rootdirectory' in line: loc = line.split()[1] - self.add_cmd_output('tree ' + loc) + self.add_dir_listing(loc, tree=True) class RedHatDockerDistribution(DockerDistribution, RedHatPlugin): diff --git a/sos/report/plugins/ds.py b/sos/report/plugins/ds.py index 4fa7fabbe8..856701d93b 100644 --- a/sos/report/plugins/ds.py +++ b/sos/report/plugins/ds.py @@ -77,7 +77,7 @@ def setup(self): "/opt/redhat-ds/slapd-*/logs" ]) - self.add_cmd_output("ls -l /var/lib/dirsrv/slapd-*/db/*") + self.add_dir_listing("/var/lib/dirsrv/slapd-*/db/*") def postproc(self): # Example for scrubbing rootpw hash diff --git a/sos/report/plugins/etcd.py b/sos/report/plugins/etcd.py index 08cd19d3d4..7f3b4755fa 100644 --- a/sos/report/plugins/etcd.py +++ b/sos/report/plugins/etcd.py @@ -51,7 +51,8 @@ def setup(self): '/etc/etcd/*.key' ]) - self.add_cmd_output('ls -lR /var/lib/etcd/', container=etcd_con) + self.add_dir_listing('/var/lib/etcd/', container=etcd_con, + recursive=True) self.add_copy_spec('/etc/etcd', container=etcd_con) subcmds = [ diff --git a/sos/report/plugins/filesys.py b/sos/report/plugins/filesys.py index c001fe5986..9a9564b768 100644 --- a/sos/report/plugins/filesys.py +++ b/sos/report/plugins/filesys.py @@ -108,6 +108,6 @@ class RedHatFilesys(Filesys, RedHatPlugin): def setup(self): super().setup() - self.add_cmd_output("ls -ltradZ /tmp") + self.add_cmd_output('ls -ldZ /tmp') # vim: set et ts=4 sw=4 : diff --git a/sos/report/plugins/foreman.py b/sos/report/plugins/foreman.py index 927ab731ad..f3d3f4ad37 100644 --- a/sos/report/plugins/foreman.py +++ b/sos/report/plugins/foreman.py @@ -127,12 +127,16 @@ def setup(self): 'passenger-status --show requests', 'passenger-status --show backtraces', 'passenger-memory-stats', - 'ls -lanR /root/ssl-build', - 'ls -lanR /usr/share/foreman/config/hooks', f'ping -c1 -W1 {_hostname}', f'ping -c1 -W1 {_host_f}', 'ping -c1 -W1 localhost' ]) + + self.add_dir_listing([ + '/root/ssl-build', + '/usr/share/foreman/config/hooks' + ], recursive=True) + self.add_cmd_output( 'qpid-stat -b amqps://localhost:5671 -q \ --ssl-certificate=/etc/pki/katello/qpid_router_client.crt \ diff --git a/sos/report/plugins/grub2.py b/sos/report/plugins/grub2.py index e4d60e4db5..7c75f76eb4 100644 --- a/sos/report/plugins/grub2.py +++ b/sos/report/plugins/grub2.py @@ -39,7 +39,6 @@ def setup(self): "/etc/grub2-efi.cfg" ]) - self.add_cmd_output("ls -lanR /boot", tags="ls_boot") # call grub2-mkconfig with GRUB_DISABLE_OS_PROBER=true to prevent # possible unwanted loading of some kernel modules # further, check if the command supports --no-grubenv-update option diff --git a/sos/report/plugins/insights.py b/sos/report/plugins/insights.py index 63dfe21040..be6a8b262e 100644 --- a/sos/report/plugins/insights.py +++ b/sos/report/plugins/insights.py @@ -52,8 +52,8 @@ def setup(self): timeout=30 ) - for _dir in ["/etc/rhsm", "/sys/kernel", "/var/lib/sss"]: - self.add_cmd_output(f"/bin/ls -lanR {_dir}", cmd_as_tag=True) + self.add_dir_listing(["/etc/rhsm", "/sys/kernel", "/var/lib/sss"], + recursive=True) def postproc(self): for conf in self.config_and_status: diff --git a/sos/report/plugins/ipa.py b/sos/report/plugins/ipa.py index 5a5dfc8800..4f95ce215d 100644 --- a/sos/report/plugins/ipa.py +++ b/sos/report/plugins/ipa.py @@ -164,7 +164,6 @@ def setup(self): ]) self.add_cmd_output([ - "ls -la /etc/dirsrv/slapd-*/schema/", "certutil -L -d /etc/httpd/alias/", "pki-server cert-find --show-all", "pki-server subsystem-cert-validate ca", @@ -173,6 +172,8 @@ def setup(self): "klist -ket /var/lib/ipa/gssproxy/http.keytab" ]) + self.add_dir_listing("/etc/dirsrv/slapd-*/schema/") + getcert_pred = SoSPredicate(self, services=['certmonger']) diff --git a/sos/report/plugins/juju.py b/sos/report/plugins/juju.py index 468aa843df..8a194df615 100644 --- a/sos/report/plugins/juju.py +++ b/sos/report/plugins/juju.py @@ -33,10 +33,10 @@ def setup(self): self.add_copy_spec("/var/lib/juju/agents/*/agent.conf") # Get a directory listing of /var/log/juju and /var/lib/juju - self.add_cmd_output([ - "ls -alRh /var/log/juju*", - "ls -alRh /var/lib/juju*" - ]) + self.add_dir_listing([ + '/var/log/juju*', + '/var/lib/juju*' + ], recursive=True) if self.get_option("all_logs"): # /var/lib/juju used to be in the default capture moving here diff --git a/sos/report/plugins/kdump.py b/sos/report/plugins/kdump.py index a5841aea8c..a1be9ea462 100644 --- a/sos/report/plugins/kdump.py +++ b/sos/report/plugins/kdump.py @@ -94,7 +94,7 @@ def setup(self): # set no filesystem and default path path = "/var/crash" - self.add_cmd_output(f"ls -alhR {path}") + self.add_dir_listing(path, recursive=True) self.add_copy_spec(f"{path}/*/vmcore-dmesg.txt") self.add_copy_spec(f"{path}/*/kexec-dmesg.log") @@ -131,7 +131,7 @@ class CosKDump(KDump, CosPlugin): def setup(self): super().setup() - self.add_cmd_output('ls -alRh /var/kdump*') + self.add_dir_listing('/var/kdump*', recursive=True) if self.get_option("collect-kdumps"): self.add_copy_spec(["/var/kdump-*"]) @@ -172,7 +172,7 @@ def setup(self): # set no filesystem and default path path = "/var/crash" - self.add_cmd_output(f"ls -alhR {path}") + self.add_dir_listing(path, recursive=True) self.add_copy_spec(f"{path}/*/vmcore-dmesg.txt") self.add_copy_spec(f"{path}/*/kexec-dmesg.log") diff --git a/sos/report/plugins/kernel.py b/sos/report/plugins/kernel.py index 929a73512f..9304a2288f 100644 --- a/sos/report/plugins/kernel.py +++ b/sos/report/plugins/kernel.py @@ -51,7 +51,7 @@ def setup(self): # compat self.add_cmd_output("uname -a", root_symlink="uname", tags="uname") self.add_cmd_output("lsmod", root_symlink="lsmod", tags="lsmod") - self.add_cmd_output("ls -lt /sys/kernel/slab") + self.add_dir_listing('/sys/kernel/slab') try: modules = self.listdir(self.sys_module) diff --git a/sos/report/plugins/libraries.py b/sos/report/plugins/libraries.py index 3a551a2d44..cd44978670 100644 --- a/sos/report/plugins/libraries.py +++ b/sos/report/plugins/libraries.py @@ -44,7 +44,9 @@ def setup(self): dirs.add(fqlib[1].rsplit('/', 1)[0]) if dirs: - self.add_cmd_output(f"ls -lanH {' '.join(dirs)}", - suggest_filename="ld_so_cache") + self.add_dir_listing( + f"{' '.join(dirs)}", + suggest_filename='ld_so_cache' + ) # vim: set et ts=4 sw=4 : diff --git a/sos/report/plugins/libvirt.py b/sos/report/plugins/libvirt.py index 25d718a439..169d662eee 100644 --- a/sos/report/plugins/libvirt.py +++ b/sos/report/plugins/libvirt.py @@ -74,7 +74,7 @@ def setup(self): if self.path_exists(self.path_join(libvirt_keytab)): self.add_cmd_output(f"klist -ket {libvirt_keytab}") - self.add_cmd_output("ls -lR /var/lib/libvirt/qemu") + self.add_dir_listing("/var/lib/libvirt/qemu", recursive=True) # get details of processes of KVM hosts for pidfile in glob.glob("/run/libvirt/*/*.pid"): diff --git a/sos/report/plugins/logs.py b/sos/report/plugins/logs.py index 04352c7a57..78d7e4a4c4 100644 --- a/sos/report/plugins/logs.py +++ b/sos/report/plugins/logs.py @@ -54,7 +54,7 @@ def setup(self): ]) self.add_cmd_output("journalctl --disk-usage") - self.add_cmd_output('ls -alRh /var/log/') + self.add_dir_listing('/var/log', recursive=True) # collect journal logs if: # - there is some data present, either persistent or runtime only diff --git a/sos/report/plugins/mssql.py b/sos/report/plugins/mssql.py index 592c094c3d..fd6dd03514 100644 --- a/sos/report/plugins/mssql.py +++ b/sos/report/plugins/mssql.py @@ -66,7 +66,7 @@ def setup(self): f' but not found in {kerberoskeytabfile}') if kerberoskeytabfile is not None: if self.path_isfile(kerberoskeytabfile): - self.add_cmd_output(f'ls -l {kerberoskeytabfile}') + self.add_dir_listing(kerberoskeytabfile) self.add_cmd_output(f'klist -e -k {kerberoskeytabfile}') else: self._log_error(keytab_err) diff --git a/sos/report/plugins/openstack_ironic.py b/sos/report/plugins/openstack_ironic.py index 2cb24f317e..b63e240fbe 100644 --- a/sos/report/plugins/openstack_ironic.py +++ b/sos/report/plugins/openstack_ironic.py @@ -71,8 +71,10 @@ def setup(self): for path in ['/var/lib/ironic', '/httpboot', '/tftpboot', self.ins_puppet_gen + '/var/lib/httpboot/', self.ins_puppet_gen + '/var/lib/tftpboot/']: - self.add_cmd_output(f'ls -laRt {path}') - self.add_cmd_output(f'ls -laRt {self.var_puppet_gen + path}') + self.add_dir_listing([ + path, + f"{self.var_puppet_gen}{path}" + ], recursive=True) # Let's get the packages from the containers, always helpful when # troubleshooting. @@ -108,8 +110,8 @@ def setup(self): "/var/log/ironic-inspector/*.log", ]) - for path in ['/var/lib/ironic', '/httpboot', '/tftpboot']: - self.add_cmd_output(f'ls -laRt {path}') + self.add_dir_listing(['/var/lib/ironic', '/httpboot', '/tftpboot'], + recursive=True) self.add_file_tags({ ".*/etc/ironic/ironic.conf": "ironic_conf" diff --git a/sos/report/plugins/openstack_neutron.py b/sos/report/plugins/openstack_neutron.py index bed4351fe9..678b985589 100644 --- a/sos/report/plugins/openstack_neutron.py +++ b/sos/report/plugins/openstack_neutron.py @@ -42,7 +42,7 @@ def setup(self): # rather take a list of files in the dir only self.add_copy_spec("/var/lib/neutron/") self.add_forbidden_path("/var/lib/neutron/lock") - self.add_cmd_output("ls -laZR /var/lib/neutron/lock") + self.add_dir_listing('/var/lib/neutron/lock', recursive=True) if self.path_exists(self.var_puppet_gen): ml2_pre = self.var_puppet_gen diff --git a/sos/report/plugins/opensvc.py b/sos/report/plugins/opensvc.py index 7b1319fe73..4f14fa7530 100644 --- a/sos/report/plugins/opensvc.py +++ b/sos/report/plugins/opensvc.py @@ -49,7 +49,6 @@ def setup(self): "/var/lib/opensvc/vol/*", ]) self.add_cmd_output([ - "ls -laRt /var/lib/opensvc", "om pool status --verbose --color=no", "om net status --verbose --color=no", "om mon --color=no", @@ -57,6 +56,7 @@ def setup(self): "om daemon relay status --color=no", "om daemon status --format flat_json --color=no" ]) + self.add_dir_listing('/var/lib/opensvc', recursive=True) self.get_status('vol') self.get_status('svc') diff --git a/sos/report/plugins/openvswitch.py b/sos/report/plugins/openvswitch.py index 728acab9bc..8ecb8433af 100644 --- a/sos/report/plugins/openvswitch.py +++ b/sos/report/plugins/openvswitch.py @@ -73,12 +73,14 @@ def setup(self): "openvswitch_server_log" }) + self.add_dir_listing([ + '/run/openvswitch', + '/dev/hugepages/', + '/dev/vfio', + '/var/lib/vhost_sockets', + ]) + self.add_cmd_output([ - # List the contents of important runtime directories - "ls -laZ /run/openvswitch", - "ls -laZ /dev/hugepages/", - "ls -laZ /dev/vfio", - "ls -laZ /var/lib/vhost_sockets", # List devices and their drivers "dpdk_nic_bind --status", "dpdk-devbind.py --status", diff --git a/sos/report/plugins/ovirt.py b/sos/report/plugins/ovirt.py index d3eacc2610..682dbb5e71 100644 --- a/sos/report/plugins/ovirt.py +++ b/sos/report/plugins/ovirt.py @@ -86,7 +86,7 @@ def setup(self): if not self.get_option('heapdump'): self.add_forbidden_path('/var/log/ovirt-engine/dump') - self.add_cmd_output('ls -l /var/log/ovirt-engine/dump/') + self.add_dir_listing('/var/log/ovirt-engine/dump/') certificates = [ '/etc/pki/ovirt-engine/ca.pem', diff --git a/sos/report/plugins/ovn_central.py b/sos/report/plugins/ovn_central.py index 0040c28065..6c09f18093 100644 --- a/sos/report/plugins/ovn_central.py +++ b/sos/report/plugins/ovn_central.py @@ -209,8 +209,8 @@ def setup(self): dbfilepath = self.path_join(path, dbfile) if self.path_exists(dbfilepath): self.add_copy_spec(dbfilepath) - self.add_cmd_output( - f"ls -lan {dbfilepath}", foreground=True) + self.add_dir_listing(dbfilepath) + if ovs_dbdir: self.add_copy_spec(self.path_join(ovs_dbdir, dbfile)) diff --git a/sos/report/plugins/pam.py b/sos/report/plugins/pam.py index 81e7492537..a9773ff1f2 100644 --- a/sos/report/plugins/pam.py +++ b/sos/report/plugins/pam.py @@ -30,11 +30,12 @@ def setup(self): "/etc/security" ]) self.add_cmd_output([ - f"ls -lanF {self.security_libs}", "pam_tally2", "faillock" ]) + self.add_dir_listing(self.security_libs) + class RedHatPam(Pam, RedHatPlugin): security_libs = "/lib*/security" diff --git a/sos/report/plugins/podman.py b/sos/report/plugins/podman.py index 0fab328571..3d6f2b0810 100644 --- a/sos/report/plugins/podman.py +++ b/sos/report/plugins/podman.py @@ -79,10 +79,10 @@ def setup(self): if self.get_option('size'): self.add_cmd_output('podman ps -as', priority=100) - self.add_cmd_output([ - "ls -alhR /etc/cni", - "ls -alhR /etc/containers" - ]) + self.add_dir_listing([ + '/etc/cni', + '/etc/containers' + ], recursive=True) pnets = self.collect_cmd_output('podman network ls', tags='podman_list_networks') diff --git a/sos/report/plugins/powerpc.py b/sos/report/plugins/powerpc.py index 46d001bcbc..cb216ee8ba 100644 --- a/sos/report/plugins/powerpc.py +++ b/sos/report/plugins/powerpc.py @@ -121,8 +121,6 @@ def setup(self): self.add_cmd_output([ "opal-prd --expert-mode run nvdimm_info" ]) - if self.path_isdir("/var/log/dump"): - self.add_cmd_output("ls -l /var/log/dump") - + self.add_dir_listing('/var/log/dump') # vim: set et ts=4 sw=4 : diff --git a/sos/report/plugins/pulpcore.py b/sos/report/plugins/pulpcore.py index 3f9ce95367..f3696cd595 100644 --- a/sos/report/plugins/pulpcore.py +++ b/sos/report/plugins/pulpcore.py @@ -100,7 +100,7 @@ def setup(self): "DJANGO_SETTINGS_MODULE": "pulpcore.app.settings"} self.add_cmd_output("dynaconf list", env=dynaconf_env) for _dir in [self.staticroot, self.uploaddir]: - self.add_cmd_output(f"ls -l {_dir}") + self.add_dir_listing(_dir) task_days = self.get_option('task-days') for table in ['core_task', 'core_taskgroup', diff --git a/sos/report/plugins/puppet.py b/sos/report/plugins/puppet.py index 9a69ed149b..b6c2d24ff2 100644 --- a/sos/report/plugins/puppet.py +++ b/sos/report/plugins/puppet.py @@ -47,10 +47,13 @@ def setup(self): self.add_cmd_output([ 'facter', 'puppet --version', - 'ls -lanR /etc/puppet/modules', - 'ls -lanR /etc/puppetlabs/code/modules' ]) + self.add_dir_listing([ + '/etc/puppet/modules', + '/etc/puppetlabs/code/modules' + ], recursive=True) + def postproc(self): for device_conf in glob("/etc/puppet/device.conf*"): self.do_file_sub( diff --git a/sos/report/plugins/qpid.py b/sos/report/plugins/qpid.py index 40dd3af28e..87b5315e1d 100644 --- a/sos/report/plugins/qpid.py +++ b/sos/report/plugins/qpid.py @@ -60,9 +60,10 @@ def setup(self): "qpid-route route list" + options, "qpid-cluster" + options, # applies to pre-0.22 versions "qpid-ha query" + options, # applies since 0.22 version - "ls -lanR /var/lib/qpidd" ]) + self.add_dir_listing('/var/lib/qpidd', recursive=True) + self.add_copy_spec([ "/etc/qpidd.conf", # applies to pre-0.22 versions "/etc/qpid/qpidd.conf", # applies since 0.22 version diff --git a/sos/report/plugins/rhui.py b/sos/report/plugins/rhui.py index 465c47191f..d465bbb073 100644 --- a/sos/report/plugins/rhui.py +++ b/sos/report/plugins/rhui.py @@ -39,9 +39,10 @@ def setup(self): self.add_cmd_output([ "rhui-manager status", "rhui-manager cert info", - "ls -lR /var/lib/rhui/remote_share", ], timeout=60, env={'PYTHONUNBUFFERED': '1'}) + self.add_dir_listing('/var/lib/rhui/remote_share', recursive=True) + def postproc(self): # hide rhui_manager_password value in (also rotated) answers file self.do_path_regex_sub( diff --git a/sos/report/plugins/rpm.py b/sos/report/plugins/rpm.py index 1e4caeefc6..4fd94e86ec 100644 --- a/sos/report/plugins/rpm.py +++ b/sos/report/plugins/rpm.py @@ -27,7 +27,7 @@ class Rpm(Plugin, RedHatPlugin): def setup(self): self.add_copy_spec("/var/log/rpmpkgs") - self.add_cmd_output("ls -lanR /var/lib/rpm") + self.add_dir_listing('/var/lib/rpm', recursive=True) if self.get_option("rpmq"): rpmq = "rpm --nodigest -qa --qf=%s" diff --git a/sos/report/plugins/services.py b/sos/report/plugins/services.py index 59b45f24ed..7cddf87253 100644 --- a/sos/report/plugins/services.py +++ b/sos/report/plugins/services.py @@ -30,10 +30,9 @@ def setup(self): ]) if self.get_option('servicestatus'): self.add_cmd_output("service --status-all") - self.add_cmd_output([ - "/sbin/runlevel", - "ls /var/lock/subsys" - ]) + self.add_cmd_output("/sbin/runlevel") + + self.add_dir_listing('/var/lock/subsys') class RedHatServices(Services, RedHatPlugin): diff --git a/sos/report/plugins/smartcard.py b/sos/report/plugins/smartcard.py index c08b8501c6..623c060849 100644 --- a/sos/report/plugins/smartcard.py +++ b/sos/report/plugins/smartcard.py @@ -34,13 +34,15 @@ def setup(self): ]) self.add_cmd_output([ "pklogin_finder debug", - "ls -nl /usr/lib*/pam_pkcs11/", "pcsc_scan", "pkcs11-tool --show-info", "pkcs11-tool --list-mechanisms", "pkcs11-tool --list-slots", "pkcs11-tool --list-objects" ]) + + self.add_dir_listing('/usr/lib*/pam_pkcs11/') + self.add_forbidden_path("/etc/pam_pkcs11/nssdb/key[3-4].db") # vim: set et ts=4 sw=4 : diff --git a/sos/report/plugins/snapper.py b/sos/report/plugins/snapper.py index 9ef5fec231..6ac627f86c 100644 --- a/sos/report/plugins/snapper.py +++ b/sos/report/plugins/snapper.py @@ -19,9 +19,10 @@ class Snapper(Plugin, IndependentPlugin): def setup(self): self.add_cmd_output([ - "ls -la /usr/lib/snapper/", "snapper --version", "snapper list" ]) + self.add_dir_listing('/usr/lib/snapper/') + # vim: set et ts=4 sw=4 : diff --git a/sos/report/plugins/ssh.py b/sos/report/plugins/ssh.py index 9098611d0a..7e426f31fc 100644 --- a/sos/report/plugins/ssh.py +++ b/sos/report/plugins/ssh.py @@ -83,7 +83,6 @@ def user_ssh_files_permissions(self): # Read the home paths of users in the system and check the ~/.ssh dirs for user in users_data: home_dir = self.path_join(user.pw_dir, '.ssh') - if self.path_isdir(home_dir): - self.add_cmd_output(f"ls -laZ {home_dir}") + self.add_dir_listing(home_dir) # vim: set et ts=4 sw=4 : diff --git a/sos/report/plugins/systemd.py b/sos/report/plugins/systemd.py index a141947763..a50a155e36 100644 --- a/sos/report/plugins/systemd.py +++ b/sos/report/plugins/systemd.py @@ -30,9 +30,10 @@ def setup(self): '/etc/systemd/logind.conf': 'systemd_logind_conf' }) + self.add_dir_listing('/lib/systemd', recursive=True) + self.add_cmd_output([ "journalctl --list-boots", - "ls -lR /lib/systemd", "systemctl list-dependencies", "systemctl list-jobs", "systemctl list-machines", diff --git a/sos/report/plugins/tftpserver.py b/sos/report/plugins/tftpserver.py index bda54779ea..d2ee6daed4 100644 --- a/sos/report/plugins/tftpserver.py +++ b/sos/report/plugins/tftpserver.py @@ -21,8 +21,6 @@ class TftpServer(Plugin, IndependentPlugin): packages = ('tftp-server',) def setup(self): - self.add_cmd_output("ls -lanR /tftpboot") - self.add_cmd_output('ls -lanR /srv/tftp') - + self.add_dir_listing(['/tftpboot', '/sr/tftp'], recursive=True) # vim: set et ts=4 sw=4 : diff --git a/sos/report/plugins/vdsm.py b/sos/report/plugins/vdsm.py index a4582e6e8b..4a59416821 100644 --- a/sos/report/plugins/vdsm.py +++ b/sos/report/plugins/vdsm.py @@ -98,11 +98,14 @@ def setup(self): for pid in qemu_pids for name in files ]) - self.add_cmd_output([ - "ls -ldZ /etc/vdsm", - "su vdsm -s /bin/sh -c 'tree -l /rhev/data-center'", - "su vdsm -s /bin/sh -c 'ls -lR /rhev/data-center'" - ]) + + self.add_dir_listing( + ['/etc/vdsm', '/rhev/data-center'], + runas='vdsm', recursive=True + ) + + self.add_dir_listing('/rhev/data-center', tree=True) + self.add_cmd_output([ f"lvm vgs -v -o +tags --config \'{LVM_CONFIG}\'", f"lvm lvs -v -o +tags --config \'{LVM_CONFIG}\'", diff --git a/tests/report_tests/basic_report_tests.py b/tests/report_tests/basic_report_tests.py index acdf5e76f5..6489670e9c 100644 --- a/tests/report_tests/basic_report_tests.py +++ b/tests/report_tests/basic_report_tests.py @@ -47,6 +47,16 @@ def test_tag_summary_created(self): "Tag summary malformed" ) + def test_dir_listing_works(self): + self.assertFileCollected('sos_commands/boot/ls_-alhZR_.boot') + boot_ls = self.get_name_in_archive('sos_commands/boot/ls_-alhZR_.boot') + with open(boot_ls, 'r') as ls_file: + # make sure we actually got ls output + ln = ls_file.readline().strip() + self.assertEqual( + ln, '/boot:', f"dir listing first line looks incorrect: {ln}" + ) + @redhat_only def test_version_matches_package(self): if not self.params.get('TESTLOCAL') == 'true':