diff options
-rw-r--r-- | sos/plugins/python.py | 63 |
1 files changed, 55 insertions, 8 deletions
diff --git a/sos/plugins/python.py b/sos/plugins/python.py index e355f518..f2d16c1e 100644 --- a/sos/plugins/python.py +++ b/sos/plugins/python.py @@ -10,6 +10,9 @@ from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin import sos.policies +import os +import json +import hashlib class Python(Plugin, DebianPlugin, UbuntuPlugin): @@ -21,25 +24,69 @@ class Python(Plugin, DebianPlugin, UbuntuPlugin): packages = ('python',) + python_version = "python -V" + def setup(self): - self.add_cmd_output("python -V", suggest_filename="python-version") + self.add_cmd_output( + self.python_version, suggest_filename="python-version" + ) self.add_cmd_output("pip list") class RedHatPython(Python, RedHatPlugin): packages = ('python', 'python36', 'python2', 'platform-python') + option_list = [ + ('hashes', "gather hashes for all python files", 'slow', + False)] def setup(self): self.add_cmd_output(['python2 -V', 'python3 -V']) - self.add_cmd_output("pip list") if isinstance(self.policy, sos.policies.redhat.RHELPolicy) and \ self.policy.dist_version() > 7: - self.add_cmd_output( - '/usr/libexec/platform-python -V', - suggest_filename='python-version' - ) - else: - self.add_cmd_output('python -V', suggest_filename='python-version') + self.python_version = "/usr/libexec/platform-python -V" + super(RedHatPython, self).setup() + + if self.get_option('hashes'): + digests = { + 'digests': [] + } + + py_paths = [ + '/usr/lib', + '/usr/lib64', + '/usr/local/lib', + '/usr/local/lib64' + ] + + for py_path in py_paths: + for root, _, files in os.walk(py_path): + for file_ in files: + filepath = os.path.join(root, file_) + if filepath.endswith('.py'): + try: + with open(filepath, 'rb') as f: + digest = hashlib.sha256() + chunk = 1024 + while True: + data = f.read(chunk) + if data: + digest.update(data) + else: + break + + digest = digest.hexdigest() + + digests['digests'].append({ + 'filepath': filepath, + 'sha256': digest + }) + except IOError: + self._log_error( + "Unable to read python file at %s" % + filepath + ) + + self.add_string_as_file(json.dumps(digests), 'digests.json') # vim: set et ts=4 sw=4 : |