]> git.openstreetmap.org Git - chef.git/blobdiff - cookbooks/hardware/templates/default/cciss-vol-statusd.erb
Add local implementation of cciss-vol-statusd
[chef.git] / cookbooks / hardware / templates / default / cciss-vol-statusd.erb
diff --git a/cookbooks/hardware/templates/default/cciss-vol-statusd.erb b/cookbooks/hardware/templates/default/cciss-vol-statusd.erb
new file mode 100755 (executable)
index 0000000..8f25650
--- /dev/null
@@ -0,0 +1,77 @@
+#!/bin/sh
+
+NAME="cciss-vol-statusd"
+STATUSFILE=/var/run/$NAME.status
+
+# Do not touch you can configure this in /etc/default/cciss-vol-statusd
+MAILTO=root   # Where to report problems
+PERIOD=600    # Seconds between each check    (default 10 minutes)
+REMIND=7200   # Seconds between each reminder (default 2 hours)
+ID=/dev/cciss/c0d0
+
+[ -e /etc/default/cciss-vol-statusd ] && . /etc/default/cciss-vol-statusd
+
+# Gracefully exit if the package has been removed.
+test -x /usr/bin/cciss_vol_status || exit 0
+
+while true ; do
+    # Check ever $PERIOD seconds, send email on every status
+    # change and repeat ever $REMIND seconds if the raid is still
+    # bad.
+    if (cciss_vol_status $ID); then
+        BADRAID=false
+    else
+        BADRAID=true
+        logger -t cciss-vol-statusd "detected non-optimal RAID status"
+    fi
+    STATUSCHANGE=false
+    if [ true = "$BADRAID" ] ; then
+        # RAID not OK
+        (cciss_vol_status $ID) > $STATUSFILE.new
+        if [ ! -f $STATUSFILE ] ; then # RAID just became broken
+            STATUSCHANGE=true
+            mv $STATUSFILE.new $STATUSFILE
+        elif cmp -s $STATUSFILE $STATUSFILE.new ; then
+            # No change.  Should we send reminder?
+            LASTTIME="`stat -c '%Z' $STATUSFILE`"
+            NOW="`date +%s`"
+            SINCELAST="`expr $NOW - $LASTTIME`"
+            if [ $REMIND -le "$SINCELAST" ]; then
+                # Time to send reminder
+                STATUSCHANGE=true
+                mv $STATUSFILE.new $STATUSFILE
+            else
+                rm $STATUSFILE.new
+            fi
+        else
+            STATUSCHANGE=true
+            mv $STATUSFILE.new $STATUSFILE
+        fi
+    else
+        # RAID OK
+        if [ -f $STATUSFILE ] ; then
+            rm $STATUSFILE
+            STATUSCHANGE=true
+        fi
+    fi
+
+    if [ true = "$STATUSCHANGE" ]; then
+        hostname="`uname -n`"
+        (
+            cat <<EOF
+This is a RAID status update from cciss-vol-statusd.  The cciss_vol_status
+program reports that one of the RAIDs changed state:
+
+EOF
+            if [ -f $STATUSFILE ] ; then
+                cat $STATUSFILE
+            else
+                (cciss_vol_status $ID)
+            fi
+            echo
+            echo "Report from $0 on $hostname"
+        ) | mail -s "info: CCISS raid status change on $hostname" $MAILTO
+    fi
+
+    sleep $PERIOD
+done