====== check-raid-status ====== #!/bin/sh # raid_status - check the state of the RAID. # This script works for various types of RAID devices. (Currently, 3Ware, # gmirror, BSd 'ar0' raids, zpool) # WARNING: Install the proper CLI program for your 3ware card, if you use 3ware. # Set up a cronjob like this: # */16 * * * * /home/rudy/bin/raid_status CRON ### Copyright (c) 2006, Rudy Rucker All rights reserved. ### Redistribution and use of script, with or without modification, is ### permitted provided that the following condition is met: ### Redistributions of source code must retain the above copyright ### notice, this list of conditions and the following disclaimer. ### THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND ### ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ### IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ### ARE DISCLAIMED. # ----------- Change Log ------------ # Mon Oct 11 15:20:37 PDT 2004 - rudy # Original script. # Tue Feb 7 01:28:07 PST 2006 - rudy # Added 9500 and 9550 support # Fri Jun 9 10:38:33 PDT 2006 - rudy # works for 'ar' and 'tw' mirrored arrays # Tue Sep 12 10:23:13 PDT 2006 - rudy # Added gmirror and realized that not all 3ware's are the same... # Fri Jan 18 00:46:13 PST 2008 - rudy # going to add support for multiple geom mirrors. gm0s1, gm0s2, etc... # Fri Jan 18 01:03:25 PST 2008 - rudy # added zpool status checking. untested :) # Fri Jan 18 01:23:54 PST 2008 # can check machines with multiple array types... got zfs and gmirror? # tested a machine with zfs and gmirror # --------------------------------------------------------------------- # # Variables # TWCLI="/opt/3ware/CLI/tw_cli"; AWK="/usr/bin/awk"; GREP="/bin/grep"; VALID="OK"; CONTROLLER="c2"; UNITS="u0 u1"; PORTS="p0 p1 p2 p3 p4 p5"; hostname=$(hostname -f); UNITSTATUS=""; PORTSTATUS=""; # # Functions # function_get_ports () { echo; } function_get_units () { echo; } function_get_controllers () { echo; } function_report_unit_status () { TEMPUNITSTATUS=$1; if [ "$UNITSTATUS" = "$VALID" ]; then echo "Unit-Status /"$CONTROLLER"/"$UNIT": Condition Good"; $TWCLI info $CONTROLLER $UNIT; echo else # ERROR! Either print to TTY or send an email, based on MODE (which is arg[1]) if [ "$MODE" = "CRON" ]; then $ESTATUS_CMD | $MAIL -s "[ERROR] Raid array on $HOST returned $STATUS" $EMAIL else echo "ERROR condition" $ESTATUS_CMD; fi fi } function_report_port_status () { TEMPUNITSTATUS=$1; if [ "$UNITSTATUS" = "$VALID" ]; then echo "Condition Good"; $TWCLI info $CONTROLLER $UNIT; echo else # ERROR! Either print to TTY or send an email, based on MODE (which is arg[1]) if [ "$MODE" = "CRON" ]; then $ESTATUS_CMD | $MAIL -s "[ERROR] Raid array on $HOST returned $STATUS" $EMAIL else echo "ERROR condition" $ESTATUS_CMD; fi fi } function_check_unit () { UNITSTATUS=$(${TWCLI} /${CONTROLLER}/${UNIT} show | $GREP "^${UNIT} " | ${AWK} {'print $3'}); } function_check_port () { PORTSTATUS=$(${TWCLI} /${CONTROLLER}/${PORT} show | $GREP "^${PORT}" | ${AWK} {'print $2'}); } function_main () { for i in $UNITS; do UNIT=$i; echo "for UNIT: "$UNIT" Controller: "$CONTROLLER; function_check_unit; function_report_unit_status; done; for a in $PORTS; do PORT=$a; echo "for PORT: "$PORT" CONTROLLER: "$CONTROLLER; function_check_port; function_report_port_status; done; } function_main;