From 7de8fb33a206fabb06261c0a5b79656d66efb32f Mon Sep 17 00:00:00 2001 From: "Scot W. Stevenson" Date: Sun, 12 Nov 2017 05:27:43 +0100 Subject: [PATCH] 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 Reviewed-by: Giuseppe Di Natale Signed-off-by: Scot W. Stevenson Closes #6849 Closes #6850 --- cmd/arc_summary/arc_summary.py | 24 ++++++++++++++++-------- 1 file 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 getopt +import os +import re import sys import time -import getopt -import re -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: