793 lines
29 KiB
Python
793 lines
29 KiB
Python
|
#!/usr/bin/env python3
|
||
|
import time
|
||
|
import syslog
|
||
|
import traceback
|
||
|
from plat_hal.interface import interface
|
||
|
from plat_hal.baseutil import baseutil
|
||
|
try:
|
||
|
import abc
|
||
|
except ImportError as e:
|
||
|
raise ImportError (str(e) + " - required module not found")
|
||
|
|
||
|
SWITCH_TEMP = "SWITCH_TEMP"
|
||
|
F2B_AIR_FLOW = "F2B"
|
||
|
B2F_AIR_FLOW = "B2F"
|
||
|
ONIE_E2_NAME = "ONIE_E2"
|
||
|
|
||
|
# status
|
||
|
STATUS_PRESENT = "PRESENT"
|
||
|
STATUS_ABSENT = "ABSENT"
|
||
|
STATUS_OK = "OK"
|
||
|
STATUS_NOT_OK = "NOT OK"
|
||
|
STATUS_FAILED = "FAILED"
|
||
|
STATUS_UNKNOWN = "UNKNOWN"
|
||
|
|
||
|
LEDCTROL_DEBUG_FILE = "/etc/.ledcontrol_debug_flag"
|
||
|
|
||
|
LEDCTROLERROR = 1
|
||
|
LEDCTROLDEBUG = 2
|
||
|
|
||
|
debuglevel = 0
|
||
|
# led status defined
|
||
|
COLOR_GREEN = 1
|
||
|
COLOR_YELLOW = 2
|
||
|
COLOR_RED = 3
|
||
|
LED_STATUS_DICT = {COLOR_GREEN: "green", COLOR_YELLOW: "yellow", COLOR_RED: "red"}
|
||
|
|
||
|
|
||
|
def ledcontrol_debug(s):
|
||
|
if LEDCTROLDEBUG & debuglevel:
|
||
|
syslog.openlog("LEDCONTROL", syslog.LOG_PID)
|
||
|
syslog.syslog(syslog.LOG_DEBUG, s)
|
||
|
|
||
|
|
||
|
def ledcontrol_error(s):
|
||
|
if LEDCTROLERROR & debuglevel:
|
||
|
syslog.openlog("LEDCONTROL", syslog.LOG_PID)
|
||
|
syslog.syslog(syslog.LOG_ERR, s)
|
||
|
|
||
|
|
||
|
def air_flow_warn(s):
|
||
|
syslog.openlog("AIR_FLOW_MONITOR", syslog.LOG_PID)
|
||
|
syslog.syslog(syslog.LOG_WARNING, s)
|
||
|
|
||
|
|
||
|
def air_flow_error(s):
|
||
|
syslog.openlog("AIR_FLOW_MONITOR", syslog.LOG_PID)
|
||
|
syslog.syslog(syslog.LOG_ERR, s)
|
||
|
|
||
|
|
||
|
def debug_init():
|
||
|
global debuglevel
|
||
|
try:
|
||
|
with open(LEDCTROL_DEBUG_FILE, "r") as fd:
|
||
|
value = fd.read()
|
||
|
debuglevel = int(value)
|
||
|
except Exception as e:
|
||
|
debuglevel = 0
|
||
|
|
||
|
|
||
|
class DevBase(object):
|
||
|
__metaclass__ = abc.ABCMeta
|
||
|
|
||
|
def __init__(self, name, air_flow_monitor):
|
||
|
self.__name = name
|
||
|
self.__air_flow_monitor = air_flow_monitor
|
||
|
self.present = STATUS_UNKNOWN
|
||
|
self.status = STATUS_UNKNOWN
|
||
|
self.status_summary = STATUS_UNKNOWN
|
||
|
self.origin_name = STATUS_UNKNOWN
|
||
|
self.display_name = STATUS_UNKNOWN
|
||
|
self.air_flow = STATUS_UNKNOWN
|
||
|
self.led_status = COLOR_GREEN
|
||
|
|
||
|
@property
|
||
|
def name(self):
|
||
|
return self.__name
|
||
|
|
||
|
@property
|
||
|
def air_flow_monitor(self):
|
||
|
return self.__air_flow_monitor
|
||
|
|
||
|
@abc.abstractmethod
|
||
|
def get_present(self):
|
||
|
"""
|
||
|
Gets the present status of PSU/FAN
|
||
|
|
||
|
Returns:
|
||
|
A string, e.g. 'PRESENT, ABSENT, FAILED'
|
||
|
"""
|
||
|
raise NotImplementedError
|
||
|
|
||
|
@abc.abstractmethod
|
||
|
def get_status(self):
|
||
|
"""
|
||
|
Gets the status of PSU/FAN
|
||
|
|
||
|
Returns:
|
||
|
A string, e.g. 'OK, NOT OK, FAILED'
|
||
|
"""
|
||
|
raise NotImplementedError
|
||
|
|
||
|
@abc.abstractmethod
|
||
|
def update_dev_info(self):
|
||
|
"""
|
||
|
update status and fru info of PSU/FAN
|
||
|
|
||
|
include present, status, status_summary, part_model_name, product_name, air_flow
|
||
|
"""
|
||
|
raise NotImplementedError
|
||
|
|
||
|
@abc.abstractmethod
|
||
|
def set_module_led(self, color):
|
||
|
"""
|
||
|
set PSU/FAN module LED status
|
||
|
|
||
|
Args:
|
||
|
color: A string representing the color with which to set the
|
||
|
PSU/FAN module LED status
|
||
|
|
||
|
Returns:
|
||
|
bool: True if status LED state is set successfully, False if not
|
||
|
"""
|
||
|
raise NotImplementedError
|
||
|
|
||
|
|
||
|
class DevPsu(DevBase):
|
||
|
|
||
|
def __init__(self, name, air_flow_monitor, interface):
|
||
|
super(DevPsu, self).__init__(name, air_flow_monitor)
|
||
|
self.int_case = interface
|
||
|
|
||
|
def get_psu_presence(self):
|
||
|
return self.int_case.get_psu_presence(self.name)
|
||
|
|
||
|
def get_psu_input_output_status(self):
|
||
|
return self.int_case.get_psu_input_output_status(self.name)
|
||
|
|
||
|
def get_psu_fru_info(self):
|
||
|
return self.int_case.get_psu_fru_info(self.name)
|
||
|
|
||
|
@property
|
||
|
def na_ret(self):
|
||
|
return self.int_case.na_ret
|
||
|
|
||
|
def get_present(self):
|
||
|
try:
|
||
|
status = self.get_psu_presence()
|
||
|
if status is True:
|
||
|
return STATUS_PRESENT
|
||
|
if status is False:
|
||
|
return STATUS_ABSENT
|
||
|
except Exception as e:
|
||
|
ledcontrol_error("get %s present status error, msg: %s" % (self.name, str(e)))
|
||
|
return STATUS_FAILED
|
||
|
|
||
|
def get_status(self):
|
||
|
try:
|
||
|
status = self.get_psu_input_output_status()
|
||
|
if status is True:
|
||
|
return STATUS_OK
|
||
|
if status is False:
|
||
|
return STATUS_NOT_OK
|
||
|
except Exception as e:
|
||
|
ledcontrol_error("get %s status error, msg: %s" % (self.name, str(e)))
|
||
|
return STATUS_FAILED
|
||
|
|
||
|
def update_dev_info(self):
|
||
|
try:
|
||
|
# update status
|
||
|
self.present = self.get_present()
|
||
|
if self.present != STATUS_PRESENT:
|
||
|
self.status = STATUS_UNKNOWN
|
||
|
self.status_summary = self.present
|
||
|
else:
|
||
|
self.status = self.get_status()
|
||
|
self.status_summary = self.status
|
||
|
# update fru info if need air flow monitor
|
||
|
if self.air_flow_monitor:
|
||
|
dic = self.get_psu_fru_info()
|
||
|
self.origin_name = dic["PN"]
|
||
|
self.air_flow = dic["AirFlow"]
|
||
|
self.display_name = dic["DisplayName"]
|
||
|
except Exception as e:
|
||
|
ledcontrol_error("update %s info error, msg: %s" % (self.name, str(e)))
|
||
|
self.present = STATUS_FAILED
|
||
|
self.status = STATUS_FAILED
|
||
|
self.status_summary = STATUS_FAILED
|
||
|
self.origin_name = self.na_ret
|
||
|
self.air_flow = self.na_ret
|
||
|
self.display_name = self.na_ret
|
||
|
|
||
|
def set_module_led(self, color):
|
||
|
"""
|
||
|
set PSU module LED is not support, always return True
|
||
|
"""
|
||
|
return True
|
||
|
|
||
|
|
||
|
class DevFan(DevBase):
|
||
|
|
||
|
def __init__(self, name, air_flow_monitor, interface):
|
||
|
super(DevFan, self).__init__(name, air_flow_monitor)
|
||
|
self.int_case = interface
|
||
|
|
||
|
def get_fan_rotor_number(self):
|
||
|
return self.int_case.get_fan_rotor_number(self.name)
|
||
|
|
||
|
def get_fan_presence(self):
|
||
|
return self.int_case.get_fan_presence(self.name)
|
||
|
|
||
|
def get_fan_rotor_status(self, rotor_name):
|
||
|
return self.int_case.get_fan_rotor_status(self.name, rotor_name)
|
||
|
|
||
|
def get_fan_fru_info(self):
|
||
|
return self.int_case.get_fan_fru_info(self.name)
|
||
|
|
||
|
@property
|
||
|
def na_ret(self):
|
||
|
return self.int_case.na_ret
|
||
|
|
||
|
def get_present(self):
|
||
|
try:
|
||
|
status = self.get_fan_presence()
|
||
|
if status is True:
|
||
|
return STATUS_PRESENT
|
||
|
if status is False:
|
||
|
return STATUS_ABSENT
|
||
|
except Exception as e:
|
||
|
ledcontrol_error("get %s present status error, msg: %s" % (self.name, str(e)))
|
||
|
return STATUS_FAILED
|
||
|
|
||
|
def get_status(self):
|
||
|
try:
|
||
|
rotor_num = self.get_fan_rotor_number()
|
||
|
err_motor_num = 0
|
||
|
for j in range(rotor_num):
|
||
|
rotor_name = "Rotor" + str(j + 1)
|
||
|
roll_status = self.get_fan_rotor_status(rotor_name)
|
||
|
if roll_status is not True:
|
||
|
err_motor_num += 1
|
||
|
ledcontrol_debug("%s %s error, status %s" % (self.name, rotor_name, roll_status))
|
||
|
else:
|
||
|
ledcontrol_debug("%s %s ok" % (self.name, rotor_name))
|
||
|
if err_motor_num > 0:
|
||
|
return STATUS_NOT_OK
|
||
|
return STATUS_OK
|
||
|
except Exception as e:
|
||
|
ledcontrol_error("get %s status error, msg: %s" % (self.name, str(e)))
|
||
|
return STATUS_FAILED
|
||
|
|
||
|
def update_dev_info(self):
|
||
|
try:
|
||
|
# update status
|
||
|
self.present = self.get_present()
|
||
|
if self.present != STATUS_PRESENT:
|
||
|
self.status = STATUS_UNKNOWN
|
||
|
self.status_summary = self.present
|
||
|
else:
|
||
|
self.status = self.get_status()
|
||
|
self.status_summary = self.status
|
||
|
# update fru info if need air flow monitor
|
||
|
if self.air_flow_monitor:
|
||
|
dic = self.get_fan_fru_info()
|
||
|
self.origin_name = dic["PN"]
|
||
|
self.air_flow = dic["AirFlow"]
|
||
|
self.display_name = dic["DisplayName"]
|
||
|
except Exception as e:
|
||
|
ledcontrol_error("update %s fru info error, msg: %s" % (self.name, str(e)))
|
||
|
self.present = STATUS_FAILED
|
||
|
self.status = STATUS_FAILED
|
||
|
self.status_summary = STATUS_FAILED
|
||
|
self.origin_name = self.na_ret
|
||
|
self.air_flow = self.na_ret
|
||
|
self.display_name = self.na_ret
|
||
|
|
||
|
def set_module_led(self, color):
|
||
|
ret = self.int_case.set_fan_led(self.name, color)
|
||
|
if ret == 0:
|
||
|
return True
|
||
|
return False
|
||
|
|
||
|
|
||
|
class ledcontrol(object):
|
||
|
|
||
|
def __init__(self):
|
||
|
self.fan_obj_list = []
|
||
|
self.psu_obj_list = []
|
||
|
self.board_psu_led_status = COLOR_GREEN
|
||
|
self.board_fan_led_status = COLOR_GREEN
|
||
|
self.__board_air_flow = ""
|
||
|
self.int_case = interface()
|
||
|
self.__config = baseutil.get_monitor_config()
|
||
|
self.__temps_threshold_config = self.__config["temps_threshold"]
|
||
|
for temp_threshold in self.__temps_threshold_config.values():
|
||
|
temp_threshold['temp'] = 0
|
||
|
temp_threshold['fail_num'] = 0
|
||
|
self.__ledcontrol_para = self.__config["ledcontrol_para"]
|
||
|
self.__interval = self.__ledcontrol_para.get("interval", 5)
|
||
|
self.__checkpsu = self.__ledcontrol_para.get("checkpsu", 0)
|
||
|
self.__checkfan = self.__ledcontrol_para.get("checkfan", 0)
|
||
|
self.__psu_yellow_num = self.__ledcontrol_para.get("psu_yellow_num")
|
||
|
self.__fan_yellow_num = self.__ledcontrol_para.get("fan_yellow_num")
|
||
|
self.__board_sys_led = self.__ledcontrol_para.get("board_sys_led", [])
|
||
|
self.__board_psu_led = self.__ledcontrol_para.get("board_psu_led", [])
|
||
|
self.__board_fan_led = self.__ledcontrol_para.get("board_fan_led", [])
|
||
|
self.__psu_air_flow_monitor = self.__ledcontrol_para.get("psu_air_flow_monitor", 0)
|
||
|
self.__fan_air_flow_monitor = self.__ledcontrol_para.get("fan_air_flow_monitor", 0)
|
||
|
self.__fan_mix_list = self.__ledcontrol_para.get("fan_mix_list", [])
|
||
|
|
||
|
@property
|
||
|
def na_ret(self):
|
||
|
return self.int_case.na_ret
|
||
|
|
||
|
@property
|
||
|
def checkpsu(self):
|
||
|
return self.__checkpsu
|
||
|
|
||
|
@property
|
||
|
def checkfan(self):
|
||
|
return self.__checkfan
|
||
|
|
||
|
@property
|
||
|
def psu_yellow_num(self):
|
||
|
return self.__psu_yellow_num
|
||
|
|
||
|
@property
|
||
|
def fan_yellow_num(self):
|
||
|
return self.__fan_yellow_num
|
||
|
|
||
|
@property
|
||
|
def psu_air_flow_monitor(self):
|
||
|
return self.__psu_air_flow_monitor
|
||
|
|
||
|
@property
|
||
|
def fan_air_flow_monitor(self):
|
||
|
return self.__fan_air_flow_monitor
|
||
|
|
||
|
@property
|
||
|
def board_sys_led(self):
|
||
|
return self.__board_sys_led
|
||
|
|
||
|
@property
|
||
|
def board_psu_led(self):
|
||
|
return self.__board_psu_led
|
||
|
|
||
|
@property
|
||
|
def board_fan_led(self):
|
||
|
return self.__board_fan_led
|
||
|
|
||
|
@property
|
||
|
def fan_mix_list(self):
|
||
|
return self.__fan_mix_list
|
||
|
|
||
|
@property
|
||
|
def interval(self):
|
||
|
return self.__interval
|
||
|
|
||
|
def get_fan_total_number(self):
|
||
|
return self.int_case.get_fan_total_number()
|
||
|
|
||
|
def get_psu_total_number(self):
|
||
|
return self.int_case.get_psu_total_number()
|
||
|
|
||
|
def get_onie_e2_obj(self, name):
|
||
|
return self.int_case.get_onie_e2_obj(name)
|
||
|
|
||
|
def set_led_color(self, led_name, color):
|
||
|
try:
|
||
|
ret = self.int_case.set_led_color(led_name, color)
|
||
|
except Exception as e:
|
||
|
ledcontrol_error("set %s led %s error, msg: %s" % (led_name, color, str(e)))
|
||
|
ret = False
|
||
|
return ret
|
||
|
|
||
|
def set_sys_led(self, color):
|
||
|
for led in self.board_sys_led:
|
||
|
led_name = led.get("led_name")
|
||
|
ret = self.set_led_color(led_name, color)
|
||
|
if ret is True:
|
||
|
ledcontrol_debug("set %s success, color:%s," % (led_name, color))
|
||
|
else:
|
||
|
ledcontrol_debug("set %s failed, color:%s," % (led_name, color))
|
||
|
|
||
|
def set_psu_led(self, color):
|
||
|
for led in self.board_psu_led:
|
||
|
led_name = led.get("led_name")
|
||
|
ret = self.set_led_color(led_name, color)
|
||
|
if ret is True:
|
||
|
ledcontrol_debug("set %s success, color:%s," % (led_name, color))
|
||
|
else:
|
||
|
ledcontrol_debug("set %s failed, color:%s," % (led_name, color))
|
||
|
|
||
|
def set_fan_led(self, color):
|
||
|
for led in self.board_fan_led:
|
||
|
led_name = led.get("led_name")
|
||
|
ret = self.set_led_color(led_name, color)
|
||
|
if ret is True:
|
||
|
ledcontrol_debug("set %s success, color:%s," % (led_name, color))
|
||
|
else:
|
||
|
ledcontrol_debug("set %s failed, color:%s," % (led_name, color))
|
||
|
|
||
|
def set_fan_module_led(self):
|
||
|
for fan_obj in self.fan_obj_list:
|
||
|
color = LED_STATUS_DICT.get(fan_obj.led_status)
|
||
|
ret = fan_obj.set_module_led(color)
|
||
|
if ret is True:
|
||
|
ledcontrol_debug("set %s module led success, color: %s," % (fan_obj.name, color))
|
||
|
else:
|
||
|
ledcontrol_debug("set %s module led failed, color: %s," % (fan_obj.name, color))
|
||
|
|
||
|
@property
|
||
|
def board_air_flow(self):
|
||
|
if self.__board_air_flow != F2B_AIR_FLOW and self.__board_air_flow != B2F_AIR_FLOW:
|
||
|
onie_e2_obj = self.get_onie_e2_obj(ONIE_E2_NAME)
|
||
|
if onie_e2_obj is not None:
|
||
|
ledcontrol_debug("onie_e2 servicetag: %s" % onie_e2_obj.servicetag)
|
||
|
if isinstance(onie_e2_obj.servicetag, str) and onie_e2_obj.servicetag.startswith("F2B"):
|
||
|
self.__board_air_flow = F2B_AIR_FLOW
|
||
|
elif isinstance(onie_e2_obj.servicetag, str) and onie_e2_obj.servicetag.startswith("B2F"):
|
||
|
self.__board_air_flow = B2F_AIR_FLOW
|
||
|
else:
|
||
|
self.__board_air_flow = onie_e2_obj.servicetag
|
||
|
ledcontrol_debug("board_air_flow: %s" % self.__board_air_flow)
|
||
|
return self.__board_air_flow
|
||
|
|
||
|
def update_psu_info(self):
|
||
|
for psu_obj in self.psu_obj_list:
|
||
|
psu_obj.update_dev_info()
|
||
|
ledcontrol_debug("%s present: [%s], status: [%s] status_summary [%s]" %
|
||
|
(psu_obj.name, psu_obj.present, psu_obj.status, psu_obj.status_summary))
|
||
|
if psu_obj.air_flow_monitor:
|
||
|
ledcontrol_debug("%s origin name: [%s], display name: [%s] air flow [%s]" %
|
||
|
(psu_obj.name, psu_obj.origin_name, psu_obj.display_name, psu_obj.air_flow))
|
||
|
|
||
|
def update_fan_info(self):
|
||
|
for fan_obj in self.fan_obj_list:
|
||
|
fan_obj.update_dev_info()
|
||
|
ledcontrol_debug("%s present: [%s], status: [%s] status_summary [%s]" %
|
||
|
(fan_obj.name, fan_obj.present, fan_obj.status, fan_obj.status_summary))
|
||
|
if fan_obj.air_flow_monitor:
|
||
|
ledcontrol_debug("%s origin name: [%s], display name: [%s] air flow [%s]" %
|
||
|
(fan_obj.name, fan_obj.origin_name, fan_obj.display_name, fan_obj.air_flow))
|
||
|
|
||
|
def get_monitor_temp(self):
|
||
|
sensorlist = self.int_case.get_temp_info()
|
||
|
|
||
|
for temp_threshold in self.__temps_threshold_config.values():
|
||
|
sensor = sensorlist.get(temp_threshold['name'])
|
||
|
if sensor["Value"] is None:
|
||
|
temp_threshold['fail_num'] += 1
|
||
|
ledcontrol_error("get %s failed, fail_num = %d" % (temp_threshold['name'], temp_threshold['fail_num']))
|
||
|
else:
|
||
|
temp_threshold['fail_num'] = 0
|
||
|
temp_threshold.setdefault('fix', 0)
|
||
|
temp_threshold['temp'] = sensor["Value"] + temp_threshold['fix']
|
||
|
ledcontrol_debug("%s = %d" % (temp_threshold['name'], temp_threshold['temp']))
|
||
|
ledcontrol_debug("warning = %d, critical = %d" % (temp_threshold['warning'], temp_threshold['critical']))
|
||
|
|
||
|
def is_temp_warning(self):
|
||
|
warning_flag = False
|
||
|
for temp_threshold in self.__temps_threshold_config.values():
|
||
|
if temp_threshold['temp'] >= temp_threshold['warning']:
|
||
|
warning_flag = True
|
||
|
ledcontrol_debug("%s is over warning" % temp_threshold['name'])
|
||
|
ledcontrol_debug(
|
||
|
"%s = %d, warning = %d" %
|
||
|
(temp_threshold['name'],
|
||
|
temp_threshold['temp'],
|
||
|
temp_threshold['warning']))
|
||
|
return warning_flag
|
||
|
|
||
|
def checkTempWarning(self):
|
||
|
try:
|
||
|
if self.is_temp_warning():
|
||
|
ledcontrol_debug("temp is over warning")
|
||
|
return True
|
||
|
except Exception as e:
|
||
|
ledcontrol_error("%%policy: checkTempWarning failed")
|
||
|
ledcontrol_error(str(e))
|
||
|
return False
|
||
|
|
||
|
def is_temp_critical(self):
|
||
|
critical_flag = False
|
||
|
for temp_threshold in self.__temps_threshold_config.values():
|
||
|
temp_threshold['critical_flag'] = False
|
||
|
if temp_threshold['temp'] >= temp_threshold['critical']:
|
||
|
critical_flag = True
|
||
|
temp_threshold['critical_flag'] = True
|
||
|
ledcontrol_debug("%s is over critical" % temp_threshold['name'])
|
||
|
ledcontrol_debug(
|
||
|
"%s = %d, critical = %d" %
|
||
|
(temp_threshold['name'],
|
||
|
temp_threshold['temp'],
|
||
|
temp_threshold['critical']))
|
||
|
return critical_flag
|
||
|
|
||
|
def checkTempCrit(self):
|
||
|
try:
|
||
|
if self.is_temp_critical():
|
||
|
temp_dict = dict(self.__temps_threshold_config)
|
||
|
tmp = temp_dict.get(SWITCH_TEMP)
|
||
|
if tmp['critical_flag'] == True:
|
||
|
ledcontrol_debug("temp is over critical")
|
||
|
return True
|
||
|
|
||
|
del temp_dict[SWITCH_TEMP]
|
||
|
for temp_items in temp_dict.values():
|
||
|
if temp_items['critical_flag'] == False:
|
||
|
return False
|
||
|
|
||
|
ledcontrol_debug("temp is over critical")
|
||
|
return True
|
||
|
except Exception as e:
|
||
|
ledcontrol_error("%%policy: checkTempCrit failed")
|
||
|
ledcontrol_error(str(e))
|
||
|
return False
|
||
|
|
||
|
def check_board_air_flow(self):
|
||
|
board_air_flow = self.board_air_flow
|
||
|
if board_air_flow != F2B_AIR_FLOW and board_air_flow != B2F_AIR_FLOW:
|
||
|
air_flow_error("%%AIR_FLOW_MONITOR-3-ERROR: get board air flow error, value [%s]" % board_air_flow)
|
||
|
return False
|
||
|
ledcontrol_debug("board air flow check ok: %s" % board_air_flow)
|
||
|
return True
|
||
|
|
||
|
def get_monitor_fan_status(self):
|
||
|
fanerrnum = 0
|
||
|
for fan_obj in self.fan_obj_list:
|
||
|
status = fan_obj.status_summary
|
||
|
ledcontrol_debug("%s status: %s" % (fan_obj.name, status))
|
||
|
if status != STATUS_OK:
|
||
|
fan_obj.led_status = COLOR_RED
|
||
|
fanerrnum += 1
|
||
|
else:
|
||
|
fan_obj.led_status = COLOR_GREEN
|
||
|
ledcontrol_debug("fan error number: %d" % fanerrnum)
|
||
|
|
||
|
if fanerrnum == 0:
|
||
|
fan_led_status = COLOR_GREEN
|
||
|
elif fanerrnum <= self.fan_yellow_num:
|
||
|
fan_led_status = COLOR_YELLOW
|
||
|
else:
|
||
|
fan_led_status = COLOR_RED
|
||
|
ledcontrol_debug("monitor fan status, set fan led: %s" % LED_STATUS_DICT.get(fan_led_status))
|
||
|
return fan_led_status
|
||
|
|
||
|
def get_monitor_psu_status(self):
|
||
|
psuerrnum = 0
|
||
|
for psu_obj in self.psu_obj_list:
|
||
|
status = psu_obj.status_summary
|
||
|
ledcontrol_debug("%s status: %s" % (psu_obj.name, status))
|
||
|
if status != STATUS_OK:
|
||
|
psu_obj.led_status = COLOR_RED
|
||
|
psuerrnum += 1
|
||
|
else:
|
||
|
psu_obj.led_status = COLOR_GREEN
|
||
|
ledcontrol_debug("psu error number: %d" % psuerrnum)
|
||
|
|
||
|
if psuerrnum == 0:
|
||
|
psu_led_status = COLOR_GREEN
|
||
|
elif psuerrnum <= self.psu_yellow_num:
|
||
|
psu_led_status = COLOR_YELLOW
|
||
|
else:
|
||
|
psu_led_status = COLOR_RED
|
||
|
ledcontrol_debug("monitor psu status, set psu led: %s" % LED_STATUS_DICT.get(psu_led_status))
|
||
|
return psu_led_status
|
||
|
|
||
|
def get_monitor_fan_air_flow(self):
|
||
|
if self.fan_air_flow_monitor == 0:
|
||
|
ledcontrol_debug("fan air flow monitor not open, default green")
|
||
|
return COLOR_GREEN
|
||
|
|
||
|
ret = self.check_board_air_flow()
|
||
|
if ret is False:
|
||
|
ledcontrol_debug("check board air flow error, skip fan air flow monitor.")
|
||
|
return COLOR_GREEN
|
||
|
|
||
|
fan_led_status_list = []
|
||
|
fan_air_flow_ok_obj_list = []
|
||
|
fan_air_flow_ok_set = set()
|
||
|
fan_module_led_list = []
|
||
|
for fan_obj in self.fan_obj_list:
|
||
|
if fan_obj.present != STATUS_PRESENT:
|
||
|
fan_module_led_list.append(COLOR_GREEN)
|
||
|
continue
|
||
|
if fan_obj.air_flow == self.na_ret:
|
||
|
air_flow_warn("%%AIR_FLOW_MONITOR-4-WARN: %s get air flow failed, origin name: [%s], display name: [%s], air flow [%s]" %
|
||
|
(fan_obj.name, fan_obj.origin_name, fan_obj.display_name, fan_obj.air_flow))
|
||
|
led_status = COLOR_YELLOW
|
||
|
elif fan_obj.air_flow != self.board_air_flow:
|
||
|
air_flow_error("%%AIR_FLOW_MONITOR-3-ERROR: %s air flow error, origin name: [%s], display name: [%s], fan air flow [%s], board air flow [%s]" %
|
||
|
(fan_obj.name, fan_obj.origin_name, fan_obj.display_name, fan_obj.air_flow, self.board_air_flow))
|
||
|
led_status = COLOR_RED
|
||
|
else:
|
||
|
fan_air_flow_ok_obj_list.append(fan_obj)
|
||
|
fan_air_flow_ok_set.add(fan_obj.origin_name)
|
||
|
ledcontrol_debug("%s air flow check ok, origin name: [%s], display name: [%s], fan air flow: [%s], board air flow: [%s]" %
|
||
|
(fan_obj.name, fan_obj.origin_name, fan_obj.display_name, fan_obj.air_flow, self.board_air_flow))
|
||
|
led_status = COLOR_GREEN
|
||
|
fan_module_led_list.append(led_status)
|
||
|
if led_status > fan_obj.led_status:
|
||
|
fan_obj.led_status = led_status
|
||
|
|
||
|
fan_led_status = max(fan_module_led_list)
|
||
|
fan_led_status_list.append(fan_led_status)
|
||
|
if len(fan_air_flow_ok_set) > 1 and fan_air_flow_ok_set not in self.fan_mix_list:
|
||
|
for fan_obj in fan_air_flow_ok_obj_list:
|
||
|
air_flow_warn("%%AIR_FLOW_MONITOR-4-WARN: %s mixing, origin name: [%s], display name: [%s], air flow [%s]" %
|
||
|
(fan_obj.name, fan_obj.origin_name, fan_obj.display_name, fan_obj.air_flow))
|
||
|
fan_led_status = COLOR_YELLOW
|
||
|
fan_led_status_list.append(fan_led_status)
|
||
|
|
||
|
fan_led_status = max(fan_led_status_list)
|
||
|
ledcontrol_debug("monitor fan air flow, set fan led: %s" % LED_STATUS_DICT.get(fan_led_status))
|
||
|
return fan_led_status
|
||
|
|
||
|
def get_monitor_psu_air_flow(self):
|
||
|
if self.psu_air_flow_monitor == 0:
|
||
|
ledcontrol_debug("psu air flow monitor not open, default green")
|
||
|
return COLOR_GREEN
|
||
|
|
||
|
ret = self.check_board_air_flow()
|
||
|
if ret is False:
|
||
|
ledcontrol_debug("check board air flow error, skip psu air flow monitor.")
|
||
|
return COLOR_GREEN
|
||
|
|
||
|
psu_module_led_list = []
|
||
|
for psu_obj in self.psu_obj_list:
|
||
|
if psu_obj.present != STATUS_PRESENT:
|
||
|
psu_module_led_list.append(COLOR_GREEN)
|
||
|
continue
|
||
|
if psu_obj.air_flow == self.na_ret:
|
||
|
air_flow_warn("%%AIR_FLOW_MONITOR-4-WARN: %s get air flow failed, origin name: [%s], display name: [%s], air flow [%s]" %
|
||
|
(psu_obj.name, psu_obj.origin_name, psu_obj.display_name, psu_obj.air_flow))
|
||
|
led_status = COLOR_YELLOW
|
||
|
elif psu_obj.air_flow != self.board_air_flow:
|
||
|
air_flow_error("%%AIR_FLOW_MONITOR-3-ERROR: %s air flow error, origin name: [%s], display name: [%s], psu air flow [%s], board air flow [%s]" %
|
||
|
(psu_obj.name, psu_obj.origin_name, psu_obj.display_name, psu_obj.air_flow, self.board_air_flow))
|
||
|
led_status = COLOR_RED
|
||
|
else:
|
||
|
ledcontrol_debug("%s psu air flow check ok, origin name: [%s], display name: [%s], psu air flow: [%s], board air flow: [%s]" %
|
||
|
(psu_obj.name, psu_obj.origin_name, psu_obj.display_name, psu_obj.air_flow, self.board_air_flow))
|
||
|
led_status = COLOR_GREEN
|
||
|
psu_module_led_list.append(led_status)
|
||
|
if led_status > psu_obj.led_status:
|
||
|
psu_obj.led_status = led_status
|
||
|
|
||
|
psu_led_status = max(psu_module_led_list)
|
||
|
ledcontrol_debug("monitor psu air flow, set psu led: %s" % LED_STATUS_DICT.get(psu_led_status))
|
||
|
return psu_led_status
|
||
|
|
||
|
def get_temp_sys_led_status(self):
|
||
|
if self.checkTempCrit() is True:
|
||
|
sys_led_status = COLOR_RED
|
||
|
elif self.checkTempWarning() is True:
|
||
|
sys_led_status = COLOR_YELLOW
|
||
|
else:
|
||
|
sys_led_status = COLOR_GREEN
|
||
|
ledcontrol_debug("monitor temperature, set sys led: %s" % LED_STATUS_DICT.get(sys_led_status))
|
||
|
return sys_led_status
|
||
|
|
||
|
def get_sys_led_follow_fan_status(self):
|
||
|
|
||
|
if self.checkfan:
|
||
|
sys_led_status = self.board_fan_led_status
|
||
|
ledcontrol_debug("sys led follow fan led, set sys led: %s" % LED_STATUS_DICT.get(sys_led_status))
|
||
|
else:
|
||
|
sys_led_status = COLOR_GREEN
|
||
|
ledcontrol_debug("sys led don't follow fan led, set default green")
|
||
|
return sys_led_status
|
||
|
|
||
|
def get_sys_led_follow_psu_status(self):
|
||
|
if self.checkpsu:
|
||
|
sys_led_status = self.board_psu_led_status
|
||
|
ledcontrol_debug("sys led follow psu led, set sys led: %s" % LED_STATUS_DICT.get(sys_led_status))
|
||
|
else:
|
||
|
sys_led_status = COLOR_GREEN
|
||
|
ledcontrol_debug("sys led don't follow psu led, set default green")
|
||
|
return sys_led_status
|
||
|
|
||
|
def dealSysLedStatus(self):
|
||
|
sys_led_status_list = []
|
||
|
# get_monitor_temp
|
||
|
self.get_monitor_temp()
|
||
|
|
||
|
# monitor temp get sys led status
|
||
|
sys_led_status = self.get_temp_sys_led_status()
|
||
|
sys_led_status_list.append(sys_led_status)
|
||
|
|
||
|
# check sys led follow fan led status
|
||
|
sys_led_status = self.get_sys_led_follow_fan_status()
|
||
|
sys_led_status_list.append(sys_led_status)
|
||
|
|
||
|
# check sys led follow psu led status
|
||
|
sys_led_status = self.get_sys_led_follow_psu_status()
|
||
|
sys_led_status_list.append(sys_led_status)
|
||
|
|
||
|
sys_led_status = max(sys_led_status_list)
|
||
|
sys_led_color = LED_STATUS_DICT.get(sys_led_status)
|
||
|
|
||
|
# set sys led
|
||
|
self.set_sys_led(sys_led_color)
|
||
|
|
||
|
def dealFanLedStatus(self):
|
||
|
fan_led_status_list = []
|
||
|
# update fan info
|
||
|
self.update_fan_info()
|
||
|
|
||
|
# monitor fan status first
|
||
|
fan_led_status = self.get_monitor_fan_status()
|
||
|
fan_led_status_list.append(fan_led_status)
|
||
|
|
||
|
# monitor fan air flow
|
||
|
fan_led_status = self.get_monitor_fan_air_flow()
|
||
|
fan_led_status_list.append(fan_led_status)
|
||
|
|
||
|
self.board_fan_led_status = max(fan_led_status_list)
|
||
|
fan_led_color = LED_STATUS_DICT.get(self.board_fan_led_status)
|
||
|
|
||
|
# set fan led
|
||
|
self.set_fan_led(fan_led_color)
|
||
|
# set fan module led
|
||
|
self.set_fan_module_led()
|
||
|
|
||
|
def dealPsuLedStatus(self):
|
||
|
psu_led_status_list = []
|
||
|
# update psu info
|
||
|
self.update_psu_info()
|
||
|
|
||
|
# monitor psu status first
|
||
|
psu_led_status = self.get_monitor_psu_status()
|
||
|
psu_led_status_list.append(psu_led_status)
|
||
|
|
||
|
# monitor psu air flow
|
||
|
psu_led_status = self.get_monitor_psu_air_flow()
|
||
|
psu_led_status_list.append(psu_led_status)
|
||
|
|
||
|
self.board_psu_led_status = max(psu_led_status_list)
|
||
|
psu_led_color = LED_STATUS_DICT.get(self.board_psu_led_status)
|
||
|
|
||
|
# set psu led
|
||
|
self.set_psu_led(psu_led_color)
|
||
|
|
||
|
def do_ledcontrol(self):
|
||
|
self.dealPsuLedStatus()
|
||
|
self.dealFanLedStatus()
|
||
|
self.dealSysLedStatus()
|
||
|
|
||
|
def fan_obj_init(self):
|
||
|
fan_num = self.get_fan_total_number()
|
||
|
for i in range(fan_num):
|
||
|
fan_name = "FAN" + str(i + 1)
|
||
|
fan_obj = DevFan(fan_name, self.fan_air_flow_monitor, self.int_case)
|
||
|
self.fan_obj_list.append(fan_obj)
|
||
|
ledcontrol_debug("fan object initialize success")
|
||
|
|
||
|
def psu_obj_init(self):
|
||
|
psu_num = self.get_psu_total_number()
|
||
|
for i in range(psu_num):
|
||
|
psu_name = "PSU" + str(i + 1)
|
||
|
psu_obj = DevPsu(psu_name, self.psu_air_flow_monitor, self.int_case)
|
||
|
self.psu_obj_list.append(psu_obj)
|
||
|
ledcontrol_debug("psu object initialize success")
|
||
|
|
||
|
def run(self):
|
||
|
while True:
|
||
|
try:
|
||
|
debug_init()
|
||
|
self.do_ledcontrol()
|
||
|
time.sleep(self.interval)
|
||
|
except Exception as e:
|
||
|
traceback.print_exc()
|
||
|
ledcontrol_error(str(e))
|
||
|
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
debug_init()
|
||
|
ledcontrol_debug("enter main")
|
||
|
led_control = ledcontrol()
|
||
|
led_control.fan_obj_init()
|
||
|
led_control.psu_obj_init()
|
||
|
led_control.run()
|