#!/bin/bash ## # This script is to handle fan fail condition which is described below. # Fan fail means one fan RPM is under its CriticalLow. If BMC encounters # such situation, then sets other fans to full speed. # # get fan state function get_fan_state() { get_property_path='xyz.openbmc_project.Sensor.Threshold.Critical CriticalAlarmLow' fan_state="$(busctl get-property $1 $2 $get_property_path | awk '{print $2}')" echo "$fan_state" } # check fan fail function is_fan_fail() { fan_state=("$@") for i in "${fan_state[@]}" do if [ ! -z "$i" ] then if [ $i == "true" ] then echo 1 return fi fi done echo 0 } fan_tach_path=( '/xyz/openbmc_project/sensors/fan_tach/fan0' '/xyz/openbmc_project/sensors/fan_tach/fan1' '/xyz/openbmc_project/sensors/fan_tach/fb_fan0' '/xyz/openbmc_project/sensors/fan_tach/fb_fan1' '/xyz/openbmc_project/sensors/fan_tach/fb_fan2' ) check_fail_flag=0 is_fan_fail_flag=0 current_fan_state=() while true do for i in ${!fan_tach_path[@]} do mapper wait ${fan_tach_path[$i]} hwmon_path="$(mapper get-service ${fan_tach_path[0]})" current_fan_state[$i]=$(get_fan_state $hwmon_path ${fan_tach_path[$i]}) done is_fan_fail_flag=$(is_fan_fail "${current_fan_state[@]}") # if fan fails then set all fans to full speed if [ $is_fan_fail_flag -eq 1 ] && [ $check_fail_flag -eq 0 ] then check_fail_flag=1 systemctl stop phosphor-pid-control.service # fans recover to normal state elif [ $is_fan_fail_flag -eq 0 ] && [ $check_fail_flag -eq 1 ] then check_fail_flag=0 systemctl restart phosphor-pid-control.service fi sleep 2 done