368d6fafea
Code backup
1045 lines
33 KiB
Bash
1045 lines
33 KiB
Bash
#!/bin/bash
|
|
|
|
# - VAR
|
|
|
|
# - Bash info
|
|
APPNAME=$(basename $0)
|
|
NAME="Check IPMI"
|
|
AUTHOR="Kalarumeth"
|
|
VERSION="v0.2"
|
|
URL="https://github.com/Kalarumeth"
|
|
|
|
# - Default settings for connection
|
|
COMMUNITY="public"
|
|
HOST_NAME="localhost"
|
|
SNMPVERSION="2c"
|
|
|
|
# - State Variables
|
|
STATE_OK=0
|
|
STATE_WARN=1
|
|
STATE_CRIT=2
|
|
STATE_UNK=3
|
|
STATE=$STATE_OK
|
|
|
|
# - Range Variables
|
|
WA=60
|
|
CR=70
|
|
|
|
# - OID
|
|
|
|
IPMI.OIDS() {
|
|
# - memTotal
|
|
OID_memTotalReal="1.3.6.1.4.1.2021.4.5"
|
|
OID_memTotalFree="1.3.6.1.4.1.2021.4.11"
|
|
# - ssCpu
|
|
OID_ssCpuSystem="1.3.6.1.4.1.2021.11.10"
|
|
# - snmperrError
|
|
OID_snmperrErrorFlag="1.3.6.1.4.1.2021.101.100"
|
|
OID_snmperrErrorMessage="1.3.6.1.4.1.2021.101.101"
|
|
# - obj
|
|
OID_objName="1.3.6.1.4.1.21317.1.3.1.13"
|
|
OID_objValue="1.3.6.1.4.1.21317.1.3.1.2"
|
|
}
|
|
|
|
IDRAC.OIDS() {
|
|
# - systemInfo
|
|
OID_productType=".1.3.6.1.4.1.674.10892.5.4.300.10.1.9.1"
|
|
OID_serviceTag=".1.3.6.1.4.1.674.10892.5.4.300.10.1.11.1"
|
|
# - globalDevice
|
|
OID_globalSystem=".1.3.6.1.4.1.674.10892.5.2.1.0"
|
|
OID_systemLcd=".1.3.6.1.4.1.674.10892.5.2.2.0"
|
|
OID_globalStorage=".1.3.6.1.4.1.674.10892.5.2.3.0"
|
|
OID_systemPower=".1.3.6.1.4.1.674.10892.5.2.4.0"
|
|
OID_systemPowerUpTime=".1.3.6.1.4.1.674.10892.5.2.5.0"
|
|
# - namesDevice
|
|
OID_namePowerUnit=".1.3.6.1.4.1.674.10892.5.4.600.12.1.8"
|
|
OID_nameChassisIntrusion=".1.3.6.1.4.1.674.10892.5.4.300.70.1.8"
|
|
OID_nameCoolingUnit=".1.3.6.1.4.1.674.10892.5.4.700.10.1.7"
|
|
OID_nameDrive=".1.3.6.1.4.1.674.10892.5.5.1.20.130.4.1.2"
|
|
# - statusDevice
|
|
OID_statusPowerUnit=".1.3.6.1.4.1.674.10892.5.4.600.12.1.5"
|
|
OID_statusChassisIntrusion=".1.3.6.1.4.1.674.10892.5.4.300.70.1.5"
|
|
OID_statusCoolingUnit=".1.3.6.1.4.1.674.10892.5.4.700.10.1.8"
|
|
OID_statusDrive=".1.3.6.1.4.1.674.10892.5.5.1.20.130.4.1.4"
|
|
OID_statusPredictiveDrive=".1.3.6.1.4.1.674.10892.5.5.1.20.130.4.1.31"
|
|
# - temperatureDevice
|
|
OID_temperatureProbeStatus=".1.3.6.1.4.1.674.10892.5.4.700.20.1.5"
|
|
OID_temperatureProbeReading=".1.3.6.1.4.1.674.10892.5.4.700.20.1.6"
|
|
OID_temperatureProbeLocation=".1.3.6.1.4.1.674.10892.5.4.700.20.1.8"
|
|
}
|
|
|
|
# - MAIN CODE
|
|
|
|
Script.HostAlive() {
|
|
for server in $HOST_NAME; do
|
|
ping -c1 -W1 -q $server &>/dev/null
|
|
if [[ $? != 0 ]] ; then
|
|
printf "%s\n" "$server is unreachable"
|
|
exit $STATE_UNK
|
|
fi
|
|
done
|
|
}
|
|
|
|
snmp() {
|
|
snmpwalk -v $SNMPVERSION -Oe -c $COMMUNITY $HOST_NAME $1
|
|
}
|
|
|
|
# - IPMI Health Check
|
|
|
|
IPMI.Main() {
|
|
case $1 in
|
|
all)
|
|
IPMI.Full
|
|
exit $STATE ;;
|
|
cpu)
|
|
IPMI.Cpu
|
|
exit $STATE ;;
|
|
err)
|
|
IPMI.Error
|
|
exit $STATE ;;
|
|
fan)
|
|
IPMI.Fan
|
|
exit $STATE ;;
|
|
hw)
|
|
IPMI.Hardware
|
|
exit $STATE ;;
|
|
ram)
|
|
IPMI.Ram
|
|
exit $STATE ;;
|
|
temp)
|
|
IPMI.Temperature
|
|
exit $STATE ;;
|
|
*)
|
|
echo "Unknown check!"
|
|
Help.IPMI
|
|
exit $STATE_UNK ;;
|
|
esac
|
|
}
|
|
|
|
IPMI.GetData() {
|
|
IPMI.OIDS
|
|
|
|
case $1 in
|
|
obj)
|
|
raw_name=$(snmp $OID_objName | cut -d '"' -f 2 | sed "s/$//g")
|
|
value=($(snmp $OID_objValue | cut -d '"' -f 2 | cut -d '.' -f 1 | sed "s/$/\n/g"))
|
|
readarray -t name <<< $raw_name ;;
|
|
cpu)
|
|
value=$(snmp $OID_ssCpuSystem | cut -d ' ' -f 4) ;;
|
|
ram)
|
|
RAM_ALL=$(snmp $OID_memTotalReal | cut -d " " -f4)
|
|
RAM_FRE=$(snmp $OID_memTotalFree | cut -d " " -f4)
|
|
RAM_ALLK=$(echo "$RAM_ALL" | awk '{ kbyte = $1 /1024/1024; print kbyte }' | xargs printf "%.2f")
|
|
RAM_FREK=$(echo "$RAM_FRE" | awk '{ kbyte = $1 /1024/1024; print kbyte }' | xargs printf "%.2f")
|
|
RAM_PERC=$(echo "$RAM_FRE" "$RAM_ALL" | awk '{ ramp = $1 /$2 *100; print ramp }' | xargs printf "%.2f" )
|
|
RAM_UPERC=$(echo "$RAM_PERC" | awk '{ ramup = 100 - $1; print ramup }')
|
|
RAM_P=$(echo "$RAM_UPERC" | cut -d "." -f1 )
|
|
RAM_USE=$(echo "$RAM_ALL" "$RAM_FRE" | awk '{ used = $1 -$2; print used }' )
|
|
RAM_USEK=$(echo "$RAM_USE" | awk '{ kbyte = $1 /1024/1024; print kbyte }' | xargs printf "%.2f") ;;
|
|
error)
|
|
flag=$(snmp $OID_snmperrErrorFlag | cut -d ' ' -f 4)
|
|
message=$(snmp $OID_snmperrErrorMessage | cut -d ' ' -f 4) ;;
|
|
esac
|
|
}
|
|
|
|
IPMI.Hardware() {
|
|
IPMI.GetData obj
|
|
|
|
if [[ $NoHeader != 1 ]] ; then
|
|
IPMI.Hardware.Header
|
|
fi
|
|
|
|
for((i=0; i<${#name[@]}; i++))
|
|
do
|
|
if [[ ${name[$i]} == *"Intru"* ]] ; then
|
|
for element in "${value[$i]}"; do
|
|
if [[ $element == 0 ]] || [[ $element == "0x00" ]]; then
|
|
printf "%s\t%s\n" "OK" "${name[$i]}"
|
|
break
|
|
else
|
|
printf "%s\t%s\n" "CRIT" "${name[$i]}"
|
|
STATE=$STATE_CRIT
|
|
break
|
|
fi
|
|
done
|
|
elif [[ ${name[$i]} == *"Status"* ]] ; then
|
|
for element in "${value[$i]}"; do
|
|
if [[ $element == 1 ]] || [[ $element == "0x01" ]]; then
|
|
printf "%s\t%s\n" "OK" "${name[$i]}"
|
|
break
|
|
else
|
|
printf "%s\t%s\n" "CRIT" "${name[$i]}"
|
|
STATE=$STATE_CRIT
|
|
break
|
|
fi
|
|
done
|
|
fi
|
|
done
|
|
}
|
|
|
|
IPMI.Hardware.Header() {
|
|
ErrorCounter=0
|
|
|
|
for((i=0; i<${#name[@]}; i++));
|
|
do
|
|
if [[ ${name[$i]} == *"Intru"* ]] ; then
|
|
for element in "${value[$i]}"; do
|
|
if [[ $element != 0 ]] && [[ $element != "0x00" ]]; then
|
|
ErrorCounter=$((ErrorCounter + 1))
|
|
fi
|
|
done
|
|
elif [[ ${name[$i]} == *"Status"* ]] ; then
|
|
for element in "${value[$i]}"; do
|
|
if [[ $element != 1 ]] && [[ $element != "0x01" ]]; then
|
|
ErrorCounter=$((ErrorCounter + 1))
|
|
fi
|
|
done
|
|
fi
|
|
done
|
|
|
|
for Error in "$ErrorCounter"; do
|
|
if [[ $Error == 0 ]] ; then
|
|
printf "%s\t%s\n\n" "OK!" "All is Working"
|
|
else
|
|
printf "%s\t%s\n\n" "CRITICAL!" "$Error Obj Not Working"
|
|
fi
|
|
done
|
|
|
|
printf "%s\t%s\n%s\n" "STATUS" "NAME" "======================"
|
|
}
|
|
|
|
IPMI.Fan() {
|
|
IPMI.GetData obj
|
|
|
|
if [[ $NoHeader != 1 ]] ; then
|
|
printf "%s\t%s\n\n" "OK!" "All Fan is Working"
|
|
printf "%s\t%s\t%s\n%s\n" "STATUS" "NAME" "VALUE" "========================="
|
|
fi
|
|
|
|
for((i=0; i<${#name[@]}; i++))
|
|
do
|
|
if [[ ${name[$i]} == *"FAN"* ]] ; then
|
|
for element in "${value[$i]}"; do
|
|
if [[ $element != 0 ]]; then
|
|
printf "%s\t%s\t%s\n" "OK" "${name[$i]}" "${value[$i]} RPM"
|
|
break
|
|
else
|
|
printf "%s\t%s\n" "N/A" "${name[$i]}"
|
|
break
|
|
fi
|
|
done
|
|
fi
|
|
done
|
|
}
|
|
|
|
IPMI.Temperature() {
|
|
IPMI.GetData obj
|
|
|
|
if [[ $NoHeader != 1 ]] ; then
|
|
IPMI.Temperature.Header
|
|
fi
|
|
|
|
for((i=0; i<${#name[@]}; i++))
|
|
do
|
|
if [[ ${name[$i]} == *"Temp"* ]] ; then
|
|
for element in "${value[$i]}"; do
|
|
if [[ $element == 0 ]]; then
|
|
break
|
|
elif [[ $element < $WA-1 ]]; then
|
|
printf "%s\t%s\t%s\n" "OK" "${name[$i]}" "${value[$i]} °C"
|
|
break
|
|
elif [[ $element < $CR-1 ]]; then
|
|
printf "%s\t%s\t%s\n" "WARN" "${name[$i]}" "${value[$i]} °C"
|
|
STATE=$STATE_WARN
|
|
break
|
|
elif [[ $element > $CR-1 ]]; then
|
|
printf "%s\t%s\t%s\n" "CRIT" "${name[$i]}" "${value[$i]} °C"
|
|
STATE=$STATE_CRIT
|
|
break
|
|
fi
|
|
done
|
|
fi
|
|
done
|
|
}
|
|
|
|
IPMI.Temperature.Header() {
|
|
WarningCounter=0
|
|
CriticalCounter=0
|
|
|
|
for((i=0; i<${#name[@]}; i++))
|
|
do
|
|
if [[ ${name[$i]} == *"Temp"* ]] ; then
|
|
for element in "${value[$i]}"; do
|
|
if [[ $element < $WA-1 ]]; then
|
|
break
|
|
elif [[ $element < $CR-1 ]]; then
|
|
WarningCounter=$(( WarningCounter + 1 ))
|
|
break
|
|
elif [[ $element > $CR-1 ]]; then
|
|
CriticalCounter=$(( CriticalCounter + 1 ))
|
|
break
|
|
fi
|
|
done
|
|
fi
|
|
done
|
|
|
|
for Error in "$(( WarningCounter + CriticalCounter ))"; do
|
|
if [[ $WarningCounter == 0 ]] && [[ $CriticalCounter == 0 ]] ; then
|
|
printf "%s\t%s\n\n" "OK!" "All Temperature is in range"
|
|
elif [[ $WarningCounter != 0 ]] && [[ $CriticalCounter == 0 ]] ; then
|
|
printf "%s\t%s\n\n" "WARNING!" "$Error Temperature is out range"
|
|
else
|
|
printf "%s\t%s\n\n" "CRITICAL!" "$Error Temperature is out range"
|
|
fi
|
|
done
|
|
|
|
printf "%s\t%s\t%s\t%s\n%s\n" "STATUS" "NAME" "" "VALUE" "=============================="
|
|
}
|
|
|
|
IPMI.Cpu() {
|
|
IPMI.GetData cpu
|
|
|
|
case 1 in
|
|
$(($value <= $WA-1)))
|
|
if [[ $NoHeader != 1 ]] ; then
|
|
printf "%s\t%s\n" "OK!" "CPU used: $value%"
|
|
else
|
|
printf "%s\t%s\n" "OK" "CPU used: $value%"
|
|
fi ;;
|
|
$(($value <= $CR-1)))
|
|
if [[ $NoHeader != 1 ]] ; then
|
|
printf "%s\t%s\n" "WARNING!" "CPU used: $value%"
|
|
else
|
|
printf "%s\t%s\n" "WARN" "CPU used: $value%"
|
|
fi
|
|
STATE=$STATE_WARN ;;
|
|
$(($value > $CR-1)))
|
|
if [[ $NoHeader != 1 ]] ; then
|
|
printf "%s\t%s\n" "CRITICAL!" "CPU used: $value%"
|
|
else
|
|
printf "%s\t%s\n" "CRIT" "CPU used: $value%"
|
|
fi
|
|
STATE=$STATE_CRIT ;;
|
|
esac
|
|
}
|
|
|
|
IPMI.Ram() {
|
|
IPMI.GetData ram
|
|
|
|
case 1 in
|
|
$(($RAM_P <= $WA-1)))
|
|
if [[ $NoHeader != 1 ]] ; then
|
|
printf "%s\t%s\n" "OK!" "RAM used: $RAM_USEK / $RAM_ALLK GB ($RAM_UPERC%)"
|
|
printf "%s\t%s\n" "" "RAM free: $RAM_FREK GB ($RAM_PERC%)"
|
|
else
|
|
printf "%s\t%s\n" "OK" "RAM used: $RAM_USEK / $RAM_ALLK GB ($RAM_UPERC%)"
|
|
fi ;;
|
|
$(($RAM_P <= $CR-1)))
|
|
if [[ $NoHeader != 1 ]] ; then
|
|
printf "%s\t%s\n" "WARNING!" "RAM used: $RAM_USEK / $RAM_ALLK GB ($RAM_UPERC%)"
|
|
printf "%s\t%s\n" "" "RAM free: $RAM_FREK GB ($RAM_PERC%)"
|
|
else
|
|
printf "%s\t%s\n" "WARN" "RAM used: $RAM_USEK / $RAM_ALLK GB ($RAM_UPERC%)"
|
|
fi
|
|
STATE=$STATE_WARN ;;
|
|
$(($RAM_P > $CR-1)))
|
|
if [[ $NoHeader != 1 ]] ; then
|
|
printf "%s\t%s\n" "CRITICAL!" "RAM used: $RAM_USEK / $RAM_ALLK GB ($RAM_UPERC%)"
|
|
printf "%s\t%s\n" "" "RAM free: $RAM_FREK GB ($RAM_PERC%)"
|
|
else
|
|
printf "%s\t%s\n" "CRIT" "RAM used: $RAM_USEK / $RAM_ALLK GB ($RAM_UPERC%)"
|
|
fi
|
|
STATE=$STATE_CRIT ;;
|
|
esac
|
|
}
|
|
|
|
IPMI.Error() {
|
|
IPMI.GetData error
|
|
|
|
if [[ $flag == *"0"* ]]; then
|
|
if [[ $NoHeader != 1 ]] ; then
|
|
printf "%s\t%s\n" "OK!" "No Error Found"
|
|
else
|
|
printf "%s\t%s\n" "OK" "No Error Found"
|
|
fi
|
|
else
|
|
if [[ $NoHeader != 1 ]] ; then
|
|
printf "%s\t%s\n" "CRITICAL!" "Error Found: $flag" "Message" "$message"
|
|
else
|
|
printf "%s\t%s\n" "CRIT" "Error Found: $flag" "Message" "$message"
|
|
fi
|
|
STATE=$STATE_CRIT
|
|
fi
|
|
}
|
|
|
|
IPMI.Full() {
|
|
IPMI.Full.Header
|
|
IPMI.Full.Error
|
|
|
|
printf "\n\n\n%s\n\n" "All Check Run"
|
|
|
|
NoHeader=1
|
|
|
|
IPMI.Error
|
|
IPMI.Cpu
|
|
IPMI.Ram
|
|
IPMI.Hardware
|
|
IPMI.Temperature
|
|
IPMI.Fan
|
|
}
|
|
|
|
IPMI.Full.Header() {
|
|
WarningCounter=0
|
|
CriticalCounter=0
|
|
|
|
IPMI.GetData obj
|
|
|
|
for((i=0; i<${#name[@]}; i++))
|
|
do
|
|
if [[ ${name[$i]} == *"Intru"* ]] ; then
|
|
for element in "${value[$i]}"; do
|
|
if [[ $element != 0 ]] && [[ $element != "0x00" ]]; then
|
|
CriticalCounter=$(( CriticalCounter + 1 ))
|
|
fi
|
|
done
|
|
elif [[ ${name[$i]} == *"Status"* ]] ; then
|
|
for element in "${value[$i]}"; do
|
|
if [[ $element != 1 ]] && [[ $element != "0x01" ]]; then
|
|
CriticalCounter=$(( CriticalCounter + 1 ))
|
|
fi
|
|
done
|
|
fi
|
|
done
|
|
|
|
for((i=0; i<${#name[@]}; i++))
|
|
do
|
|
if [[ ${name[$i]} == *"Temp"* ]] ; then
|
|
for element in "${value[$i]}"; do
|
|
if [[ $element < $WA-1 ]]; then
|
|
break
|
|
elif [[ $element < $CR-1 ]]; then
|
|
WarningCounter=$(( WarningCounter + 1 ))
|
|
break
|
|
elif [[ $element > $CR-1 ]]; then
|
|
CriticalCounter=$(( CriticalCounter + 1 ))
|
|
break
|
|
fi
|
|
done
|
|
fi
|
|
done
|
|
|
|
IPMI.GetData error
|
|
|
|
if [[ $flag != *"0"* ]]; then
|
|
CriticalCounter=$(( CriticalCounter + 1 ))
|
|
shift
|
|
fi
|
|
|
|
IPMI.GetData cpu
|
|
|
|
case 1 in
|
|
$(($value <= $WA-1)))
|
|
shift ;;
|
|
$(($value <= $CR-1)))
|
|
WarningCounter=$(( WarningCounter + 1 )) ;;
|
|
$(($value > $CR-1)))
|
|
CriticalCounter=$(( CriticalCounter + 1 )) ;;
|
|
esac
|
|
|
|
IPMI.GetData ram
|
|
|
|
case 1 in
|
|
$(($RAM_P <= $WA-1)))
|
|
shift ;;
|
|
$(($RAM_P <= $CR-1)))
|
|
WarningCounter=$(( WarningCounter + 1 )) ;;
|
|
$(($RAM_P > $CR-1)))
|
|
CriticalCounter=$(( CriticalCounter + 1 )) ;;
|
|
esac
|
|
|
|
for Error in "$(( WarningCounter + CriticalCounter ))"; do
|
|
if [[ $WarningCounter == 0 ]] && [[ $CriticalCounter == 0 ]] ; then
|
|
printf "%s\t%s\n\n" "OK!" "All Check's in range"
|
|
elif [[ $WarningCounter != 0 ]] && [[ $CriticalCounter == 0 ]] ; then
|
|
printf "%s\t%s\n\n" "WARNING!" "Error: $Error"
|
|
else
|
|
printf "%s\t%s\n" "CRITICAL!" "Critical Error: $CriticalCounter"
|
|
if [[ $WarningCounter != 0 ]] ; then
|
|
printf "%s\t%s\t%s\n" "" "" "Warning Error: $WarningCounter"
|
|
fi
|
|
printf "\n"
|
|
fi
|
|
done
|
|
}
|
|
|
|
IPMI.Full.Error() {
|
|
IPMI.GetData error
|
|
|
|
if [[ $flag != *"0"* ]]; then
|
|
printf "%s\t%s\n" "CRIT" "Error Found: $flag" "Message" "$message"
|
|
shift
|
|
fi
|
|
|
|
IPMI.GetData cpu
|
|
|
|
case 1 in
|
|
$(($value <= $WA-1)))
|
|
shift ;;
|
|
$(($value <= $CR-1)))
|
|
printf "%s\t%s\n" "WARN" "CPU used: $value%" ;;
|
|
$(($value > $CR-1)))
|
|
printf "%s\t%s\n" "CRIT" "CPU used: $value%" ;;
|
|
esac
|
|
|
|
IPMI.GetData ram
|
|
|
|
case 1 in
|
|
$(($RAM_P <= $WA-1)))
|
|
shift ;;
|
|
$(($RAM_P <= $CR-1)))
|
|
printf "%s\t%s\n" "WARN" "RAM used: $RAM_USEK / $RAM_ALLK GB ($RAM_UPERC%)" ;;
|
|
$(($RAM_P > $CR-1)))
|
|
printf "%s\t%s\n" "CRIT" "RAM used: $RAM_USEK / $RAM_ALLK GB ($RAM_UPERC%)" ;;
|
|
esac
|
|
|
|
IPMI.GetData obj
|
|
|
|
for((i=0; i<${#name[@]}; i++))
|
|
do
|
|
if [[ ${name[$i]} == *"Intru"* ]] ; then
|
|
for element in "${value[$i]}"; do
|
|
if [[ $element != 0 ]] && [[ $element != "0x00" ]]; then
|
|
printf "%s\t%s\n" "CRIT" "${name[$i]}"
|
|
fi
|
|
done
|
|
elif [[ ${name[$i]} == *"Status"* ]] ; then
|
|
for element in "${value[$i]}"; do
|
|
if [[ $element != 1 ]] && [[ $element != "0x01" ]]; then
|
|
printf "%s\t%s\n" "CRIT" "${name[$i]}"
|
|
fi
|
|
done
|
|
fi
|
|
done
|
|
|
|
for((i=0; i<${#name[@]}; i++))
|
|
do
|
|
if [[ ${name[$i]} == *"Temp"* ]] ; then
|
|
for element in "${value[$i]}"; do
|
|
if [[ $element < $WA-1 ]]; then
|
|
break
|
|
elif [[ $element < $CR-1 ]]; then
|
|
printf "%s\t%s\t%s\n" "WARN" "${name[$i]}" "${value[$i]} °C"
|
|
break
|
|
elif [[ $element > $CR-1 ]]; then
|
|
printf "%s\t%s\t%s\n" "CRIT" "${name[$i]}" "${value[$i]} °C"
|
|
break
|
|
fi
|
|
done
|
|
fi
|
|
done
|
|
}
|
|
|
|
# - Dell Health Check
|
|
|
|
IDRAC.Main() {
|
|
case $1 in
|
|
all)
|
|
IDRAC.Full
|
|
exit $STATE ;;
|
|
drive)
|
|
IDRAC.Drive
|
|
exit $STATE ;;
|
|
glob)
|
|
IDRAC.GlobalDevice
|
|
exit $STATE ;;
|
|
hw)
|
|
IDRAC.Hardware
|
|
exit $STATE ;;
|
|
*)
|
|
echo "Unknown check!"
|
|
Help.IDRAC
|
|
exit $STATE_UNK ;;
|
|
esac
|
|
}
|
|
|
|
IDRAC.GetData() {
|
|
IDRAC.OIDS
|
|
|
|
case $1 in
|
|
drive)
|
|
arrayStatusDrive=($(snmp $OID_statusDrive | cut -d ' ' -f 4 | sed "s/$//g"))
|
|
arrayPredictDrive=($(snmp $OID_statusPredictiveDrive | cut -d ' ' -f 4 | sed "s/$//g"))
|
|
rawNameDrive=$(snmp $OID_nameDrive | cut -d '"' -f 2 | sed "s/$//g")
|
|
readarray -t arrayNameDrive <<< $rawNameDrive ;;
|
|
global)
|
|
globalSystem=$(snmp $OID_globalSystem | cut -d ' ' -f 4 | sed "s/$//g")
|
|
systemLcd=$(snmp $OID_systemLcd | cut -d ' ' -f 4 | sed "s/$//g")
|
|
globalStorage=$(snmp $OID_globalStorage | cut -d ' ' -f 4 | sed "s/$//g")
|
|
systemPower=$(snmp $OID_systemPower | cut -d ' ' -f 4 | sed "s/$//g")
|
|
systemPowerUpTime=$(snmp $OID_systemPowerUpTime | cut -d ' ' -f 4 | sed "s/$//g")
|
|
productType=$(snmp $OID_productType | cut -d '"' -f 2 | sed "s/$//g")
|
|
serviceTag=$(snmp $OID_serviceTag | cut -d '"' -f 2 | sed "s/$//g") ;;
|
|
hardware)
|
|
systemPower=$(snmp $OID_systemPower | cut -d ' ' -f 4 | sed "s/$//g")
|
|
nameFan=$(snmp $OID_nameCoolingUnit | cut -d '"' -f 2 | sed "s/$//g")
|
|
statusFan=$(snmp $OID_statusCoolingUnit | cut -d ' ' -f 4 | sed "s/$//g")
|
|
nameIntrusion=$(snmp $OID_nameChassisIntrusion | cut -d '"' -f 2 | sed "s/$//g")
|
|
statusIntrusion=$(snmp $OID_statusChassisIntrusion | cut -d ' ' -f 4 | sed "s/$//g")
|
|
rawNamePS=$(snmp $OID_namePowerUnit | cut -d '"' -f 2 | sed "s/$//g")
|
|
readarray -t arrayNamePS <<< $rawNamePS
|
|
arrayStatusPS=($(snmp $OID_statusPowerUnit | cut -d ' ' -f 4 | sed "s/$//g"))
|
|
rawNameTemp=$(snmp $OID_temperatureProbeLocation | cut -d '"' -f 2 | sed "s/$//g")
|
|
readarray -t arrayNameTemp <<< $rawNameTemp
|
|
arrayStatusTemp=($(snmp $OID_temperatureProbeStatus | cut -d ' ' -f 4 | sed "s/$//g"))
|
|
arrayValueTemp=($(snmp $OID_temperatureProbeReading | cut -d ' ' -f 4 | sed "s/$//g" | awk '{ value = $1 /10; print value }')) ;;
|
|
esac
|
|
}
|
|
|
|
IDRAC.NormalState() {
|
|
case $1 in
|
|
1) printf "%s" "other" ;;
|
|
2) printf "%s" "unknow" ;;
|
|
3) printf "%s" "ok" ;;
|
|
4) printf "%s" "warning" ;;
|
|
5) printf "%s" "critical" ;;
|
|
6) printf "%s" "nonRecoverable" ;;
|
|
esac
|
|
}
|
|
|
|
IDRAC.ErrorCounter.NormalState() {
|
|
if [[ $1 == *"array"* ]] ; then
|
|
for((i=0; i<$1; i++))
|
|
do
|
|
case $1 in
|
|
1) warningCounter=$(( warningCounter + 1 )) ;;
|
|
2) unknownCounter=$(( unknownCounter + 1 )) ;;
|
|
3) okCounter=$(( okCounter + 1 )) ;;
|
|
4) warningCounter=$(( warningCounter + 1 )) ;;
|
|
5) criticalCounter=$(( criticalCounter + 1 )) ;;
|
|
6) criticalCounter=$(( criticalCounter + 1 )) ;;
|
|
esac
|
|
done
|
|
else
|
|
case $1 in
|
|
1) warningCounter=$(( warningCounter + 1 )) ;;
|
|
2) unknownCounter=$(( unknownCounter + 1 )) ;;
|
|
3) okCounter=$(( okCounter + 1 )) ;;
|
|
4) warningCounter=$(( warningCounter + 1 )) ;;
|
|
5) criticalCounter=$(( criticalCounter + 1 )) ;;
|
|
6) criticalCounter=$(( criticalCounter + 1 )) ;;
|
|
esac
|
|
fi
|
|
}
|
|
|
|
IDRAC.ProbeState() {
|
|
case $1 in
|
|
1) printf "%s" "other" ;;
|
|
2) printf "%s" "unknow" ;;
|
|
3) printf "%s" "ok" ;;
|
|
4) printf "%s" "nonCriticalUpper" ;;
|
|
5) printf "%s" "criticalUpper" ;;
|
|
6) printf "%s" "nonRecoverableUpper" ;;
|
|
7) printf "%s" "nonCriticalLower" ;;
|
|
8) printf "%s" "criticalLower" ;;
|
|
9) printf "%s" "nonRecoverableLower" ;;
|
|
10) printf "%s" "failed" ;;
|
|
esac
|
|
}
|
|
|
|
IDRAC.ErrorCounter.ProbeState() {
|
|
case $1 in
|
|
1) warningCounter=$(( warningCounter + 1 )) ;;
|
|
2) unknownCounter=$(( unknownCounter + 1 )) ;;
|
|
3) okCounter=$(( okCounter + 1 )) ;;
|
|
4) warningCounter=$(( warningCounter + 1 )) ;;
|
|
5) criticalCounter=$(( criticalCounter + 1 )) ;;
|
|
6) warningCounter=$(( warningCounter + 1 )) ;;
|
|
7) warningCounter=$(( warningCounter + 1 )) ;;
|
|
8) criticalCounter=$(( criticalCounter + 1 )) ;;
|
|
9) warningCounter=$(( warningCounter + 1 )) ;;
|
|
10) criticalCounter=$(( criticalCounter + 1 )) ;;
|
|
esac
|
|
}
|
|
|
|
IDRAC.Drive() {
|
|
IDRAC.GetData drive
|
|
|
|
if [[ $NoHeader != 1 ]] ; then
|
|
IDRAC.Drive.Header
|
|
fi
|
|
|
|
for((i=0; i<${#arrayNameDrive[@]}; i++))
|
|
do
|
|
printf "%s\t" "${arrayNameDrive[$i]}"
|
|
IDRAC.Drive.arrayStatus
|
|
IDRAC.Drive.arrayPredict
|
|
done
|
|
}
|
|
|
|
IDRAC.Drive.arrayStatus() {
|
|
case ${arrayStatusDrive[$i]} in
|
|
1) printf "%s\t" "unknown" ;;
|
|
2) printf "%s\t" "ready" ;;
|
|
3) printf "%s\t" "online" ;;
|
|
4) printf "%s\t" "foreign" ;;
|
|
5) printf "%s\t" "offline" ;;
|
|
6) printf "%s\t" "blocked" ;;
|
|
7) printf "%s\t" "failed" ;;
|
|
8) printf "%s\t" "non-raid" ;;
|
|
9) printf "%s\t" "removed" ;;
|
|
esac
|
|
}
|
|
|
|
IDRAC.Drive.arrayPredict() {
|
|
if [[ ${arrayPredictDrive[$i]} != 0 ]]; then
|
|
printf "%s\n" "predictive failure - replace drive"
|
|
else
|
|
printf "\n"
|
|
fi
|
|
}
|
|
|
|
IDRAC.Drive.Header() {
|
|
unknownCounter=0
|
|
okCounter=0
|
|
warningCounter=0
|
|
criticalCounter=0
|
|
readyCounter=0
|
|
onlineCounter=0
|
|
foreignCounter=0
|
|
offlineCounter=0
|
|
blockedCounter=0
|
|
failedCounter=0
|
|
nonraidCounter=0
|
|
removedCounter=0
|
|
predictiveCounter=0
|
|
|
|
for((i=0; i<${#arrayStatusDrive[@]}; i++))
|
|
do
|
|
case ${arrayStatusDrive[$i]} in
|
|
1) unknownCounter=$(( unknownCounter + 1 )) ;;
|
|
2) readyCounter=$(( readyCounter + 1 ))
|
|
okCounter=$(( okCounter + 1 )) ;;
|
|
3) onlineCounter=$(( onlineCounter + 1 ))
|
|
okCounter=$(( okCounter + 1 )) ;;
|
|
4) foreignCounter=$(( foreignCounter + 1 ))
|
|
warningCounter=$(( warningCounter + 1 )) ;;
|
|
5) offlineCounter=$(( offlineCounter + 1 ))
|
|
warningCounter=$(( warningCounter + 1 )) ;;
|
|
6) blockedCounter=$(( blockedCounter + 1 ))
|
|
warningCounter=$(( warningCounter + 1 )) ;;
|
|
7) failedCounter=$(( failedCounter + 1 ))
|
|
criticalCounter=$(( criticalCounter + 1 )) ;;
|
|
8) nonraidCounter=$(( nonraidCounter + 1 ))
|
|
okCounter=$(( okCounter + 1 )) ;;
|
|
9) removedCounter=$(( removedCounter + 1 ))
|
|
criticalCounter=$(( criticalCounter + 1 )) ;;
|
|
esac
|
|
|
|
if [[ ${arrayPredictDrive[$i]} = 1 ]]; then
|
|
predictiveCounter=$(( predictiveCounter + 1 ))
|
|
warningCounter=$(( warningCounter + 1 ))
|
|
fi
|
|
done
|
|
|
|
for Error in "$(( warningCounter + criticalCounter ))"; do
|
|
if [[ $warningCounter == 0 ]] && [[ $criticalCounter == 0 ]] ; then
|
|
printf "%s\t%s\n\n" "OK!" "All Drives are working correctly"
|
|
STATE=$STATE_OK
|
|
elif [[ $warningCounter != 0 ]] && [[ $criticalCounter == 0 ]] ; then
|
|
printf "%s\t%s\n\n" "WARNING!" "$Error Drive issue."
|
|
STATE=$STATE_WARN
|
|
else
|
|
printf "%s\t%s\n\n" "CRITICAL!" "$Error Drive issue."
|
|
STATE=$STATE_CRIT
|
|
fi
|
|
done
|
|
|
|
if [[ $predictiveCounter != 0 ]]; then
|
|
printf "%s\t%s\n" "" "$predictiveCounter in state Predictive Failure"
|
|
elif [[ $failedCounter != 0 ]]; then
|
|
printf "%s\t%s\n" "" "$failedCounter in state Failed"
|
|
elif [[ $removedCounter != 0 ]]; then
|
|
printf "%s\t%s\n" "" "$removedCounter in state Removed"
|
|
elif [[ $unknownCounter != 0 ]]; then
|
|
printf "%s\t%s\n" "" "$unknownCounter in state Unknown"
|
|
elif [[ $blockedCounter != 0 ]]; then
|
|
printf "%s\t%s\n" "" "$blockedCounter in state Blocked"
|
|
elif [[ $offlineCounter != 0 ]]; then
|
|
printf "%s\t%s\n" "" "$offlineCounter in state Offline"
|
|
elif [[ $foreignCounter != 0 ]]; then
|
|
printf "%s\t%s\n" "" "$foreignCounter in state Foreign"
|
|
fi
|
|
printf "\n"
|
|
}
|
|
|
|
IDRAC.GlobalDevice() {
|
|
IDRAC.GetData global
|
|
|
|
if [[ $NoHeader != 1 ]] ; then
|
|
IDRAC.GlobalDevice.Header
|
|
fi
|
|
|
|
printf "%s\t" "System Power Status:"
|
|
if [[ $systemPower == 4 ]]; then
|
|
IDRAC.GlobalDevice.PowerState
|
|
IDRAC.GlobalDevice.PowerUpTime
|
|
else
|
|
IDRAC.GlobalDevice.PowerState
|
|
fi
|
|
|
|
printf "%s\t" "Device Status:"
|
|
IDRAC.NormalState $globalSystem && printf "\n"
|
|
|
|
printf "%s\t" "Storage Status:"
|
|
IDRAC.NormalState $globalStorage && printf "\n"
|
|
|
|
printf "%s\t" "LCD Status:"
|
|
IDRAC.NormalState $systemLcd && printf "\n"
|
|
|
|
if [[ $warningCounter != 0 ]] || [[ $criticalCounter != 0 ]]; then
|
|
printf "%s\t%s\n" "Type: $productType" "ServiceTag: $serviceTag"
|
|
fi
|
|
}
|
|
|
|
IDRAC.GlobalDevice.PowerState() {
|
|
case $systemPower in
|
|
1) printf "%s\n" "other" ;;
|
|
2) printf "%s\n" "unknow" ;;
|
|
3) printf "%s\n" "off" ;;
|
|
4) printf "%s\n" "on" ;;
|
|
esac
|
|
}
|
|
|
|
IDRAC.GlobalDevice.PowerUpTime() {
|
|
printf "%s\t" "System PowerUp Time:"
|
|
local totalSeconds=$systemPowerUpTime;
|
|
local seconds=$((totalSeconds%60));
|
|
local minutes=$((totalSeconds/60%60));
|
|
local hours=$((totalSeconds/60/60%24));
|
|
local days=$((totalSeconds/60/60/24));
|
|
(( $days > 0 )) && printf '%dd ' $days;
|
|
(( $hours > 0 )) && printf '%dh ' $hours;
|
|
(( $minutes > 0 )) && printf '%dm ' $minutes;
|
|
(( $days > 0 || $hours > 0 || $minutes > 0 )) && printf '%ds\n' $seconds;
|
|
}
|
|
|
|
IDRAC.GlobalDevice.Header() {
|
|
unknownCounter=0
|
|
okCounter=0
|
|
warningCounter=0
|
|
criticalCounter=0
|
|
|
|
case $systemPower in
|
|
1) warningCounter=$(( warningCounter + 1 )) ;;
|
|
2) unknownCounter=$(( unknownCounter + 1 )) ;;
|
|
3) criticalCounter=$(( criticalCounter + 1 )) ;;
|
|
4) okCounter=$(( okCounter + 1 )) ;;
|
|
esac
|
|
|
|
arrayStatus=( $globalSystem $globalStorage $systemLcd )
|
|
|
|
for((i=0; i<${#arrayStatus[@]}; i++))
|
|
do
|
|
case ${arrayStatus[i]} in
|
|
1) warningCounter=$(( warningCounter + 1 )) ;;
|
|
2) unknownCounter=$(( unknownCounter + 1 )) ;;
|
|
3) okCounter=$(( okCounter + 1 )) ;;
|
|
4) warningCounter=$(( warningCounter + 1 )) ;;
|
|
5) criticalCounter=$(( criticalCounter + 1 )) ;;
|
|
6) criticalCounter=$(( criticalCounter + 1 )) ;;
|
|
esac
|
|
done
|
|
|
|
if [[ $warningCounter == 0 ]] && [[ $criticalCounter == 0 ]] ; then
|
|
printf "%s\t%s\t%s\n\n" "OK!" "Type: $productType" "ServiceTag: $serviceTag"
|
|
elif [[ $warningCounter != 0 ]] && [[ $criticalCounter == 0 ]] ; then
|
|
STATE=$STATE_WARN
|
|
printf "%s\t%s\n\n" "WARNING!" "$warningCounter Warning States"
|
|
elif [[ $criticalCounter != 0 ]] ; then
|
|
STATE=$STATE_CRIT
|
|
if [[ $systemPower = 3 ]] ; then
|
|
printf "%s\t%s\n" "CRITICAL!" "System is turned off"
|
|
printf "\t\t%s\n" "$criticalCounter Critical States"
|
|
if [[ $warningCounter != 0 ]] ; then
|
|
printf "\t\t%s\n" "$warningCounter Warning States"
|
|
fi
|
|
if [[ $unknownCounter != 0 ]] ; then
|
|
printf "\t\t%s\n" "$unknownCounter Unknown States"
|
|
fi
|
|
else
|
|
printf "%s\t%s\n" "CRITICAL!" "$criticalCounter Critical States"
|
|
if [[ $warningCounter != 0 ]] ; then
|
|
printf "\t\t%s\n" "$warningCounter Warning States"
|
|
fi
|
|
if [[ $unknownCounter != 0 ]] ; then
|
|
printf "\t\t%s\n" "$unknownCounter Unknown States"
|
|
fi
|
|
fi
|
|
fi
|
|
printf "\n"
|
|
}
|
|
|
|
IDRAC.Hardware() {
|
|
IDRAC.GetData hardware
|
|
|
|
IDRAC.Hardware.Header
|
|
|
|
printf "%s\t" "$nameFan"
|
|
IDRAC.NormalState $statusFan && printf "\n"
|
|
|
|
printf "%s\t\t" "$nameIntrusion"
|
|
IDRAC.NormalState $statusIntrusion && printf "\n"
|
|
|
|
for((i=0; i<${#arrayNameTemp[@]}; i++))
|
|
do
|
|
if [[ ${arrayNameTemp[$i]} == *"Inlet"* ]] ; then
|
|
printf "%s\t\t" "${arrayNameTemp[$i]}"
|
|
elif [[ ${arrayNameTemp[$i]} == *"Exhaust"* ]] ; then
|
|
printf "%s\t" "${arrayNameTemp[$i]}"
|
|
else
|
|
printf "%s\t\t\t" "${arrayNameTemp[$i]}"
|
|
fi
|
|
IDRAC.ProbeState ${arrayStatusTemp[i]} && printf "\n"
|
|
done
|
|
|
|
for((i=0; i<${#arrayNamePS[@]}; i++))
|
|
do
|
|
printf "%s\t\t\t" "${arrayNamePS[$i]}"
|
|
IDRAC.NormalState ${arrayStatusPS[i]} && printf "\n"
|
|
done
|
|
}
|
|
|
|
IDRAC.Hardware.Header() {
|
|
unknownCounter=0
|
|
okCounter=0
|
|
warningCounter=0
|
|
criticalCounter=0
|
|
|
|
for((i=0; i<${#arrayStatusPS[@]}; i++))
|
|
do
|
|
IDRAC.ErrorCounter.NormalState ${arrayStatusPS[i]}
|
|
done
|
|
for((i=0; i<${#arrayStatusTemp[@]}; i++))
|
|
do
|
|
IDRAC.ErrorCounter.NormalState ${arrayStatusTemp[i]}
|
|
done
|
|
|
|
IDRAC.ErrorCounter.NormalState $statusFan
|
|
IDRAC.ErrorCounter.NormalState $statusIntrusion
|
|
|
|
|
|
if [[ $warningCounter == 0 ]] && [[ $criticalCounter == 0 ]] ; then
|
|
printf "%s\t%s\n\n" "OK!" "All Hardware are working correctly"
|
|
elif [[ $warningCounter != 0 ]] && [[ $criticalCounter == 0 ]] ; then
|
|
printf "%s\t%s\n" "WARNING!" "$warningCounter Warning States"
|
|
if [[ $unknownCounter != 0 ]] ; then
|
|
printf "\t\t%s\n" "$unknownCounter Unknown States"
|
|
fi
|
|
STATE=$STATE_WARN
|
|
elif [[ $criticalCounter != 0 ]] ; then
|
|
printf "%s\t%s\n" "CRITICAL!" "$criticalCounter Critical States"
|
|
if [[ $warningCounter != 0 ]] ; then
|
|
printf "\t\t%s\n" "$warningCounter Warning States"
|
|
fi
|
|
if [[ $unknownCounter != 0 ]] ; then
|
|
printf "\t\t%s\n" "$unknownCounter Unknown States"
|
|
fi
|
|
STATE=$STATE_CRIT
|
|
fi
|
|
printf "\n"
|
|
}
|
|
|
|
# - Help
|
|
|
|
Help.Main() {
|
|
echo "Check IPMI Status"
|
|
echo ''
|
|
Help.Usage
|
|
echo ''
|
|
Help.Option
|
|
echo ''
|
|
Help.IPMI
|
|
echo ''
|
|
Help.IDRAC
|
|
echo ''
|
|
Help.Info
|
|
echo ''
|
|
exit $STATE_UNK
|
|
}
|
|
|
|
Help.Usage() {
|
|
printf "%s\n" "Method to compose the execution string"
|
|
printf "%s\n" "./$APPNAME -c <SNMP community> -h <host> -wa <value> -cr <value> -ipmi <object>"
|
|
}
|
|
|
|
Help.Option() {
|
|
printf "%s\n" "OPTIONS:"
|
|
printf "%s\t%s\t%s\n\t\t\t%s\n" "-c" "--community" "SNMP v2 community string with Read access." " Default is: $COMMUNITY."
|
|
printf "%s\t%s\t\t%s\n\t\t\t%s\n" "-h" "--host" "Host name or IP address to check." " Default is: $HOST_NAME."
|
|
printf "%s\t%s\t%s\n\t\t\t%s\n" "-wa" "--allert-wa" "Defines the threshold for Warning." " Default is: $WA."
|
|
printf "%s\t%s\t%s\n\t\t\t%s\n" "-cr" "--allert-cr" "Defines the threshold for Critical." " Default is: $CR."
|
|
printf "%s\t%s\t%s\n\t\t\t%s\n" "-ipmi" "" "Field for select element to check on IPMI Device" " { all | cpu | err | fan | he | temp }"
|
|
printf "%s\t%s\t%s\n\t\t\t%s\n" "-idrac" "" "Field for select element to check on IDRAC Device" " { all | drive | glob | hw }"
|
|
printf "%s\t%s\t\t%s\n" "-H" "--help" "Show script help"
|
|
printf "%s\t%s\t%s\n" "-V" "--version" "Show script version"
|
|
}
|
|
|
|
Help.IPMI() {
|
|
printf "\n%s\n\n" "IPMI Check Function"
|
|
printf "%s\t%s\n\n" "Check" "Description"
|
|
printf "%s\t%s\n" "all" "Full monitoring check with single output"
|
|
printf "%s\t%s\n" "cpu" "Monitoring CPU load"
|
|
printf "%s\t%s\n" "err" "Monitoring system error"
|
|
printf "%s\t%s\n" "fan" "Monitoring fan speed"
|
|
printf "%s\t%s\n" "ram" "Monitoring RAM load"
|
|
printf "%s\t%s\n" "hw" "Monitoring Hardware status"
|
|
printf "%s\t%s\n" "temp" "Monitoring temperature sensor"
|
|
}
|
|
|
|
Help.IDRAC() {
|
|
printf "\n%s\n\n" "IDRAC Check Function"
|
|
printf "%s\t%s\n\n" "Check" "Description"
|
|
printf "%s\t%s\n" "all" "[WiP] Full monitoring check with single output"
|
|
printf "%s\t%s\n" "drive" "Monitoring Drive unit"
|
|
printf "%s\t%s\n" "glob" "Monitoring Global system"
|
|
printf "%s\t%s\n" "hw" "Monitoring Hardware"
|
|
}
|
|
|
|
Help.Info() {
|
|
printf "%s\t%s\t%s\n" "INFO:" "$NAME" "$VERSION" "" "$AUTHOR" "$URL"
|
|
}
|
|
|
|
# - COMMAND LINE ENCODER
|
|
|
|
while test -n "$1"; do
|
|
case "$1" in
|
|
--host|-h)
|
|
HOST_NAME=$2
|
|
shift ;;
|
|
--comunity | -c)
|
|
COMMUNITY=$2
|
|
shift ;;
|
|
--allert-wa|-wa)
|
|
WA=$2
|
|
shift ;;
|
|
--allert-cr|-cr)
|
|
CR=$2
|
|
shift ;;
|
|
-ipmi)
|
|
IPMI.Main $2
|
|
shift ;;
|
|
-idrac)
|
|
IDRAC.Main $2
|
|
shift ;;
|
|
--help | -H)
|
|
Help.Main ;;
|
|
--version | -V)
|
|
Help.Info
|
|
exit $STATE ;;
|
|
*)
|
|
echo "Unknown argument: $1"
|
|
print_help
|
|
exit $STATE_UNK ;;
|
|
esac
|
|
shift
|
|
done |