From 06e1a0bc142bbe9f15421d7b6d7c3e4708d0c499 Mon Sep 17 00:00:00 2001 From: Mai Bui Date: Thu, 5 Jan 2023 19:22:09 -0500 Subject: [PATCH] [device/dell] Mitigation for security vulnerability (#11875) Dependency: [PR (#12065)](https://github.com/sonic-net/sonic-buildimage/pull/12065) needs to merge first. #### Why I did it `commands` module is not protected against malicious input `getstatusoutput` is detected without a static string, uses `shell=True` #### How I did it Eliminate the use of `commands` Use `subprocess.run()`, commands in `subprorcess.run()` are totally static Fix indentation #### How to verify it Tested on DUT [dell_log.txt](https://github.com/sonic-net/sonic-buildimage/files/9561332/dell_log.txt) --- .../plugins/fanutil.py | 29 ++- .../plugins/psuutil.py | 11 +- .../plugins/fanutil.py | 29 ++- .../plugins/psuutil.py | 11 +- .../plugins/psuutil.py | 12 +- .../plugins/psuutil.py | 8 +- .../plugins/psuutil.py | 62 +++--- .../plugins/psuutil.py | 13 +- .../plugins/psuutil.py | 17 +- .../plugins/psuutil.py | 13 +- .../plugins/psuutil.py | 55 ++--- .../plugins/fanutil.py | 98 +++++---- .../plugins/psuutil.py | 164 +++++++------- .../n3248pxe/sonic_platform/component.py | 6 +- .../n3248pxe/sonic_platform/psu.py | 20 +- .../n3248te/sonic_platform/component.py | 6 +- .../n3248te/sonic_platform/psu.py | 20 +- .../s5212f/scripts/platform_sensors.py | 80 +++---- .../s5212f/sonic_platform/sfp.py | 23 +- .../s5224f/scripts/platform_sensors.py | 58 ++--- .../s5224f/sonic_platform/sfp.py | 23 +- .../s5232f/scripts/platform_sensors.py | 50 +++-- .../s5232f/sonic_platform/sfp.py | 23 +- .../s5248f/scripts/platform_sensors.py | 17 +- .../s5248f/sonic_platform/sfp.py | 25 ++- .../s5296f/scripts/platform_sensors.py | 159 +++++++------- .../s5296f/sonic_platform/component.py | 5 +- .../s5296f/sonic_platform/sfp.py | 24 +- .../z9264f/scripts/platform_sensors.py | 6 +- .../z9264f/sonic_platform/sfp.py | 25 ++- .../z9332f/scripts/platform_sensors.py | 16 +- .../z9332f/sonic_platform/component.py | 15 +- .../z9332f/sonic_platform/sfp.py | 23 +- .../z9432f/scripts/platform_sensors.py | 206 +++++++++--------- .../z9432f/sonic_platform/component.py | 16 +- .../z9432f/sonic_platform/sfp.py | 23 +- 36 files changed, 715 insertions(+), 676 deletions(-) diff --git a/device/dell/x86_64-dellemc_n3248pxe_c3338-r0/plugins/fanutil.py b/device/dell/x86_64-dellemc_n3248pxe_c3338-r0/plugins/fanutil.py index b70d589013..e4d3429230 100644 --- a/device/dell/x86_64-dellemc_n3248pxe_c3338-r0/plugins/fanutil.py +++ b/device/dell/x86_64-dellemc_n3248pxe_c3338-r0/plugins/fanutil.py @@ -3,10 +3,10 @@ # Platform-specific FAN status interface for SONiC # -import commands import sys +from sonic_py_common.general import getstatusoutput_noshell -SENSORS_CMD = "docker exec -i pmon /usr/bin/sensors" +SENSORS_CMD = ["docker", "exec", "-i", "pmon", "/usr/bin/sensors"] DOCKER_SENSORS_CMD = "/usr/bin/sensors" @@ -33,24 +33,23 @@ class FanUtil(FanBase): return True def get_num_fans(self): - n3248pxe_MAX_FANTRAYS = 3 - return n3248pxe_MAX_FANTRAYS + n3248pxe_MAX_FANTRAYS = 3 + return n3248pxe_MAX_FANTRAYS def get_presence(self, idx): - sysfs_path = "/sys/devices/platform/dell-n3248pxe-cpld.0/fan" + self._fan_mapping[idx] + "_prs" - return int(open(sysfs_path).read(), 16) + sysfs_path = "/sys/devices/platform/dell-n3248pxe-cpld.0/fan" + self._fan_mapping[idx] + "_prs" + return int(open(sysfs_path).read(), 16) def get_direction(self, idx): - sysfs_path = "/sys/devices/platform/dell-n3248pxe-cpld.0/fan" + self._fan_mapping[idx] + "_dir" - return open(sysfs_path).read() + sysfs_path = "/sys/devices/platform/dell-n3248pxe-cpld.0/fan" + self._fan_mapping[idx] + "_dir" + return open(sysfs_path).read() def get_speed(self, idx): dockerenv = self.isDockerEnv() if not dockerenv: - status, cmd_output = commands.getstatusoutput(SENSORS_CMD) - else : - status, cmd_output = commands.getstatusoutput(DOCKER_SENSORS_CMD) - + status, cmd_output = getstatusoutput_noshell(SENSORS_CMD) + else: + status, cmd_output = getstatusoutput_noshell(DOCKER_SENSORS_CMD) if status: print('Failed to execute sensors command') sys.exit(0) @@ -64,9 +63,9 @@ class FanUtil(FanBase): return 0.0 def get_status(self, idx): - sysfs_path = "/sys/devices/platform/dell-n3248pxe-cpld.0/fan" + self._fan_mapping[idx] + "_prs" - return int(open(sysfs_path).read(), 16) + sysfs_path = "/sys/devices/platform/dell-n3248pxe-cpld.0/fan" + self._fan_mapping[idx] + "_prs" + return int(open(sysfs_path).read(), 16) def set_speed(self, idx): - return False + return False diff --git a/device/dell/x86_64-dellemc_n3248pxe_c3338-r0/plugins/psuutil.py b/device/dell/x86_64-dellemc_n3248pxe_c3338-r0/plugins/psuutil.py index a9cfd00b9e..758068dc47 100644 --- a/device/dell/x86_64-dellemc_n3248pxe_c3338-r0/plugins/psuutil.py +++ b/device/dell/x86_64-dellemc_n3248pxe_c3338-r0/plugins/psuutil.py @@ -3,11 +3,11 @@ # Platform-specific PSU status interface for SONiC # -import commands import os import sys +from sonic_py_common.general import getstatusoutput_noshell -SENSORS_CMD = "docker exec -i pmon /usr/bin/sensors" +SENSORS_CMD = ["docker", "exec", "-i", "pmon", "/usr/bin/sensors"] DOCKER_SENSORS_CMD = "/usr/bin/sensors" try: @@ -95,10 +95,9 @@ class PsuUtil(PsuBase): def get_sensor(self): dockerenv = self.isDockerEnv() if not dockerenv: - status, cmd_output = commands.getstatusoutput(SENSORS_CMD) - else : - status, cmd_output = commands.getstatusoutput(DOCKER_SENSORS_CMD) - + status, cmd_output = getstatusoutput_noshell(SENSORS_CMD) + else: + status, cmd_output = getstatusoutput_noshell(DOCKER_SENSORS_CMD) if status: print('Failed to execute sensors command') sys.exit(0) diff --git a/device/dell/x86_64-dellemc_n3248te_c3338-r0/plugins/fanutil.py b/device/dell/x86_64-dellemc_n3248te_c3338-r0/plugins/fanutil.py index 47979b5d7a..974d9156e2 100644 --- a/device/dell/x86_64-dellemc_n3248te_c3338-r0/plugins/fanutil.py +++ b/device/dell/x86_64-dellemc_n3248te_c3338-r0/plugins/fanutil.py @@ -3,10 +3,10 @@ # Platform-specific FAN status interface for SONiC # -import subprocess import sys +from sonic_py_common.general import getstatusoutput_noshell -SENSORS_CMD = "docker exec -i pmon /usr/bin/sensors" +SENSORS_CMD = ["docker", "exec", "-i", "pmon", "/usr/bin/sensors"] DOCKER_SENSORS_CMD = "/usr/bin/sensors" @@ -33,24 +33,23 @@ class FanUtil(FanBase): return True def get_num_fans(self): - N3248TE_MAX_FANTRAYS = 3 - return N3248TE_MAX_FANTRAYS + N3248TE_MAX_FANTRAYS = 3 + return N3248TE_MAX_FANTRAYS def get_presence(self, idx): - sysfs_path = "/sys/devices/platform/dell-n3248te-cpld.0/fan" + self._fan_mapping[idx] + "_prs" - return int(open(sysfs_path).read(), 16) + sysfs_path = "/sys/devices/platform/dell-n3248te-cpld.0/fan" + self._fan_mapping[idx] + "_prs" + return int(open(sysfs_path).read(), 16) def get_direction(self, idx): - sysfs_path = "/sys/devices/platform/dell-n3248te-cpld.0/fan" + self._fan_mapping[idx] + "_dir" - return open(sysfs_path).read() + sysfs_path = "/sys/devices/platform/dell-n3248te-cpld.0/fan" + self._fan_mapping[idx] + "_dir" + return open(sysfs_path).read() def get_speed(self, idx): dockerenv = self.isDockerEnv() if not dockerenv: - status, cmd_output = subprocess.getstatusoutput(SENSORS_CMD) - else : - status, cmd_output = subprocess.getstatusoutput(DOCKER_SENSORS_CMD) - + status, cmd_output = getstatusoutput_noshell(SENSORS_CMD) + else: + status, cmd_output = getstatusoutput_noshell(DOCKER_SENSORS_CMD) if status: print('Failed to execute sensors command') sys.exit(0) @@ -64,9 +63,9 @@ class FanUtil(FanBase): return 0.0 def get_status(self, idx): - sysfs_path = "/sys/devices/platform/dell-n3248te-cpld.0/fan" + self._fan_mapping[idx] + "_prs" - return int(open(sysfs_path).read(), 16) + sysfs_path = "/sys/devices/platform/dell-n3248te-cpld.0/fan" + self._fan_mapping[idx] + "_prs" + return int(open(sysfs_path).read(), 16) def set_speed(self, idx): - return False + return False diff --git a/device/dell/x86_64-dellemc_n3248te_c3338-r0/plugins/psuutil.py b/device/dell/x86_64-dellemc_n3248te_c3338-r0/plugins/psuutil.py index 13e95ed254..c334cc8927 100644 --- a/device/dell/x86_64-dellemc_n3248te_c3338-r0/plugins/psuutil.py +++ b/device/dell/x86_64-dellemc_n3248te_c3338-r0/plugins/psuutil.py @@ -3,11 +3,11 @@ # Platform-specific PSU status interface for SONiC # -import commands import os import sys +from sonic_py_common.general import getstatusoutput_noshell -SENSORS_CMD = "docker exec -i pmon /usr/bin/sensors" +SENSORS_CMD = ["docker", "exec", "-i", "pmon", "/usr/bin/sensors"] DOCKER_SENSORS_CMD = "/usr/bin/sensors" try: @@ -95,10 +95,9 @@ class PsuUtil(PsuBase): def get_sensor(self): dockerenv = self.isDockerEnv() if not dockerenv: - status, cmd_output = commands.getstatusoutput(SENSORS_CMD) - else : - status, cmd_output = commands.getstatusoutput(DOCKER_SENSORS_CMD) - + status, cmd_output = getstatusoutput_noshell(SENSORS_CMD) + else: + status, cmd_output = getstatusoutput_noshell(DOCKER_SENSORS_CMD) if status: print('Failed to execute sensors command') sys.exit(0) diff --git a/device/dell/x86_64-dellemc_s5212f_c3538-r0/plugins/psuutil.py b/device/dell/x86_64-dellemc_s5212f_c3538-r0/plugins/psuutil.py index 9a71f7b911..f8c5b0193a 100644 --- a/device/dell/x86_64-dellemc_s5212f_c3538-r0/plugins/psuutil.py +++ b/device/dell/x86_64-dellemc_s5212f_c3538-r0/plugins/psuutil.py @@ -5,11 +5,11 @@ import logging import sys -import subprocess +from sonic_py_common.general import getstatusoutput_noshell, getstatusoutput_noshell_pipe S5212F_MAX_PSUS = 2 -IPMI_PSU_DATA = "docker exec -it pmon ipmitool sdr list" -IPMI_PSU_DATA_DOCKER = "ipmitool sdr list" +IPMI_PSU_DATA = ["docker", "exec", "-it", "pmon", "ipmitool", "sdr", "list"] +IPMI_PSU_DATA_DOCKER = ["ipmitool", "sdr", "list"] PSU_PRESENCE = "PSU{0}_stat" # Use this for older firmware # PSU_PRESENCE="PSU{0}_prsnt" @@ -44,7 +44,7 @@ class PsuUtil(PsuBase): if dockerenv == True: ipmi_cmd = IPMI_PSU_DATA_DOCKER - status, ipmi_sdr_list = subprocess.getstatusoutput(ipmi_cmd) + status, ipmi_sdr_list = getstatusoutput_noshell(ipmi_cmd) if status: logging.error('Failed to execute:' + ipmi_sdr_list) @@ -91,6 +91,8 @@ class PsuUtil(PsuBase): :param index: An integer, index of the PSU of which to query status :return: Boolean, True if PSU is plugged, False if not """ - cmd_status, psu_status = subprocess.getstatusoutput('ipmitool raw 0x04 0x2d ' + hex(0x30 + index) + " | awk '{print substr($0,9,1)}'") + ipmi_cmd = ["ipmitool", "raw", "0x04", "0x2d", hex(0x30 + index)] + awk_cmd = ['awk', '{print substr($0,9,1)}'] + cmd_status, psu_status = getstatusoutput_noshell_pipe(ipmi_cmd, awk_cmd) return 1 if psu_status == '1' else 0 diff --git a/device/dell/x86_64-dellemc_s5224f_c3538-r0/plugins/psuutil.py b/device/dell/x86_64-dellemc_s5224f_c3538-r0/plugins/psuutil.py index 8ae70b9755..6613af1661 100644 --- a/device/dell/x86_64-dellemc_s5224f_c3538-r0/plugins/psuutil.py +++ b/device/dell/x86_64-dellemc_s5224f_c3538-r0/plugins/psuutil.py @@ -6,7 +6,7 @@ import logging import sys -import subprocess +from sonic_py_common.general import getstatusoutput_noshell, getstatusoutput_noshell_pipe S5224F_MAX_PSUS = 2 IPMI_PSU_DATA = "docker exec -it pmon ipmitool sdr list" @@ -45,7 +45,7 @@ class PsuUtil(PsuBase): if dockerenv == True: ipmi_cmd = IPMI_PSU_DATA_DOCKER - status, ipmi_sdr_list = subprocess.getstatusoutput(ipmi_cmd) + status, ipmi_sdr_list = getstatusoutput_noshell(ipmi_cmd) if status: logging.error('Failed to execute:' + ipmi_sdr_list) @@ -92,6 +92,8 @@ class PsuUtil(PsuBase): :param index: An integer, index of the PSU of which to query status :return: Boolean, True if PSU is plugged, False if not """ - cmd_status, psu_status = subprocess.getstatusoutput('ipmitool raw 0x04 0x2d ' + hex(0x30 + index) + " | awk '{print substr($0,9,1)}'") + ipmi_cmd = ["ipmitool", "raw", "0x04", "0x2d", hex(0x30 + index)] + awk_cmd = ['awk', '{print substr($0,9,1)}'] + cmd_status, psu_status = getstatusoutput_noshell_pipe(ipmi_cmd, awk_cmd) return 1 if psu_status == '1' else 0 diff --git a/device/dell/x86_64-dellemc_s5232f_c3538-r0/plugins/psuutil.py b/device/dell/x86_64-dellemc_s5232f_c3538-r0/plugins/psuutil.py index 27042e3122..5dc44f9918 100644 --- a/device/dell/x86_64-dellemc_s5232f_c3538-r0/plugins/psuutil.py +++ b/device/dell/x86_64-dellemc_s5232f_c3538-r0/plugins/psuutil.py @@ -4,22 +4,17 @@ # -import os.path import logging import sys - -if sys.version_info[0] < 3: - import commands -else: - import subprocess as commands - +from sonic_py_common.general import getstatusoutput_noshell_pipe S5232F_MAX_PSUS = 2 -IPMI_PSU1_DATA = "docker exec -it pmon ipmitool raw 0x04 0x2d 0x31 | awk '{print substr($0,9,1)}'" -IPMI_PSU1_DATA_DOCKER = "ipmitool raw 0x04 0x2d 0x31 | awk '{print substr($0,9,1)}'" -IPMI_PSU2_DATA = "docker exec -it pmon ipmitool raw 0x04 0x2d 0x32 | awk '{print substr($0,9,1)}'" -IPMI_PSU2_DATA_DOCKER = "ipmitool raw 0x04 0x2d 0x32 | awk '{print substr($0,9,1)}'" +IPMI_PSU1_DATA = ["docker", "exec", "-it", "pmon", "ipmitool", "raw", "0x04", "0x2d", "0x31"] +IPMI_PSU1_DATA_DOCKER = ["ipmitool", "raw", "0x04", "0x2d", "0x31"] +IPMI_PSU2_DATA = ["docker", "exec", "-it", "pmon", "ipmitool", "raw", "0x04", "0x2d", "0x32"] +IPMI_PSU2_DATA_DOCKER = ["ipmitool", "raw", "0x04", "0x2d", "0x32"] PSU_PRESENCE = "PSU{0}_stat" +awk_cmd = ['awk', '{print substr($0,9,1)}'] # Use this for older firmware # PSU_PRESENCE="PSU{0}_prsnt" @@ -44,23 +39,24 @@ class PsuUtil(PsuBase): return False # Fetch a BMC register - def get_pmc_register(self, reg_name): + def get_pmc_register(self, index): status = 1 - ipmi_cmd_1 = IPMI_PSU1_DATA - ipmi_cmd_2 = IPMI_PSU1_DATA + ipmi_cmd = '' dockerenv = self.isDockerEnv() if dockerenv == True: if index == 1: - status, ipmi_sdr_list = commands.getstatusoutput(IPMI_PSU1_DATA_DOCKER) + ipmi_cmd = IPMI_PSU1_DATA_DOCKER elif index == 2: - status, ipmi_sdr_list = commands.getstatusoutput(IPMI_PSU2_DATA_DOCKER) + ipmi_cmd = IPMI_PSU2_DATA_DOCKER else: if index == 1: - status, ipmi_sdr_list = commands.getstatusoutput(IPMI_PSU1_DATA) + ipmi_cmd = IPMI_PSU1_DATA elif index == 2: - status, ipmi_sdr_list = commands.getstatusoutput(IPMI_PSU2_DATA) - + ipmi_cmd = IPMI_PSU2_DATA + if ipmi_cmd != '': + status, ipmi_sdr_list = getstatusoutput_noshell_pipe(ipmi_cmd, awk_cmd) + if status: logging.error('Failed to execute ipmitool') sys.exit(0) @@ -87,22 +83,25 @@ class PsuUtil(PsuBase): """ # Until psu_status is implemented this is hardcoded temporarily - psu_status = 'f' + psu_status = '' ret_status = 1 + ipmi_cmd = '' dockerenv = self.isDockerEnv() if dockerenv == True: if index == 1: - ret_status, ipmi_sdr_list = commands.getstatusoutput(IPMI_PSU1_DATA_DOCKER) + ipmi_cmd = IPMI_PSU1_DATA_DOCKER elif index == 2: - ret_status, ipmi_sdr_list = commands.getstatusoutput(IPMI_PSU2_DATA_DOCKER) + ipmi_cmd = IPMI_PSU2_DATA_DOCKER else: if index == 1: - ret_status, ipmi_sdr_list = commands.getstatusoutput(IPMI_PSU1_DATA) + ipmi_cmd = IPMI_PSU1_DATA elif index == 2: - ret_status, ipmi_sdr_list = commands.getstatusoutput(IPMI_PSU2_DATA) + ipmi_cmd = IPMI_PSU2_DATA + if ipmi_cmd != '': + ret_status, ipmi_sdr_list = getstatusoutput_noshell_pipe(ipmi_cmd, awk_cmd) if ret_status: - logging.error('Failed to execute ipmitool : ') + logging.error('Failed to execute ipmitool') sys.exit(0) psu_status = ipmi_sdr_list @@ -117,20 +116,23 @@ class PsuUtil(PsuBase): """ psu_status = '0' ret_status = 1 + ipmi_cmd = '' dockerenv = self.isDockerEnv() if dockerenv == True: if index == 1: - ret_status, ipmi_sdr_list = commands.getstatusoutput(IPMI_PSU1_DATA_DOCKER) + ipmi_cmd = IPMI_PSU1_DATA_DOCKER elif index == 2: - ret_status, ipmi_sdr_list = commands.getstatusoutput(IPMI_PSU2_DATA_DOCKER) + ipmi_cmd = IPMI_PSU2_DATA_DOCKER else: if index == 1: - ret_status, ipmi_sdr_list = commands.getstatusoutput(IPMI_PSU1_DATA) + ipmi_cmd = IPMI_PSU1_DATA elif index == 2: - ret_status, ipmi_sdr_list = commands.getstatusoutput(IPMI_PSU2_DATA) + ipmi_cmd = IPMI_PSU2_DATA + if ipmi_cmd != '': + ret_status, ipmi_sdr_list = getstatusoutput_noshell_pipe(ipmi_cmd, awk_cmd) if ret_status: - logging.error('Failed to execute ipmitool : ') + logging.error('Failed to execute ipmitool') sys.exit(0) psu_status = ipmi_sdr_list diff --git a/device/dell/x86_64-dellemc_s5248f_c3538-r0/plugins/psuutil.py b/device/dell/x86_64-dellemc_s5248f_c3538-r0/plugins/psuutil.py index 9cd1866114..9a4e20705b 100644 --- a/device/dell/x86_64-dellemc_s5248f_c3538-r0/plugins/psuutil.py +++ b/device/dell/x86_64-dellemc_s5248f_c3538-r0/plugins/psuutil.py @@ -4,19 +4,14 @@ # -import os.path import logging import sys - -if sys.version_info[0] < 3: - import commands -else: - import subprocess as commands +from sonic_py_common.general import getstatusoutput_noshell S5248F_MAX_PSUS = 2 -IPMI_PSU_DATA = "docker exec -it pmon ipmitool sdr list" -IPMI_PSU_DATA_DOCKER = "ipmitool sdr list" +IPMI_PSU_DATA = ["docker", "exec", "-it", "pmon", "ipmitool", "sdr", "list"] +IPMI_PSU_DATA_DOCKER = ["ipmitool", "sdr", "list"] PSU_PRESENCE = "PSU{0}_stat" # Use this for older firmware # PSU_PRESENCE="PSU{0}_prsnt" @@ -53,7 +48,7 @@ class PsuUtil(PsuBase): if dockerenv == True: ipmi_cmd = IPMI_PSU_DATA_DOCKER - status, ipmi_sdr_list = commands.getstatusoutput(ipmi_cmd) + status, ipmi_sdr_list = getstatusoutput_noshell(ipmi_cmd) if status: logging.error('Failed to execute:' + ipmi_sdr_list) diff --git a/device/dell/x86_64-dellemc_s5296f_c3538-r0/plugins/psuutil.py b/device/dell/x86_64-dellemc_s5296f_c3538-r0/plugins/psuutil.py index 8a7b53a626..2c39fa7934 100644 --- a/device/dell/x86_64-dellemc_s5296f_c3538-r0/plugins/psuutil.py +++ b/device/dell/x86_64-dellemc_s5296f_c3538-r0/plugins/psuutil.py @@ -6,16 +6,12 @@ import logging import sys - -if sys.version_info[0] < 3: - import commands -else: - import subprocess as commands +from sonic_py_common.general import getstatusoutput_noshell, getstatusoutput_noshell_pipe S5296F_MAX_PSUS = 2 -IPMI_PSU_DATA = "docker exec -it pmon ipmitool sdr list" -IPMI_PSU_DATA_DOCKER = "ipmitool sdr list" +IPMI_PSU_DATA = ["docker", "exec", "-it", "pmon", "ipmitool", "sdr", "list"] +IPMI_PSU_DATA_DOCKER = ["ipmitool", "sdr", "list"] PSU_PRESENCE = "PSU{0}_stat" # Use this for older firmware # PSU_PRESENCE="PSU{0}_prsnt" @@ -50,7 +46,7 @@ class PsuUtil(PsuBase): if dockerenv == True: ipmi_cmd = IPMI_PSU_DATA_DOCKER - status, ipmi_sdr_list = commands.getstatusoutput(ipmi_cmd) + status, ipmi_sdr_list = getstatusoutput_noshell(ipmi_cmd) if status: logging.error('Failed to execute:' + ipmi_sdr_list) @@ -97,6 +93,7 @@ class PsuUtil(PsuBase): :param index: An integer, index of the PSU of which to query status :return: Boolean, True if PSU is plugged, False if not """ - cmd_status, psu_status = commands.getstatusoutput( - 'ipmitool raw 0x04 0x2d ' + hex(0x30 + index) + " | awk '{print substr($0,9,1)}'") + ipmi_cmd = ["ipmitool", "raw", "0x04", "0x2d", hex(0x30 + index)] + awk_cmd = ["awk", "{print substr($0,9,1)}"] + cmd_status, psu_status = getstatusoutput_noshell_pipe(ipmi_cmd, awk_cmd) return 1 if psu_status == '1' else 0 diff --git a/device/dell/x86_64-dellemc_z9264f_c3538-r0/plugins/psuutil.py b/device/dell/x86_64-dellemc_z9264f_c3538-r0/plugins/psuutil.py index 3a58afda8d..3f3841095c 100644 --- a/device/dell/x86_64-dellemc_z9264f_c3538-r0/plugins/psuutil.py +++ b/device/dell/x86_64-dellemc_z9264f_c3538-r0/plugins/psuutil.py @@ -4,19 +4,14 @@ # -import os.path import logging import sys - -if sys.version_info[0] < 3: - import commands -else: - import subprocess as commands +from sonic_py_common.general import getstatusoutput_noshell Z9264F_MAX_PSUS = 2 -IPMI_PSU_DATA = "docker exec -it pmon ipmitool sdr list" -IPMI_PSU_DATA_DOCKER = "ipmitool sdr list" +IPMI_PSU_DATA = ["docker", "exec", "-it", "pmon", "ipmitool", "sdr", "list"] +IPMI_PSU_DATA_DOCKER = ["ipmitool", "sdr", "list"] PSU_PRESENCE = "PSU{0}_state" # Use this for older firmware # PSU_PRESENCE="PSU{0}_prsnt" @@ -53,7 +48,7 @@ class PsuUtil(PsuBase): if dockerenv == True: ipmi_cmd = IPMI_PSU_DATA_DOCKER - status, ipmi_sdr_list = commands.getstatusoutput(ipmi_cmd) + status, ipmi_sdr_list = getstatusoutput_noshell(ipmi_cmd) if status: logging.error('Failed to execute:' + ipmi_sdr_list) diff --git a/device/dell/x86_64-dellemc_z9332f_d1508-r0/plugins/psuutil.py b/device/dell/x86_64-dellemc_z9332f_d1508-r0/plugins/psuutil.py index 435f9b2929..a559cfe474 100644 --- a/device/dell/x86_64-dellemc_z9332f_d1508-r0/plugins/psuutil.py +++ b/device/dell/x86_64-dellemc_z9332f_d1508-r0/plugins/psuutil.py @@ -4,25 +4,21 @@ # -import os.path import logging import sys - -if sys.version_info[0] < 3: - import commands -else: - import subprocess as commands +from sonic_py_common.general import getstatusoutput_noshell_pipe Z9332F_MAX_PSUS = 2 -IPMI_PSU1_DATA = "docker exec -it pmon ipmitool raw 0x04 0x2d 0x2f | awk '{print substr($0,9,1)}'" -IPMI_PSU1_DATA_DOCKER = "ipmitool raw 0x04 0x2d 0x2f | awk '{print substr($0,9,1)}'" -IPMI_PSU2_DATA = "docker exec -it pmon ipmitool raw 0x04 0x2d 0x39 | awk '{print substr($0,9,1)}'" -IPMI_PSU2_DATA_DOCKER = "ipmitool raw 0x04 0x2d 0x39 | awk '{print substr($0,9,1)}'" +IPMI_PSU1_DATA = ["docker", "exec", "-it", "pmon", "ipmitool", "raw", "0x04", "0x2d", "0x2f"] +IPMI_PSU1_DATA_DOCKER = ["ipmitool", "raw", "0x04", "0x2d", "0x2f"] +IPMI_PSU2_DATA = ["docker", "exec", "-it", "pmon", "ipmitool", "raw", "0x04", "0x2d", "0x39"] +IPMI_PSU2_DATA_DOCKER = ["ipmitool", "raw", "0x04", "0x2d", "0x39"] PSU_PRESENCE = "PSU{0}_Status" # Use this for older firmware # PSU_PRESENCE="PSU{0}_prsnt" ipmi_sdr_list = "" +awk_cmd = ['awk', '{print substr($0,9,1)}'] try: @@ -46,28 +42,24 @@ class PsuUtil(PsuBase): # Fetch a BMC register def get_pmc_register(self, reg_name): - - status = 1 global ipmi_sdr_list - ipmi_dev_node = "/dev/pmi0" - ipmi_cmd_1 = IPMI_PSU1_DATA - ipmi_cmd_2 = IPMI_PSU1_DATA + ipmi_cmd = '' dockerenv = self.isDockerEnv() if dockerenv == True: if index == 1: - status, ipmi_sdr_list = commands.getstatusoutput(IPMI_PSU1_DATA_DOCKER) + ipmi_cmd = IPMI_PSU1_DATA_DOCKER elif index == 2: - status, ipmi_sdr_list = commands.getstatusoutput(IPMI_PSU2_DATA_DOCKER) + ipmi_cmd = IPMI_PSU2_DATA_DOCKER else: if index == 1: - status, ipmi_sdr_list = commands.getstatusoutput(IPMI_PSU1_DATA) + ipmi_cmd = IPMI_PSU1_DATA elif index == 2: - status, ipmi_sdr_list = commands.getstatusoutput(IPMI_PSU2_DATA) - - if status: - logging.error('Failed to execute ipmitool') - sys.exit(0) - + ipmi_cmd = IPMI_PSU2_DATA + if ipmi_cmd != '': + status, ipmi_sdr_list = getstatusoutput_noshell_pipe(ipmi_cmd, awk_cmd) + if status: + logging.error('Failed to execute ipmitool') + sys.exit(0) output = ipmi_sdr_list return output @@ -100,22 +92,23 @@ class PsuUtil(PsuBase): :param index: An integer, index of the PSU of which to query status :return: Boolean, True if PSU is plugged, False if not """ + ipmi_cmd = '' status = 0 - ret_status = 1 + # ret_status = 1 global ipmi_sdr_list - ipmi_dev_node = "/dev/pmi0" dockerenv = self.isDockerEnv() if dockerenv == True: if index == 1: - status, ipmi_sdr_list = commands.getstatusoutput(IPMI_PSU1_DATA_DOCKER) + ipmi_cmd = IPMI_PSU1_DATA_DOCKER elif index == 2: - status, ipmi_sdr_list = commands.getstatusoutput(IPMI_PSU2_DATA_DOCKER) + ipmi_cmd = IPMI_PSU2_DATA_DOCKER else: if index == 1: - status, ipmi_sdr_list = commands.getstatusoutput(IPMI_PSU1_DATA) + ipmi_cmd = IPMI_PSU1_DATA elif index == 2: - ret_status, ipmi_sdr_list = commands.getstatusoutput(IPMI_PSU2_DATA) - + ipmi_cmd = IPMI_PSU2_DATA + if ipmi_cmd != '': + status, ipmi_sdr_list = getstatusoutput_noshell_pipe(ipmi_cmd, awk_cmd) # if ret_status: # print ipmi_sdr_list # logging.error('Failed to execute ipmitool') diff --git a/device/dell/x86_64-dellemc_z9432f_c3758-r0/plugins/fanutil.py b/device/dell/x86_64-dellemc_z9432f_c3758-r0/plugins/fanutil.py index 5dabf2de10..3788c0d705 100644 --- a/device/dell/x86_64-dellemc_z9432f_c3758-r0/plugins/fanutil.py +++ b/device/dell/x86_64-dellemc_z9432f_c3758-r0/plugins/fanutil.py @@ -7,7 +7,7 @@ # ############################################################################# import logging -import commands +from sonic_py_common.general import getstatusoutput_noshell try: from sonic_fan.fan_base import FanBase @@ -20,10 +20,10 @@ class FanUtil(FanBase): NUM_FANS_PERTRAY = 2 FANTRAY_NUM_START_IDX = 1 FRU_FAN_START_IDX = 1 - IPMI_FAN_PRESENCE = "ipmitool sensor get FAN{0}_prsnt" - IPMI_FAN_FRONT_SPEED = "ipmitool sdr get Fan{0}_Front_rpm" - IPMI_FAN_REAR_SPEED = "ipmitool sdr get Fan{0}_Rear_rpm" - IPMI_FRU_DATA = "ipmitool fru print {0}" + IPMI_FAN_PRESENCE = ["ipmitool", "sensor", "get", ""] + IPMI_FAN_FRONT_SPEED = ["ipmitool", "sdr", "get", ""] + IPMI_FAN_REAR_SPEED = ["ipmitool", "sdr", "get", ""] + IPMI_FRU_DATA = ["ipmitool", "fru", "print", ""] def __init__(self, log_level=logging.DEBUG): FanBase.__init__(self) @@ -31,59 +31,63 @@ class FanUtil(FanBase): def get_fan_status(self,fan_id): try: - ret_status, ipmi_cmd_ret = commands.getstatusoutput(self.IPMI_FAN_PRESENCE.format(fan_id)) - if ret_status == 0: - return(ipmi_cmd_ret.splitlines()[5].strip(' ').strip('[]')) + self.IPMI_FAN_PRESENCE[3] = 'FAN' + str(fan_id) + '_prsnt' + ret_status, ipmi_cmd_ret = getstatusoutput_noshell(self.IPMI_FAN_PRESENCE) + if ret_status == 0: + return(ipmi_cmd_ret.splitlines()[5].strip(' ').strip('[]')) except Exception: - logging.error('Failed to execute : %s'%self.IPMI_FAN_PRESENCE.format(fan_id)) + logging.error('Failed to execute : %s'%(' '.join(self.IPMI_FAN_PRESENCE))) def get_front_fan_speed(self,fan_id): try: - ret_status, ipmi_cmd_ret = commands.getstatusoutput(self.IPMI_FAN_FRONT_SPEED.format(fan_id)) - if ret_status == 0: - rdata = ipmi_cmd_ret.splitlines()[3].split(':')[1].split(' ')[1] - return rdata + self.IPMI_FAN_FRONT_SPEED[3] = 'Fan' + str(fan_id) + '_Front_rpm' + ret_status, ipmi_cmd_ret = getstatusoutput_noshell(self.IPMI_FAN_FRONT_SPEED) + if ret_status == 0: + rdata = ipmi_cmd_ret.splitlines()[3].split(':')[1].split(' ')[1] + return rdata except Exception: - logging.error('Failed to execute : %s'%self.IPMI_FAN_FRONT_SPEED.format(fan_id)) + logging.error('Failed to execute : %s'%(' '.join(self.IPMI_FAN_FRONT_SPEED))) def get_rear_fan_speed(self,fan_id): try: - ret_status, ipmi_cmd_ret = commands.getstatusoutput(self.IPMI_FAN_REAR_SPEED.format(fan_id)) - if ret_status == 0: - rdata = ipmi_cmd_ret.splitlines()[3].split(':')[1].split(' ')[1] - return rdata + self.IPMI_FAN_REAR_SPEED[3] = 'Fan' + str(fan_id) + '_Rear_rpm' + ret_status, ipmi_cmd_ret = getstatusoutput_noshell(self.IPMI_FAN_REAR_SPEED) + if ret_status == 0: + rdata = ipmi_cmd_ret.splitlines()[3].split(':')[1].split(' ')[1] + return rdata except Exception: - logging.error('Failed to execute : %s'%self.IPMI_FAN_REAR_SPEED.format(fan_id)) + logging.error('Failed to execute : %s'%(' '.join(self.IPMI_FAN_REAR_SPEED))) # Read FAN FRU info def get_fan_direction_from_fru(self,fru_id,reg_name): output = None try: - status, ipmi_fru_list = commands.getstatusoutput(self.IPMI_FRU_DATA.format(fru_id)) - if status == 0: - for item in ipmi_fru_list.split("\n"): - if reg_name in item: - output = item.strip() - if output is None: - logging.error('\nFailed to fetch: ' + reg_name + ' sensor ') - output = output.split(':')[1].strip(' ') - if output == 'F2B' or output == 'B2F': - return output + self.IPMI_FRU_DATA[3] = str(fru_id) + status, ipmi_fru_list = getstatusoutput_noshell(self.IPMI_FRU_DATA) + if status == 0: + for item in ipmi_fru_list.split("\n"): + if reg_name in item: + output = item.strip() + if output is None: + logging.error('\nFailed to fetch: ' + reg_name + ' sensor ') + output = output.split(':')[1].strip(' ') + if output == 'F2B' or output == 'B2F': + return output except Exception: - logging.error('Failed to execute:' + ipmi_fru_list) + logging.error('Failed to execute:' + ipmi_fru_list) def get_num_fans(self): return self.num_fans def get_presence(self, index): if index is None: - return False + return False if index < self.FANTRAY_NUM_START_IDX or index > self.FANTRAY_NUM_START_IDX + self.num_fans - 1: - logging.error('Invalid FAN index:%d', index) - return False + logging.error('Invalid FAN index:%d', index) + return False tray_index = ((index-1)/self.NUM_FANS_PERTRAY) + 1 @@ -94,11 +98,11 @@ class FanUtil(FanBase): def get_status(self, index): if index is None: - return False + return False if index < self.FANTRAY_NUM_START_IDX or index > self.FANTRAY_NUM_START_IDX + self.num_fans - 1: - logging.error('Invalid FAN index:%d', index) - return False + logging.error('Invalid FAN index:%d', index) + return False tray_index = ((index-1)/self.NUM_FANS_PERTRAY) + 1 fantray_front_speed=self.get_front_fan_speed(tray_index) @@ -112,38 +116,38 @@ class FanUtil(FanBase): def get_direction(self, index): if index is None: - return None + return None if index < self.FANTRAY_NUM_START_IDX or index > self.FANTRAY_NUM_START_IDX + self.num_fans - 1: - logging.error('Invalid FAN index:%d', index) - return None + logging.error('Invalid FAN index:%d', index) + return None tray_index = ((index-1)/self.NUM_FANS_PERTRAY) fru_id = self.FRU_FAN_START_IDX + tray_index direction = self.get_fan_direction_from_fru(fru_id,'Board Extra') if direction == 'B2F': - return "INTAKE" + return "INTAKE" elif direction == 'F2B': - return "EXHAUST" + return "EXHAUST" else: - return None + return None def get_speed(self, index): if index is None: - return 0 + return 0 if index < self.FANTRAY_NUM_START_IDX or index > self.FANTRAY_NUM_START_IDX + self.num_fans - 1: - logging.error('Invalid FAN index:%d', index) - return 0 + logging.error('Invalid FAN index:%d', index) + return 0 tray_index = ((index-1)/self.NUM_FANS_PERTRAY) + 1 if (index % 2 != 0): - fantray_speed=self.get_front_fan_speed(tray_index) + fantray_speed=self.get_front_fan_speed(tray_index) else: - fantray_speed=self.get_rear_fan_speed(tray_index) + fantray_speed=self.get_rear_fan_speed(tray_index) if (self.get_presence(index) == True): return int(fantray_speed.strip()) diff --git a/device/dell/x86_64-dellemc_z9432f_c3758-r0/plugins/psuutil.py b/device/dell/x86_64-dellemc_z9432f_c3758-r0/plugins/psuutil.py index aaf02fec0c..897744f69c 100644 --- a/device/dell/x86_64-dellemc_z9432f_c3758-r0/plugins/psuutil.py +++ b/device/dell/x86_64-dellemc_z9432f_c3758-r0/plugins/psuutil.py @@ -3,7 +3,7 @@ # Platform-specific PSU status interface for SONiC # import logging -import commands +from sonic_py_common.general import getstatusoutput_noshell, getstatusoutput_noshell_pipe Z9332F_MAX_PSUS = 2 FRU_PSUL = 11 @@ -18,14 +18,15 @@ except ImportError as e: class PsuUtil(PsuBase): """Platform-specific PSUutil class""" - IPMI_PSU1_DATA = "ipmitool raw 0x04 0x2d 0x2f | awk '{print substr($0,9,1)}'" - IPMI_PSU2_DATA = "ipmitool raw 0x04 0x2d 0x39 | awk '{print substr($0,9,1)}'" - IPMI_PSU_VOUT = "ipmitool sdr get PSU{0}_VOut" - IPMI_PSU_POUT = "ipmitool sdr get PSU{0}_POut" - IPMI_PSU_COUT = "ipmitool sdr get PSU{0}_COut" - IPMI_PSU_FAN_SPEED = "ipmitool sdr get PSU{0}_Fan" - IPMI_FRU = "ipmitool fru" - IPMI_FRU_DATA = "ipmitool fru print {0}" + IPMI_PSU1_DATA = ["ipmitool", "raw", "0x04", "0x2d", "0x2f"] + IPMI_PSU2_DATA = ["ipmitool", "raw", "0x04", "0x2d", "0x39"] + IPMI_PSU_VOUT = ["ipmitool", "sdr", "get", ""] + IPMI_PSU_POUT = ["ipmitool", "sdr", "get", ""] + IPMI_PSU_COUT = ["ipmitool", "sdr", "get", ""] + IPMI_PSU_FAN_SPEED = ["ipmitool", "sdr", "get", ""] + IPMI_FRU = ["ipmitool", "fru"] + IPMI_FRU_DATA = ["ipmitool", "fru", "print", ""] + awk_cmd = ['awk', '{print substr($0,9,1)}'] def __init__(self): PsuBase.__init__(self) @@ -39,62 +40,66 @@ class PsuUtil(PsuBase): def get_psu_vout(self,index): try: - ret_status, ipmi_cmd_ret = commands.getstatusoutput(self.IPMI_PSU_VOUT.format(index)) - if ret_status == 0: - rdata = ipmi_cmd_ret.splitlines()[3].split(':')[1].split(' ')[1] - return rdata + self.IPMI_PSU_VOUT[3] = 'PSU' + str(index) + '_VOut' + ret_status, ipmi_cmd_ret = getstatusoutput_noshell(self.IPMI_PSU_VOUT) + if ret_status == 0: + rdata = ipmi_cmd_ret.splitlines()[3].split(':')[1].split(' ')[1] + return rdata except Exception: - logging.error('Failed to execute : %s'%self.IPMI_PSU_VOUT.format(index)) + logging.error('Failed to execute : %s'%(' '.join(self.IPMI_PSU_VOUT))) def get_psu_cout(self,index): try: - ret_status, ipmi_cmd_ret = commands.getstatusoutput(self.IPMI_PSU_COUT.format(index)) - if ret_status == 0: - rdata = ipmi_cmd_ret.splitlines()[3].split(':')[1].split(' ')[1] - return rdata + self.IPMI_PSU_COUT[3] = 'PSU' + str(index) + 'POut' + ret_status, ipmi_cmd_ret = getstatusoutput_noshell(self.IPMI_PSU_COUT) + if ret_status == 0: + rdata = ipmi_cmd_ret.splitlines()[3].split(':')[1].split(' ')[1] + return rdata except Exception: - logging.error('Failed to execute : %s'%self.IPMI_PSU_COUT.format(index)) + logging.error('Failed to execute : %s'%(' '.join(self.IPMI_PSU_COUT))) def get_psu_pout(self,index): try: - ret_status, ipmi_cmd_ret = commands.getstatusoutput(self.IPMI_PSU_POUT.format(index)) - if ret_status == 0: - rdata = ipmi_cmd_ret.splitlines()[3].split(':')[1].split(' ')[1] - return rdata + self.IPMI_PSU_POUT[3] = 'PSU' + str(index) + '_COut' + ret_status, ipmi_cmd_ret = getstatusoutput_noshell(self.IPMI_PSU_POUT) + if ret_status == 0: + rdata = ipmi_cmd_ret.splitlines()[3].split(':')[1].split(' ')[1] + return rdata except Exception: - logging.error('Failed to execute : %s'%self.IPMI_PSU_POUT.format(index)) + logging.error('Failed to execute : %s'%(' '.join(self.IPMI_PSU_POUT))) def get_psu_fan_speed(self,index): try: - ret_status, ipmi_cmd_ret = commands.getstatusoutput(self.IPMI_PSU_FAN_SPEED.format(index)) - if ret_status == 0: - rdata = ipmi_cmd_ret.splitlines()[3].split(':')[1].split(' ')[1] - return rdata + self.IPMI_PSU_FAN_SPEED[3] = 'PSU' + str(index) + '_Fan' + ret_status, ipmi_cmd_ret = getstatusoutput_noshell(self.IPMI_PSU_FAN_SPEED) + if ret_status == 0: + rdata = ipmi_cmd_ret.splitlines()[3].split(':')[1].split(' ')[1] + return rdata except Exception: - logging.error('Failed to execute : %s'%self.IPMI_PSU_FAN_SPEED.format(index)) + logging.error('Failed to execute : %s'%(' '.join(self.IPMI_PSU_FAN_SPEED))) #Fetch FRU Data for given fruid def get_psu_airflow(self, index): if index == 1: - fru_id = 'FRU_PSUL' + fru_id = 'FRU_PSUL' else: - fru_id = 'FRU_PSUR' + fru_id = 'FRU_PSUR' - ret_status, ipmi_cmd_ret = commands.getstatusoutput(self.IPMI_FRU) + ret_status, ipmi_cmd_ret = getstatusoutput_noshell(self.IPMI_FRU) if ret_status: - logging.error('Failed to execute ipmitool: '+ self.IPMI_FRU) + logging.error('Failed to execute ipmitool: '+ self.IPMI_FRU) found_fru = False for line in ipmi_cmd_ret.splitlines(): if line.startswith('FRU Device Description') and fru_id in line.split(':')[1] : - found_fru = True + found_fru = True if found_fru and line.startswith(' Board Product '): - return ' B2F' if 'PS/IO' in line else ' F2B' + return ' B2F' if 'PS/IO' in line else ' F2B' return '' # Read FRU info @@ -102,21 +107,22 @@ class PsuUtil(PsuBase): output = None Found = False try: - status, ipmi_fru_list = commands.getstatusoutput(self.IPMI_FRU_DATA.format(fru_id)) - if status == 0: - for item in ipmi_fru_list.split("\n"): - if reg_name == item.split(':')[0].strip(' '): - output = item.strip() - output = output.split(':')[1] - Found = True - break; + self.IPMI_FRU_DATA[3] = str(fru_id) + status, ipmi_fru_list = getstatusoutput_noshell(self.IPMI_FRU_DATA) + if status == 0: + for item in ipmi_fru_list.split("\n"): + if reg_name == item.split(':')[0].strip(' '): + output = item.strip() + output = output.split(':')[1] + Found = True + break; - if not Found: - logging.error('\nFailed to fetch: ' + reg_name + ' sensor ') + if not Found: + logging.error('\nFailed to fetch: ' + reg_name + ' sensor ') - return output + return output except Exception: - logging.error('Failed to execute:' + ipmi_fru_list) + logging.error('Failed to execute:' + ipmi_fru_list) def get_num_psus(self): """ @@ -135,17 +141,18 @@ class PsuUtil(PsuBase): faulty """ psu_status = '0' - + ipmi_cmd = '' if index == 1: - cmd_status, psu_status = commands.getstatusoutput(self.IPMI_PSU1_DATA) + ipmi_cmd = self.IPMI_PSU1_DATA elif index == 2: - cmd_status, psu_status = commands.getstatusoutput(self.IPMI_PSU2_DATA) + ipmi_cmd = self.IPMI_PSU2_DATA else: - logging.error("Invalid PSU number:" + index) - - if cmd_status: - logging.error('Failed to execute ipmitool') + logging.error("Invalid PSU number:" + index) + if ipmi_cmd != '': + cmd_status, psu_status = getstatusoutput_noshell_pipe(ipmi_cmd, self.awk_cmd) + if cmd_status: + logging.error('Failed to execute ipmitool') return (not int(psu_status, 16) > 1) def get_psu_presence(self, index): @@ -155,82 +162,85 @@ class PsuUtil(PsuBase): :param index: An integer, index of the PSU of which to query status :return: Boolean, True if PSU is plugged, False if not """ - psu_status = '0' + psu_status = '0' + ipmi_cmd = '' if index == 1: - cmd_status, psu_status = commands.getstatusoutput(self.IPMI_PSU1_DATA) + ipmi_cmd = self.IPMI_PSU1_DATA elif index == 2: - cmd_status, psu_status = commands.getstatusoutput(self.IPMI_PSU2_DATA) + ipmi_cmd = self.IPMI_PSU2_DATA else: - logging.error("Invalid PSU number:" + index) - + logging.error("Invalid PSU number:" + index) + + if ipmi_cmd != '': + cmd_status, psu_status = getstatusoutput_noshell_pipe(ipmi_cmd, self.awk_cmd) if cmd_status: - logging.error('Failed to execute ipmitool') + logging.error('Failed to execute ipmitool') return (int(psu_status, 16) & 1) def get_output_voltage(self, index): if index is None: - return 0.0 + return 0.0 psuvoltage=self.get_psu_vout(index) return float(psuvoltage.strip()) def get_output_current(self, index): if index is None: - return 0.0 + return 0.0 psucurrent=self.get_psu_cout(index) return float(psucurrent.strip()) def get_output_power(self, index): if index is None: - return 0.0 + return 0.0 psupower=self.get_psu_pout(index) return float(psupower.strip()) def get_fan_rpm(self, index, fan_idx): if index is None: - return 0 + return 0 fanrpm=self.get_psu_fan_speed(index) return int(fanrpm.strip()) def get_serial(self, index): if index is None: - return None + return None if index == 1: - fru_id = FRU_PSUL + fru_id = FRU_PSUL else: - fru_id = FRU_PSUR + fru_id = FRU_PSUR return self.get_fru_info(fru_id,'Board Serial') def get_model(self, index): if index is None: - return None + return None if index == 1: - fru_id = FRU_PSUL + fru_id = FRU_PSUL else: - fru_id = FRU_PSUR + fru_id = FRU_PSUR return self.get_fru_info(fru_id,'Board Part Number') def get_mfr_id(self, index): if index is None: - return None + return None if index == 1: - fru_id = FRU_PSUL + fru_id = FRU_PSUL else: - fru_id = FRU_PSUR + fru_id = FRU_PSUR return self.get_fru_info(fru_id,'Board Mfg') def get_direction(self, index): if index is None: - return None + return None direction=self.get_psu_airflow(index).strip() if direction == 'B2F': - return "INTAKE" + return "INTAKE" elif direction == 'F2B': - return "EXHAUST" + return "EXHAUST" else: - return None + return None diff --git a/platform/broadcom/sonic-platform-modules-dell/n3248pxe/sonic_platform/component.py b/platform/broadcom/sonic-platform-modules-dell/n3248pxe/sonic_platform/component.py index 50b85cc179..9982582158 100644 --- a/platform/broadcom/sonic-platform-modules-dell/n3248pxe/sonic_platform/component.py +++ b/platform/broadcom/sonic-platform-modules-dell/n3248pxe/sonic_platform/component.py @@ -19,8 +19,10 @@ def get_bios_version(): return subprocess.check_output(['dmidecode', '-s', 'system-version']).strip().decode() def get_cpld_version(cpld): - mjr_ver=subprocess.check_output('cat /sys/devices/platform/dell-n3248pxe-cpld.0/' + cpld + '_mjr_ver', shell=True).strip()[2:].decode() - mnr_ver=subprocess.check_output('cat /sys/devices/platform/dell-n3248pxe-cpld.0/' + cpld + '_mnr_ver', shell=True).strip()[2:].decode() + mjr_ver_path = "/sys/devices/platform/dell-n3248pxe-cpld.0/" + cpld + '_mjr_ver' + mnr_ver_path = "/sys/devices/platform/dell-n3248pxe-cpld.0/" + cpld + '_mnr_ver' + mjr_ver = subprocess.check_output(['cat', mjr_ver_path]).strip()[2:].decode() + mnr_ver = subprocess.check_output(['cat', mnr_ver_path]).strip()[2:].decode() return (str(mjr_ver) + '.' + str(mnr_ver)) class Component(ComponentBase): diff --git a/platform/broadcom/sonic-platform-modules-dell/n3248pxe/sonic_platform/psu.py b/platform/broadcom/sonic-platform-modules-dell/n3248pxe/sonic_platform/psu.py index 74f8a766f6..f9a9970016 100644 --- a/platform/broadcom/sonic-platform-modules-dell/n3248pxe/sonic_platform/psu.py +++ b/platform/broadcom/sonic-platform-modules-dell/n3248pxe/sonic_platform/psu.py @@ -61,20 +61,24 @@ class Psu(PsuBase): def _reload_dps_module(self): try: - del_cmd = "echo 0x56 > /sys/bus/i2c/devices/i2c-{}/delete_device".format(10 + self.index - 1) - os.system(del_cmd) + file = "/sys/bus/i2c/devices/i2c-{}/delete_device".format(10 + self.index - 1) + with open(file, 'w') as f: + f.write("0x56\n") except (IOError, OSError): pass try: - del_cmd = "echo 0x5e > /sys/bus/i2c/devices/i2c-{}/delete_device".format(10 + self.index - 1) - os.system(del_cmd) + file = "/sys/bus/i2c/devices/i2c-{}/delete_device".format(10 + self.index - 1) + with open(file, 'w') as f: + f.write("0x5e\n") except (IOError, OSError): pass try: - ins_cmd = "echo '24c02 0x56' > /sys/bus/i2c/devices/i2c-{}/new_device".format(10 + self.index - 1) - os.system(ins_cmd) - ins_cmd = "echo 'dps460 0x5e' > /sys/bus/i2c/devices/i2c-{}/new_device".format(10 + self.index - 1) - os.system(ins_cmd) + file = "/sys/bus/i2c/devices/i2c-{}/new_device".format(10 + self.index - 1) + with open(file, 'w') as f: + f.write('24c02 0x56\n') + file = "/sys/bus/i2c/devices/i2c-{}/new_device".format(10 + self.index - 1) + with open(file, 'w') as f: + f.write('dps460 0x5e\n') except (IOError, OSError): pass diff --git a/platform/broadcom/sonic-platform-modules-dell/n3248te/sonic_platform/component.py b/platform/broadcom/sonic-platform-modules-dell/n3248te/sonic_platform/component.py index ccf90f881b..c69d5ef34e 100644 --- a/platform/broadcom/sonic-platform-modules-dell/n3248te/sonic_platform/component.py +++ b/platform/broadcom/sonic-platform-modules-dell/n3248te/sonic_platform/component.py @@ -19,8 +19,10 @@ def get_bios_version(): return subprocess.check_output(['dmidecode', '-s', 'system-version']).strip().decode() def get_cpld_version(cpld): - mjr_ver=subprocess.check_output('cat /sys/devices/platform/dell-n3248te-cpld.0/' + cpld + '_mjr_ver', shell=True).strip()[2:].decode() - mnr_ver=subprocess.check_output('cat /sys/devices/platform/dell-n3248te-cpld.0/' + cpld + '_mnr_ver', shell=True).strip()[2:].decode() + mjr_ver_path = '/sys/devices/platform/dell-n3248te-cpld.0/' + cpld + '_mjr_ver' + mnr_ver_path = '/sys/devices/platform/dell-n3248te-cpld.0/' + cpld + '_mnr_ver' + mjr_ver = subprocess.check_output(['cat', mjr_ver_path]).strip()[2:].decode() + mnr_ver = subprocess.check_output(['cat', mnr_ver_path]).strip()[2:].decode() return (str(mjr_ver) + '.' + str(mnr_ver)) class Component(ComponentBase): diff --git a/platform/broadcom/sonic-platform-modules-dell/n3248te/sonic_platform/psu.py b/platform/broadcom/sonic-platform-modules-dell/n3248te/sonic_platform/psu.py index b2f06785f0..6822ed9882 100644 --- a/platform/broadcom/sonic-platform-modules-dell/n3248te/sonic_platform/psu.py +++ b/platform/broadcom/sonic-platform-modules-dell/n3248te/sonic_platform/psu.py @@ -63,20 +63,24 @@ class Psu(PsuBase): def _reload_dps_module(self): try: - del_cmd = "echo 0x56 > /sys/bus/i2c/devices/i2c-{}/delete_device".format(10 + self.index - 1) - os.system(del_cmd) + file = "/sys/bus/i2c/devices/i2c-{}/delete_device".format(10 + self.index - 1) + with open(file, 'w') as f: + f.write('0x56\n') except (IOError, OSError): pass try: - del_cmd = "echo 0x5e > /sys/bus/i2c/devices/i2c-{}/delete_device".format(10 + self.index - 1) - os.system(del_cmd) + file = "/sys/bus/i2c/devices/i2c-{}/delete_device".format(10 + self.index - 1) + with open(file, 'w') as f: + f.write('0x5e\n') except (IOError, OSError): pass try: - ins_cmd = "echo '24c02 0x56' > /sys/bus/i2c/devices/i2c-{}/new_device".format(10 + self.index - 1) - os.system(ins_cmd) - ins_cmd = "echo 'dps460 0x5e' > /sys/bus/i2c/devices/i2c-{}/new_device".format(10 + self.index - 1) - os.system(ins_cmd) + file = "/sys/bus/i2c/devices/i2c-{}/new_device".format(10 + self.index - 1) + with open(file, 'w') as f: + f.write('24c02 0x56\n') + file = "/sys/bus/i2c/devices/i2c-{}/new_device".format(10 + self.index - 1) + with open(file, 'w') as f: + f.write('dps460 0x5e\n') except (IOError, OSError): pass diff --git a/platform/broadcom/sonic-platform-modules-dell/s5212f/scripts/platform_sensors.py b/platform/broadcom/sonic-platform-modules-dell/s5212f/scripts/platform_sensors.py index 0fc484be2f..9df70736c8 100755 --- a/platform/broadcom/sonic-platform-modules-dell/s5212f/scripts/platform_sensors.py +++ b/platform/broadcom/sonic-platform-modules-dell/s5212f/scripts/platform_sensors.py @@ -13,10 +13,10 @@ import sys import logging -import commands +from sonic_py_common.general import getstatusoutput_noshell S5212F_MAX_FAN_TRAYS = 4 -IPMI_SENSOR_DATA = "ipmitool sdr list" +IPMI_SENSOR_DATA = ["ipmitool", "sdr", "list"] switch_sku = { "0K6MG9":(' AC', ' Exhaust'), @@ -36,7 +36,7 @@ switch_sku = { "04T94Y":(' DC', ' Intake') } -ipmi_status, ipmi_sdr_list = commands.getstatusoutput(IPMI_SENSOR_DATA) +ipmi_status, ipmi_sdr_list = getstatusoutput_noshell(IPMI_SENSOR_DATA) def get_pmc_register(reg_name): if ipmi_status: @@ -56,21 +56,21 @@ def print_temperature_sensors(): print("\nOnboard Temperature Sensors:") - print ' PT_Left_temp: ',\ - (get_pmc_register('PT_Left_temp')) - print ' PT_Mid_temp: ',\ - (get_pmc_register('PT_Mid_temp')) - print ' PT_Right_temp: ',\ - (get_pmc_register('PT_Right_temp')) - print ' Broadcom Temp: ',\ - (get_pmc_register('NPU_Near_temp')) - print ' Inlet Airflow Temp: ',\ - (get_pmc_register('ILET_AF_temp')) - print ' CPU Temp: ',\ - (get_pmc_register('CPU_temp')) + print(' PT_Left_temp: ',\ + (get_pmc_register('PT_Left_temp'))) + print(' PT_Mid_temp: ',\ + (get_pmc_register('PT_Mid_temp'))) + print(' PT_Right_temp: ',\ + (get_pmc_register('PT_Right_temp'))) + print(' Broadcom Temp: ',\ + (get_pmc_register('NPU_Near_temp'))) + print(' Inlet Airflow Temp: ',\ + (get_pmc_register('ILET_AF_temp'))) + print(' CPU Temp: ',\ + (get_pmc_register('CPU_temp'))) def get_switch_details(): - status, ipmi_fru = commands.getstatusoutput('/usr/bin/ipmitool fru') + status, ipmi_fru = getstatusoutput_noshell(['/usr/bin/ipmitool', 'fru']) for line in ipmi_fru.splitlines(): info = line.split(':') if 'Board Part Number' in info[0] : @@ -78,7 +78,9 @@ def get_switch_details(): if (partno in switch_sku): return switch_sku[partno] return None -commands.getstatusoutput('echo 0 > /sys/module/ipmi_si/parameters/kipmid_max_busy_us') +file = '/sys/module/ipmi_si/parameters/kipmid_max_busy_us' +with open(file, 'w') as f: + f.write('0\n') print_temperature_sensors() # Print the information for 1 Fan Tray @@ -86,40 +88,42 @@ print_temperature_sensors() def print_fan_tray(tray): - print ' Fan Tray ' + str(tray) + ':' + print(' Fan Tray ' + str(tray) + ':') if (tray == 1): - print ' Fan1 Speed: ',\ - get_pmc_register('FAN1_Front_rpm') - print ' Fan2 Speed: ',\ - get_pmc_register('FAN1_Rear_rpm') + print(' Fan1 Speed: ',\ + get_pmc_register('FAN1_Front_rpm')) + print(' Fan2 Speed: ',\ + get_pmc_register('FAN1_Rear_rpm')) elif (tray == 2): - print ' Fan1 Speed: ',\ - get_pmc_register('FAN2_Front_rpm') - print ' Fan2 Speed: ',\ - get_pmc_register('FAN2_Rear_rpm') + print(' Fan1 Speed: ',\ + get_pmc_register('FAN2_Front_rpm')) + print(' Fan2 Speed: ',\ + get_pmc_register('FAN2_Rear_rpm')) elif (tray == 3): - print ' Fan1 Speed: ',\ - get_pmc_register('FAN3_Front_rpm') - print ' Fan2 Speed: ',\ - get_pmc_register('FAN3_Rear_rpm') + print(' Fan1 Speed: ',\ + get_pmc_register('FAN3_Front_rpm')) + print(' Fan2 Speed: ',\ + get_pmc_register('FAN3_Rear_rpm')) elif (tray == 4): - print ' Fan1 Speed: ',\ - get_pmc_register('FAN4_Front_rpm') - print ' Fan2 Speed: ',\ - get_pmc_register('FAN4_Rear_rpm') + print(' Fan1 Speed: ',\ + get_pmc_register('FAN4_Front_rpm')) + print(' Fan2 Speed: ',\ + get_pmc_register('FAN4_Rear_rpm')) type, dir = get_switch_details() print('\nFan Trays(Fixed):') -print ' Fan Tray Direction: ', dir +print(' Fan Tray Direction: ', dir) for tray in range(1, S5212F_MAX_FAN_TRAYS + 1): print_fan_tray(tray) print('\nPSU Tray(Fixed):') -print ' PSU Tray Direction: ', dir -print ' PSU Tray Type: ', type +print(' PSU Tray Direction: ', dir) +print(' PSU Tray Type: ', type) -ret_status, ipmi_cmd_ret = commands.getstatusoutput('echo 1000 > /sys/module/ipmi_si/parameters/kipmid_max_busy_us') +file = '/sys/module/ipmi_si/parameters/kipmid_max_busy_us' +with open(file, 'w') as f: + f.write('1000\n') diff --git a/platform/broadcom/sonic-platform-modules-dell/s5212f/sonic_platform/sfp.py b/platform/broadcom/sonic-platform-modules-dell/s5212f/sonic_platform/sfp.py index 6b8b6c9287..d1a2b30e96 100644 --- a/platform/broadcom/sonic-platform-modules-dell/s5212f/sonic_platform/sfp.py +++ b/platform/broadcom/sonic-platform-modules-dell/s5212f/sonic_platform/sfp.py @@ -13,7 +13,6 @@ try: import time import struct import mmap - import subprocess from sonic_platform_base.sonic_xcvr.sfp_optoe_base import SfpOptoeBase except ImportError as e: @@ -300,7 +299,6 @@ class Sfp(SfpOptoeBase): del_sfp_path = "/sys/class/i2c-adapter/i2c-{0}/delete_device".format(self.index+1) new_sfp_path = "/sys/class/i2c-adapter/i2c-{0}/new_device".format(self.index+1) driver_path = "/sys/class/i2c-adapter/i2c-{0}/{0}-0050/name".format(self.index+1) - delete_device = "echo 0x50 >" + del_sfp_path if not os.path.isfile(driver_path): print(driver_path, "does not exist") @@ -314,22 +312,25 @@ class Sfp(SfpOptoeBase): #Avoid re-initialization of the QSFP/SFP optic on QSFP/SFP port. if self.sfp_type == 'SFP' and driver_name in ['optoe1', 'optoe3']: - subprocess.Popen(delete_device, shell=True, stdout=subprocess.PIPE) + with open(del_sfp_path, 'w') as f: + f.write('0x50\n') time.sleep(0.2) - new_device = "echo optoe2 0x50 >" + new_sfp_path - subprocess.Popen(new_device, shell=True, stdout=subprocess.PIPE) + with open(new_sfp_path, 'w') as f: + f.write('optoe2 0x50\n') time.sleep(2) elif self.sfp_type == 'QSFP' and driver_name in ['optoe2', 'optoe3']: - subprocess.Popen(delete_device, shell=True, stdout=subprocess.PIPE) + with open(del_sfp_path, 'w') as f: + f.write('0x50\n') time.sleep(0.2) - new_device = "echo optoe1 0x50 >" + new_sfp_path - subprocess.Popen(new_device, shell=True, stdout=subprocess.PIPE) + with open(new_sfp_path, 'w') as f: + f.write('optoe1 0x50\n') time.sleep(2) elif self.sfp_type == 'QSFP_DD' and driver_name in ['optoe1', 'optoe2']: - subprocess.Popen(delete_device, shell=True, stdout=subprocess.PIPE) + with open(del_sfp_path, 'w') as f: + f.write('0x50\n') time.sleep(0.2) - new_device = "echo optoe3 0x50 >" + new_sfp_path - subprocess.Popen(new_device, shell=True, stdout=subprocess.PIPE) + with open(new_sfp_path, 'w') as f: + f.write('optoe3 0x50\n') time.sleep(2) except IOError as e: diff --git a/platform/broadcom/sonic-platform-modules-dell/s5224f/scripts/platform_sensors.py b/platform/broadcom/sonic-platform-modules-dell/s5224f/scripts/platform_sensors.py index 483dd59a56..f03c2fc9b4 100644 --- a/platform/broadcom/sonic-platform-modules-dell/s5224f/scripts/platform_sensors.py +++ b/platform/broadcom/sonic-platform-modules-dell/s5224f/scripts/platform_sensors.py @@ -10,25 +10,25 @@ # * FAN trays # * PSU - import sys import logging -import subprocess +from sonic_py_common.general import getstatusoutput_noshell, getstatusoutput_noshell_pipe S5224F_MAX_FAN_TRAYS = 4 S5224F_MAX_PSUS = 2 -IPMI_SENSOR_DATA = "ipmitool sdr list" +IPMI_SENSOR_DATA = ["ipmitool", "sdr", "list"] IPMI_SENSOR_DUMP = "/tmp/sdr" PSU_PRESENCE = "PSU{0}_stat" # Use this for older firmware # PSU_PRESENCE="PSU{0}_prsnt" -IPMI_FAN_PRESENCE = "ipmitool sensor get FAN{0}_prsnt" -IPMI_PSU1_DATA_DOCKER = "ipmitool raw 0x04 0x2d 0x31 | awk '{print substr($0,9,1)}'" -IPMI_PSU2_DATA_DOCKER = "ipmitool raw 0x04 0x2d 0x32 | awk '{print substr($0,9,1)}'" -IPMI_RAW_STORAGE_READ = "ipmitool raw 0x0a 0x11 {0} 0 0 0xa0" -IPMI_FRU = "ipmitool fru" +IPMI_FAN_PRESENCE = ["ipmitool", "sensor", "get", "FAN{0}_prsnt"] +IPMI_PSU1_DATA_DOCKER = ["ipmitool", "raw", "0x04", "0x2d", "0x31"] +IPMI_PSU2_DATA_DOCKER = ["ipmitool", "raw", "0x04", "0x2d", "0x32"] +awk_cmd = ['awk', '{print substr($0,9,1)}'] +IPMI_RAW_STORAGE_READ = ["ipmitool", "raw", "0x0a", "0x11", "", "0", "0", "0xa0"] +IPMI_FRU = ["ipmitool", "fru"] ipmi_sdr_list = "" # Dump sensor registers @@ -38,7 +38,7 @@ def ipmi_sensor_dump(): global ipmi_sdr_list ipmi_cmd = IPMI_SENSOR_DATA - status, ipmi_sdr_list = subprocess.getstatusoutput(ipmi_cmd) + status, ipmi_sdr_list = getstatusoutput_noshell(ipmi_cmd) if status: logging.error('Failed to execute:' + ipmi_sdr_list) @@ -47,9 +47,10 @@ def ipmi_sensor_dump(): # Fetch a Fan Status def get_fan_status(fan_id): - ret_status, ipmi_cmd_ret = subprocess.getstatusoutput(IPMI_FAN_PRESENCE.format(fan_id)) + IPMI_FAN_PRESENCE[3] = 'FAN' + str(fan_id) + '_prsnt' + ret_status, ipmi_cmd_ret = getstatusoutput_noshell(IPMI_FAN_PRESENCE) if ret_status: - logging.error('Failed to execute : %s'%IPMI_FAN_PRESENCE.format(fan_id)) + logging.error('Failed to execute : %s'% (' '.join(IPMI_FAN_PRESENCE))) sys.exit(0) return(' ' + ipmi_cmd_ret.splitlines()[5].strip(' ').strip('[]')) @@ -75,9 +76,9 @@ def get_pmc_register(reg_name): #Fetch FRU Data for given fruid def get_psu_airflow(psu_id): fru_id = 'PSU' + str(psu_id) + '_fru' - ret_status, ipmi_cmd_ret = subprocess.getstatusoutput(IPMI_FRU) + ret_status, ipmi_cmd_ret = getstatusoutput_noshell(IPMI_FRU) if ret_status: - logging.error('Failed to execute ipmitool: '+ IPMI_FRU) + logging.error('Failed to execute ipmitool: '+ ' '.join(IPMI_FRU)) sys.exit(0) found_fru = False for line in ipmi_cmd_ret.splitlines(): @@ -89,9 +90,10 @@ def get_psu_airflow(psu_id): # Fetch FRU on given offset def fetch_raw_fru(dev_id, offset): - ret_status, ipmi_cmd_ret = subprocess.getstatusoutput(IPMI_RAW_STORAGE_READ.format(dev_id)) + IPMI_RAW_STORAGE_READ[3] = str(dev_id) + ret_status, ipmi_cmd_ret = getstatusoutput_noshell(IPMI_RAW_STORAGE_READ) if ret_status: - logging.error('Failed to execute ipmitool :' + IPMI_RAW_STORAGE_READ.format(dev_id)) + logging.error('Failed to execute ipmitool :' + ' '.join(IPMI_RAW_STORAGE_READ)) sys.exit(0) return int((ipmi_cmd_ret.splitlines()[int(offset/16)]).split(' ')[(int(offset%16)+1)]) @@ -119,8 +121,11 @@ def print_temperature_sensors(): print (' CPU Temp: ',\ (get_pmc_register('CPU_temp'))) -ret_status, ipmi_cmd_ret = subprocess.getstatusoutput('echo 0 > /sys/module/ipmi_si/parameters/kipmid_max_busy_us') -if ret_status: +file = '/sys/module/ipmi_si/parameters/kipmid_max_busy_us' +try: + with open(file, 'w') as f: + f.write('0\n') +except (IOError, FileNotFoundError): logging.error("platform_sensors: Failed to set kipmid_max_busy_us to 0") ipmi_sensor_dump() @@ -212,12 +217,12 @@ def get_psu_presence(index): ret_status = 1 if index == 1: - ret_status, ipmi_cmd_ret = subprocess.getstatusoutput(IPMI_PSU1_DATA_DOCKER) + ret_status, ipmi_cmd_ret = getstatusoutput_noshell_pipe(IPMI_PSU1_DATA_DOCKER, awk_cmd) elif index == 2: - ret_status, ipmi_cmd_ret = subprocess.getstatusoutput(IPMI_PSU2_DATA_DOCKER) + ret_status, ipmi_cmd_ret = getstatusoutput_noshell_pipe(IPMI_PSU2_DATA_DOCKER, awk_cmd) if ret_status: - logging.error('Failed to execute ipmitool :' + IPMI_PSU1_DATA_DOCKER) + logging.error('Failed to execute ipmitool :' + ' '.join(IPMI_PSU1_DATA_DOCKER)) sys.exit(0) psu_status = ipmi_cmd_ret @@ -234,12 +239,12 @@ def get_psu_status(index): ipmi_cmd_ret = 'f' if index == 1: - ret_status, ipmi_cmd_ret = subprocess.getstatusoutput(IPMI_PSU1_DATA_DOCKER) + ret_status, ipmi_cmd_ret = getstatusoutput_noshell_pipe(IPMI_PSU1_DATA_DOCKER, awk_cmd) elif index == 2: - ret_status, ipmi_cmd_ret = subprocess.getstatusoutput(IPMI_PSU2_DATA_DOCKER) + ret_status, ipmi_cmd_ret = getstatusoutput_noshell_pipe(IPMI_PSU2_DATA_DOCKER, awk_cmd) if ret_status: - logging.error('Failed to execute ipmitool : ' + IPMI_PSU2_DATA_DOCKER) + logging.error('Failed to execute ipmitool : ' + ' '.join(IPMI_PSU2_DATA_DOCKER)) sys.exit(0) psu_status = ipmi_cmd_ret @@ -316,6 +321,9 @@ for psu in range(1, S5224F_MAX_PSUS + 1): print ('\n Total Power: ',\ get_pmc_register('PSU_Total_watt')) -ret_status, ipmi_cmd_ret = subprocess.getstatusoutput('echo 1000 > /sys/module/ipmi_si/parameters/kipmid_max_busy_us') -if ret_status: +file = '/sys/module/ipmi_si/parameters/kipmid_max_busy_us' +try: + with open(file, 'w') as f: + f.write('1000\n') +except (IOError, FileNotFoundError): logging.error("platform_sensors: Failed to set kipmid_max_busy_us to 1000") diff --git a/platform/broadcom/sonic-platform-modules-dell/s5224f/sonic_platform/sfp.py b/platform/broadcom/sonic-platform-modules-dell/s5224f/sonic_platform/sfp.py index 65eca49261..0d612854c3 100644 --- a/platform/broadcom/sonic-platform-modules-dell/s5224f/sonic_platform/sfp.py +++ b/platform/broadcom/sonic-platform-modules-dell/s5224f/sonic_platform/sfp.py @@ -13,7 +13,6 @@ try: import time import struct import mmap - import subprocess from sonic_platform_base.sonic_xcvr.sfp_optoe_base import SfpOptoeBase except ImportError as e: @@ -300,7 +299,6 @@ class Sfp(SfpOptoeBase): del_sfp_path = "/sys/class/i2c-adapter/i2c-{0}/delete_device".format(self.index+1) new_sfp_path = "/sys/class/i2c-adapter/i2c-{0}/new_device".format(self.index+1) driver_path = "/sys/class/i2c-adapter/i2c-{0}/{0}-0050/name".format(self.index+1) - delete_device = "echo 0x50 >" + del_sfp_path if not os.path.isfile(driver_path): print(driver_path, "does not exist") @@ -314,22 +312,25 @@ class Sfp(SfpOptoeBase): #Avoid re-initialization of the QSFP/SFP optic on QSFP/SFP port. if self.sfp_type == 'SFP' and driver_name in ['optoe1', 'optoe3']: - subprocess.Popen(delete_device, shell=True, stdout=subprocess.PIPE) + with open(del_sfp_path, 'w') as f: + f.write('0x50\n') time.sleep(0.2) - new_device = "echo optoe2 0x50 >" + new_sfp_path - subprocess.Popen(new_device, shell=True, stdout=subprocess.PIPE) + with open(new_sfp_path, 'w') as f: + f.write('optoe2 0x50\n') time.sleep(2) elif self.sfp_type == 'QSFP' and driver_name in ['optoe2', 'optoe3']: - subprocess.Popen(delete_device, shell=True, stdout=subprocess.PIPE) + with open(del_sfp_path, 'w') as f: + f.write('0x50\n') time.sleep(0.2) - new_device = "echo optoe1 0x50 >" + new_sfp_path - subprocess.Popen(new_device, shell=True, stdout=subprocess.PIPE) + with open(new_sfp_path, 'w') as f: + f.write('optoe1 0x50\n') time.sleep(2) elif self.sfp_type == 'QSFP_DD' and driver_name in ['optoe1', 'optoe2']: - subprocess.Popen(delete_device, shell=True, stdout=subprocess.PIPE) + with open(del_sfp_path, 'w') as f: + f.write('0x50\n') time.sleep(0.2) - new_device = "echo optoe3 0x50 >" + new_sfp_path - subprocess.Popen(new_device, shell=True, stdout=subprocess.PIPE) + with open(new_sfp_path, 'w') as f: + f.write('optoe3 0x50\n') time.sleep(2) except IOError as e: diff --git a/platform/broadcom/sonic-platform-modules-dell/s5232f/scripts/platform_sensors.py b/platform/broadcom/sonic-platform-modules-dell/s5232f/scripts/platform_sensors.py index 5db9837403..a3a4b2f467 100755 --- a/platform/broadcom/sonic-platform-modules-dell/s5232f/scripts/platform_sensors.py +++ b/platform/broadcom/sonic-platform-modules-dell/s5232f/scripts/platform_sensors.py @@ -13,21 +13,23 @@ import sys import logging +from sonic_py_common.general import getstatusoutput_noshell, getstatusoutput_noshell_pipe S5232F_MAX_FAN_TRAYS = 4 S5232F_MAX_PSUS = 2 -IPMI_SENSOR_DATA = "ipmitool sdr list" +IPMI_SENSOR_DATA = ["ipmitool", "sdr", "list"] IPMI_SENSOR_DUMP = "/tmp/sdr" PSU_PRESENCE = "PSU{0}_stat" # Use this for older firmware # PSU_PRESENCE="PSU{0}_prsnt" -IPMI_FAN_PRESENCE = "ipmitool sensor get FAN{0}_prsnt" -IPMI_PSU1_DATA_DOCKER = "ipmitool raw 0x04 0x2d 0x31 | awk '{print substr($0,9,1)}'" -IPMI_PSU2_DATA_DOCKER = "ipmitool raw 0x04 0x2d 0x32 | awk '{print substr($0,9,1)}'" -IPMI_RAW_STORAGE_READ = "ipmitool raw 0x0a 0x11 {0} 0 0 0xa0" -IPMI_FRU = "ipmitool fru" +IPMI_FAN_PRESENCE = ["ipmitool", "sensor", "get", ""] +IPMI_PSU1_DATA_DOCKER = ["ipmitool", "raw", "0x04", "0x2d", "0x31"] +IPMI_PSU2_DATA_DOCKER = ["ipmitool", "raw", "0x04", "0x2d", "0x32"] +awk_cmd = ['awk', '{print substr($0,9,1)}'] +IPMI_RAW_STORAGE_READ = ["ipmitool", "raw", "0x0a", "0x11", "", "0", "0", "0xa0"] +IPMI_FRU = ["ipmitool", "fru"] ipmi_sdr_list = "" # Dump sensor registers @@ -38,7 +40,7 @@ def ipmi_sensor_dump(): status = 1 global ipmi_sdr_list ipmi_cmd = IPMI_SENSOR_DATA - status, ipmi_sdr_list = subprocess.getstatusoutput(ipmi_cmd) + status, ipmi_sdr_list = getstatusoutput_noshell(ipmi_cmd) if status: logging.error('Failed to execute: ' + ipmi_sdr_list) @@ -47,9 +49,10 @@ def ipmi_sensor_dump(): # Fetch a Fan Status def get_fan_status(fan_id): - ret_status, ipmi_cmd_ret = subprocess.getstatusoutput(IPMI_FAN_PRESENCE.format(fan_id)) + IPMI_FAN_PRESENCE[3] = "FAN" + str(fan_id) + "_prsnt" + ret_status, ipmi_cmd_ret = getstatusoutput_noshell(IPMI_FAN_PRESENCE) if ret_status: - logging.error('Failed to execute : %s' % IPMI_FAN_PRESENCE.format(fan_id)) + logging.error('Failed to execute : %s' % ' '.join(IPMI_FAN_PRESENCE)) sys.exit(0) return(' ' + ipmi_cmd_ret.splitlines()[5].strip(' ').strip('[]')) @@ -75,9 +78,9 @@ def get_pmc_register(reg_name): # Fetch FRU Data for given fruid def get_psu_airflow(psu_id): fru_id = 'PSU' + str(psu_id) + '_fru' - ret_status, ipmi_cmd_ret = subprocess.getstatusoutput(IPMI_FRU) + ret_status, ipmi_cmd_ret = getstatusoutput_noshell(IPMI_FRU) if ret_status: - logging.error('Failed to execute ipmitool: ' + IPMI_FRU) + logging.error('Failed to execute ipmitool: ' + ' '.join(IPMI_FRU)) sys.exit(0) found_fru = False for line in ipmi_cmd_ret.splitlines(): @@ -89,9 +92,10 @@ def get_psu_airflow(psu_id): # Fetch FRU on given offset def fetch_raw_fru(dev_id, offset): - ret_status, ipmi_cmd_ret = subprocess.getstatusoutput(IPMI_RAW_STORAGE_READ.format(dev_id)) + IPMI_RAW_STORAGE_READ[4] = str(dev_id) + ret_status, ipmi_cmd_ret = getstatusoutput_noshell(IPMI_RAW_STORAGE_READ) if ret_status: - logging.error('Failed to execute ipmitool :' + IPMI_RAW_STORAGE_READ.format(dev_id)) + logging.error('Failed to execute ipmitool :' + ' '.join(IPMI_RAW_STORAGE_READ)) sys.exit(0) return int((ipmi_cmd_ret.splitlines()[offset//16]).split(' ')[(offset%16+1)]) @@ -118,7 +122,9 @@ def print_temperature_sensors(): print(' CPU Temp: ', get_pmc_register('CPU_temp')) -subprocess.getstatusoutput('echo 0 > /sys/module/ipmi_si/parameters/kipmid_max_busy_us') +file = '/sys/module/ipmi_si/parameters/kipmid_max_busy_us' +with open(file, 'w') as f: + f.write('0\n') ipmi_sensor_dump() print_temperature_sensors() @@ -209,12 +215,12 @@ for tray in range(1, S5232F_MAX_FAN_TRAYS + 1): ret_status = 1 if index == 1: - ret_status, ipmi_cmd_ret = subprocess.getstatusoutput(IPMI_PSU1_DATA_DOCKER) + ret_status, ipmi_cmd_ret = getstatusoutput_noshell_pipe(IPMI_PSU1_DATA_DOCKER, awk_cmd) elif index == 2: - ret_status, ipmi_cmd_ret = subprocess.getstatusoutput(IPMI_PSU2_DATA_DOCKER) + ret_status, ipmi_cmd_ret = getstatusoutput_noshell_pipe(IPMI_PSU2_DATA_DOCKER, awk_cmd) if ret_status: - logging.error('Failed to execute ipmitool :' + IPMI_PSU1_DATA_DOCKER) + logging.error('Failed to execute ipmitool :' + ' '.join(IPMI_PSU1_DATA_DOCKER)) sys.exit(0) psu_status = ipmi_cmd_ret @@ -232,12 +238,12 @@ for tray in range(1, S5232F_MAX_FAN_TRAYS + 1): ipmi_cmd_ret = 'f' if index == 1: - ret_status, ipmi_cmd_ret = subprocess.getstatusoutput(IPMI_PSU1_DATA_DOCKER) + ret_status, ipmi_cmd_ret = getstatusoutput_noshell_pipe(IPMI_PSU1_DATA_DOCKER, awk_cmd) elif index == 2: - ret_status, ipmi_cmd_ret = subprocess.getstatusoutput(IPMI_PSU2_DATA_DOCKER) + ret_status, ipmi_cmd_ret = getstatusoutput_noshell_pipe(IPMI_PSU2_DATA_DOCKER, awk_cmd) if ret_status: - logging.error('Failed to execute ipmitool : ' + IPMI_PSU2_DATA_DOCKER) + logging.error('Failed to execute ipmitool : ' + ' '.join(IPMI_PSU2_DATA_DOCKER)) sys.exit(0) psu_status = ipmi_cmd_ret @@ -330,4 +336,6 @@ for psu in range(1, S5232F_MAX_PSUS + 1): print('\n Total Power: ', get_pmc_register('PSU_Total_watt')) -subprocess.getstatusoutput('echo 1000 > /sys/module/ipmi_si/parameters/kipmid_max_busy_us') +file = '/sys/module/ipmi_si/parameters/kipmid_max_busy_us' +with open(file, 'w') as f: + f.write('1000\n') diff --git a/platform/broadcom/sonic-platform-modules-dell/s5232f/sonic_platform/sfp.py b/platform/broadcom/sonic-platform-modules-dell/s5232f/sonic_platform/sfp.py index 7b2e9025bb..74cfbf1b93 100644 --- a/platform/broadcom/sonic-platform-modules-dell/s5232f/sonic_platform/sfp.py +++ b/platform/broadcom/sonic-platform-modules-dell/s5232f/sonic_platform/sfp.py @@ -13,7 +13,6 @@ try: import time import struct import mmap - import subprocess from sonic_platform_base.sonic_xcvr.sfp_optoe_base import SfpOptoeBase except ImportError as e: @@ -278,7 +277,6 @@ class Sfp(SfpOptoeBase): del_sfp_path = "/sys/class/i2c-adapter/i2c-{0}/delete_device".format(self.index+1) new_sfp_path = "/sys/class/i2c-adapter/i2c-{0}/new_device".format(self.index+1) driver_path = "/sys/class/i2c-adapter/i2c-{0}/{0}-0050/name".format(self.index+1) - delete_device = "echo 0x50 >" + del_sfp_path if not os.path.isfile(driver_path): print(driver_path, "does not exist") @@ -292,22 +290,25 @@ class Sfp(SfpOptoeBase): #Avoid re-initialization of the QSFP/SFP optic on QSFP/SFP port. if self.sfp_type == 'SFP' and driver_name in ['optoe1', 'optoe3']: - subprocess.Popen(delete_device, shell=True, stdout=subprocess.PIPE) + with open(del_sfp_path, 'w') as f: + f.write('0x50\n') time.sleep(0.2) - new_device = "echo optoe2 0x50 >" + new_sfp_path - subprocess.Popen(new_device, shell=True, stdout=subprocess.PIPE) + with open(new_sfp_path, 'w') as f: + f.write('optoe2 0x50\n') time.sleep(2) elif self.sfp_type == 'QSFP' and driver_name in ['optoe2', 'optoe3']: - subprocess.Popen(delete_device, shell=True, stdout=subprocess.PIPE) + with open(del_sfp_path, 'w') as f: + f.write('0x50\n') time.sleep(0.2) - new_device = "echo optoe1 0x50 >" + new_sfp_path - subprocess.Popen(new_device, shell=True, stdout=subprocess.PIPE) + with open(new_sfp_path, 'w') as f: + f.write('optoe1 0x50\n') time.sleep(2) elif self.sfp_type == 'QSFP_DD' and driver_name in ['optoe1', 'optoe2']: - subprocess.Popen(delete_device, shell=True, stdout=subprocess.PIPE) + with open(del_sfp_path, 'w') as f: + f.write('0x50\n') time.sleep(0.2) - new_device = "echo optoe3 0x50 >" + new_sfp_path - subprocess.Popen(new_device, shell=True, stdout=subprocess.PIPE) + with open(new_sfp_path, 'w') as f: + f.write('optoe3 0x50\n') time.sleep(2) except IOError as e: diff --git a/platform/broadcom/sonic-platform-modules-dell/s5248f/scripts/platform_sensors.py b/platform/broadcom/sonic-platform-modules-dell/s5248f/scripts/platform_sensors.py index f276e6879d..e05ec4c888 100755 --- a/platform/broadcom/sonic-platform-modules-dell/s5248f/scripts/platform_sensors.py +++ b/platform/broadcom/sonic-platform-modules-dell/s5248f/scripts/platform_sensors.py @@ -13,11 +13,11 @@ import sys import logging -import subprocess +from sonic_py_common.general import getstatusoutput_noshell, getstatusoutput_noshell_pipe S5248F_MAX_FAN_TRAYS = 4 S5248F_MAX_PSUS = 2 -IPMI_SENSOR_DATA = "ipmitool sdr list" +IPMI_SENSOR_DATA = ["ipmitool", "sdr", "list"] IPMI_SENSOR_DUMP = "/tmp/sdr" FAN_PRESENCE = "FAN{0}_prsnt" @@ -25,8 +25,9 @@ PSU_PRESENCE = "PSU{0}_stat" # Use this for older firmware # PSU_PRESENCE="PSU{0}_prsnt" -IPMI_PSU1_DATA_DOCKER = "ipmitool raw 0x04 0x2d 0x31 | awk '{print substr($0,9,1)}'" -IPMI_PSU2_DATA_DOCKER = "ipmitool raw 0x04 0x2d 0x32 | awk '{print substr($0,9,1)}'" +IPMI_PSU1_DATA_DOCKER = ["ipmitool", "raw", "0x04", "0x2d", "0x31"] +IPMI_PSU2_DATA_DOCKER = ["ipmitool", "raw", "0x04", "0x2d", "0x32"] +awk_cmd = ['awk', '{print substr($0,9,1)}'] ipmi_sdr_list = "" # Dump sensor registers @@ -37,7 +38,7 @@ def ipmi_sensor_dump(): status = 1 global ipmi_sdr_list ipmi_cmd = IPMI_SENSOR_DATA - status, ipmi_sdr_list = subprocess.getstatusoutput(ipmi_cmd) + status, ipmi_sdr_list = getstatusoutput_noshell(ipmi_cmd) if status: logging.error('Failed to execute:' + ipmi_sdr_list) @@ -174,9 +175,9 @@ for tray in range(1, S5248F_MAX_FAN_TRAYS + 1): ret_status = 1 if index == 1: - status, ipmi_cmd_ret = subprocess.getstatusoutput(IPMI_PSU1_DATA_DOCKER) + status, ipmi_cmd_ret = getstatusoutput_noshell_pipe(IPMI_PSU1_DATA_DOCKER, awk_cmd) elif index == 2: - ret_status, ipmi_cmd_ret = subprocess.getstatusoutput(IPMI_PSU2_DATA_DOCKER) + ret_status, ipmi_cmd_ret = getstatusoutput_noshell_pipe(IPMI_PSU2_DATA_DOCKER, awk_cmd) #if ret_status: # print ipmi_cmd_ret @@ -186,7 +187,7 @@ for tray in range(1, S5248F_MAX_FAN_TRAYS + 1): psu_status = ipmi_cmd_ret if psu_status == '1': - status = 1 + status = 1 return status diff --git a/platform/broadcom/sonic-platform-modules-dell/s5248f/sonic_platform/sfp.py b/platform/broadcom/sonic-platform-modules-dell/s5248f/sonic_platform/sfp.py index b568b6fa15..af29c3a180 100644 --- a/platform/broadcom/sonic-platform-modules-dell/s5248f/sonic_platform/sfp.py +++ b/platform/broadcom/sonic-platform-modules-dell/s5248f/sonic_platform/sfp.py @@ -13,7 +13,6 @@ try: import time import struct import mmap - import subprocess from sonic_platform_base.sonic_xcvr.sfp_optoe_base import SfpOptoeBase except ImportError as e: @@ -242,7 +241,7 @@ class Sfp(SfpOptoeBase): """ reset = self.get_reset_status() - if (reset == True): + if (reset is True): status = False else: status = True @@ -278,7 +277,6 @@ class Sfp(SfpOptoeBase): del_sfp_path = "/sys/class/i2c-adapter/i2c-{0}/delete_device".format(self.index+1) new_sfp_path = "/sys/class/i2c-adapter/i2c-{0}/new_device".format(self.index+1) driver_path = "/sys/class/i2c-adapter/i2c-{0}/{0}-0050/name".format(self.index+1) - delete_device = "echo 0x50 >" + del_sfp_path if not os.path.isfile(driver_path): print(driver_path, "does not exist") @@ -292,22 +290,25 @@ class Sfp(SfpOptoeBase): #Avoid re-initialization of the QSFP/SFP optic on QSFP/SFP port. if self.sfp_type == 'SFP' and driver_name in ['optoe1', 'optoe3']: - subprocess.Popen(delete_device, shell=True, stdout=subprocess.PIPE) + with open(del_sfp_path, 'w') as f: + f.write('0x50\n') time.sleep(0.2) - new_device = "echo optoe2 0x50 >" + new_sfp_path - subprocess.Popen(new_device, shell=True, stdout=subprocess.PIPE) + with open(new_sfp_path, 'w') as f: + f.write('optoe2 0x50\n') time.sleep(2) elif self.sfp_type == 'QSFP' and driver_name in ['optoe2', 'optoe3']: - subprocess.Popen(delete_device, shell=True, stdout=subprocess.PIPE) + with open(del_sfp_path, 'w') as f: + f.write('0x50\n') time.sleep(0.2) - new_device = "echo optoe1 0x50 >" + new_sfp_path - subprocess.Popen(new_device, shell=True, stdout=subprocess.PIPE) + with open(new_sfp_path, 'w') as f: + f.write('optoe1 0x50\n') time.sleep(2) elif self.sfp_type == 'QSFP_DD' and driver_name in ['optoe1', 'optoe2']: - subprocess.Popen(delete_device, shell=True, stdout=subprocess.PIPE) + with open(del_sfp_path, 'w') as f: + f.write('0x50\n') time.sleep(0.2) - new_device = "echo optoe3 0x50 >" + new_sfp_path - subprocess.Popen(new_device, shell=True, stdout=subprocess.PIPE) + with open(new_sfp_path, 'w') as f: + f.write('optoe3 0x50\n') time.sleep(2) except IOError as e: diff --git a/platform/broadcom/sonic-platform-modules-dell/s5296f/scripts/platform_sensors.py b/platform/broadcom/sonic-platform-modules-dell/s5296f/scripts/platform_sensors.py index 4c6ef3b229..615e8caf1b 100755 --- a/platform/broadcom/sonic-platform-modules-dell/s5296f/scripts/platform_sensors.py +++ b/platform/broadcom/sonic-platform-modules-dell/s5296f/scripts/platform_sensors.py @@ -13,11 +13,11 @@ import sys import logging -import commands +from sonic_py_common.general import getstatusoutput_noshell, getstatusoutput_noshell_pipe S5296F_MAX_FAN_TRAYS = 4 S5296F_MAX_PSUS = 2 -IPMI_SENSOR_DATA = "ipmitool sdr list" +IPMI_SENSOR_DATA = ["ipmitool", "sdr", "list"] IPMI_SENSOR_DUMP = "/tmp/sdr" FAN_PRESENCE = "FAN{0}_prsnt" @@ -25,8 +25,9 @@ PSU_PRESENCE = "PSU{0}_stat" # Use this for older firmware # PSU_PRESENCE="PSU{0}_prsnt" -IPMI_PSU1_DATA_DOCKER = "ipmitool raw 0x04 0x2d 0x31 | awk '{print substr($0,9,1)}'" -IPMI_PSU2_DATA_DOCKER = "ipmitool raw 0x04 0x2d 0x32 | awk '{print substr($0,9,1)}'" +IPMI_PSU1_DATA_DOCKER = ["ipmitool", "raw", "0x04", "0x2d", "0x31"] +IPMI_PSU2_DATA_DOCKER = ["ipmitool", "raw", "0x04", "0x2d", "0x32"] +awk_cmd = ['awk', '{print substr($0,9,1)}'] ipmi_sdr_list = "" # Dump sensor registers @@ -36,7 +37,7 @@ def ipmi_sensor_dump(): global ipmi_sdr_list ipmi_cmd = IPMI_SENSOR_DATA - status, ipmi_sdr_list = commands.getstatusoutput(ipmi_cmd) + status, ipmi_sdr_list = getstatusoutput_noshell(ipmi_cmd) if status: logging.error('Failed to execute:' + ipmi_sdr_list) @@ -69,18 +70,18 @@ def print_temperature_sensors(): print("\nOnboard Temperature Sensors:") - print ' PT_Left_temp: ',\ - (get_pmc_register('PT_Left_temp')) - print ' PT_Mid_temp: ',\ - (get_pmc_register('PT_Mid_temp')) - print ' PT_Right_temp: ',\ - (get_pmc_register('PT_Right_temp')) - print ' Broadcom Temp: ',\ - (get_pmc_register('NPU_Near_temp')) - print ' Inlet Airflow Temp: ',\ - (get_pmc_register('ILET_AF_temp')) - print ' CPU Temp: ',\ - (get_pmc_register('CPU_temp')) + print(' PT_Left_temp: ',\ + (get_pmc_register('PT_Left_temp'))) + print(' PT_Mid_temp: ',\ + (get_pmc_register('PT_Mid_temp'))) + print(' PT_Right_temp: ',\ + (get_pmc_register('PT_Right_temp'))) + print(' Broadcom Temp: ',\ + (get_pmc_register('NPU_Near_temp'))) + print(' Inlet Airflow Temp: ',\ + (get_pmc_register('ILET_AF_temp'))) + print(' CPU Temp: ',\ + (get_pmc_register('CPU_temp'))) ipmi_sensor_dump() @@ -93,43 +94,43 @@ def print_fan_tray(tray): Fan_Status = [' Normal', ' Abnormal'] - print ' Fan Tray ' + str(tray) + ':' + print(' Fan Tray ' + str(tray) + ':') if (tray == 1): fan2_status = int(get_pmc_register('FAN1_Rear_stat'), 16) - print ' Fan Speed: ',\ - get_pmc_register('FAN1_Rear_rpm') - print ' Fan State: ',\ - Fan_Status[fan2_status] + print(' Fan Speed: ',\ + get_pmc_register('FAN1_Rear_rpm')) + print(' Fan State: ',\ + Fan_Status[fan2_status]) elif (tray == 2): fan2_status = int(get_pmc_register('FAN2_Rear_stat'), 16) - print ' Fan Speed: ',\ - get_pmc_register('FAN2_Rear_rpm') - print ' Fan State: ',\ - Fan_Status[fan2_status] + print(' Fan Speed: ',\ + get_pmc_register('FAN2_Rear_rpm')) + print(' Fan State: ',\ + Fan_Status[fan2_status]) elif (tray == 3): fan2_status = int(get_pmc_register('FAN3_Rear_stat'), 16) - print ' Fan Speed: ',\ - get_pmc_register('FAN3_Rear_rpm') - print ' Fan State: ',\ - Fan_Status[fan2_status] + print(' Fan Speed: ',\ + get_pmc_register('FAN3_Rear_rpm')) + print(' Fan State: ',\ + Fan_Status[fan2_status]) elif (tray == 4): fan2_status = int(get_pmc_register('FAN4_Rear_stat'), 16) - print ' Fan Speed: ',\ - get_pmc_register('FAN4_Rear_rpm') - print ' Fan State: ',\ - Fan_Status[fan2_status] + print(' Fan Speed: ',\ + get_pmc_register('FAN4_Rear_rpm')) + print(' Fan State: ',\ + Fan_Status[fan2_status]) print('\nFan Trays:') @@ -139,7 +140,7 @@ for tray in range(1, S5296F_MAX_FAN_TRAYS + 1): if (get_pmc_register(fan_presence)): print_fan_tray(tray) else: - print '\n Fan Tray ' + str(tray + 1) + ': Not present' + print('\n Fan Tray ' + str(tray + 1) + ': Not present') def get_psu_presence(index): """ @@ -151,9 +152,9 @@ for tray in range(1, S5296F_MAX_FAN_TRAYS + 1): status = 0 if index == 1: - status, ipmi_cmd_ret = commands.getstatusoutput(IPMI_PSU1_DATA_DOCKER) + status, ipmi_cmd_ret = getstatusoutput_noshell_pipe(IPMI_PSU1_DATA_DOCKER, awk_cmd) elif index == 2: - ret_status, ipmi_cmd_ret = commands.getstatusoutput(IPMI_PSU2_DATA_DOCKER) + ret_status, ipmi_cmd_ret = getstatusoutput_noshell_pipe(IPMI_PSU2_DATA_DOCKER, awk_cmd) #if ret_status: # print ipmi_cmd_ret @@ -163,7 +164,7 @@ for tray in range(1, S5296F_MAX_FAN_TRAYS + 1): psu_status = ipmi_cmd_ret if psu_status == '1': - status = 1 + status = 1 return status @@ -179,54 +180,54 @@ def print_psu(psu): # psu1_fan_status = int(get_pmc_register('PSU1_status'),16) - print ' PSU1:' - print ' FAN Normal Temperature: ',\ - get_pmc_register('PSU1_temp') - print ' FAN AirFlow Temperature: ',\ - get_pmc_register('PSU1_AF_temp') - print ' FAN RPM: ',\ - get_pmc_register('PSU1_rpm') + print(' PSU1:') + print(' FAN Normal Temperature: ',\ + get_pmc_register('PSU1_temp')) + print(' FAN AirFlow Temperature: ',\ + get_pmc_register('PSU1_AF_temp')) + print(' FAN RPM: ',\ + get_pmc_register('PSU1_rpm')) # print ' FAN Status: ', Psu_Fan_Status[psu1_fan_status] # PSU input & output monitors - print ' Input Voltage: ',\ - get_pmc_register('PSU1_In_volt') - print ' Output Voltage: ',\ - get_pmc_register('PSU1_Out_volt') - print ' Input Power: ',\ - get_pmc_register('PSU1_In_watt') - print ' Output Power: ',\ - get_pmc_register('PSU1_Out_watt') - print ' Input Current: ',\ - get_pmc_register('PSU1_In_amp') - print ' Output Current: ',\ - get_pmc_register('PSU1_Out_amp') + print(' Input Voltage: ',\ + get_pmc_register('PSU1_In_volt')) + print(' Output Voltage: ',\ + get_pmc_register('PSU1_Out_volt')) + print(' Input Power: ',\ + get_pmc_register('PSU1_In_watt')) + print(' Output Power: ',\ + get_pmc_register('PSU1_Out_watt')) + print(' Input Current: ',\ + get_pmc_register('PSU1_In_amp')) + print(' Output Current: ',\ + get_pmc_register('PSU1_Out_amp')) else: # psu2_fan_status = int(get_pmc_register('PSU1_status'),16) - print ' PSU2:' - print ' FAN Normal Temperature: ',\ - get_pmc_register('PSU2_temp') - print ' FAN AirFlow Temperature: ',\ - get_pmc_register('PSU2_AF_temp') - print ' FAN RPM: ',\ - get_pmc_register('PSU2_rpm') + print(' PSU2:') + print(' FAN Normal Temperature: ',\ + get_pmc_register('PSU2_temp')) + print(' FAN AirFlow Temperature: ',\ + get_pmc_register('PSU2_AF_temp')) + print(' FAN RPM: ',\ + get_pmc_register('PSU2_rpm')) # print ' FAN Status: ', Psu_Fan_Status[psu2_fan_status] # PSU input & output monitors - print ' Input Voltage: ',\ - get_pmc_register('PSU2_In_volt') - print ' Output Voltage: ',\ - get_pmc_register('PSU2_Out_volt') - print ' Input Power: ',\ - get_pmc_register('PSU2_In_watt') - print ' Output Power: ',\ - get_pmc_register('PSU2_Out_watt') - print ' Input Current: ',\ - get_pmc_register('PSU2_In_amp') - print ' Output Current: ',\ - get_pmc_register('PSU2_Out_amp') + print(' Input Voltage: ',\ + get_pmc_register('PSU2_In_volt')) + print(' Output Voltage: ',\ + get_pmc_register('PSU2_Out_volt')) + print(' Input Power: ',\ + get_pmc_register('PSU2_In_watt')) + print(' Output Power: ',\ + get_pmc_register('PSU2_Out_watt')) + print(' Input Current: ',\ + get_pmc_register('PSU2_In_amp')) + print(' Output Current: ',\ + get_pmc_register('PSU2_Out_amp')) print('\nPSUs:') @@ -235,8 +236,8 @@ for psu in range(1, S5296F_MAX_PSUS + 1): if (get_psu_presence(psu)): print_psu(psu) else: - print '\n PSU ', psu, 'Not present' + print('\n PSU ', psu, 'Not present') -print '\n Total Power: ',\ - get_pmc_register('PSU_Total_watt') +print('\n Total Power: ',\ + get_pmc_register('PSU_Total_watt')) diff --git a/platform/broadcom/sonic-platform-modules-dell/s5296f/sonic_platform/component.py b/platform/broadcom/sonic-platform-modules-dell/s5296f/sonic_platform/component.py index 592cd4e8c4..cc0022e43e 100644 --- a/platform/broadcom/sonic-platform-modules-dell/s5296f/sonic_platform/component.py +++ b/platform/broadcom/sonic-platform-modules-dell/s5296f/sonic_platform/component.py @@ -14,6 +14,7 @@ try: import subprocess from sonic_platform_base.component_base import ComponentBase import sonic_platform.hwaccess as hwaccess + from sonic_py_common.general import check_output_pipe except ImportError as e: raise ImportError(str(e) + "- required module not found") @@ -31,9 +32,7 @@ def get_bmc_version(): """ Returns BMC Version """ bmc_ver = '' try: - bmc_ver = subprocess.check_output( - "ipmitool mc info | awk '/Firmware Revision/ { print $NF }'", - shell=True, text=True).strip() + bmc_ver = check_output_pipe(["ipmitool", "mc", "info"], ["awk", "/Firmware Revision/ { print $NF }"]) except (FileNotFoundError, subprocess.CalledProcessError): pass return bmc_ver diff --git a/platform/broadcom/sonic-platform-modules-dell/s5296f/sonic_platform/sfp.py b/platform/broadcom/sonic-platform-modules-dell/s5296f/sonic_platform/sfp.py index d87ad3db74..c94baaec10 100644 --- a/platform/broadcom/sonic-platform-modules-dell/s5296f/sonic_platform/sfp.py +++ b/platform/broadcom/sonic-platform-modules-dell/s5296f/sonic_platform/sfp.py @@ -257,7 +257,7 @@ class Sfp(SfpOptoeBase): """ reset = self.get_reset_status() - if (reset == True): + if (reset is True): status = False else: status = True @@ -293,7 +293,6 @@ class Sfp(SfpOptoeBase): del_sfp_path = "/sys/class/i2c-adapter/i2c-{0}/delete_device".format(self.index+1) new_sfp_path = "/sys/class/i2c-adapter/i2c-{0}/new_device".format(self.index+1) driver_path = "/sys/class/i2c-adapter/i2c-{0}/{0}-0050/name".format(self.index+1) - delete_device = "echo 0x50 >" + del_sfp_path if not os.path.isfile(driver_path): print(driver_path, "does not exist") @@ -307,22 +306,25 @@ class Sfp(SfpOptoeBase): #Avoid re-initialization of the QSFP/SFP optic on QSFP/SFP port. if self.sfp_type == 'SFP' and driver_name in ['optoe1', 'optoe3']: - subprocess.Popen(delete_device, shell=True, stdout=subprocess.PIPE) + with open(del_sfp_path, 'w') as f: + f.write('0x50\n') time.sleep(0.2) - new_device = "echo optoe2 0x50 >" + new_sfp_path - subprocess.Popen(new_device, shell=True, stdout=subprocess.PIPE) + with open(new_sfp_path, 'w') as f: + f.write('optoe2 0x50\n') time.sleep(2) elif self.sfp_type == 'QSFP' and driver_name in ['optoe2', 'optoe3']: - subprocess.Popen(delete_device, shell=True, stdout=subprocess.PIPE) + with open(del_sfp_path, 'w') as f: + f.write('0x50\n') time.sleep(0.2) - new_device = "echo optoe1 0x50 >" + new_sfp_path - subprocess.Popen(new_device, shell=True, stdout=subprocess.PIPE) + with open(new_sfp_path, 'w') as f: + f.write('optoe1 0x50\n') time.sleep(2) elif self.sfp_type == 'QSFP_DD' and driver_name in ['optoe1', 'optoe2']: - subprocess.Popen(delete_device, shell=True, stdout=subprocess.PIPE) + with open(del_sfp_path, 'w') as f: + f.write('0x50\n') time.sleep(0.2) - new_device = "echo optoe3 0x50 >" + new_sfp_path - subprocess.Popen(new_device, shell=True, stdout=subprocess.PIPE) + with open(new_sfp_path, 'w') as f: + f.write('optoe3 0x50\n') time.sleep(2) except IOError as e: diff --git a/platform/broadcom/sonic-platform-modules-dell/z9264f/scripts/platform_sensors.py b/platform/broadcom/sonic-platform-modules-dell/z9264f/scripts/platform_sensors.py index bcc13452a8..25b206a1fe 100755 --- a/platform/broadcom/sonic-platform-modules-dell/z9264f/scripts/platform_sensors.py +++ b/platform/broadcom/sonic-platform-modules-dell/z9264f/scripts/platform_sensors.py @@ -13,11 +13,11 @@ import sys import logging -import subprocess +from sonic_py_common.general import getstatusoutput_noshell Z9264F_MAX_FAN_TRAYS = 4 Z9264F_MAX_PSUS = 2 -IPMI_SENSOR_DATA = "ipmitool sdr list" +IPMI_SENSOR_DATA = ["ipmitool", "sdr", "list"] IPMI_SENSOR_DUMP = "/tmp/sdr" FAN_PRESENCE = "FAN{0}_prsnt" @@ -34,7 +34,7 @@ def ipmi_sensor_dump(): status = 1 global ipmi_sdr_list ipmi_cmd = IPMI_SENSOR_DATA - status, ipmi_sdr_list = subprocess.getstatusoutput(ipmi_cmd) + status, ipmi_sdr_list = getstatusoutput_noshell(ipmi_cmd) if status: logging.error('Failed to execute:' + ipmi_sdr_list) diff --git a/platform/broadcom/sonic-platform-modules-dell/z9264f/sonic_platform/sfp.py b/platform/broadcom/sonic-platform-modules-dell/z9264f/sonic_platform/sfp.py index 2e20fa9e0e..a234ba04c1 100644 --- a/platform/broadcom/sonic-platform-modules-dell/z9264f/sonic_platform/sfp.py +++ b/platform/broadcom/sonic-platform-modules-dell/z9264f/sonic_platform/sfp.py @@ -13,7 +13,6 @@ try: import time import struct import mmap - import subprocess from sonic_platform_base.sonic_xcvr.sfp_optoe_base import SfpOptoeBase except ImportError as e: @@ -244,7 +243,7 @@ class Sfp(SfpOptoeBase): """ reset = self.get_reset_status() - if (reset == True): + if (reset is True): status = False else: status = True @@ -280,7 +279,6 @@ class Sfp(SfpOptoeBase): del_sfp_path = "/sys/class/i2c-adapter/i2c-{0}/delete_device".format(self.index+1) new_sfp_path = "/sys/class/i2c-adapter/i2c-{0}/new_device".format(self.index+1) driver_path = "/sys/class/i2c-adapter/i2c-{0}/{0}-0050/name".format(self.index+1) - delete_device = "echo 0x50 >" + del_sfp_path if not os.path.isfile(driver_path): print(driver_path, "does not exist") @@ -294,22 +292,25 @@ class Sfp(SfpOptoeBase): #Avoid re-initialization of the QSFP/SFP optic on QSFP/SFP port. if self.sfp_type == 'SFP' and driver_name in ['optoe1', 'optoe3']: - subprocess.Popen(delete_device, shell=True, stdout=subprocess.PIPE) + with open(del_sfp_path, 'w') as f: + f.write('0x50\n') time.sleep(0.2) - new_device = "echo optoe2 0x50 >" + new_sfp_path - subprocess.Popen(new_device, shell=True, stdout=subprocess.PIPE) + with open(new_sfp_path, 'w') as f: + f.write('optoe2 0x50\n') time.sleep(2) elif self.sfp_type == 'QSFP' and driver_name in ['optoe2', 'optoe3']: - subprocess.Popen(delete_device, shell=True, stdout=subprocess.PIPE) + with open(del_sfp_path, 'w') as f: + f.write('0x50\n') time.sleep(0.2) - new_device = "echo optoe1 0x50 >" + new_sfp_path - subprocess.Popen(new_device, shell=True, stdout=subprocess.PIPE) + with open(new_sfp_path, 'w') as f: + f.write('optoe1 0x50\n') time.sleep(2) elif self.sfp_type == 'QSFP_DD' and driver_name in ['optoe1', 'optoe2']: - subprocess.Popen(delete_device, shell=True, stdout=subprocess.PIPE) + with open(del_sfp_path, 'w') as f: + f.write('0x50\n') time.sleep(0.2) - new_device = "echo optoe3 0x50 >" + new_sfp_path - subprocess.Popen(new_device, shell=True, stdout=subprocess.PIPE) + with open(new_sfp_path, 'w') as f: + f.write('optoe3 0x50\n') time.sleep(2) except IOError as e: diff --git a/platform/broadcom/sonic-platform-modules-dell/z9332f/scripts/platform_sensors.py b/platform/broadcom/sonic-platform-modules-dell/z9332f/scripts/platform_sensors.py index 1a5778525d..ecc9f67d35 100755 --- a/platform/broadcom/sonic-platform-modules-dell/z9332f/scripts/platform_sensors.py +++ b/platform/broadcom/sonic-platform-modules-dell/z9332f/scripts/platform_sensors.py @@ -13,11 +13,11 @@ import sys import logging -import subprocess +from sonic_py_common.general import getstatusoutput_noshell, getstatusoutput_noshell_pipe Z9332F_MAX_FAN_TRAYS = 7 Z9332F_MAX_PSUS = 2 -IPMI_SENSOR_DATA = "ipmitool sdr list" +IPMI_SENSOR_DATA = ["ipmitool", "sdr", "list"] IPMI_SENSOR_DUMP = "/tmp/sdr" FAN_PRESENCE = "Fan{0}_Status" @@ -25,9 +25,9 @@ PSU_PRESENCE = "PSU{0}_Status" # Use this for older firmware # PSU_PRESENCE="PSU{0}_prsnt" -IPMI_PSU1_DATA_DOCKER = "ipmitool raw 0x04 0x2d 0x2f | awk '{print substr($0,9,1)}'" -IPMI_PSU2_DATA_DOCKER = "ipmitool raw 0x04 0x2d 0x39 | awk '{print substr($0,9,1)}'" - +IPMI_PSU1_DATA_DOCKER = ["ipmitool", "raw", "0x04", "0x2d", "0x2f"] +IPMI_PSU2_DATA_DOCKER = ["ipmitool", "raw", "0x04", "0x2d", "0x39"] +awk_cmd = ['awk', '{print substr($0,9,1)}'] ipmi_sdr_list = "" # Dump sensor registers @@ -38,7 +38,7 @@ def ipmi_sensor_dump(): status = 1 global ipmi_sdr_list ipmi_cmd = IPMI_SENSOR_DATA - status, ipmi_sdr_list = subprocess.getstatusoutput(ipmi_cmd) + status, ipmi_sdr_list = getstatusoutput_noshell(ipmi_cmd) if status: logging.error('Failed to execute:' + ipmi_sdr_list) @@ -130,9 +130,9 @@ for tray in range(1, Z9332F_MAX_FAN_TRAYS + 1): ret_status = 1 if index == 1: - status, ipmi_cmd_ret = subprocess.getstatusoutput(IPMI_PSU1_DATA_DOCKER) + status, ipmi_cmd_ret = getstatusoutput_noshell_pipe(IPMI_PSU1_DATA_DOCKER, awk_cmd) elif index == 2: - ret_status, ipmi_cmd_ret = subprocess.getstatusoutput(IPMI_PSU2_DATA_DOCKER) + ret_status, ipmi_cmd_ret = getstatusoutput_noshell_pipe(IPMI_PSU2_DATA_DOCKER, awk_cmd) #if ret_status: # print ipmi_cmd_ret diff --git a/platform/broadcom/sonic-platform-modules-dell/z9332f/sonic_platform/component.py b/platform/broadcom/sonic-platform-modules-dell/z9332f/sonic_platform/component.py index 6abe435ca6..62f4402fd4 100644 --- a/platform/broadcom/sonic-platform-modules-dell/z9332f/sonic_platform/component.py +++ b/platform/broadcom/sonic-platform-modules-dell/z9332f/sonic_platform/component.py @@ -18,6 +18,7 @@ try: import tempfile from sonic_platform_base.component_base import ComponentBase import sonic_platform.hwaccess as hwaccess + from sonic_py_common.general import check_output_pipe except ImportError as e: raise ImportError(str(e) + "- required module not found") @@ -161,10 +162,10 @@ class Component(ComponentBase): return False, "ERROR: File not found" with tempfile.TemporaryDirectory() as tmpdir: - cmd = "sed -e '1,/^exit_marker$/d' {} | tar -x -C {} installer/onie-update.tar.xz".format(image_path, tmpdir) + cmd1 = ["sed", "-e", '1,/^exit_marker$/d', image_path] + cmd2 = ["tar", "-x", "-C", tmpdir, "installer/onie-update.tar.xz"] try: - subprocess.check_call(cmd, stdout=subprocess.DEVNULL, - stderr=subprocess.DEVNULL, shell=True) + check_output_pipe(cmd1, cmd2) except subprocess.CalledProcessError: return False, "ERROR: Unable to extract firmware updater" @@ -200,18 +201,18 @@ class Component(ComponentBase): @staticmethod def _stage_firmware_package(image_path): stage_msg = None - cmd = "onie_stage_fwpkg -a {}".format(image_path) + cmd = ["onie_stage_fwpkg", "-a", image_path] try: - subprocess.check_output(cmd.split(), stderr=subprocess.STDOUT, text=True) + subprocess.check_output(cmd, stderr=subprocess.STDOUT, text=True) except subprocess.CalledProcessError as e: if e.returncode != 2: return False, e.output.strip() else: stage_msg = e.output.strip() - cmd = "onie_mode_set -o update" + cmd = ["onie_mode_set", "-o", "update"] try: - subprocess.check_output(cmd.split(), stderr=subprocess.STDOUT, text=True) + subprocess.check_output(cmd, stderr=subprocess.STDOUT, text=True) except subprocess.CalledProcessError as e: return False, e.output.strip() diff --git a/platform/broadcom/sonic-platform-modules-dell/z9332f/sonic_platform/sfp.py b/platform/broadcom/sonic-platform-modules-dell/z9332f/sonic_platform/sfp.py index 693c83743e..fbd5b2b8ea 100644 --- a/platform/broadcom/sonic-platform-modules-dell/z9332f/sonic_platform/sfp.py +++ b/platform/broadcom/sonic-platform-modules-dell/z9332f/sonic_platform/sfp.py @@ -12,7 +12,6 @@ try: import os import time - import subprocess import mmap from sonic_platform_base.sonic_xcvr.sfp_optoe_base import SfpOptoeBase @@ -335,7 +334,6 @@ class Sfp(SfpOptoeBase): self._port_to_i2c_mapping[self.index]) driver_path = "/sys/class/i2c-adapter/i2c-{0}/{0}-0050/name".format( self._port_to_i2c_mapping[self.index]) - delete_device = "echo 0x50 >" + del_sfp_path if not os.path.isfile(driver_path): print(driver_path, "does not exist") @@ -349,22 +347,25 @@ class Sfp(SfpOptoeBase): #Avoid re-initialization of the QSFP/SFP optic on QSFP/SFP port. if self.sfp_type == 'SFP' and driver_name in ['optoe1', 'optoe3']: - subprocess.Popen(delete_device, shell=True, stdout=subprocess.PIPE) + with open(del_sfp_path, 'w') as f: + f.write('0x50\n') time.sleep(0.2) - new_device = "echo optoe2 0x50 >" + new_sfp_path - subprocess.Popen(new_device, shell=True, stdout=subprocess.PIPE) + with open(new_sfp_path, 'w') as f: + f.write('optoe2 0x50\n') time.sleep(2) elif self.sfp_type == 'QSFP' and driver_name in ['optoe2', 'optoe3']: - subprocess.Popen(delete_device, shell=True, stdout=subprocess.PIPE) + with open(del_sfp_path, 'w') as f: + f.write('0x50\n') time.sleep(0.2) - new_device = "echo optoe1 0x50 >" + new_sfp_path - subprocess.Popen(new_device, shell=True, stdout=subprocess.PIPE) + with open(new_sfp_path, 'w') as f: + f.write('optoe1 0x50\n') time.sleep(2) elif self.sfp_type == 'QSFP_DD' and driver_name in ['optoe1', 'optoe2']: - subprocess.Popen(delete_device, shell=True, stdout=subprocess.PIPE) + with open(del_sfp_path, 'w') as f: + f.write('0x50\n') time.sleep(0.2) - new_device = "echo optoe3 0x50 >" + new_sfp_path - subprocess.Popen(new_device, shell=True, stdout=subprocess.PIPE) + with open(new_sfp_path, 'w') as f: + f.write('optoe3 0x50\n') time.sleep(2) except IOError as err: diff --git a/platform/broadcom/sonic-platform-modules-dell/z9432f/scripts/platform_sensors.py b/platform/broadcom/sonic-platform-modules-dell/z9432f/scripts/platform_sensors.py index 3446a09321..1d1230019e 100755 --- a/platform/broadcom/sonic-platform-modules-dell/z9432f/scripts/platform_sensors.py +++ b/platform/broadcom/sonic-platform-modules-dell/z9432f/scripts/platform_sensors.py @@ -12,20 +12,20 @@ import sys import logging -import commands +from sonic_py_common.general import getstatusoutput_noshell Z9432F_MAX_FAN_TRAYS = 7 Z9432F_MAX_PSUS = 2 -IPMI_SENSOR_DATA = "ipmitool sdr elist" +IPMI_SENSOR_DATA = ["ipmitool", "sdr", "elist"] -IPMI_RAW_STORAGE_READ = "ipmitool raw 0x0a 0x11 {0} {1} 0 1" +IPMI_RAW_STORAGE_READ = ["ipmitool", "raw", "0x0a", "0x11", "", "", "0", "1"] # Dump sensor registers class SdrStatus(object): """ Contains IPMI SDR List """ def __init__(self): ipmi_cmd = IPMI_SENSOR_DATA - status, resp = commands.getstatusoutput(ipmi_cmd) + status, resp = getstatusoutput_noshell(ipmi_cmd) if status: logging.error('Failed to execute: ' + ipmi_cmd) sys.exit(0) @@ -43,14 +43,6 @@ class SdrStatus(object): # Fetch a Fan Status SDR_STATUS = SdrStatus() -def get_fan_status(fan_id): - """ Get Fan Status of give Id """ - status, cmd_ret = commands.getstatusoutput(IPMI_FAN_PRESENCE.format(fan_id)) - if status: - logging.error('Failed to execute : %s', IPMI_FAN_PRESENCE.format(fan_id)) - sys.exit(0) - return ' ' + cmd_ret.splitlines()[5].strip(' ').strip('[]') - # Fetch a BMC register @@ -62,7 +54,7 @@ def get_pmc_register(reg_name): if reg_name in sdr_status: output = sdr_status[reg_name] else: - print '\nFailed to fetch: ' + reg_name + ' sensor ' + print('\nFailed to fetch: ' + reg_name + ' sensor ') sys.exit(0) logging.basicConfig(level=logging.DEBUG) @@ -71,9 +63,11 @@ def get_pmc_register(reg_name): # Fetch FRU on given offset def fetch_raw_fru(dev_id, offset): """ Fetch RAW value from FRU (dev_id) @ given offset """ - status, cmd_ret = commands.getstatusoutput(IPMI_RAW_STORAGE_READ.format(dev_id, offset)) + IPMI_RAW_STORAGE_READ[4] = str(dev_id) + IPMI_RAW_STORAGE_READ[5] = offset + status, cmd_ret = getstatusoutput_noshell(IPMI_RAW_STORAGE_READ) if status: - logging.error('Failed to execute ipmitool :' + IPMI_RAW_STORAGE_READ.format(dev_id, offset)) + logging.error('Failed to execute ipmitool :' + ' '.join(IPMI_RAW_STORAGE_READ)) return -1 return int(cmd_ret.strip().split(' ')[1]) @@ -83,7 +77,7 @@ def fetch_raw_fru(dev_id, offset): def get_fan_airflow(fan_id): """ Return Airflow of direction of FANTRAY(fan_id) """ airflow_direction = ['Exhaust', 'Intake'] - dir_idx = fetch_raw_fru(fan_id+2, 0x45) + dir_idx = fetch_raw_fru(fan_id+2, "0x45") if dir_idx == -1: return 'N/A' return airflow_direction[dir_idx] @@ -92,7 +86,7 @@ def get_fan_airflow(fan_id): def get_psu_airflow(psu_id): """ Return Airflow Direction of psu_id """ airflow_direction = ['Exhaust', 'Intake'] - dir_idx = fetch_raw_fru(psu_id, 0x2F) + dir_idx = fetch_raw_fru(psu_id, "0x2F") if dir_idx == -1: return 'N/A' return airflow_direction[dir_idx] @@ -103,37 +97,39 @@ def get_psu_airflow(psu_id): def print_temperature_sensors(): """ Prints Temperature Sensor """ - print "\nOnboard Temperature Sensors:" + print("\nOnboard Temperature Sensors:") - print ' PT Left Temp: ',\ - (get_pmc_register('PT_Left_temp')) - print ' NPU Rear Temp: ',\ - (get_pmc_register('NPU_Rear_temp')) - print ' PT Right Temp: ',\ - (get_pmc_register('PT_Right_temp')) - print ' NPU Front Temp: ',\ - (get_pmc_register('NPU_Front_temp')) - print ' FAN Right Temp: ',\ - (get_pmc_register('FAN_Right_temp')) - print ' NPU Temp: ',\ - (get_pmc_register('NPU_temp')) - print ' CPU Temp: ',\ - (get_pmc_register('CPU_temp')) - print ' PSU1 AF Temp: ',\ - (get_pmc_register('PSU1_AF_temp')) - print ' PSU1 Mid Temp: ',\ - (get_pmc_register('PSU1_Mid_temp')) - print ' PSU1 Rear Temp: ',\ - (get_pmc_register('PSU1_Rear_temp')) - print ' PSU2 AF Temp: ',\ - (get_pmc_register('PSU2_AF_temp')) - print ' PSU2 Mid Temp: ',\ - (get_pmc_register('PSU2_Mid_temp')) - print ' PSU2 Rear Temp: ',\ - (get_pmc_register('PSU2_Rear_temp')) + print(' PT Left Temp: ',\ + (get_pmc_register('PT_Left_temp'))) + print(' NPU Rear Temp: ',\ + (get_pmc_register('NPU_Rear_temp'))) + print(' PT Right Temp: ',\ + (get_pmc_register('PT_Right_temp'))) + print(' NPU Front Temp: ',\ + (get_pmc_register('NPU_Front_temp'))) + print(' FAN Right Temp: ',\ + (get_pmc_register('FAN_Right_temp'))) + print(' NPU Temp: ',\ + (get_pmc_register('NPU_temp'))) + print(' CPU Temp: ',\ + (get_pmc_register('CPU_temp'))) + print(' PSU1 AF Temp: ',\ + (get_pmc_register('PSU1_AF_temp'))) + print(' PSU1 Mid Temp: ',\ + (get_pmc_register('PSU1_Mid_temp'))) + print(' PSU1 Rear Temp: ',\ + (get_pmc_register('PSU1_Rear_temp'))) + print(' PSU2 AF Temp: ',\ + (get_pmc_register('PSU2_AF_temp'))) + print(' PSU2 Mid Temp: ',\ + (get_pmc_register('PSU2_Mid_temp'))) + print(' PSU2 Rear Temp: ',\ + (get_pmc_register('PSU2_Rear_temp'))) - commands.getstatusoutput('echo 0 > /sys/module/ipmi_si/parameters/kipmid_max_busy_us') + file = '/sys/module/ipmi_si/parameters/kipmid_max_busy_us' + with open(file, 'w') as f: + f.write('0\n') print_temperature_sensors() @@ -144,26 +140,26 @@ def print_fan_tray(fan_tray): """ Prints given Fan Tray information """ fan_status = ['Abnormal', 'Normal'] - print ' Fan Tray ' + str(fan_tray) + ':' + print(' Fan Tray ' + str(fan_tray) + ':') fan_front_status = (get_pmc_register('Fan{0}_Front_state'.format(str(fan_tray))) == '') fan_rear_status = (get_pmc_register('Fan{0}_Rear_state'.format(str(fan_tray))) == '') - print ' Fan1 Speed: ', \ - get_pmc_register('FAN{0}_Front_rpm'.format(str(fan_tray))) - print ' Fan2 Speed: ',\ - get_pmc_register('FAN{0}_Rear_rpm'.format(str(fan_tray))) - print ' Fan1 State: ', fan_status[fan_front_status] - print ' Fan2 State: ', fan_status[fan_rear_status] - print ' Airflow: ', get_fan_airflow(fan_tray) + print(' Fan1 Speed: ', \ + get_pmc_register('FAN{0}_Front_rpm'.format(str(fan_tray)))) + print(' Fan2 Speed: ',\ + get_pmc_register('FAN{0}_Rear_rpm'.format(str(fan_tray)))) + print(' Fan1 State: ', fan_status[fan_front_status]) + print(' Fan2 State: ', fan_status[fan_rear_status]) + print(' Airflow: ', get_fan_airflow(fan_tray)) -print '\nFan Trays:' +print('\nFan Trays:') for tray in range(1, Z9432F_MAX_FAN_TRAYS + 1): if get_pmc_register('FAN{0}_prsnt'.format(str(tray))) == 'Present': print_fan_tray(tray) else: - print ' Fan Tray {}: NOT PRESENT'.format(str(tray)) + print(' Fan Tray {}: NOT PRESENT'.format(str(tray))) def get_psu_status(index): """ @@ -188,67 +184,69 @@ def print_psu(psu_id): # PSU FAN details if psu_id == 1: - print ' PSU1:' - print ' AF Temperature: ',\ - get_pmc_register('PSU1_AF_temp') - print ' Mid Temperature: ',\ - get_pmc_register('PSU1_Mid_temp') - print ' Rear Temperature: ',\ - get_pmc_register('PSU1_Rear_temp') - print ' FAN RPM: ',\ - get_pmc_register('PSU1_rpm') + print(' PSU1:') + print(' AF Temperature: ',\ + get_pmc_register('PSU1_AF_temp')) + print(' Mid Temperature: ',\ + get_pmc_register('PSU1_Mid_temp')) + print(' Rear Temperature: ',\ + get_pmc_register('PSU1_Rear_temp')) + print(' FAN RPM: ',\ + get_pmc_register('PSU1_rpm')) # PSU input & output monitors - print ' Input Voltage: ',\ - get_pmc_register('PSU1_In_volt') - print ' Output Voltage: ',\ - get_pmc_register('PSU1_Out_volt') - print ' Input Power: ',\ - get_pmc_register('PSU1_In_watt') - print ' Output Power: ',\ - get_pmc_register('PSU1_Out_watt') - print ' Input Current: ',\ - get_pmc_register('PSU1_In_amp') - print ' Output Current: ',\ - get_pmc_register('PSU1_Out_amp') + print(' Input Voltage: ',\ + get_pmc_register('PSU1_In_volt')) + print(' Output Voltage: ',\ + get_pmc_register('PSU1_Out_volt')) + print(' Input Power: ',\ + get_pmc_register('PSU1_In_watt')) + print(' Output Power: ',\ + get_pmc_register('PSU1_Out_watt')) + print(' Input Current: ',\ + get_pmc_register('PSU1_In_amp')) + print(' Output Current: ',\ + get_pmc_register('PSU1_Out_amp')) else: - print ' PSU2:' - print ' AF Temperature: ',\ - get_pmc_register('PSU2_AF_temp') - print ' Mid Temperature: ',\ - get_pmc_register('PSU2_Mid_temp') - print ' Rear Temperature: ',\ - get_pmc_register('PSU2_Rear_temp') - print ' FAN RPM: ',\ - get_pmc_register('PSU2_rpm') + print(' PSU2:') + print(' AF Temperature: ',\ + get_pmc_register('PSU2_AF_temp')) + print(' Mid Temperature: ',\ + get_pmc_register('PSU2_Mid_temp')) + print(' Rear Temperature: ',\ + get_pmc_register('PSU2_Rear_temp')) + print(' FAN RPM: ',\ + get_pmc_register('PSU2_rpm')) # PSU input & output monitors - print ' Input Voltage: ',\ - get_pmc_register('PSU2_In_volt') - print ' Output Voltage: ',\ - get_pmc_register('PSU2_Out_volt') - print ' Input Power: ',\ - get_pmc_register('PSU2_In_watt') - print ' Output Power: ',\ - get_pmc_register('PSU2_Out_watt') - print ' Input Current: ',\ - get_pmc_register('PSU2_In_amp') - print ' Output Current: ',\ - get_pmc_register('PSU2_Out_amp') - print ' Airflow: ',\ - get_psu_airflow(psu_id) + print(' Input Voltage: ',\ + get_pmc_register('PSU2_In_volt')) + print(' Output Voltage: ',\ + get_pmc_register('PSU2_Out_volt')) + print(' Input Power: ',\ + get_pmc_register('PSU2_In_watt')) + print(' Output Power: ',\ + get_pmc_register('PSU2_Out_watt')) + print(' Input Current: ',\ + get_pmc_register('PSU2_In_amp')) + print(' Output Current: ',\ + get_pmc_register('PSU2_Out_amp')) + print(' Airflow: ',\ + get_psu_airflow(psu_id)) -print '\nPSUs:' +print('\nPSUs:') for psu in range(1, Z9432F_MAX_PSUS + 1): psu_status = get_psu_status(psu) if psu_status is not None: - print ' PSU{0}: {1}'.format(psu, psu_status) + print(' PSU{0}: {1}'.format(psu, psu_status)) else: print_psu(psu) -print '\n Total Power: ',\ - get_pmc_register('PSU_Total_watt') - commands.getstatusoutput('echo 1000 > /sys/module/ipmi_si/parameters/kipmid_max_busy_us') +print('\n Total Power: ',\ +get_pmc_register('PSU_Total_watt')) +file = '/sys/module/ipmi_si/parameters/kipmid_max_busy_us' +with open(file, 'w') as f: + f.write('1000\n') diff --git a/platform/broadcom/sonic-platform-modules-dell/z9432f/sonic_platform/component.py b/platform/broadcom/sonic-platform-modules-dell/z9432f/sonic_platform/component.py index 42d8d50d09..8d5ab6c648 100644 --- a/platform/broadcom/sonic-platform-modules-dell/z9432f/sonic_platform/component.py +++ b/platform/broadcom/sonic-platform-modules-dell/z9432f/sonic_platform/component.py @@ -18,6 +18,7 @@ try: import tempfile from sonic_platform_base.component_base import ComponentBase import sonic_platform.hwaccess as hwaccess + from sonic_py_common.general import check_output_pipe except ImportError as e: raise ImportError(str(e) + "- required module not found") @@ -135,10 +136,11 @@ class Component(ComponentBase): return False, "ERROR: File not found" with tempfile.TemporaryDirectory() as tmpdir: - cmd = "sed -e '1,/^exit_marker$/d' {} | tar -x -C {} installer/onie-update.tar.xz".format(image_path, tmpdir) + cmd1 = ["sed", "-e", '1,/^exit_marker$/d', image_path] + cmd2 = ["tar", "-x", "-C", tmpdir, "installer/onie-update.tar.xz"] try: - subprocess.check_call(cmd, stdout=subprocess.DEVNULL, - stderr=subprocess.DEVNULL, shell=True) + check_output_pipe(cmd1, cmd2) + except subprocess.CalledProcessError: return False, "ERROR: Unable to extract firmware updater" @@ -166,18 +168,18 @@ class Component(ComponentBase): @staticmethod def _stage_firmware_package(image_path): stage_msg = None - cmd = "onie_stage_fwpkg -a {}".format(image_path) + cmd = ["onie_stage_fwpkg", "-a", image_path] try: - subprocess.check_output(cmd.split(), stderr=subprocess.STDOUT, text=True) + subprocess.check_output(cmd, stderr=subprocess.STDOUT, text=True) except subprocess.CalledProcessError as e: if e.returncode != 2: return False, e.output.strip() else: stage_msg = e.output.strip() - cmd = "onie_mode_set -o update" + cmd = ["onie_mode_set", "-o", "update"] try: - subprocess.check_output(cmd.split(), stderr=subprocess.STDOUT, text=True) + subprocess.check_output(cmd, stderr=subprocess.STDOUT, text=True) except subprocess.CalledProcessError as e: return False, e.output.strip() diff --git a/platform/broadcom/sonic-platform-modules-dell/z9432f/sonic_platform/sfp.py b/platform/broadcom/sonic-platform-modules-dell/z9432f/sonic_platform/sfp.py index eaff8e9b1d..bc43ba712c 100644 --- a/platform/broadcom/sonic-platform-modules-dell/z9432f/sonic_platform/sfp.py +++ b/platform/broadcom/sonic-platform-modules-dell/z9432f/sonic_platform/sfp.py @@ -12,7 +12,6 @@ try: import os import time - import subprocess import mmap from sonic_platform_base.sonic_xcvr.sfp_optoe_base import SfpOptoeBase @@ -302,7 +301,6 @@ class Sfp(SfpOptoeBase): del_sfp_path = "/sys/class/i2c-adapter/i2c-{0}/delete_device".format(i2c_bus) new_sfp_path = "/sys/class/i2c-adapter/i2c-{0}/new_device".format(i2c_bus) driver_path = "/sys/class/i2c-adapter/i2c-{0}/{0}-0050/name".format(i2c_bus) - delete_device = "echo 0x50 >" + del_sfp_path if not os.path.isfile(driver_path): print(driver_path, "does not exist") @@ -316,22 +314,25 @@ class Sfp(SfpOptoeBase): #Avoid re-initialization of the QSFP/SFP optic on QSFP/SFP port. if self.sfp_type == 'SFP' and driver_name in ['optoe1', 'optoe3']: - subprocess.Popen(delete_device, shell=True, stdout=subprocess.PIPE) + with open(del_sfp_path, 'w') as f: + f.write('0x50\n') time.sleep(0.2) - new_device = "echo optoe2 0x50 >" + new_sfp_path - subprocess.Popen(new_device, shell=True, stdout=subprocess.PIPE) + with open(new_sfp_path, 'w') as f: + f.write('optoe2 0x50\n') time.sleep(2) elif self.sfp_type == 'QSFP' and driver_name in ['optoe2', 'optoe3']: - subprocess.Popen(delete_device, shell=True, stdout=subprocess.PIPE) + with open(del_sfp_path, 'w') as f: + f.write('0x50\n') time.sleep(0.2) - new_device = "echo optoe1 0x50 >" + new_sfp_path - subprocess.Popen(new_device, shell=True, stdout=subprocess.PIPE) + with open(new_sfp_path, 'w') as f: + f.write('optoe1 0x50\n') time.sleep(2) elif self.sfp_type == 'QSFP_DD' and driver_name in ['optoe1', 'optoe2']: - subprocess.Popen(delete_device, shell=True, stdout=subprocess.PIPE) + with open(del_sfp_path, 'w') as f: + f.write('0x50\n') time.sleep(0.2) - new_device = "echo optoe3 0x50 >" + new_sfp_path - subprocess.Popen(new_device, shell=True, stdout=subprocess.PIPE) + with open(new_sfp_path, 'w') as f: + f.write('optoe3 0x50\n') time.sleep(2) except IOError as err: