# NagCollect -- Nagios Data Collector for Passive Checks
-# Copyright (c)2009 Alexander Barton, alex@barton.de
+# Copyright (c)2009-2011 Alexander Barton, alex@barton.de
SERVICE="RAID_p"
if [ `uname` = "Darwin" ]; then
tmp=`mktemp "/tmp/$$.XXXX"`
- LC_ALL=C diskutil checkRAID >"$tmp"
+ tmp2=`mktemp "/tmp/$$-2.XXXX"`
+ LC_ALL=C diskutil checkRAID >"$tmp" 2>/dev/null
if [ $? -eq 0 ]; then
# Apple Software-RAID detected
- statusText=`grep "^Status:" "$tmp"`
- status=`echo "$statusText" | cut -d' ' -f2-`
+ statusString1=`grep "^Status:" "$tmp" | uniq`
+ status=`echo $statusString1 | sed -e 's/Status: //g'`
+ statusString=`grep "^Status:" "$tmp"`
+ statusText=`echo $statusString | sed -e 's/Status: //g' | sed -e 's/ /, /g'`
if [ "$status" != "Online" ]; then
STATUS=2
- TEXT="ERROR - RAID is $status"
+ TEXT="$TEXT SW-RAID is $statusText."
else
- STATUS=0
- TEXT="OK - RAID status is good."
+ [ -z "$STATUS" ] && STATUS=0
+ TEXT="$TEXT SW-RAID status is good."
fi
fi
- rm -f "$tmp"
+ LC_ALL=C raidutil list status 2>/dev/null | grep "RAID " >"$tmp"
+ if [ $? -eq 0 ]; then
+ # Apple Hardware-RAID detected
+ declare -i good=0
+ declare -i bad=0
+ status=""
+ while read x; do
+ v=`echo "$x" | cut -d' ' -f1`
+ s=`echo "$x" | cut -b67- | sed -e 's/://g'`
+ s2=`echo "$x" | cut -b78-`
+ [ -n "$status" ] \
+ && status="$status, $v:$s" \
+ || status="$v:$s"
+ [ "$s2" = "Good" ] && good=$good+1 || bad=bad+1
+ done <"$tmp"
+ if [ $bad -eq 0 -a $good -ge 1 ]; then
+ [ -z "$STATUS" ] && STATUS=0
+ TEXT="$TEXT Apple HW-RAID is good: $status."
+ elif [ $bad -gt 0 ]; then
+ STATUS=2
+ TEXT="$TEXT Apple HW-RAID status: $status."
+ else
+ [ -z "$STATUS" -o "$STATUS" = "1" ] && STATUS=1
+ TEXT="$TEXT Apple HW-RAID status is unknown ($status)!?"
+ fi
+ fi
+ LC_ALL=C screen -D -m sh -c "promiseutil -C array -a list -v >$tmp2"
+ grep -A8 '^LdId' "$tmp2" | grep '^[0-9]' >"$tmp"
+ if [ $? -eq 0 ]; then
+ # Promise Hardware-RAID detected
+ declare -i good=0
+ declare -i bad=0
+ status=""
+ while read x; do
+ v=`echo "$x" | awk "{ print \\$2 }"`
+ z=`echo "$x" | awk "{ print \\$3 }"`
+ s=`echo "$x" | awk "{ print \\$4 }"`
+ [ -n "$status" ] \
+ && status="$status, $v($z):$s" \
+ || status="$v($z):$s"
+ [ "$s" = "OK" ] && good=$good+1 || bad=bad+1
+ done <"$tmp"
+ if [ $bad -eq 0 -a $good -ge 1 ]; then
+ [ -z "$STATUS" ] && STATUS=0
+ TEXT="$TEXT Promise HW-RAID is good: $status."
+ elif [ $bad -gt 0 ]; then
+ STATUS=2
+ TEXT="$TEXT Promise HW-RAID status: $status."
+ else
+ [ -z "$STATUS" -o "$STATUS" = "1" ] && STATUS=1
+ TEXT="$TEXT Promise HW-RAID status is unknown ($status)!?"
+ fi
+ fi
+ rm -f "$tmp" "$tmp2"
+elif [ `uname` = "Linux" -a -r /proc/mdstat ]; then
+ status=$(cat /proc/mdstat | grep -E "(^md|^ [0-9])" \
+ | while read info1; do
+ read info2
+ dev=`echo $info1 | cut -d' ' -f1`
+ stat=`echo $info2 | cut -d'[' -f 3 | cut -d']' -f1`
+ echo -n " $dev:$stat"
+ done)
+ if [ -n "$status" ]; then
+ if [ "`echo $status | tr -d 'md0123456789: U'`" = "" ]; then
+ [ -z "$STATUS" ] && STATUS=0
+ TEXT="$TEXT SW-RAID is good: $status."
+ else
+ STATUS=2
+ TEXT="$TEXT SW-RAID status: $status."
+ fi
+ fi
+fi
+
+if [ -n "$TEXT" ]; then
+ case "$STATUS" in
+ 0) TEXT="OK -${TEXT}"; ;;
+ 1) TEXT="WARNING -${TEXT}"; ;;
+ 2) TEXT="ERROR -${TEXT}"; ;;
+ *) TEXT="UNKNOWN -${TEXT}"; ;;
+ esac
fi