9f8d691d4e
Add reboot cause API to support process-reboot-cause.service Implement chassis.get_reboot_cause platform API
72 lines
2.6 KiB
Python
72 lines
2.6 KiB
Python
#!/usr/bin/env python
|
|
|
|
#############################################################################
|
|
# Celestica
|
|
#
|
|
# Module contains an implementation of SONiC Platform Base API and
|
|
# provides the Chassis information which are available in the platform
|
|
#
|
|
#############################################################################
|
|
|
|
try:
|
|
import subprocess
|
|
from sonic_platform_base.chassis_base import ChassisBase
|
|
except ImportError as e:
|
|
raise ImportError(str(e) + "- required module not found")
|
|
|
|
RESET_REGISTER = "0x103"
|
|
GETREG_PATH = "/sys/devices/platform/dx010_cpld/getreg"
|
|
HOST_REBOOT_CAUSE_PATH = "/host/reboot-cause/"
|
|
REBOOT_CAUSE_FILE = "reboot-cause.txt"
|
|
|
|
|
|
class Chassis(ChassisBase):
|
|
"""Platform-specific Chassis class"""
|
|
|
|
def __init__(self):
|
|
ChassisBase.__init__(self)
|
|
|
|
def __get_register_value(self, register):
|
|
# Retrieves the cpld register value
|
|
cmd = "echo {1} > {0}; cat {0}".format(GETREG_PATH, register)
|
|
p = subprocess.Popen(
|
|
cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
|
raw_data, err = p.communicate()
|
|
if err is not '':
|
|
return None
|
|
return raw_data.strip()
|
|
|
|
def __read_txt_file(self, file_path):
|
|
try:
|
|
with open(file_path, 'r') as fd:
|
|
data = fd.read()
|
|
return data.strip()
|
|
except IOError:
|
|
pass
|
|
return None
|
|
|
|
def get_reboot_cause(self):
|
|
"""
|
|
Retrieves the cause of the previous reboot
|
|
Returns:
|
|
A tuple (string, string) where the first element is a string
|
|
containing the cause of the previous reboot. This string must be
|
|
one of the predefined strings in this class. If the first string
|
|
is "REBOOT_CAUSE_HARDWARE_OTHER", the second string can be used
|
|
to pass a description of the reboot cause.
|
|
"""
|
|
reboot_cause_path = (HOST_REBOOT_CAUSE_PATH + REBOOT_CAUSE_FILE)
|
|
sw_reboot_cause = self.__read_txt_file(reboot_cause_path) or "Unknown"
|
|
hw_reboot_cause = self.__get_register_value(RESET_REGISTER)
|
|
|
|
prev_reboot_cause = {
|
|
'0x11': (self.REBOOT_CAUSE_POWER_LOSS, 'Power on reset'),
|
|
'0x22': (self.REBOOT_CAUSE_WATCHDOG, 'Watchdog reset'),
|
|
'0x33': (self.REBOOT_CAUSE_HARDWARE_OTHER, 'Power cycle reset triggered by CPU')
|
|
}.get(hw_reboot_cause, (self.REBOOT_CAUSE_HARDWARE_OTHER, 'Unknown reason'))
|
|
|
|
if sw_reboot_cause != 'Unknown' and ( hw_reboot_cause == '0x11' or hw_reboot_cause == '0x33'):
|
|
prev_reboot_cause = (self.REBOOT_CAUSE_NON_HARDWARE, sw_reboot_cause)
|
|
|
|
return prev_reboot_cause
|