From 5e2ab9dd03983351ec740fbdcf38831757c840e6 Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Fri, 5 Jul 2019 17:53:49 -0700 Subject: [PATCH] [process-reboot-cause] Handle case if platform does not yet have sonic_platform implementation (#3126) --- .../process-reboot-cause/process-reboot-cause | 76 +++++++++++++------ 1 file changed, 54 insertions(+), 22 deletions(-) diff --git a/files/image_config/process-reboot-cause/process-reboot-cause b/files/image_config/process-reboot-cause/process-reboot-cause index d75924f2988e..0d5ae78137fa 100755 --- a/files/image_config/process-reboot-cause/process-reboot-cause +++ b/files/image_config/process-reboot-cause/process-reboot-cause @@ -9,11 +9,8 @@ try: import os import pwd - import subprocess import sys import syslog - import sonic_platform - from sonic_daemon_base.daemon_base import Logger except ImportError as err: raise ImportError("%s - required module not found" % str(err)) @@ -21,9 +18,6 @@ VERSION = "1.0" SYSLOG_IDENTIFIER = "process-reboot-cause" -# Global logger instance -logger = Logger(SYSLOG_IDENTIFIER) - REBOOT_CAUSE_DIR = "/host/reboot-cause/" REBOOT_CAUSE_FILE = REBOOT_CAUSE_DIR + "reboot-cause.txt" PREVIOUS_REBOOT_CAUSE_FILE = REBOOT_CAUSE_DIR + "previous-reboot-cause.txt" @@ -31,11 +25,33 @@ PREVIOUS_REBOOT_CAUSE_FILE = REBOOT_CAUSE_DIR + "previous-reboot-cause.txt" UNKNOWN_REBOOT_CAUSE = "Unknown" +# ========================== Syslog wrappers ========================== + +def log_info(msg): + syslog.openlog(SYSLOG_IDENTIFIER) + syslog.syslog(syslog.LOG_INFO, msg) + syslog.closelog() + + +def log_warning(msg): + syslog.openlog(SYSLOG_IDENTIFIER) + syslog.syslog(syslog.LOG_WARNING, msg) + syslog.closelog() + + +def log_error(msg): + syslog.openlog(SYSLOG_IDENTIFIER) + syslog.syslog(syslog.LOG_ERR, msg) + syslog.closelog() + + +# ============================= Functions ============================= + def main(): - logger.log_info("Starting up...") + log_info("Starting up...") if not os.geteuid() == 0: - logger.log_error("User {} does not have permission to execute".format(pwd.getpwuid(os.getuid()).pw_name)) + log_error("User {} does not have permission to execute".format(pwd.getpwuid(os.getuid()).pw_name)) sys.exit("This utility must be run as root") # Create REBOOT_CAUSE_DIR if it doesn't exist @@ -46,27 +62,43 @@ def main(): if os.path.exists(PREVIOUS_REBOOT_CAUSE_FILE): os.remove(PREVIOUS_REBOOT_CAUSE_FILE) - # Check if the previous reboot was caused by hardware - platform = sonic_platform.platform.Platform() - - chassis = platform.get_chassis() - - hardware_reboot_cause, optional_details = chassis.get_reboot_cause() # Set a default previous reboot cause previous_reboot_cause = UNKNOWN_REBOOT_CAUSE - if hardware_reboot_cause == chassis.REBOOT_CAUSE_NON_HARDWARE: - # The reboot was not caused by hardware. If there is a REBOOT_CAUSE_FILE, it will - # contain any software-related reboot info. We will use it as the previous cause. + # Until all platform vendors have provided sonic_platform packages, + # if there is no sonic_platform package installed, we only provide + # software-related reboot causes. + try: + import sonic_platform + + # Check if the previous reboot was caused by hardware + platform = sonic_platform.platform.Platform() + + chassis = platform.get_chassis() + + hardware_reboot_cause, optional_details = chassis.get_reboot_cause() + + if hardware_reboot_cause == chassis.REBOOT_CAUSE_NON_HARDWARE: + # The reboot was not caused by hardware. If there is a REBOOT_CAUSE_FILE, it will + # contain any software-related reboot info. We will use it as the previous cause. + if os.path.isfile(REBOOT_CAUSE_FILE): + cause_file = open(REBOOT_CAUSE_FILE, "r") + previous_reboot_cause = cause_file.readline().rstrip('\n') + cause_file.close() + elif hardware_reboot_cause == chassis.REBOOT_CAUSE_HARDWARE_OTHER: + previous_reboot_cause = "{} ({})".format(hardware_reboot_cause, optional_details) + else: + previous_reboot_cause = hardware_reboot_cause + except ImportError as err: + log_warning("sonic_platform package not installed. Unable to detect hardware reboot causes.") + + # If there is a REBOOT_CAUSE_FILE, it will contain any software-related + # reboot info. We will use it as the previous cause. if os.path.isfile(REBOOT_CAUSE_FILE): cause_file = open(REBOOT_CAUSE_FILE, "r") previous_reboot_cause = cause_file.readline().rstrip('\n') cause_file.close() - elif hardware_reboot_cause == chassis.REBOOT_CAUSE_HARDWARE_OTHER: - previous_reboot_cause = "{} ({})".format(hardware_reboot_cause, optional_details) - else: - previous_reboot_cause = hardware_reboot_cause # Write the previous reboot cause to PREVIOUS_REBOOT_CAUSE_FILE prev_cause_file = open(PREVIOUS_REBOOT_CAUSE_FILE, "w") @@ -74,7 +106,7 @@ def main(): prev_cause_file.close() # Also log the previous reboot cause to the syslog - logger.log_info("Previous reboot cause: {}".format(previous_reboot_cause)) + log_info("Previous reboot cause: {}".format(previous_reboot_cause)) # Remove the old REBOOT_CAUSE_FILE os.remove(REBOOT_CAUSE_FILE)