diff options
author | Scot W. Stevenson <[email protected]> | 2017-11-12 05:27:43 +0100 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2017-11-11 20:27:43 -0800 |
commit | 5277f208f290ea4e2204800a66c3ba20a03fe503 (patch) | |
tree | 217ed55031313452a83b48fb3ad1af0cade7cc30 /cmd | |
parent | 7c351e31d5961a65ebf8ba2110f941391834df55 (diff) |
Fix arc_summary.py -d crash with Python3
Prevents arc_summary.py crashing when called with parameter -d or
long form --description with Python3.
Reviewed-by: George Melikov <[email protected]>
Reviewed-by: Giuseppe Di Natale <[email protected]>
Signed-off-by: Scot W. Stevenson <[email protected]>
Closes #6849
Closes #6850
Diffstat (limited to 'cmd')
-rwxr-xr-x | cmd/arc_summary/arc_summary.py | 24 |
1 files changed, 16 insertions, 8 deletions
diff --git a/cmd/arc_summary/arc_summary.py b/cmd/arc_summary/arc_summary.py index 4c513d63d..ec0468ecc 100755 --- a/cmd/arc_summary/arc_summary.py +++ b/cmd/arc_summary/arc_summary.py @@ -39,12 +39,12 @@ in-source documentation and code at https://github.com/zfsonlinux/zfs/blob/master/module/zfs/arc.c for details. """ -import sys -import time import getopt +import os import re +import sys +import time -from os import listdir from subprocess import Popen, PIPE from decimal import Decimal as D @@ -858,12 +858,12 @@ def _vdev_summary(Kstat): def _tunable_summary(Kstat): - """Print information on tunables""" + """Print information on tunables, including descriptions if requested""" global show_tunable_descriptions global alternate_tunable_layout - names = listdir("/sys/module/zfs/parameters/") + names = os.listdir("/sys/module/zfs/parameters/") values = {} for name in names: @@ -874,13 +874,21 @@ def _tunable_summary(Kstat): descriptions = {} if show_tunable_descriptions: + + command = ["/sbin/modinfo", "zfs", "-0"] + try: - command = ["/sbin/modinfo", "zfs", "-0"] p = Popen(command, stdin=PIPE, stdout=PIPE, stderr=PIPE, shell=False, close_fds=True) p.wait() - description_list = p.communicate()[0].strip().split('\0') + # By default, Python 2 returns a string as the first element of the + # tuple from p.communicate(), while Python 3 returns bytes which + # must be decoded first. The better way to do this would be with + # subprocess.run() or at least .check_output(), but this fails on + # CentOS 6 because of its old version of Python 2 + desc = bytes.decode(p.communicate()[0]) + description_list = desc.strip().split('\0') if p.returncode == 0: for tunable in description_list: @@ -899,7 +907,7 @@ def _tunable_summary(Kstat): (sys.argv[0], command[0], e.strerror)) sys.stderr.write("Tunable descriptions will be disabled.\n") - sys.stdout.write("ZFS Tunable:\n") + sys.stdout.write("ZFS Tunables:\n") names.sort() if alternate_tunable_layout: |