diff options
author | Bissenbay <bissenbay@gmail.com> | 2019-09-23 11:08:05 -0400 |
---|---|---|
committer | Jake Hunsaker <jhunsake@redhat.com> | 2019-11-14 12:52:24 -0500 |
commit | 3391ca32d95d3038cfcd33c2ff17c90e39778027 (patch) | |
tree | dc45d3882bf4e7a102aeeaec2041a9edf1227a66 | |
parent | 0a4dc49aa64df0934beffdf993f210d6bd997e90 (diff) | |
download | sos-3391ca32d95d3038cfcd33c2ff17c90e39778027.tar.gz |
[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 <bissenbay@gmail.com>
Signed-off-by: Jake Hunsaker <jhunsake@redhat.com>
-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 : |