diff --git a/sos/report/plugins/__init__.py b/sos/report/plugins/__init__.py index 3e943e95e4..783cdaa906 100644 --- a/sos/report/plugins/__init__.py +++ b/sos/report/plugins/__init__.py @@ -1616,6 +1616,19 @@ def get_tags_for_file(self, fname): tags.extend(val) return tags + def get_devices_by_fstype(self, fstype): + """Get list of devices based on fstype and returns empty array in case + of failure. + """ + dev = [] + all_devs = self.exec_cmd("lsblk -rpo NAME,FSTYPE") + if (all_devs['status'] == 0 and not all_devs['truncated']): + if all_devs['status'] == 0: + for line in all_devs['output'].splitlines(): + if (fstype in line) and (line.split()[0] not in dev): + dev.append(line.split()[0]) + return dev + def generate_copyspec_tags(self): """After file collections have completed, retroactively generate manifest entries to apply tags to files copied by generic copyspecs diff --git a/sos/report/plugins/ext.py b/sos/report/plugins/ext.py new file mode 100644 index 0000000000..80f624582f --- /dev/null +++ b/sos/report/plugins/ext.py @@ -0,0 +1,57 @@ +# This file is part of the sos project: https://github.com/sosreport/sos +# +# This copyrighted material is made available to anyone wishing to use, +# modify, copy, or redistribute it subject to the terms and conditions of +# version 2 of the GNU General Public License. +# +# See the LICENSE file in the source distribution for further information. + +from sos.report.plugins import Plugin, IndependentPlugin, PluginOpt + + +class Ext(Plugin, IndependentPlugin): + """This plugin collects information on mounted Ext2/3/4 filessystems on + the local system. + + Users should expect `dumpe2fs -h` or `dumpe2fs` collections by this + plugin for each Ext2/3/4 filesystem that is recognized by lsblk. + """ + + short_desc = 'Ext2/3/4 filesystem' + + plugin_name = 'ext' + profiles = ('storage',) + files = ('/sys/fs/ext4/', '/proc/fs/ext4/', '/proc/fs/jbd2/') + + option_list = [ + PluginOpt('dumpe2fs', default=False, desc='dump filesystem info'), + PluginOpt('frag', default=False, + desc='collect filesystem fragmentation status') + ] + + def setup(self): + dumpe2fs_opts = '-h' + if self.get_option('dumpe2fs'): + dumpe2fs_opts = '' + allfs = self.get_devices_by_fstype('ext') + if allfs: + for fs in allfs: + self.add_cmd_output(f"dumpe2fs {dumpe2fs_opts} {fs}", + tags="dumpe2fs_h") + + if self.get_option('frag'): + self.add_cmd_output(f"e2freefrag {fs}", priority=100) + + else: + mounts = '/proc/mounts' + ext_fs_regex = r"^(/dev/\S+).+ext[234]\s+" + for dev in self.do_regex_find_all(ext_fs_regex, mounts): + self.add_cmd_output(f"dumpe2fs {dumpe2fs_opts} {fs}", + tags="dumpe2fs_h") + + if self.get_option('frag'): + self.add_cmd_output(f"e2freefrag {fs}", priority=100) + + self.add_copy_spec(self.files) + +# vim: set et ts=4 sw=4 : diff --git a/sos/report/plugins/filesys.py b/sos/report/plugins/filesys.py index f45eb38214..0a3f058825 100644 --- a/sos/report/plugins/filesys.py +++ b/sos/report/plugins/filesys.py @@ -29,9 +29,6 @@ class Filesys(Plugin, DebianPlugin, UbuntuPlugin, CosPlugin): option_list = [ PluginOpt('lsof', default=False, desc='collect information on all open files'), - PluginOpt('dumpe2fs', default=False, desc='dump filesystem info'), - PluginOpt('frag', default=False, - desc='collect filesystem fragmentation status') ] def setup(self): @@ -75,18 +72,36 @@ def setup(self): if self.get_option('lsof'): self.add_cmd_output("lsof -b +M -n -l -P", root_symlink="lsof", priority=50) + option_list = [ + PluginOpt('dumpe2fs', default=False, desc='dump filesystem info'), + PluginOpt('frag', default=False, + desc='collect filesystem fragmentation status') + ] + def setup(self): dumpe2fs_opts = '-h' if self.get_option('dumpe2fs'): dumpe2fs_opts = '' - mounts = '/proc/mounts' - ext_fs_regex = r"^(/dev/\S+).+ext[234]\s+" - for dev in self.do_regex_find_all(ext_fs_regex, mounts): - self.add_cmd_output("dumpe2fs %s %s" % (dumpe2fs_opts, dev), - tags="dumpe2fs_h") + allfs = self.get_devices_by_fstype('ext') + if allfs: + for fs in allfs: + self.add_cmd_output(f"dumpe2fs {dumpe2fs_opts} {fs}", + tags="dumpe2fs_h") + + if self.get_option('frag'): + self.add_cmd_output(f"e2freefrag {fs}", priority=100) + + else: + mounts = '/proc/mounts' + ext_fs_regex = r"^(/dev/\S+).+ext[234]\s+" + for dev in self.do_regex_find_all(ext_fs_regex, mounts): + self.add_cmd_output(f"dumpe2fs {dumpe2fs_opts} {fs}", + tags="dumpe2fs_h") if self.get_option('frag'): - self.add_cmd_output("e2freefrag %s" % (dev), priority=100) + self.add_cmd_output(f"e2freefrag {fs}", priority=100) + + self.add_copy_spec(self.files) def postproc(self): self.do_file_sub( diff --git a/sos/report/plugins/xfs.py b/sos/report/plugins/xfs.py index 79e1e2728c..8ca0e9ac1f 100644 --- a/sos/report/plugins/xfs.py +++ b/sos/report/plugins/xfs.py @@ -10,11 +10,11 @@ class Xfs(Plugin, IndependentPlugin): - """This plugin collects information on mounted XFS filessystems on the - local system. + """This plugin collects information on mounted XFS filessystems on + the local system. - Users should expect `xfs_info` and `xfs_admin` collections by this plugin - for each XFS filesystem that is locally mounted. + Users should expect `xfs_info` and `xfs_admin` collections by this + plugin for each XFS filesystem that is recognized by lsblk. """ short_desc = 'XFS filesystem' @@ -25,18 +25,23 @@ class Xfs(Plugin, IndependentPlugin): kernel_mods = ('xfs',) def setup(self): - mounts = '/proc/mounts' - ext_fs_regex = r"^(/dev/.+).+xfs\s+" - for dev in zip(self.do_regex_find_all(ext_fs_regex, mounts)): - for e in dev: - parts = e.split(' ') - self.add_cmd_output("xfs_info %s" % (parts[1]), + allfs = self.get_devices_by_fstype('xfs') + if allfs: + for fs in allfs: + self.add_cmd_output(f"xfs_info {fs}", tags="xfs_info") - self.add_cmd_output("xfs_admin -l -u %s" % (parts[0])) - - self.add_copy_spec([ - '/proc/fs/xfs', - '/sys/fs/xfs' - ]) + self.add_cmd_output(f"xfs_admin -l -u {fs}") + + else: + mounts = '/proc/mounts' + ext_fs_regex = r"^(/dev/.+).+xfs\s+" + for dev in zip(self.do_regex_find_all(ext_fs_regex, mounts)): + for e in dev: + parts = e.split() + self.add_cmd_output(f"xfs_info {parts[1]}", + tags="xfs_info") + self.add_cmd_output(f"xfs_admin -l -u {parts[0]}") + + self.add_copy_spec(self.files) # vim: set et ts=4 sw=4 :