aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBissenbay <bissenbay@gmail.com>2019-09-23 11:08:05 -0400
committerJake Hunsaker <jhunsake@redhat.com>2019-11-14 12:52:24 -0500
commit3391ca32d95d3038cfcd33c2ff17c90e39778027 (patch)
treedc45d3882bf4e7a102aeeaec2041a9edf1227a66
parent0a4dc49aa64df0934beffdf993f210d6bd997e90 (diff)
downloadsos-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.py63
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 :