blob: 687098ce38f0bc227b0620e91ccbbe1a33106647 [file] [log] [blame]
#!/bin/bash -e
FAN_STATUS_UNKNOWN="Unknown"
FAN_STATUS_NORMAL="Normal"
FAN_STATUS_ABNORMAL="Abnormal"
create_log()
{
local service="xyz.openbmc_project.Logging"
local object_path="/xyz/openbmc_project/logging"
local interface="xyz.openbmc_project.Logging.Create"
local message="Fan status abnormal"
local severity="xyz.openbmc_project.Logging.Entry.Level.Error"
local arg="CALLOUT_INVENTORY_PATH"
local value="/xyz/openbmc_project/inventory/fan"
busctl call "$service" "$object_path" "$interface" Create "ssa{ss}" "$message" "$severity" 1 "$arg" "$value"
}
resolve_log()
{
local service="xyz.openbmc_project.ObjectMapper"
local object_path="/xyz/openbmc_project/inventory/fan/fault"
local interface="xyz.openbmc_project.Association"
local property="endpoints"
mapfile -t -d " " endpoint_array < <(busctl get-property "$service" "$object_path" "$interface" "$property" | tr -d '"\n')
for ((i = 2; i < ${#endpoint_array[@]}; i++)); do
endpoint="${endpoint_array[$i]}"
busctl set-property xyz.openbmc_project.Logging "$endpoint" xyz.openbmc_project.Logging.Entry Resolved b true
done
}
check_fcb_fan_status()
{
local fcb_num=$1
if ! [[ $fcb_num =~ ^[0-5]$ ]]; then
echo "$FAN_STATUS_UNKNOWN"
return 1
fi
local service="xyz.openbmc_project.FanSensor"
local interface="xyz.openbmc_project.Sensor.Threshold.Critical"
local property_list=("CriticalAlarmHigh" "CriticalAlarmLow")
local fan_name_prefix=("FCB_BOT_0" "FCB_BOT_1" "FCB_MID_0" "FCB_MID_1" "FCB_TOP_0" "FCB_TOP_1")
local in_out=("IL" "OL")
for index in {0..7}
do
local object_path="/xyz/openbmc_project/sensors/fan_tach/${fan_name_prefix[$fcb_num]}_FAN$((index / 2))_TACH_${in_out[$((index % 2))]}_SPEED_RPM"
for property in "${property_list[@]}"; do
tach_alarm=$(busctl get-property "$service" "$object_path" "$interface" "$property" | cut -d ' ' -f2)
if [ "$tach_alarm" = "true" ]; then
echo "$FAN_STATUS_ABNORMAL"
return 0
fi
done
done
echo "$FAN_STATUS_NORMAL"
return 0
}
pre_status=$FAN_STATUS_UNKNOWN
while true
do
fan_status=$FAN_STATUS_NORMAL
# Get the FCBs' presence status from the CMM CPLD
fcb_prsnt_reg=$(i2cget -f -y 0x00 0x15 0x01)
for i in {0..5}
do
# Check the presence of each FCB
if (( (fcb_prsnt_reg & (1 << i)) != 0 )); then
fan_status=$FAN_STATUS_ABNORMAL
break
else
# Check each sensor on the FCB whether alert critical alarm
fan_status=$(check_fcb_fan_status "$i")
if [ "$fan_status" = "$FAN_STATUS_ABNORMAL" ]; then
break
fi
fi
done
if [ "$fan_status" = "$FAN_STATUS_ABNORMAL" ] && [ "$pre_status" != "$FAN_STATUS_ABNORMAL" ]; then
create_log
pre_status="$FAN_STATUS_ABNORMAL"
elif [ "$fan_status" = "$FAN_STATUS_NORMAL" ] && [ "$pre_status" != "$FAN_STATUS_NORMAL" ]; then
resolve_log
pre_status="$FAN_STATUS_NORMAL"
fi
sleep 1
done