403Webshell
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 :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /lib64/nagios/plugins/check_raid_status.sh
#!/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	

Youez - 2016 - github.com/yon3zu
LinuXploit