| Server IP : 172.64.80.1 / Your IP : 216.73.216.175 Web Server : LiteSpeed System : Linux srv13.swhc.ca 4.18.0-553.126.2.lve.el8.x86_64 #1 SMP Thu May 28 14:12:30 UTC 2026 x86_64 User : hongluck ( 2522) PHP Version : 7.4.33 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : ON | Sudo : OFF | Pkexec : OFF Directory : /lib64/nagios/plugins/ |
Upload File : |
#!/bin/bash
# Initialise all variables
MD_STATUS=0
MD_MSG=""
HW_STATUS=0
HW_MSG=""
HW_OK_MSG=""
HAS_MD=0
HAS_HW=0
STATE_OK=0
STATE_WARNING=1
STATE_CRITICAL=2
STATE_UNKNOWN=3
STATE_DEPENDENT=4
MEGACLI=$(which megacli 2>/dev/null)
MDADM=$(which mdadm 2>/dev/null)
function check_megaraid {
DETECT_PREDICTIVE_FAILURE='yes'
LINEFEED=" --- "
# Report virtual drive issues (partially degraded, degraded)
for VIRTUAL_DRIVE in `$MEGACLI -LDInfo -Lall -a$ADAPTER -NoLog | grep -o 'Virtual Drive: [0-9]\+' | sed -e 's/.*: //'` ; do
LDINFO=`$MEGACLI -LDInfo -L${VIRTUAL_DRIVE} -a$ADAPTER -NoLog`
SIZE=`echo "$LDINFO" | grep '^Size' | sed -e 's/.*: //'`
STATE=`echo "$LDINFO" | grep '^State' | sed -e 's/.*: //'`
if [ "$STATE" != "Optimal" ] ; then
if [ -z "$HW_MSG" ] ; then
HW_MSG="Virtual drive $VIRTUAL_DRIVE ($SIZE): $STATE"
else
HW_MSG="${HW_MSG}${LINEFEED}Virtual drive $VIRTUAL_DRIVE ($SIZE): $STATE"
fi
fi
done
# Report missing disks
MISSING_DISK_INFO=`$MEGACLI -PdGetMissing -a$ADAPTER -NoLog`
if echo "$MISSING_DISK_INFO" | grep --silent 'Adapter.*Missing Physical drives' ; then
while read line ; do
NUMBER=`echo "$line" | awk '{print $1}'`
ARRAY=`echo "$line" | awk '{print $2}'`
ROW=`echo "$line" | awk '{print $3}'`
SIZE=`echo "$line" | awk '{print $4}'`
UNIT=`echo "$line" | awk '{print $5}'`
MISSING_HW_MSG="Missing disk: Nr=$NUMBER Array=$ARRAY Row=$ROW Size=$SIZE $UNIT"
if [ -z "$HW_MSG" ] ; then
HW_MSG="$MISSING_HW_MSG"
else
HW_MSG="${HW_MSG}${LINEFEED}${MISSING_HW_MSG}"
fi
done < <(echo "$MISSING_DISK_INFO" | grep -o '[0-9]\+[[:space:]]\+[0-9]\+[[:space:]]\+[0-9]\+[[:space:]]\+[0-9]\+[[:space:]]*[KMGT]B')
fi
# Report physical drive errors
HW_STATUS=$STATE_OK
for ENCLOSURE_ID in `$MEGACLI -PDList -a$ADAPTER -NoLog | grep "Enclosure Device" | awk '{print $4}' | sort -nu` ;do
for SLOT in `$MEGACLI -PDList -a$ADAPTER -NoLog | grep -A 1 "Enclosure Device ID: $ENCLOSURE_ID" | grep "Slot Number" | awk '{print $3}'` ; do
DISKINFO=`$MEGACLI -pdinfo -PhysDrv [$ENCLOSURE_ID:$SLOT] -a$ADAPTER -NoLog`
DISK_TYPE=`echo "$DISKINFO" | grep 'PD Type:' | sed -e 's/.*: //'`
DISK_WWN=`echo "$DISKINFO" | grep 'WWN:' | sed -e 's/.*: //'`
DISK_SERIAL=`echo "$DISKINFO" | grep 'Inquiry Data:' | sed -e 's/.*: //'`
SIZE=`echo "$DISKINFO" | grep 'Raw Size:' | sed -e 's/.*: //' | sed -e 's/ \[0x.*//'`
if [ "$DETECT_PREDICTIVE_FAILURE" = "yes" ] ; then
PREDICTIVE_FAILURE_REGEX='\|Predictive Failure'
else
PREDICTIVE_FAILURE_REGEX=''
fi
ERRORLINES=`echo "$DISKINFO" | grep 'Count: [1-9]\|Firmware state:' | grep -v "Firmware state: Online\|Firmware state: JBOD\|Firmware state: Hotspare$PREDICTIVE_FAILURE_REGEX"`
if [ -n "$ERRORLINES" ] ; then
NUMBER_OF_MEDIA_AND_OTHER_ERRORS=0
NUMBER_OF_ERRORLINES=0
DISKHW_MSG=""
while read line ; do
let NUMBER_OF_ERRORLINES=$NUMBER_OF_ERRORLINES+1
if echo "$line" | grep --silent 'Error Count' ; then
let NUMBER_OF_MEDIA_AND_OTHER_ERRORS=$NUMBER_OF_MEDIA_AND_OTHER_ERRORS+1
fi
if echo "$line" | grep --silent 'Rebuild' ; then
REBUILD_PROGRESS=`$MEGACLI -pdrbld -showprog -physdrv [$ENCLOSURE_ID:$SLOT] -a$ADAPTER -NoLog | grep -o 'Completed [0-9]\+%'`
line="$line ($REBUILD_PROGRESS)"
fi
if [ -z "$DISKHW_MSG" ] ; then
DISKHW_MSG=`echo Enclosure/slot [$ENCLOSURE_ID:$SLOT] WWN=$DISK_WWN $DISK_SERIAL "($SIZE)" - $line`
else
DISKHW_MSG="$DISKHW_MSG - `echo $line`"
fi
done < <(echo "$ERRORLINES")
if [ $NUMBER_OF_ERRORLINES -eq $NUMBER_OF_MEDIA_AND_OTHER_ERRORS ] ; then
HW_STATUS=$STATE_WARNING
else
HW_STATUS=$STATE_CRITICAL
fi
if [ -z "$HW_MSG" ] ; then
HW_MSG="$DISKHW_MSG"
else
HW_MSG="${HW_MSG}${LINEFEED}${DISKHW_MSG}"
fi
fi
done
done
}
function check_mds {
# Get count of raid arrays
RAID_DEVICES=`grep ^md -c /proc/mdstat`
# Get count of degraded arrays
RAID_STATUS=`grep "\[.*_.*\]" /proc/mdstat -c`
# Is an array currently recovering or resyncing, get percentage of recovery
RAID_RECOVER=`grep recovery /proc/mdstat | awk '{print $4}'`
RAID_RESYNC=`grep resync /proc/mdstat | awk '{print $4}'`
# Check raid status
if [[ $RAID_RECOVER ]]; then
# RAID recovery --> Warning
MD_MSG="Checked $RAID_DEVICES MD arrays, recovering: $RAID_RECOVER"
MD_STATUS=$STATE_WARNING
elif [[ $RAID_RESYNC ]]; then
# RAID resync --> Warning
MD_MSG="Checked $RAID_DEVICES MD arrays, resync: $RAID_RESYNC"
MD_STATUS=$STATE_WARNING
elif [[ $RAID_STATUS == "0" ]]; then
# RAID ok
MD_MSG="$RAID_DEVICES healthy MD arrays"
MD_STATUS=$STATE_OK
else
# All else critical, better safe than sorry
MD_MSG="$RAID_STATUS of $RAID_DEVICES MD arrays have FAILED"
MD_STATUS=$STATE_CRITICAL
fi
}
MD_LIST=$(${MDADM} --detail --scan | cut -d' ' -f2)
if [ -n "$MDADM" ] && [ -n "$MD_LIST" ]; then
# Test MDs
HAS_MD=1
check_mds
fi
if [ -e "$MEGACLI" ]; then
# Test hardware RAID
HAS_HW=1
check_megaraid
fi
# We've got MDs present so print the mdstat status
if [ $HAS_MD -eq 1 ]; then
echo -n $MD_MSG
fi
# Both MD and 3ware RAIDs present, separate messages with a comma
if [ $HAS_MD -eq 1 ] && [ $HAS_HW -eq 1 ]; then
echo -n ", "
fi
# We've got hware so print the hware message
if [ $HAS_HW -eq 1 ]; then
if [ -z "$HW_MSG" ] ; then
echo -n "no disk problems found"
else
echo -n $HW_MSG
fi
fi
# Didn't detect any RAID devices
if [ $HAS_MD -eq 0 ] && [ $HAS_HW -eq 0 ]; then
echo -n "No RAID devices to check"
fi
# Work out what to return
if [ $MD_STATUS -ge 2 ] && [ $HW_STATUS -ge 2 ]; then
# Status CRITICAL
echo " : CRITICAL"
exit $STATE_CRITICAL
elif [ $MD_STATUS -eq 1 ] && [ $HW_STATUS -eq 1 ]; then
# Status WARNING
echo " : WARNING"
exit $STATE_WARNING
else
# Status OK
echo " : OK"
exit $STATE_OK
fi