From 3391ca32d95d3038cfcd33c2ff17c90e39778027 Mon Sep 17 00:00:00 2001 From: Bissenbay Date: Mon, 23 Sep 2019 11:08:05 -0400 Subject: [python] Add hashes option, refactor Python vs. RedHatPython Adds a new `hashes` option to the `python` plugin. When specified, this option will generate a hash for every python file discovered in the `/usr/lib*` and `/usr/local/lib*` canonical paths. This information is then written to the archive as `digests.json` Additionally, refactors the differences between the base `Python` and `RedHatPython` classes when dealing with the system-default python installation. Resolves: #1801 Signed-off-by: Bissenbay Dauletbayev Signed-off-by: Jake Hunsaker --- sos/plugins/python.py | 63 ++++++++++++++++++++++++++++++++++++++++++++------- 1 file 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 : -- cgit