[device/quanta] Mitigation for security vulnerability (#11867)
Signed-off-by: maipbui <maibui@microsoft.com> Dependency: [https://github.com/sonic-net/sonic-buildimage/pull/12065](https://github.com/sonic-net/sonic-buildimage/pull/12065) #### Why I did it `shell=True` is dangerous because this call will spawn the command using a shell process `os` - not secure against maliciously constructed input and dangerous if used to evaluate dynamic content. #### How I did it `os` - use with `subprocess` Use `shell=False` with shell features - redirection: [https://stackoverflow.com/questions/4965159/how-to-redirect-output-with-subprocess-in-python/6482200#6482200?newreg=53afb91b3ebd47c5930be627fcdf2930](https://stackoverflow.com/questions/4965159/how-to-redirect-output-with-subprocess-in-python/6482200#6482200?newreg=53afb91b3ebd47c5930be627fcdf2930) - `|` operator: [https://docs.python.org/2/library/subprocess.html#replacing-shell-pipeline](https://docs.python.org/2/library/subprocess.html#replacing-shell-pipeline)
This commit is contained in:
parent
ef0559c030
commit
6f67a3ac6a
@ -7,6 +7,7 @@
|
|||||||
import os.path
|
import os.path
|
||||||
import subprocess
|
import subprocess
|
||||||
import logging
|
import logging
|
||||||
|
from sonic_py_common.general import check_output_pipe
|
||||||
|
|
||||||
try:
|
try:
|
||||||
from sonic_psu.psu_base import PsuBase
|
from sonic_psu.psu_base import PsuBase
|
||||||
@ -22,11 +23,13 @@ def show_log(txt):
|
|||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
def exec_cmd(cmd, show):
|
def exec_cmd(cmd_args, out_file, show):
|
||||||
|
cmd = ' '.join(cmd_args) + ' > ' + out_file
|
||||||
logging.info('Run :'+cmd)
|
logging.info('Run :'+cmd)
|
||||||
try:
|
try:
|
||||||
output = subprocess.check_output(cmd, shell=True, universal_newlines=True)
|
with open(out_file, 'w') as f:
|
||||||
show_log(cmd + "output:"+str(output))
|
output = subprocess.check_output(cmd_args, stdout=f, universal_newlines=True)
|
||||||
|
show_log(cmd + "output:"+str(output))
|
||||||
except subprocess.CalledProcessError as e:
|
except subprocess.CalledProcessError as e:
|
||||||
logging.info("Failed :"+cmd)
|
logging.info("Failed :"+cmd)
|
||||||
if show:
|
if show:
|
||||||
@ -40,12 +43,13 @@ def my_log(txt):
|
|||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
def log_os_system(cmd, show):
|
def log_os_system(cmd1_args, cmd2_args, show):
|
||||||
|
cmd = ' '.join(cmd1_args) + ' | ' + ' '.join(cmd2_args)
|
||||||
logging.info('Run :'+cmd)
|
logging.info('Run :'+cmd)
|
||||||
status = 1
|
status = 1
|
||||||
output = ""
|
output = ""
|
||||||
try:
|
try:
|
||||||
output = subprocess.check_output(cmd, shell=True, universal_newlines=True)
|
output = check_output_pipe(cmd1_args, cmd2_args)
|
||||||
my_log(cmd + "output:"+str(output))
|
my_log(cmd + "output:"+str(output))
|
||||||
except subprocess.CalledProcessError as e:
|
except subprocess.CalledProcessError as e:
|
||||||
logging.info('Failed :'+cmd)
|
logging.info('Failed :'+cmd)
|
||||||
@ -55,28 +59,28 @@ def log_os_system(cmd, show):
|
|||||||
|
|
||||||
|
|
||||||
def gpio16_exist():
|
def gpio16_exist():
|
||||||
ls = log_os_system("ls /sys/class/gpio/ | grep gpio16", 0)
|
ls = log_os_system(["ls", "/sys/class/gpio/"], ["grep", "gpio16"], 0)
|
||||||
logging.info('mods:'+ls)
|
logging.info('mods:'+ls)
|
||||||
if len(ls) == 0:
|
if len(ls) == 0:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
def gpio17_exist():
|
def gpio17_exist():
|
||||||
ls = log_os_system("ls /sys/class/gpio/ | grep gpio17", 0)
|
ls = log_os_system(["ls", "/sys/class/gpio/"], ["grep", "gpio17"], 0)
|
||||||
logging.info('mods:'+ls)
|
logging.info('mods:'+ls)
|
||||||
if len(ls) == 0:
|
if len(ls) == 0:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
def gpio19_exist():
|
def gpio19_exist():
|
||||||
ls = log_os_system("ls /sys/class/gpio/ | grep gpio19", 0)
|
ls = log_os_system(["ls", "/sys/class/gpio/"], ["grep", "gpio19"], 0)
|
||||||
logging.info('mods:'+ls)
|
logging.info('mods:'+ls)
|
||||||
if len(ls) == 0:
|
if len(ls) == 0:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
def gpio20_exist():
|
def gpio20_exist():
|
||||||
ls = log_os_system("ls /sys/class/gpio/ | grep gpio20", 0)
|
ls = log_os_system(["ls", "/sys/class/gpio/"], ["grep", "gpio20"], 0)
|
||||||
logging.info('mods:'+ls)
|
logging.info('mods:'+ls)
|
||||||
if len(ls) == 0:
|
if len(ls) == 0:
|
||||||
return False
|
return False
|
||||||
@ -95,20 +99,20 @@ class PsuUtil(PsuBase):
|
|||||||
PsuBase.__init__(self)
|
PsuBase.__init__(self)
|
||||||
|
|
||||||
if gpio16_exist() == False:
|
if gpio16_exist() == False:
|
||||||
output = exec_cmd("echo 16 > /sys/class/gpio/export ", 1)
|
output = exec_cmd(["echo", "16"], "/sys/class/gpio/export", 1)
|
||||||
output = exec_cmd("echo in > /sys/class/gpio/gpio16/direction ", 1)
|
output = exec_cmd(["echo", "in"], "/sys/class/gpio/gpio16/direction", 1)
|
||||||
|
|
||||||
if gpio17_exist() == False:
|
if gpio17_exist() == False:
|
||||||
output = exec_cmd("echo 17 > /sys/class/gpio/export ", 1)
|
output = exec_cmd(["echo", "17"], "/sys/class/gpio/export", 1)
|
||||||
output = exec_cmd("echo in > /sys/class/gpio/gpio17/direction ", 1)
|
output = exec_cmd(["echo", "in"], "/sys/class/gpio/gpio17/direction", 1)
|
||||||
|
|
||||||
if gpio19_exist() == False:
|
if gpio19_exist() == False:
|
||||||
output = exec_cmd("echo 19 > /sys/class/gpio/export ", 1)
|
output = exec_cmd(["echo", "19"], "/sys/class/gpio/export", 1)
|
||||||
output = exec_cmd("echo in > /sys/class/gpio/gpio19/direction ", 1)
|
output = exec_cmd(["echo", "in"], "/sys/class/gpio/gpio19/direction", 1)
|
||||||
|
|
||||||
if gpio20_exist() == False:
|
if gpio20_exist() == False:
|
||||||
output = exec_cmd("echo 20 > /sys/class/gpio/export ", 1)
|
output = exec_cmd(["echo", "20"], "/sys/class/gpio/export", 1)
|
||||||
output = exec_cmd("echo in > /sys/class/gpio/gpio20/direction ", 1)
|
output = exec_cmd(["echo", "in"], "/sys/class/gpio/gpio20/direction", 1)
|
||||||
|
|
||||||
# Get sysfs attribute
|
# Get sysfs attribute
|
||||||
def get_attr_value(self, attr_path):
|
def get_attr_value(self, attr_path):
|
||||||
|
@ -27,13 +27,10 @@ command:
|
|||||||
clean : uninstall drivers and remove related sysfs nodes
|
clean : uninstall drivers and remove related sysfs nodes
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import os
|
|
||||||
import commands
|
import commands
|
||||||
import sys, getopt
|
import sys, getopt
|
||||||
import logging
|
import logging
|
||||||
import re
|
|
||||||
import time
|
import time
|
||||||
from collections import namedtuple
|
|
||||||
|
|
||||||
DEBUG = False
|
DEBUG = False
|
||||||
args = []
|
args = []
|
||||||
@ -41,8 +38,8 @@ FORCE = 0
|
|||||||
i2c_prefix = '/sys/bus/i2c/devices/'
|
i2c_prefix = '/sys/bus/i2c/devices/'
|
||||||
|
|
||||||
if DEBUG == True:
|
if DEBUG == True:
|
||||||
print sys.argv[0]
|
print(sys.argv[0])
|
||||||
print 'ARGV :', sys.argv[1:]
|
print('ARGV :', sys.argv[1:])
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
global DEBUG
|
global DEBUG
|
||||||
@ -56,10 +53,10 @@ def main():
|
|||||||
'debug',
|
'debug',
|
||||||
'force',
|
'force',
|
||||||
])
|
])
|
||||||
if DEBUG == True:
|
if DEBUG is True:
|
||||||
print options
|
print(options)
|
||||||
print args
|
print(args)
|
||||||
print len(sys.argv)
|
print(len(sys.argv))
|
||||||
|
|
||||||
for opt, arg in options:
|
for opt, arg in options:
|
||||||
if opt in ('-h', '--help'):
|
if opt in ('-h', '--help'):
|
||||||
@ -83,12 +80,12 @@ def main():
|
|||||||
return 0
|
return 0
|
||||||
|
|
||||||
def show_help():
|
def show_help():
|
||||||
print __doc__ % {'scriptName' : sys.argv[0].split("/")[-1]}
|
print(__doc__ % {'scriptName' : sys.argv[0].split("/")[-1]})
|
||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
|
|
||||||
def show_log(txt):
|
def show_log(txt):
|
||||||
if DEBUG == True:
|
if DEBUG is True:
|
||||||
print "[IX1B-32X]" + txt
|
print("[IX1B-32X]" + txt)
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
@ -165,7 +162,7 @@ def system_install():
|
|||||||
status, output = exec_cmd("modprobe " + drivers[i], 1)
|
status, output = exec_cmd("modprobe " + drivers[i], 1)
|
||||||
|
|
||||||
if status:
|
if status:
|
||||||
print output
|
print(output)
|
||||||
if FORCE == 0:
|
if FORCE == 0:
|
||||||
return status
|
return status
|
||||||
|
|
||||||
@ -174,7 +171,7 @@ def system_install():
|
|||||||
status, output = exec_cmd(instantiate[i], 1)
|
status, output = exec_cmd(instantiate[i], 1)
|
||||||
|
|
||||||
if status:
|
if status:
|
||||||
print output
|
print(output)
|
||||||
if FORCE == 0:
|
if FORCE == 0:
|
||||||
return status
|
return status
|
||||||
|
|
||||||
@ -184,7 +181,9 @@ def system_install():
|
|||||||
#QSFP for 1~32 port
|
#QSFP for 1~32 port
|
||||||
for port_number in range(1, 33):
|
for port_number in range(1, 33):
|
||||||
bus_number = port_number + 31
|
bus_number = port_number + 31
|
||||||
os.system("echo %d >/sys/bus/i2c/devices/%d-0050/port_name" % (port_number, bus_number))
|
file = "/sys/bus/i2c/devices/%d-0050/port_name" % bus_number
|
||||||
|
with open(file, 'w') as f:
|
||||||
|
f.write(str(port_number) + '\n')
|
||||||
|
|
||||||
#Set system LED to green
|
#Set system LED to green
|
||||||
status, output = exec_cmd("echo 1 > /sys/class/leds/sysled_green/brightness", 1)
|
status, output = exec_cmd("echo 1 > /sys/class/leds/sysled_green/brightness", 1)
|
||||||
@ -199,14 +198,14 @@ def system_ready():
|
|||||||
|
|
||||||
def install():
|
def install():
|
||||||
if not device_found():
|
if not device_found():
|
||||||
print "No device, installing...."
|
print("No device, installing....")
|
||||||
status = system_install()
|
status = system_install()
|
||||||
|
|
||||||
if status:
|
if status:
|
||||||
if FORCE == 0:
|
if FORCE == 0:
|
||||||
return status
|
return status
|
||||||
else:
|
else:
|
||||||
print " ix1b driver already installed...."
|
print(" ix1b driver already installed....")
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
@ -215,10 +214,10 @@ def uninstall():
|
|||||||
|
|
||||||
#uninstall drivers
|
#uninstall drivers
|
||||||
for i in range(len(drivers) - 1, -1, -1):
|
for i in range(len(drivers) - 1, -1, -1):
|
||||||
status, output = exec_cmd("rmmod " + drivers[i], 1)
|
status, output = exec_cmd("rmmod " + drivers[i], 1)
|
||||||
|
|
||||||
if status:
|
if status:
|
||||||
print output
|
print(output)
|
||||||
if FORCE == 0:
|
if FORCE == 0:
|
||||||
return status
|
return status
|
||||||
|
|
||||||
|
@ -14,6 +14,7 @@ try:
|
|||||||
import subprocess
|
import subprocess
|
||||||
from sonic_platform_base.component_base import ComponentBase
|
from sonic_platform_base.component_base import ComponentBase
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
|
from sonic_py_common.general import getstatusoutput_noshell_pipe
|
||||||
except ImportError as e:
|
except ImportError as e:
|
||||||
raise ImportError(str(e) + "- required module not found")
|
raise ImportError(str(e) + "- required module not found")
|
||||||
|
|
||||||
@ -47,7 +48,7 @@ class Component(ComponentBase):
|
|||||||
try:
|
try:
|
||||||
proc = subprocess.Popen(cmdline,
|
proc = subprocess.Popen(cmdline,
|
||||||
stdout=subprocess.PIPE,
|
stdout=subprocess.PIPE,
|
||||||
shell=True, stderr=subprocess.STDOUT,
|
stderr=subprocess.STDOUT,
|
||||||
universal_newlines=True)
|
universal_newlines=True)
|
||||||
stdout = proc.communicate()[0]
|
stdout = proc.communicate()[0]
|
||||||
rc = proc.wait()
|
rc = proc.wait()
|
||||||
@ -60,12 +61,24 @@ class Component(ComponentBase):
|
|||||||
|
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def _get_command_result_pipe(cmd1, cmd2):
|
||||||
|
try:
|
||||||
|
rc, result = getstatusoutput_noshell_pipe(cmd1, cmd2)
|
||||||
|
if rc != [0, 0]:
|
||||||
|
raise RuntimeError("Failed to execute command {} {}, return code {}, {}".format(cmd1, cmd2, rc, result))
|
||||||
|
|
||||||
|
except OSError as e:
|
||||||
|
raise RuntimeError("Failed to execute command {} {} due to {}".format(cmd1, cmd2, repr(e)))
|
||||||
|
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
class ComponentBIOS(Component):
|
class ComponentBIOS(Component):
|
||||||
COMPONENT_NAME = 'BIOS'
|
COMPONENT_NAME = 'BIOS'
|
||||||
COMPONENT_DESCRIPTION = 'BIOS - Basic Input/Output System'
|
COMPONENT_DESCRIPTION = 'BIOS - Basic Input/Output System'
|
||||||
|
|
||||||
BIOS_QUERY_VERSION_COMMAND = "dmidecode -s bios-version"
|
BIOS_QUERY_VERSION_COMMAND = ["dmidecode", "-s", "bios-version"]
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super(ComponentBIOS, self).__init__()
|
super(ComponentBIOS, self).__init__()
|
||||||
@ -90,7 +103,8 @@ class ComponentBIOS(Component):
|
|||||||
class ComponentBMC(Component):
|
class ComponentBMC(Component):
|
||||||
COMPONENT_NAME = 'BMC'
|
COMPONENT_NAME = 'BMC'
|
||||||
COMPONENT_DESCRIPTION = 'BMC - Board Management Controller'
|
COMPONENT_DESCRIPTION = 'BMC - Board Management Controller'
|
||||||
BMC_QUERY_VERSION_COMMAND = "ipmitool mc info | grep 'Firmware Revision'"
|
BMC_QUERY_VERSION_COMMAND1 = ["ipmitool", "mc", "info"]
|
||||||
|
BMC_QUERY_VERSION_COMMAND2 = ["grep", 'Firmware Revision']
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super(ComponentBMC, self).__init__()
|
super(ComponentBMC, self).__init__()
|
||||||
@ -105,7 +119,7 @@ class ComponentBMC(Component):
|
|||||||
Returns:
|
Returns:
|
||||||
A string containing the firmware version of the component
|
A string containing the firmware version of the component
|
||||||
"""
|
"""
|
||||||
bmc_ver = self._get_command_result(self.BMC_QUERY_VERSION_COMMAND)
|
bmc_ver = self._get_command_result_pipe(self.BMC_QUERY_VERSION_COMMAND1, self.BMC_QUERY_VERSION_COMMAND2)
|
||||||
if not bmc_ver:
|
if not bmc_ver:
|
||||||
return 'ERR'
|
return 'ERR'
|
||||||
else:
|
else:
|
||||||
@ -159,7 +173,7 @@ class ComponentCPLD(Component):
|
|||||||
Returns:
|
Returns:
|
||||||
A string containing the firmware version of the component
|
A string containing the firmware version of the component
|
||||||
"""
|
"""
|
||||||
res = self._get_command_result("ipmitool raw 0x32 0xff 0x02 {}".format(self.cplds[self.index].cmd_index))
|
res = self._get_command_result(["ipmitool", "raw", "0x32", "0xff", "0x02", str(self.cplds[self.index].cmd_index)])
|
||||||
if not res:
|
if not res:
|
||||||
return 'ERR'
|
return 'ERR'
|
||||||
else:
|
else:
|
||||||
@ -179,7 +193,8 @@ class ComponentCPLD(Component):
|
|||||||
class ComponentPCIE(Component):
|
class ComponentPCIE(Component):
|
||||||
COMPONENT_NAME = 'PCIe'
|
COMPONENT_NAME = 'PCIe'
|
||||||
COMPONENT_DESCRIPTION = 'ASIC PCIe Firmware'
|
COMPONENT_DESCRIPTION = 'ASIC PCIe Firmware'
|
||||||
PCIE_QUERY_VERSION_COMMAND = "bcmcmd 'pciephy fw version' | grep 'FW version'"
|
PCIE_QUERY_VERSION_COMMAND1 = ["bcmcmd", 'pciephy fw version']
|
||||||
|
PCIE_QUERY_VERSION_COMMAND2 = ["grep", 'FW version']
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super(ComponentPCIE, self).__init__()
|
super(ComponentPCIE, self).__init__()
|
||||||
@ -194,7 +209,7 @@ class ComponentPCIE(Component):
|
|||||||
Returns:
|
Returns:
|
||||||
A string containing the firmware version of the component
|
A string containing the firmware version of the component
|
||||||
"""
|
"""
|
||||||
version = self._get_command_result(self.PCIE_QUERY_VERSION_COMMAND)
|
version = self._get_command_result_pipe(self.PCIE_QUERY_VERSION_COMMAND1, self.PCIE_QUERY_VERSION_COMMAND2)
|
||||||
if not version:
|
if not version:
|
||||||
return 'ERR'
|
return 'ERR'
|
||||||
else:
|
else:
|
||||||
|
@ -8,17 +8,17 @@
|
|||||||
#
|
#
|
||||||
#############################################################################
|
#############################################################################
|
||||||
|
|
||||||
import os
|
|
||||||
import time
|
import time
|
||||||
|
import subprocess
|
||||||
from ctypes import create_string_buffer
|
from ctypes import create_string_buffer
|
||||||
|
|
||||||
try:
|
try:
|
||||||
from sonic_platform_base.sfp_base import SfpBase
|
from sonic_platform_base.sfp_base import SfpBase
|
||||||
from sonic_platform_base.sonic_sfp.sff8472 import sff8472InterfaceId
|
from sonic_platform_base.sonic_sfp.sff8472 import sff8472InterfaceId
|
||||||
from sonic_platform_base.sonic_sfp.sff8472 import sff8472Dom
|
from sonic_platform_base.sonic_sfp.sff8472 import sff8472Dom
|
||||||
from sonic_platform_base.sonic_sfp.sff8436 import sff8436InterfaceId
|
from sonic_platform_base.sonic_sfp.sff8436 import sff8436InterfaceId
|
||||||
from sonic_platform_base.sonic_sfp.sff8436 import sff8436Dom
|
from sonic_platform_base.sonic_sfp.sff8436 import sff8436Dom
|
||||||
from sonic_platform_base.sonic_sfp.sfputilhelper import SfpUtilHelper
|
from sonic_platform_base.sonic_sfp.sfputilhelper import SfpUtilHelper
|
||||||
except ImportError as e:
|
except ImportError as e:
|
||||||
raise ImportError(str(e) + "- required module not found")
|
raise ImportError(str(e) + "- required module not found")
|
||||||
|
|
||||||
@ -163,7 +163,7 @@ class Sfp(SfpBase):
|
|||||||
# Path to QSFP sysfs
|
# Path to QSFP sysfs
|
||||||
PLATFORM_ROOT_PATH = "/usr/share/sonic/device"
|
PLATFORM_ROOT_PATH = "/usr/share/sonic/device"
|
||||||
PMON_HWSKU_PATH = "/usr/share/sonic/hwsku"
|
PMON_HWSKU_PATH = "/usr/share/sonic/hwsku"
|
||||||
HOST_CHK_CMD = "docker > /dev/null 2>&1"
|
HOST_CHK_CMD = ["docker"]
|
||||||
|
|
||||||
PLATFORM = "x86_64-quanta_ix7_rglbmc-r0"
|
PLATFORM = "x86_64-quanta_ix7_rglbmc-r0"
|
||||||
HWSKU = "Quanta-IX7-32X"
|
HWSKU = "Quanta-IX7-32X"
|
||||||
@ -259,7 +259,7 @@ class Sfp(SfpBase):
|
|||||||
return 'N/A'
|
return 'N/A'
|
||||||
|
|
||||||
def __is_host(self):
|
def __is_host(self):
|
||||||
return os.system(self.HOST_CHK_CMD) == 0
|
return subprocess.call(self.HOST_CHK_CMD) == 0
|
||||||
|
|
||||||
def __get_path_to_port_config_file(self):
|
def __get_path_to_port_config_file(self):
|
||||||
platform_path = "/".join([self.PLATFORM_ROOT_PATH, self.PLATFORM])
|
platform_path = "/".join([self.PLATFORM_ROOT_PATH, self.PLATFORM])
|
||||||
|
@ -27,7 +27,6 @@ command:
|
|||||||
clean : uninstall drivers and remove related sysfs nodes
|
clean : uninstall drivers and remove related sysfs nodes
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import os
|
|
||||||
import subprocess
|
import subprocess
|
||||||
import sys, getopt
|
import sys, getopt
|
||||||
import logging
|
import logging
|
||||||
@ -54,7 +53,7 @@ def main():
|
|||||||
'debug',
|
'debug',
|
||||||
'force',
|
'force',
|
||||||
])
|
])
|
||||||
if DEBUG == True:
|
if DEBUG is True:
|
||||||
print(options)
|
print(options)
|
||||||
print(args)
|
print(args)
|
||||||
print(len(sys.argv))
|
print(len(sys.argv))
|
||||||
@ -84,7 +83,7 @@ def show_help():
|
|||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
|
|
||||||
def show_log(txt):
|
def show_log(txt):
|
||||||
if DEBUG == True:
|
if DEBUG is True:
|
||||||
print("[IX7-32X]" + txt)
|
print("[IX7-32X]" + txt)
|
||||||
return
|
return
|
||||||
|
|
||||||
@ -204,7 +203,9 @@ def system_install():
|
|||||||
#QSFP for 1~32 port
|
#QSFP for 1~32 port
|
||||||
for port_number in range(1, 33):
|
for port_number in range(1, 33):
|
||||||
bus_number = port_number + 16
|
bus_number = port_number + 16
|
||||||
os.system("echo %d >/sys/bus/i2c/devices/%d-0050/port_name" % (port_number, bus_number))
|
file = "/sys/bus/i2c/devices/%d-0050/port_name" % bus_number
|
||||||
|
with open(file, 'w') as f:
|
||||||
|
f.write(str(port_number) + '\n')
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
|
@ -14,6 +14,7 @@ try:
|
|||||||
import subprocess
|
import subprocess
|
||||||
from sonic_platform_base.component_base import ComponentBase
|
from sonic_platform_base.component_base import ComponentBase
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
|
from sonic_py_common.general import getstatusoutput_noshell_pipe
|
||||||
except ImportError as e:
|
except ImportError as e:
|
||||||
raise ImportError(str(e) + "- required module not found")
|
raise ImportError(str(e) + "- required module not found")
|
||||||
|
|
||||||
@ -47,7 +48,7 @@ class Component(ComponentBase):
|
|||||||
try:
|
try:
|
||||||
proc = subprocess.Popen(cmdline,
|
proc = subprocess.Popen(cmdline,
|
||||||
stdout=subprocess.PIPE,
|
stdout=subprocess.PIPE,
|
||||||
shell=True, stderr=subprocess.STDOUT,
|
stderr=subprocess.STDOUT,
|
||||||
universal_newlines=True)
|
universal_newlines=True)
|
||||||
stdout = proc.communicate()[0]
|
stdout = proc.communicate()[0]
|
||||||
rc = proc.wait()
|
rc = proc.wait()
|
||||||
@ -60,12 +61,24 @@ class Component(ComponentBase):
|
|||||||
|
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def _get_command_result_pipe(cmd1, cmd2):
|
||||||
|
try:
|
||||||
|
rc, result = getstatusoutput_noshell_pipe(cmd1, cmd2)
|
||||||
|
if rc != [0, 0]:
|
||||||
|
raise RuntimeError("Failed to execute command {} {}, return code {}, {}".format(cmd1, cmd2, rc, result))
|
||||||
|
|
||||||
|
except OSError as e:
|
||||||
|
raise RuntimeError("Failed to execute command {} {} due to {}".format(cmd1, cmd2, repr(e)))
|
||||||
|
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
class ComponentBIOS(Component):
|
class ComponentBIOS(Component):
|
||||||
COMPONENT_NAME = 'BIOS'
|
COMPONENT_NAME = 'BIOS'
|
||||||
COMPONENT_DESCRIPTION = 'BIOS - Basic Input/Output System'
|
COMPONENT_DESCRIPTION = 'BIOS - Basic Input/Output System'
|
||||||
|
|
||||||
BIOS_QUERY_VERSION_COMMAND = "dmidecode -s bios-version"
|
BIOS_QUERY_VERSION_COMMAND = ["dmidecode", "-s", "bios-version"]
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super(ComponentBIOS, self).__init__()
|
super(ComponentBIOS, self).__init__()
|
||||||
@ -90,7 +103,8 @@ class ComponentBIOS(Component):
|
|||||||
class ComponentBMC(Component):
|
class ComponentBMC(Component):
|
||||||
COMPONENT_NAME = 'BMC'
|
COMPONENT_NAME = 'BMC'
|
||||||
COMPONENT_DESCRIPTION = 'BMC - Board Management Controller'
|
COMPONENT_DESCRIPTION = 'BMC - Board Management Controller'
|
||||||
BMC_QUERY_VERSION_COMMAND = "ipmitool mc info | grep 'Firmware Revision'"
|
BMC_QUERY_VERSION_COMMAND1 = ["ipmitool", "mc", "info"]
|
||||||
|
BMC_QUERY_VERSION_COMMAND2 = ["grep", 'Firmware Revision']
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super(ComponentBMC, self).__init__()
|
super(ComponentBMC, self).__init__()
|
||||||
@ -105,7 +119,7 @@ class ComponentBMC(Component):
|
|||||||
Returns:
|
Returns:
|
||||||
A string containing the firmware version of the component
|
A string containing the firmware version of the component
|
||||||
"""
|
"""
|
||||||
bmc_ver = self._get_command_result(self.BMC_QUERY_VERSION_COMMAND)
|
bmc_ver = self._get_command_result_pipe(self.BMC_QUERY_VERSION_COMMAND1, self.BMC_QUERY_VERSION_COMMAND2)
|
||||||
if not bmc_ver:
|
if not bmc_ver:
|
||||||
return 'ERR'
|
return 'ERR'
|
||||||
else:
|
else:
|
||||||
@ -158,9 +172,9 @@ class ComponentCPLD(Component):
|
|||||||
Returns:
|
Returns:
|
||||||
A string containing the firmware version of the component
|
A string containing the firmware version of the component
|
||||||
"""
|
"""
|
||||||
self._get_command_result("ipmitool raw 0x30 0xe0 0xd0 0x01 0x01")
|
self._get_command_result(["ipmitool", "raw", "0x30", "0xe0", "0xd0", "0x01", "0x01"])
|
||||||
res = self._get_command_result("ipmitool raw 0x32 0xff 0x02 {}".format(self.cplds[self.index].cmd_index))
|
res = self._get_command_result(["ipmitool", "raw", "0x32", "0xff", "0x02", str(self.cplds[self.index].cmd_index)])
|
||||||
self._get_command_result("ipmitool raw 0x30 0xe0 0xd0 0x01 0x00")
|
self._get_command_result(["ipmitool", "raw", "0x30", "0xe0", "0xd0", "0x01", "0x00"])
|
||||||
if not res:
|
if not res:
|
||||||
return 'ERR'
|
return 'ERR'
|
||||||
else:
|
else:
|
||||||
@ -180,7 +194,8 @@ class ComponentCPLD(Component):
|
|||||||
class ComponentPCIE(Component):
|
class ComponentPCIE(Component):
|
||||||
COMPONENT_NAME = 'PCIe'
|
COMPONENT_NAME = 'PCIe'
|
||||||
COMPONENT_DESCRIPTION = 'ASIC PCIe Firmware'
|
COMPONENT_DESCRIPTION = 'ASIC PCIe Firmware'
|
||||||
PCIE_QUERY_VERSION_COMMAND = "bcmcmd 'pciephy fw version' | grep 'FW version'"
|
PCIE_QUERY_VERSION_COMMAND1 = ["bcmcmd", 'pciephy fw version']
|
||||||
|
PCIE_QUERY_VERSION_COMMAND2 = ["grep", 'FW version']
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super(ComponentPCIE, self).__init__()
|
super(ComponentPCIE, self).__init__()
|
||||||
@ -195,7 +210,7 @@ class ComponentPCIE(Component):
|
|||||||
Returns:
|
Returns:
|
||||||
A string containing the firmware version of the component
|
A string containing the firmware version of the component
|
||||||
"""
|
"""
|
||||||
version = self._get_command_result(self.PCIE_QUERY_VERSION_COMMAND)
|
version = self._get_command_result_pipe(self.PCIE_QUERY_VERSION_COMMAND1, self.PCIE_QUERY_VERSION_COMMAND2)
|
||||||
if not version:
|
if not version:
|
||||||
return 'ERR'
|
return 'ERR'
|
||||||
else:
|
else:
|
||||||
|
@ -8,17 +8,17 @@
|
|||||||
#
|
#
|
||||||
#############################################################################
|
#############################################################################
|
||||||
|
|
||||||
import os
|
|
||||||
import time
|
import time
|
||||||
|
import subprocess
|
||||||
from ctypes import create_string_buffer
|
from ctypes import create_string_buffer
|
||||||
|
|
||||||
try:
|
try:
|
||||||
from sonic_platform_base.sfp_base import SfpBase
|
from sonic_platform_base.sfp_base import SfpBase
|
||||||
from sonic_platform_base.sonic_sfp.sff8472 import sff8472InterfaceId
|
from sonic_platform_base.sonic_sfp.sff8472 import sff8472InterfaceId
|
||||||
from sonic_platform_base.sonic_sfp.sff8472 import sff8472Dom
|
from sonic_platform_base.sonic_sfp.sff8472 import sff8472Dom
|
||||||
from sonic_platform_base.sonic_sfp.sff8436 import sff8436InterfaceId
|
from sonic_platform_base.sonic_sfp.sff8436 import sff8436InterfaceId
|
||||||
from sonic_platform_base.sonic_sfp.sff8436 import sff8436Dom
|
from sonic_platform_base.sonic_sfp.sff8436 import sff8436Dom
|
||||||
from sonic_platform_base.sonic_sfp.sfputilhelper import SfpUtilHelper
|
from sonic_platform_base.sonic_sfp.sfputilhelper import SfpUtilHelper
|
||||||
except ImportError as e:
|
except ImportError as e:
|
||||||
raise ImportError(str(e) + "- required module not found")
|
raise ImportError(str(e) + "- required module not found")
|
||||||
|
|
||||||
@ -163,7 +163,7 @@ class Sfp(SfpBase):
|
|||||||
# Path to QSFP sysfs
|
# Path to QSFP sysfs
|
||||||
PLATFORM_ROOT_PATH = "/usr/share/sonic/device"
|
PLATFORM_ROOT_PATH = "/usr/share/sonic/device"
|
||||||
PMON_HWSKU_PATH = "/usr/share/sonic/hwsku"
|
PMON_HWSKU_PATH = "/usr/share/sonic/hwsku"
|
||||||
HOST_CHK_CMD = "docker > /dev/null 2>&1"
|
HOST_CHK_CMD = ["docker"]
|
||||||
|
|
||||||
PLATFORM = "x86_64-quanta_ix7_bwde-r0"
|
PLATFORM = "x86_64-quanta_ix7_bwde-r0"
|
||||||
HWSKU = "Quanta-IX7-BWDE-32X"
|
HWSKU = "Quanta-IX7-BWDE-32X"
|
||||||
@ -259,7 +259,7 @@ class Sfp(SfpBase):
|
|||||||
return 'N/A'
|
return 'N/A'
|
||||||
|
|
||||||
def __is_host(self):
|
def __is_host(self):
|
||||||
return os.system(self.HOST_CHK_CMD) == 0
|
return subprocess.call(self.HOST_CHK_CMD) == 0
|
||||||
|
|
||||||
def __get_path_to_port_config_file(self):
|
def __get_path_to_port_config_file(self):
|
||||||
platform_path = "/".join([self.PLATFORM_ROOT_PATH, self.PLATFORM])
|
platform_path = "/".join([self.PLATFORM_ROOT_PATH, self.PLATFORM])
|
||||||
|
@ -27,7 +27,6 @@ command:
|
|||||||
clean : uninstall drivers and remove related sysfs nodes
|
clean : uninstall drivers and remove related sysfs nodes
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import os
|
|
||||||
import subprocess
|
import subprocess
|
||||||
import sys, getopt
|
import sys, getopt
|
||||||
import logging
|
import logging
|
||||||
@ -54,7 +53,7 @@ def main():
|
|||||||
'debug',
|
'debug',
|
||||||
'force',
|
'force',
|
||||||
])
|
])
|
||||||
if DEBUG == True:
|
if DEBUG is True:
|
||||||
print(options)
|
print(options)
|
||||||
print(args)
|
print(args)
|
||||||
print(len(sys.argv))
|
print(len(sys.argv))
|
||||||
@ -84,7 +83,7 @@ def show_help():
|
|||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
|
|
||||||
def show_log(txt):
|
def show_log(txt):
|
||||||
if DEBUG == True:
|
if DEBUG is True:
|
||||||
print("[IX7-BWDE-32X]"+txt)
|
print("[IX7-BWDE-32X]"+txt)
|
||||||
return
|
return
|
||||||
|
|
||||||
@ -203,7 +202,9 @@ def system_install():
|
|||||||
#QSFP for 1~32 port
|
#QSFP for 1~32 port
|
||||||
for port_number in range(1, 33):
|
for port_number in range(1, 33):
|
||||||
bus_number = port_number + 12
|
bus_number = port_number + 12
|
||||||
os.system("echo %d >/sys/bus/i2c/devices/%d-0050/port_name" % (port_number, bus_number))
|
file = "/sys/bus/i2c/devices/%d-0050/port_name" % bus_number
|
||||||
|
with open(file, 'w') as f:
|
||||||
|
f.write(str(port_number) + '\n')
|
||||||
|
|
||||||
status, output = exec_cmd("pip3 install /usr/share/sonic/device/x86_64-quanta_ix7_bwde-r0/sonic_platform-1.0-py3-none-any.whl",1)
|
status, output = exec_cmd("pip3 install /usr/share/sonic/device/x86_64-quanta_ix7_bwde-r0/sonic_platform-1.0-py3-none-any.whl",1)
|
||||||
if status:
|
if status:
|
||||||
|
@ -14,6 +14,7 @@ try:
|
|||||||
import subprocess
|
import subprocess
|
||||||
from sonic_platform_base.component_base import ComponentBase
|
from sonic_platform_base.component_base import ComponentBase
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
|
from sonic_py_common.general import getstatusoutput_noshell_pipe
|
||||||
except ImportError as e:
|
except ImportError as e:
|
||||||
raise ImportError(str(e) + "- required module not found")
|
raise ImportError(str(e) + "- required module not found")
|
||||||
|
|
||||||
@ -47,7 +48,7 @@ class Component(ComponentBase):
|
|||||||
try:
|
try:
|
||||||
proc = subprocess.Popen(cmdline,
|
proc = subprocess.Popen(cmdline,
|
||||||
stdout=subprocess.PIPE,
|
stdout=subprocess.PIPE,
|
||||||
shell=True, stderr=subprocess.STDOUT,
|
stderr=subprocess.STDOUT,
|
||||||
universal_newlines=True)
|
universal_newlines=True)
|
||||||
stdout = proc.communicate()[0]
|
stdout = proc.communicate()[0]
|
||||||
rc = proc.wait()
|
rc = proc.wait()
|
||||||
@ -60,12 +61,24 @@ class Component(ComponentBase):
|
|||||||
|
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def _get_command_result_pipe(cmd1, cmd2):
|
||||||
|
try:
|
||||||
|
rc, result = getstatusoutput_noshell_pipe(cmd1, cmd2)
|
||||||
|
if rc != [0, 0]:
|
||||||
|
raise RuntimeError("Failed to execute command {} {}, return code {}, {}".format(cmd1, cmd2, rc, result))
|
||||||
|
|
||||||
|
except OSError as e:
|
||||||
|
raise RuntimeError("Failed to execute command {} {} due to {}".format(cmd1, cmd2, repr(e)))
|
||||||
|
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
class ComponentBIOS(Component):
|
class ComponentBIOS(Component):
|
||||||
COMPONENT_NAME = 'BIOS'
|
COMPONENT_NAME = 'BIOS'
|
||||||
COMPONENT_DESCRIPTION = 'BIOS - Basic Input/Output System'
|
COMPONENT_DESCRIPTION = 'BIOS - Basic Input/Output System'
|
||||||
|
|
||||||
BIOS_QUERY_VERSION_COMMAND = "dmidecode -s bios-version"
|
BIOS_QUERY_VERSION_COMMAND = ["dmidecode", "-s", "bios-version"]
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super(ComponentBIOS, self).__init__()
|
super(ComponentBIOS, self).__init__()
|
||||||
@ -90,7 +103,8 @@ class ComponentBIOS(Component):
|
|||||||
class ComponentBMC(Component):
|
class ComponentBMC(Component):
|
||||||
COMPONENT_NAME = 'BMC'
|
COMPONENT_NAME = 'BMC'
|
||||||
COMPONENT_DESCRIPTION = 'BMC - Board Management Controller'
|
COMPONENT_DESCRIPTION = 'BMC - Board Management Controller'
|
||||||
BMC_QUERY_VERSION_COMMAND = "ipmitool mc info | grep 'Firmware Revision'"
|
BMC_QUERY_VERSION_COMMAND1 = ["ipmitool", "mc", "info"]
|
||||||
|
BMC_QUERY_VERSION_COMMAND2 = ["grep", 'Firmware Revision']
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super(ComponentBMC, self).__init__()
|
super(ComponentBMC, self).__init__()
|
||||||
@ -105,7 +119,7 @@ class ComponentBMC(Component):
|
|||||||
Returns:
|
Returns:
|
||||||
A string containing the firmware version of the component
|
A string containing the firmware version of the component
|
||||||
"""
|
"""
|
||||||
bmc_ver = self._get_command_result(self.BMC_QUERY_VERSION_COMMAND)
|
bmc_ver = self._get_command_result_pipe(self.BMC_QUERY_VERSION_COMMAND1, self.BMC_QUERY_VERSION_COMMAND2)
|
||||||
if not bmc_ver:
|
if not bmc_ver:
|
||||||
return 'ERR'
|
return 'ERR'
|
||||||
else:
|
else:
|
||||||
@ -160,7 +174,7 @@ class ComponentCPLD(Component):
|
|||||||
Returns:
|
Returns:
|
||||||
A string containing the firmware version of the component
|
A string containing the firmware version of the component
|
||||||
"""
|
"""
|
||||||
res = self._get_command_result("ipmitool raw 0x32 0xff 0x02 {}".format(self.cplds[self.index].cmd_index))
|
res = self._get_command_result(["ipmitool", "raw", "0x32", "0xff", "0x02", str(self.cplds[self.index].cmd_index)])
|
||||||
if not res:
|
if not res:
|
||||||
return 'ERR'
|
return 'ERR'
|
||||||
else:
|
else:
|
||||||
@ -180,7 +194,8 @@ class ComponentCPLD(Component):
|
|||||||
class ComponentPCIE(Component):
|
class ComponentPCIE(Component):
|
||||||
COMPONENT_NAME = 'PCIe'
|
COMPONENT_NAME = 'PCIe'
|
||||||
COMPONENT_DESCRIPTION = 'ASIC PCIe Firmware'
|
COMPONENT_DESCRIPTION = 'ASIC PCIe Firmware'
|
||||||
PCIE_QUERY_VERSION_COMMAND = "bcmcmd 'pciephy fw version' | grep 'FW version'"
|
PCIE_QUERY_VERSION_COMMAND1 = ["bcmcmd", 'pciephy fw version']
|
||||||
|
PCIE_QUERY_VERSION_COMMAND2 = ["grep", 'FW version']
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super(ComponentPCIE, self).__init__()
|
super(ComponentPCIE, self).__init__()
|
||||||
@ -195,7 +210,7 @@ class ComponentPCIE(Component):
|
|||||||
Returns:
|
Returns:
|
||||||
A string containing the firmware version of the component
|
A string containing the firmware version of the component
|
||||||
"""
|
"""
|
||||||
version = self._get_command_result(self.PCIE_QUERY_VERSION_COMMAND)
|
version = self._get_command_result_pipe(self.PCIE_QUERY_VERSION_COMMAND1, self.PCIE_QUERY_VERSION_COMMAND2)
|
||||||
if not version:
|
if not version:
|
||||||
return 'ERR'
|
return 'ERR'
|
||||||
else:
|
else:
|
||||||
|
@ -8,17 +8,17 @@
|
|||||||
#
|
#
|
||||||
#############################################################################
|
#############################################################################
|
||||||
|
|
||||||
import os
|
|
||||||
import time
|
import time
|
||||||
|
import subprocess
|
||||||
from ctypes import create_string_buffer
|
from ctypes import create_string_buffer
|
||||||
|
|
||||||
try:
|
try:
|
||||||
from sonic_platform_base.sfp_base import SfpBase
|
from sonic_platform_base.sfp_base import SfpBase
|
||||||
from sonic_platform_base.sonic_sfp.sff8472 import sff8472InterfaceId
|
from sonic_platform_base.sonic_sfp.sff8472 import sff8472InterfaceId
|
||||||
from sonic_platform_base.sonic_sfp.sff8472 import sff8472Dom
|
from sonic_platform_base.sonic_sfp.sff8472 import sff8472Dom
|
||||||
from sonic_platform_base.sonic_sfp.sff8436 import sff8436InterfaceId
|
from sonic_platform_base.sonic_sfp.sff8436 import sff8436InterfaceId
|
||||||
from sonic_platform_base.sonic_sfp.sff8436 import sff8436Dom
|
from sonic_platform_base.sonic_sfp.sff8436 import sff8436Dom
|
||||||
from sonic_platform_base.sonic_sfp.sfputilhelper import SfpUtilHelper
|
from sonic_platform_base.sonic_sfp.sfputilhelper import SfpUtilHelper
|
||||||
except ImportError as e:
|
except ImportError as e:
|
||||||
raise ImportError(str(e) + "- required module not found")
|
raise ImportError(str(e) + "- required module not found")
|
||||||
|
|
||||||
@ -163,7 +163,7 @@ class Sfp(SfpBase):
|
|||||||
# Path to QSFP sysfs
|
# Path to QSFP sysfs
|
||||||
PLATFORM_ROOT_PATH = "/usr/share/sonic/device"
|
PLATFORM_ROOT_PATH = "/usr/share/sonic/device"
|
||||||
PMON_HWSKU_PATH = "/usr/share/sonic/hwsku"
|
PMON_HWSKU_PATH = "/usr/share/sonic/hwsku"
|
||||||
HOST_CHK_CMD = "docker > /dev/null 2>&1"
|
HOST_CHK_CMD = ["docker"]
|
||||||
|
|
||||||
PLATFORM = "x86_64-quanta_ix8_rglbmc-r0"
|
PLATFORM = "x86_64-quanta_ix8_rglbmc-r0"
|
||||||
HWSKU = "Quanta-IX8-56X"
|
HWSKU = "Quanta-IX8-56X"
|
||||||
@ -281,7 +281,7 @@ class Sfp(SfpBase):
|
|||||||
return 'N/A'
|
return 'N/A'
|
||||||
|
|
||||||
def __is_host(self):
|
def __is_host(self):
|
||||||
return os.system(self.HOST_CHK_CMD) == 0
|
return subprocess.call(self.HOST_CHK_CMD) == 0
|
||||||
|
|
||||||
def __get_path_to_port_config_file(self):
|
def __get_path_to_port_config_file(self):
|
||||||
platform_path = "/".join([self.PLATFORM_ROOT_PATH, self.PLATFORM])
|
platform_path = "/".join([self.PLATFORM_ROOT_PATH, self.PLATFORM])
|
||||||
|
@ -27,7 +27,6 @@ command:
|
|||||||
clean : uninstall drivers and remove related sysfs nodes
|
clean : uninstall drivers and remove related sysfs nodes
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import os
|
|
||||||
import subprocess
|
import subprocess
|
||||||
import sys, getopt
|
import sys, getopt
|
||||||
import logging
|
import logging
|
||||||
@ -54,7 +53,7 @@ def main():
|
|||||||
'debug',
|
'debug',
|
||||||
'force',
|
'force',
|
||||||
])
|
])
|
||||||
if DEBUG == True:
|
if DEBUG is True:
|
||||||
print(options)
|
print(options)
|
||||||
print(args)
|
print(args)
|
||||||
print(len(sys.argv))
|
print(len(sys.argv))
|
||||||
@ -84,7 +83,7 @@ def show_help():
|
|||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
|
|
||||||
def show_log(txt):
|
def show_log(txt):
|
||||||
if DEBUG == True:
|
if DEBUG is True:
|
||||||
print("[IX8-56X]" + txt)
|
print("[IX8-56X]" + txt)
|
||||||
return
|
return
|
||||||
|
|
||||||
@ -301,7 +300,9 @@ def system_install():
|
|||||||
#QSFP for 1~56 port
|
#QSFP for 1~56 port
|
||||||
for port_number in range(1, 57):
|
for port_number in range(1, 57):
|
||||||
bus_number = port_number + 16
|
bus_number = port_number + 16
|
||||||
os.system("echo %d >/sys/bus/i2c/devices/%d-0050/port_name" % (port_number, bus_number))
|
file = "/sys/bus/i2c/devices/%d-0050/port_name" % bus_number
|
||||||
|
with open(file, 'w') as f:
|
||||||
|
f.write(str(port_number) + '\n')
|
||||||
|
|
||||||
status, output = exec_cmd("pip3 install /usr/share/sonic/device/x86_64-quanta_ix8_rglbmc-r0/sonic_platform-1.0-py3-none-any.whl",1)
|
status, output = exec_cmd("pip3 install /usr/share/sonic/device/x86_64-quanta_ix8_rglbmc-r0/sonic_platform-1.0-py3-none-any.whl",1)
|
||||||
if status:
|
if status:
|
||||||
|
@ -14,6 +14,7 @@ try:
|
|||||||
import subprocess
|
import subprocess
|
||||||
from sonic_platform_base.component_base import ComponentBase
|
from sonic_platform_base.component_base import ComponentBase
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
|
from sonic_py_common.general import getstatusoutput_noshell_pipe
|
||||||
except ImportError as e:
|
except ImportError as e:
|
||||||
raise ImportError(str(e) + "- required module not found")
|
raise ImportError(str(e) + "- required module not found")
|
||||||
|
|
||||||
@ -47,7 +48,7 @@ class Component(ComponentBase):
|
|||||||
try:
|
try:
|
||||||
proc = subprocess.Popen(cmdline,
|
proc = subprocess.Popen(cmdline,
|
||||||
stdout=subprocess.PIPE,
|
stdout=subprocess.PIPE,
|
||||||
shell=True, stderr=subprocess.STDOUT,
|
stderr=subprocess.STDOUT,
|
||||||
universal_newlines=True)
|
universal_newlines=True)
|
||||||
stdout = proc.communicate()[0]
|
stdout = proc.communicate()[0]
|
||||||
rc = proc.wait()
|
rc = proc.wait()
|
||||||
@ -60,12 +61,24 @@ class Component(ComponentBase):
|
|||||||
|
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def _get_command_result_pipe(cmd1, cmd2):
|
||||||
|
try:
|
||||||
|
rc, result = getstatusoutput_noshell_pipe(cmd1, cmd2)
|
||||||
|
if rc != [0, 0]:
|
||||||
|
raise RuntimeError("Failed to execute command {} {}, return code {}, {}".format(cmd1, cmd2, rc, result))
|
||||||
|
|
||||||
|
except OSError as e:
|
||||||
|
raise RuntimeError("Failed to execute command {} {} due to {}".format(cmd1, cmd2, repr(e)))
|
||||||
|
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
class ComponentBIOS(Component):
|
class ComponentBIOS(Component):
|
||||||
COMPONENT_NAME = 'BIOS'
|
COMPONENT_NAME = 'BIOS'
|
||||||
COMPONENT_DESCRIPTION = 'BIOS - Basic Input/Output System'
|
COMPONENT_DESCRIPTION = 'BIOS - Basic Input/Output System'
|
||||||
|
|
||||||
BIOS_QUERY_VERSION_COMMAND = "dmidecode -s bios-version"
|
BIOS_QUERY_VERSION_COMMAND = ["dmidecode", "-s", "bios-version"]
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super(ComponentBIOS, self).__init__()
|
super(ComponentBIOS, self).__init__()
|
||||||
@ -90,7 +103,8 @@ class ComponentBIOS(Component):
|
|||||||
class ComponentBMC(Component):
|
class ComponentBMC(Component):
|
||||||
COMPONENT_NAME = 'BMC'
|
COMPONENT_NAME = 'BMC'
|
||||||
COMPONENT_DESCRIPTION = 'BMC - Board Management Controller'
|
COMPONENT_DESCRIPTION = 'BMC - Board Management Controller'
|
||||||
BMC_QUERY_VERSION_COMMAND = "ipmitool mc info | grep 'Firmware Revision'"
|
BMC_QUERY_VERSION_COMMAND1 = ["ipmitool", "mc", "info"]
|
||||||
|
BMC_QUERY_VERSION_COMMAND2 = ["grep", 'Firmware Revision']
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super(ComponentBMC, self).__init__()
|
super(ComponentBMC, self).__init__()
|
||||||
@ -105,7 +119,7 @@ class ComponentBMC(Component):
|
|||||||
Returns:
|
Returns:
|
||||||
A string containing the firmware version of the component
|
A string containing the firmware version of the component
|
||||||
"""
|
"""
|
||||||
bmc_ver = self._get_command_result(self.BMC_QUERY_VERSION_COMMAND)
|
bmc_ver = self._get_command_result_pipe(self.BMC_QUERY_VERSION_COMMAND1, self.BMC_QUERY_VERSION_COMMAND2)
|
||||||
if not bmc_ver:
|
if not bmc_ver:
|
||||||
return 'ERR'
|
return 'ERR'
|
||||||
else:
|
else:
|
||||||
@ -159,9 +173,9 @@ class ComponentCPLD(Component):
|
|||||||
Returns:
|
Returns:
|
||||||
A string containing the firmware version of the component
|
A string containing the firmware version of the component
|
||||||
"""
|
"""
|
||||||
self._get_command_result("ipmitool raw 0x30 0xe0 0xd0 0x01 0x01")
|
self._get_command_result(["ipmitool", "raw", "0x30", "0xe0", "0xd0", "0x01", "0x01"])
|
||||||
res = self._get_command_result("ipmitool raw 0x32 0xff 0x02 {}".format(self.cplds[self.index].cmd_index))
|
res = self._get_command_result(["ipmitool", "raw", "0x32", "0xff", "0x02", str(self.cplds[self.index].cmd_index)])
|
||||||
self._get_command_result("ipmitool raw 0x30 0xe0 0xd0 0x01 0x00")
|
self._get_command_result(["ipmitool", "raw", "0x30", "0xe0", "0xd0", "0x01", "0x00"])
|
||||||
if not res:
|
if not res:
|
||||||
return 'ERR'
|
return 'ERR'
|
||||||
else:
|
else:
|
||||||
@ -181,7 +195,8 @@ class ComponentCPLD(Component):
|
|||||||
class ComponentPCIE(Component):
|
class ComponentPCIE(Component):
|
||||||
COMPONENT_NAME = 'PCIe'
|
COMPONENT_NAME = 'PCIe'
|
||||||
COMPONENT_DESCRIPTION = 'ASIC PCIe Firmware'
|
COMPONENT_DESCRIPTION = 'ASIC PCIe Firmware'
|
||||||
PCIE_QUERY_VERSION_COMMAND = "bcmcmd 'pciephy fw version' | grep 'FW version'"
|
PCIE_QUERY_VERSION_COMMAND1 = ["bcmcmd", 'pciephy fw version']
|
||||||
|
PCIE_QUERY_VERSION_COMMAND2 = ["grep", 'FW version']
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super(ComponentPCIE, self).__init__()
|
super(ComponentPCIE, self).__init__()
|
||||||
@ -196,7 +211,7 @@ class ComponentPCIE(Component):
|
|||||||
Returns:
|
Returns:
|
||||||
A string containing the firmware version of the component
|
A string containing the firmware version of the component
|
||||||
"""
|
"""
|
||||||
version = self._get_command_result(self.PCIE_QUERY_VERSION_COMMAND)
|
version = self._get_command_result_pipe(self.PCIE_QUERY_VERSION_COMMAND1, self.PCIE_QUERY_VERSION_COMMAND2)
|
||||||
if not version:
|
if not version:
|
||||||
return 'ERR'
|
return 'ERR'
|
||||||
else:
|
else:
|
||||||
|
@ -8,17 +8,17 @@
|
|||||||
#
|
#
|
||||||
#############################################################################
|
#############################################################################
|
||||||
|
|
||||||
import os
|
|
||||||
import time
|
import time
|
||||||
|
import subprocess
|
||||||
from ctypes import create_string_buffer
|
from ctypes import create_string_buffer
|
||||||
|
|
||||||
try:
|
try:
|
||||||
from sonic_platform_base.sfp_base import SfpBase
|
from sonic_platform_base.sfp_base import SfpBase
|
||||||
from sonic_platform_base.sonic_sfp.sff8472 import sff8472InterfaceId
|
from sonic_platform_base.sonic_sfp.sff8472 import sff8472InterfaceId
|
||||||
from sonic_platform_base.sonic_sfp.sff8472 import sff8472Dom
|
from sonic_platform_base.sonic_sfp.sff8472 import sff8472Dom
|
||||||
from sonic_platform_base.sonic_sfp.sff8436 import sff8436InterfaceId
|
from sonic_platform_base.sonic_sfp.sff8436 import sff8436InterfaceId
|
||||||
from sonic_platform_base.sonic_sfp.sff8436 import sff8436Dom
|
from sonic_platform_base.sonic_sfp.sff8436 import sff8436Dom
|
||||||
from sonic_platform_base.sonic_sfp.sfputilhelper import SfpUtilHelper
|
from sonic_platform_base.sonic_sfp.sfputilhelper import SfpUtilHelper
|
||||||
except ImportError as e:
|
except ImportError as e:
|
||||||
raise ImportError(str(e) + "- required module not found")
|
raise ImportError(str(e) + "- required module not found")
|
||||||
|
|
||||||
@ -163,7 +163,7 @@ class Sfp(SfpBase):
|
|||||||
# Path to QSFP sysfs
|
# Path to QSFP sysfs
|
||||||
PLATFORM_ROOT_PATH = "/usr/share/sonic/device"
|
PLATFORM_ROOT_PATH = "/usr/share/sonic/device"
|
||||||
PMON_HWSKU_PATH = "/usr/share/sonic/hwsku"
|
PMON_HWSKU_PATH = "/usr/share/sonic/hwsku"
|
||||||
HOST_CHK_CMD = "docker > /dev/null 2>&1"
|
HOST_CHK_CMD = ["docker"]
|
||||||
|
|
||||||
PLATFORM = "x86_64-quanta_ix8a_bwde-r0"
|
PLATFORM = "x86_64-quanta_ix8a_bwde-r0"
|
||||||
HWSKU = "Quanta-IX8A-BWDE-56X"
|
HWSKU = "Quanta-IX8A-BWDE-56X"
|
||||||
@ -281,7 +281,7 @@ class Sfp(SfpBase):
|
|||||||
return 'N/A'
|
return 'N/A'
|
||||||
|
|
||||||
def __is_host(self):
|
def __is_host(self):
|
||||||
return os.system(self.HOST_CHK_CMD) == 0
|
return subprocess.call(self.HOST_CHK_CMD) == 0
|
||||||
|
|
||||||
def __get_path_to_port_config_file(self):
|
def __get_path_to_port_config_file(self):
|
||||||
platform_path = "/".join([self.PLATFORM_ROOT_PATH, self.PLATFORM])
|
platform_path = "/".join([self.PLATFORM_ROOT_PATH, self.PLATFORM])
|
||||||
|
@ -27,7 +27,6 @@ command:
|
|||||||
clean : uninstall drivers and remove related sysfs nodes
|
clean : uninstall drivers and remove related sysfs nodes
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import os
|
|
||||||
import subprocess
|
import subprocess
|
||||||
import sys, getopt
|
import sys, getopt
|
||||||
import logging
|
import logging
|
||||||
@ -54,7 +53,7 @@ def main():
|
|||||||
'debug',
|
'debug',
|
||||||
'force',
|
'force',
|
||||||
])
|
])
|
||||||
if DEBUG == True:
|
if DEBUG is True:
|
||||||
print(options)
|
print(options)
|
||||||
print(args)
|
print(args)
|
||||||
print(len(sys.argv))
|
print(len(sys.argv))
|
||||||
@ -84,7 +83,7 @@ def show_help():
|
|||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
|
|
||||||
def show_log(txt):
|
def show_log(txt):
|
||||||
if DEBUG == True:
|
if DEBUG is True:
|
||||||
print("[IX8A-BWDE-56X]" + txt)
|
print("[IX8A-BWDE-56X]" + txt)
|
||||||
return
|
return
|
||||||
|
|
||||||
@ -301,7 +300,9 @@ def system_install():
|
|||||||
#QSFP for 1~56 port
|
#QSFP for 1~56 port
|
||||||
for port_number in range(1, 57):
|
for port_number in range(1, 57):
|
||||||
bus_number = port_number + 12
|
bus_number = port_number + 12
|
||||||
os.system("echo %d >/sys/bus/i2c/devices/%d-0050/port_name" % (port_number, bus_number))
|
file = "/sys/bus/i2c/devices/%d-0050/port_name" % bus_number
|
||||||
|
with open(file, 'w') as f:
|
||||||
|
f.write(str(port_number) + '\n')
|
||||||
|
|
||||||
#Enable front-ports LED decoding
|
#Enable front-ports LED decoding
|
||||||
exec_cmd('echo 1 > /sys/class/cpld-led/CPLDLED-1/led_decode', 1)
|
exec_cmd('echo 1 > /sys/class/cpld-led/CPLDLED-1/led_decode', 1)
|
||||||
|
@ -14,6 +14,7 @@ try:
|
|||||||
import subprocess
|
import subprocess
|
||||||
from sonic_platform_base.component_base import ComponentBase
|
from sonic_platform_base.component_base import ComponentBase
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
|
from sonic_py_common.general import getstatusoutput_noshell_pipe
|
||||||
except ImportError as e:
|
except ImportError as e:
|
||||||
raise ImportError(str(e) + "- required module not found")
|
raise ImportError(str(e) + "- required module not found")
|
||||||
|
|
||||||
@ -47,7 +48,7 @@ class Component(ComponentBase):
|
|||||||
try:
|
try:
|
||||||
proc = subprocess.Popen(cmdline,
|
proc = subprocess.Popen(cmdline,
|
||||||
stdout=subprocess.PIPE,
|
stdout=subprocess.PIPE,
|
||||||
shell=True, stderr=subprocess.STDOUT,
|
stderr=subprocess.STDOUT,
|
||||||
universal_newlines=True)
|
universal_newlines=True)
|
||||||
stdout = proc.communicate()[0]
|
stdout = proc.communicate()[0]
|
||||||
rc = proc.wait()
|
rc = proc.wait()
|
||||||
@ -60,12 +61,24 @@ class Component(ComponentBase):
|
|||||||
|
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def _get_command_result_pipe(cmd1, cmd2):
|
||||||
|
try:
|
||||||
|
rc, result = getstatusoutput_noshell_pipe(cmd1, cmd2)
|
||||||
|
if rc != [0, 0]:
|
||||||
|
raise RuntimeError("Failed to execute command {} {}, return code {}, {}".format(cmd1, cmd2, rc, result))
|
||||||
|
|
||||||
|
except OSError as e:
|
||||||
|
raise RuntimeError("Failed to execute command {} {} due to {}".format(cmd1, cmd2, repr(e)))
|
||||||
|
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
class ComponentBIOS(Component):
|
class ComponentBIOS(Component):
|
||||||
COMPONENT_NAME = 'BIOS'
|
COMPONENT_NAME = 'BIOS'
|
||||||
COMPONENT_DESCRIPTION = 'BIOS - Basic Input/Output System'
|
COMPONENT_DESCRIPTION = 'BIOS - Basic Input/Output System'
|
||||||
|
|
||||||
BIOS_QUERY_VERSION_COMMAND = "dmidecode -s bios-version"
|
BIOS_QUERY_VERSION_COMMAND = ["dmidecode", "-s", "bios-version"]
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super(ComponentBIOS, self).__init__()
|
super(ComponentBIOS, self).__init__()
|
||||||
@ -90,7 +103,8 @@ class ComponentBIOS(Component):
|
|||||||
class ComponentBMC(Component):
|
class ComponentBMC(Component):
|
||||||
COMPONENT_NAME = 'BMC'
|
COMPONENT_NAME = 'BMC'
|
||||||
COMPONENT_DESCRIPTION = 'BMC - Board Management Controller'
|
COMPONENT_DESCRIPTION = 'BMC - Board Management Controller'
|
||||||
BMC_QUERY_VERSION_COMMAND = "ipmitool mc info | grep 'Firmware Revision'"
|
BMC_QUERY_VERSION_COMMAND1 = ["ipmitool", "mc", "info"]
|
||||||
|
BMC_QUERY_VERSION_COMMAND2 = ["grep", 'Firmware Revision']
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super(ComponentBMC, self).__init__()
|
super(ComponentBMC, self).__init__()
|
||||||
@ -105,7 +119,7 @@ class ComponentBMC(Component):
|
|||||||
Returns:
|
Returns:
|
||||||
A string containing the firmware version of the component
|
A string containing the firmware version of the component
|
||||||
"""
|
"""
|
||||||
bmc_ver = self._get_command_result(self.BMC_QUERY_VERSION_COMMAND)
|
bmc_ver = self._get_command_result_pipe(self.BMC_QUERY_VERSION_COMMAND1, self.BMC_QUERY_VERSION_COMMAND2)
|
||||||
if not bmc_ver:
|
if not bmc_ver:
|
||||||
return 'ERR'
|
return 'ERR'
|
||||||
else:
|
else:
|
||||||
@ -158,10 +172,10 @@ class ComponentCPLD(Component):
|
|||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
A string containing the firmware version of the component
|
A string containing the firmware version of the component
|
||||||
"""
|
"""
|
||||||
self._get_command_result("ipmitool raw 0x30 0xe0 0xd0 0x01 0x01")
|
self._get_command_result(["ipmitool", "raw", "0x30", "0xe0", "0xd0", "0x01", "0x01"])
|
||||||
res = self._get_command_result("ipmitool raw 0x32 0xff 0x02 {}".format(self.cplds[self.index].cmd_index))
|
res = self._get_command_result(["ipmitool", "raw", "0x32", "0xff", "0x02", str(self.cplds[self.index].cmd_index)])
|
||||||
self._get_command_result("ipmitool raw 0x30 0xe0 0xd0 0x01 0x00")
|
self._get_command_result(["ipmitool", "raw", "0x30", "0xe0", "0xd0", "0x01", "0x00"])
|
||||||
if not res:
|
if not res:
|
||||||
return 'ERR'
|
return 'ERR'
|
||||||
else:
|
else:
|
||||||
@ -181,7 +195,8 @@ class ComponentCPLD(Component):
|
|||||||
class ComponentPCIE(Component):
|
class ComponentPCIE(Component):
|
||||||
COMPONENT_NAME = 'PCIe'
|
COMPONENT_NAME = 'PCIe'
|
||||||
COMPONENT_DESCRIPTION = 'ASIC PCIe Firmware'
|
COMPONENT_DESCRIPTION = 'ASIC PCIe Firmware'
|
||||||
PCIE_QUERY_VERSION_COMMAND = "bcmcmd 'pciephy fw version' | grep 'FW version'"
|
PCIE_QUERY_VERSION_COMMAND1 = ["bcmcmd", 'pciephy fw version']
|
||||||
|
PCIE_QUERY_VERSION_COMMAND2 = ["grep", 'FW version']
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super(ComponentPCIE, self).__init__()
|
super(ComponentPCIE, self).__init__()
|
||||||
@ -196,7 +211,7 @@ class ComponentPCIE(Component):
|
|||||||
Returns:
|
Returns:
|
||||||
A string containing the firmware version of the component
|
A string containing the firmware version of the component
|
||||||
"""
|
"""
|
||||||
version = self._get_command_result(self.PCIE_QUERY_VERSION_COMMAND)
|
version = self._get_command_result_pipe(self.PCIE_QUERY_VERSION_COMMAND1, self.PCIE_QUERY_VERSION_COMMAND2)
|
||||||
if not version:
|
if not version:
|
||||||
return 'ERR'
|
return 'ERR'
|
||||||
else:
|
else:
|
||||||
|
@ -8,17 +8,17 @@
|
|||||||
#
|
#
|
||||||
#############################################################################
|
#############################################################################
|
||||||
|
|
||||||
import os
|
import subprocess
|
||||||
import time
|
import time
|
||||||
from ctypes import create_string_buffer
|
from ctypes import create_string_buffer
|
||||||
|
|
||||||
try:
|
try:
|
||||||
from sonic_platform_base.sfp_base import SfpBase
|
from sonic_platform_base.sfp_base import SfpBase
|
||||||
from sonic_platform_base.sonic_sfp.sff8472 import sff8472InterfaceId
|
from sonic_platform_base.sonic_sfp.sff8472 import sff8472InterfaceId
|
||||||
from sonic_platform_base.sonic_sfp.sff8472 import sff8472Dom
|
from sonic_platform_base.sonic_sfp.sff8472 import sff8472Dom
|
||||||
from sonic_platform_base.sonic_sfp.sff8436 import sff8436InterfaceId
|
from sonic_platform_base.sonic_sfp.sff8436 import sff8436InterfaceId
|
||||||
from sonic_platform_base.sonic_sfp.sff8436 import sff8436Dom
|
from sonic_platform_base.sonic_sfp.sff8436 import sff8436Dom
|
||||||
from sonic_platform_base.sonic_sfp.sfputilhelper import SfpUtilHelper
|
from sonic_platform_base.sonic_sfp.sfputilhelper import SfpUtilHelper
|
||||||
except ImportError as e:
|
except ImportError as e:
|
||||||
raise ImportError(str(e) + "- required module not found")
|
raise ImportError(str(e) + "- required module not found")
|
||||||
|
|
||||||
@ -281,7 +281,7 @@ class Sfp(SfpBase):
|
|||||||
return 'N/A'
|
return 'N/A'
|
||||||
|
|
||||||
def __is_host(self):
|
def __is_host(self):
|
||||||
return os.system(self.HOST_CHK_CMD) == 0
|
return subprocess.call(self.HOST_CHK_CMD) == 0
|
||||||
|
|
||||||
def __get_path_to_port_config_file(self):
|
def __get_path_to_port_config_file(self):
|
||||||
platform_path = "/".join([self.PLATFORM_ROOT_PATH, self.PLATFORM])
|
platform_path = "/".join([self.PLATFORM_ROOT_PATH, self.PLATFORM])
|
||||||
|
@ -27,7 +27,6 @@ command:
|
|||||||
clean : uninstall drivers and remove related sysfs nodes
|
clean : uninstall drivers and remove related sysfs nodes
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import os
|
|
||||||
import subprocess
|
import subprocess
|
||||||
import sys, getopt
|
import sys, getopt
|
||||||
import logging
|
import logging
|
||||||
@ -54,7 +53,7 @@ def main():
|
|||||||
'debug',
|
'debug',
|
||||||
'force',
|
'force',
|
||||||
])
|
])
|
||||||
if DEBUG == True:
|
if DEBUG is True:
|
||||||
print(options)
|
print(options)
|
||||||
print(args)
|
print(args)
|
||||||
print(len(sys.argv))
|
print(len(sys.argv))
|
||||||
@ -84,7 +83,7 @@ def show_help():
|
|||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
|
|
||||||
def show_log(txt):
|
def show_log(txt):
|
||||||
if DEBUG == True:
|
if DEBUG is True:
|
||||||
print("[IX8C-56X]" + txt)
|
print("[IX8C-56X]" + txt)
|
||||||
return
|
return
|
||||||
|
|
||||||
@ -297,7 +296,9 @@ def system_install():
|
|||||||
#QSFP for 1~56 port
|
#QSFP for 1~56 port
|
||||||
for port_number in range(1, 57):
|
for port_number in range(1, 57):
|
||||||
bus_number = port_number + 12
|
bus_number = port_number + 12
|
||||||
os.system("echo %d >/sys/bus/i2c/devices/%d-0050/port_name" % (port_number, bus_number))
|
file = "/sys/bus/i2c/devices/%d-0050/port_name" % bus_number
|
||||||
|
with open(file, 'w') as f:
|
||||||
|
f.write(str(port_number) + '\n')
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
|
@ -14,6 +14,7 @@ try:
|
|||||||
import subprocess
|
import subprocess
|
||||||
from sonic_platform_base.component_base import ComponentBase
|
from sonic_platform_base.component_base import ComponentBase
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
|
from sonic_py_common.general import getstatusoutput_noshell_pipe
|
||||||
except ImportError as e:
|
except ImportError as e:
|
||||||
raise ImportError(str(e) + "- required module not found")
|
raise ImportError(str(e) + "- required module not found")
|
||||||
|
|
||||||
@ -47,7 +48,7 @@ class Component(ComponentBase):
|
|||||||
try:
|
try:
|
||||||
proc = subprocess.Popen(cmdline,
|
proc = subprocess.Popen(cmdline,
|
||||||
stdout=subprocess.PIPE,
|
stdout=subprocess.PIPE,
|
||||||
shell=True, stderr=subprocess.STDOUT,
|
stderr=subprocess.STDOUT,
|
||||||
universal_newlines=True)
|
universal_newlines=True)
|
||||||
stdout = proc.communicate()[0]
|
stdout = proc.communicate()[0]
|
||||||
rc = proc.wait()
|
rc = proc.wait()
|
||||||
@ -60,12 +61,24 @@ class Component(ComponentBase):
|
|||||||
|
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def _get_command_result_pipe(cmd1, cmd2):
|
||||||
|
try:
|
||||||
|
rc, result = getstatusoutput_noshell_pipe(cmd1, cmd2)
|
||||||
|
if rc != [0, 0]:
|
||||||
|
raise RuntimeError("Failed to execute command {} {}, return code {}, {}".format(cmd1, cmd2, rc, result))
|
||||||
|
|
||||||
|
except OSError as e:
|
||||||
|
raise RuntimeError("Failed to execute command {} {} due to {}".format(cmd1, cmd2, repr(e)))
|
||||||
|
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
class ComponentBIOS(Component):
|
class ComponentBIOS(Component):
|
||||||
COMPONENT_NAME = 'BIOS'
|
COMPONENT_NAME = 'BIOS'
|
||||||
COMPONENT_DESCRIPTION = 'BIOS - Basic Input/Output System'
|
COMPONENT_DESCRIPTION = 'BIOS - Basic Input/Output System'
|
||||||
|
|
||||||
BIOS_QUERY_VERSION_COMMAND = "dmidecode -s bios-version"
|
BIOS_QUERY_VERSION_COMMAND = ["dmidecode", "-s", "bios-version"]
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super(ComponentBIOS, self).__init__()
|
super(ComponentBIOS, self).__init__()
|
||||||
@ -90,7 +103,8 @@ class ComponentBIOS(Component):
|
|||||||
class ComponentBMC(Component):
|
class ComponentBMC(Component):
|
||||||
COMPONENT_NAME = 'BMC'
|
COMPONENT_NAME = 'BMC'
|
||||||
COMPONENT_DESCRIPTION = 'BMC - Board Management Controller'
|
COMPONENT_DESCRIPTION = 'BMC - Board Management Controller'
|
||||||
BMC_QUERY_VERSION_COMMAND = "ipmitool mc info | grep 'Firmware Revision'"
|
BMC_QUERY_VERSION_COMMAND1 = ["ipmitool", "mc", "info"]
|
||||||
|
BMC_QUERY_VERSION_COMMAND2 = ["grep", 'Firmware Revision']
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super(ComponentBMC, self).__init__()
|
super(ComponentBMC, self).__init__()
|
||||||
@ -105,7 +119,7 @@ class ComponentBMC(Component):
|
|||||||
Returns:
|
Returns:
|
||||||
A string containing the firmware version of the component
|
A string containing the firmware version of the component
|
||||||
"""
|
"""
|
||||||
bmc_ver = self._get_command_result(self.BMC_QUERY_VERSION_COMMAND)
|
bmc_ver = self._get_command_result_pipe(self.BMC_QUERY_VERSION_COMMAND1, self.BMC_QUERY_VERSION_COMMAND2)
|
||||||
if not bmc_ver:
|
if not bmc_ver:
|
||||||
return 'ERR'
|
return 'ERR'
|
||||||
else:
|
else:
|
||||||
@ -158,9 +172,9 @@ class ComponentCPLD(Component):
|
|||||||
Returns:
|
Returns:
|
||||||
A string containing the firmware version of the component
|
A string containing the firmware version of the component
|
||||||
"""
|
"""
|
||||||
self._get_command_result("ipmitool raw 0x30 0xe0 0xd0 0x01 0x01")
|
self._get_command_result(["ipmitool", "raw", "0x30", "0xe0", "0xd0", "0x01", "0x01"])
|
||||||
res = self._get_command_result("ipmitool raw 0x32 0xff 0x02 {}".format(self.cplds[self.index].cmd_index))
|
res = self._get_command_result(["ipmitool", "raw", "0x32", "0xff", "0x02", str(self.cplds[self.index].cmd_index)])
|
||||||
self._get_command_result("ipmitool raw 0x30 0xe0 0xd0 0x01 0x00")
|
self._get_command_result(["ipmitool", "raw", "0x30", "0xe0", "0xd0", "0x01", "0x00"])
|
||||||
if not res:
|
if not res:
|
||||||
return 'ERR'
|
return 'ERR'
|
||||||
else:
|
else:
|
||||||
@ -180,7 +194,8 @@ class ComponentCPLD(Component):
|
|||||||
class ComponentPCIE(Component):
|
class ComponentPCIE(Component):
|
||||||
COMPONENT_NAME = 'PCIe'
|
COMPONENT_NAME = 'PCIe'
|
||||||
COMPONENT_DESCRIPTION = 'ASIC PCIe Firmware'
|
COMPONENT_DESCRIPTION = 'ASIC PCIe Firmware'
|
||||||
PCIE_QUERY_VERSION_COMMAND = "bcmcmd 'pciephy fw version' | grep 'FW version'"
|
PCIE_QUERY_VERSION_COMMAND1 = ["bcmcmd", 'pciephy fw version']
|
||||||
|
PCIE_QUERY_VERSION_COMMAND2 = ["grep", 'FW version']
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super(ComponentPCIE, self).__init__()
|
super(ComponentPCIE, self).__init__()
|
||||||
@ -195,7 +210,7 @@ class ComponentPCIE(Component):
|
|||||||
Returns:
|
Returns:
|
||||||
A string containing the firmware version of the component
|
A string containing the firmware version of the component
|
||||||
"""
|
"""
|
||||||
version = self._get_command_result(self.PCIE_QUERY_VERSION_COMMAND)
|
version = self._get_command_result_pipe(self.PCIE_QUERY_VERSION_COMMAND1, self.PCIE_QUERY_VERSION_COMMAND2)
|
||||||
if not version:
|
if not version:
|
||||||
return 'ERR'
|
return 'ERR'
|
||||||
else:
|
else:
|
||||||
|
@ -8,21 +8,21 @@
|
|||||||
#
|
#
|
||||||
#############################################################################
|
#############################################################################
|
||||||
|
|
||||||
import os
|
|
||||||
import time
|
import time
|
||||||
|
import subprocess
|
||||||
from ctypes import create_string_buffer
|
from ctypes import create_string_buffer
|
||||||
|
|
||||||
try:
|
try:
|
||||||
from sonic_platform_base.sfp_base import SfpBase
|
from sonic_platform_base.sfp_base import SfpBase
|
||||||
from sonic_platform_base.sonic_sfp.sff8472 import sff8472InterfaceId
|
from sonic_platform_base.sonic_sfp.sff8472 import sff8472InterfaceId
|
||||||
from sonic_platform_base.sonic_sfp.sff8472 import sff8472Dom
|
from sonic_platform_base.sonic_sfp.sff8472 import sff8472Dom
|
||||||
from sonic_platform_base.sonic_sfp.sff8436 import sff8436InterfaceId
|
from sonic_platform_base.sonic_sfp.sff8436 import sff8436InterfaceId
|
||||||
from sonic_platform_base.sonic_sfp.sff8436 import sff8436Dom
|
from sonic_platform_base.sonic_sfp.sff8436 import sff8436Dom
|
||||||
from sonic_platform_base.sonic_sfp.inf8628 import inf8628InterfaceId
|
from sonic_platform_base.sonic_sfp.inf8628 import inf8628InterfaceId
|
||||||
from sonic_platform_base.sonic_sfp.qsfp_dd import qsfp_dd_InterfaceId
|
from sonic_platform_base.sonic_sfp.qsfp_dd import qsfp_dd_InterfaceId
|
||||||
from sonic_platform_base.sonic_sfp.qsfp_dd import qsfp_dd_Dom
|
from sonic_platform_base.sonic_sfp.qsfp_dd import qsfp_dd_Dom
|
||||||
from sonic_py_common.logger import Logger
|
from sonic_py_common.logger import Logger
|
||||||
from sonic_platform_base.sonic_sfp.sfputilhelper import SfpUtilHelper
|
from sonic_platform_base.sonic_sfp.sfputilhelper import SfpUtilHelper
|
||||||
except ImportError as e:
|
except ImportError as e:
|
||||||
raise ImportError (str(e) + "- required module not found")
|
raise ImportError (str(e) + "- required module not found")
|
||||||
|
|
||||||
@ -354,7 +354,7 @@ class Sfp(SfpBase):
|
|||||||
return 'N/A'
|
return 'N/A'
|
||||||
|
|
||||||
def __is_host(self):
|
def __is_host(self):
|
||||||
return os.system(self.HOST_CHK_CMD) == 0
|
return subprocess.call(self.HOST_CHK_CMD) == 0
|
||||||
|
|
||||||
def __get_path_to_port_config_file(self):
|
def __get_path_to_port_config_file(self):
|
||||||
platform_path = "/".join([self.PLATFORM_ROOT_PATH, self.PLATFORM])
|
platform_path = "/".join([self.PLATFORM_ROOT_PATH, self.PLATFORM])
|
||||||
|
@ -27,7 +27,6 @@ command:
|
|||||||
clean : uninstall drivers and remove related sysfs nodes
|
clean : uninstall drivers and remove related sysfs nodes
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import os
|
|
||||||
import subprocess
|
import subprocess
|
||||||
import sys, getopt
|
import sys, getopt
|
||||||
import logging
|
import logging
|
||||||
@ -54,7 +53,7 @@ def main():
|
|||||||
'debug',
|
'debug',
|
||||||
'force',
|
'force',
|
||||||
])
|
])
|
||||||
if DEBUG == True:
|
if DEBUG is True:
|
||||||
print(options)
|
print(options)
|
||||||
print(args)
|
print(args)
|
||||||
print(len(sys.argv))
|
print(len(sys.argv))
|
||||||
@ -84,7 +83,7 @@ def show_help():
|
|||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
|
|
||||||
def show_log(txt):
|
def show_log(txt):
|
||||||
if DEBUG == True:
|
if DEBUG is True:
|
||||||
print("[IX9-32X]" + txt)
|
print("[IX9-32X]" + txt)
|
||||||
return
|
return
|
||||||
|
|
||||||
@ -237,7 +236,9 @@ def system_install():
|
|||||||
#QSFPDD for 1~32 port
|
#QSFPDD for 1~32 port
|
||||||
for port_number in range(1, 33):
|
for port_number in range(1, 33):
|
||||||
bus_number = port_number + 12
|
bus_number = port_number + 12
|
||||||
os.system("echo %d >/sys/bus/i2c/devices/%d-0050/port_name" % (port_number, bus_number))
|
file = "/sys/bus/i2c/devices/%d-0050/port_name" % bus_number
|
||||||
|
with open(file, 'w') as f:
|
||||||
|
f.write(str(port_number) + '\n')
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user