tags 656630 + patch thanks On Fri, Jan 20, 2012 at 05:00:41PM +0100, Olivier Berger wrote: > > It would be great to have a script such as the one proposed by Adam Cécile in > its variant of the package. > > See : http://hwraid.le-vert.net/debian/sources/cciss-vol-status_1.03-1.dsc > for sources of its package. >
I've slightly adapted the script to adjust it to the current path. Here's the result, which depends on the 'daemon' package. Hope this helps. Best regards, -- Olivier BERGER http://www-public.it-sudparis.eu/~berger_o/ - OpenPGP-Id: 2048R/5819D7E8 Ingenieur Recherche - Dept INF Institut TELECOM, SudParis (http://www.it-sudparis.eu/), Evry (France)
#! /bin/sh # Author: Petter Reinholdtsen <[email protected]> # Author: Adam Cécile (Le_Vert) <[email protected]> # License: GNU General Public License v2 or later # ### BEGIN INIT INFO # Provides: cciss-vol-statusd # Required-Start: $remote_fs $syslog # Required-Stop: $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Check cciss_vol_status values in the background. ### END INIT INFO set -e PATH=/sbin:/bin:/usr/sbin:/usr/bin DESC="cciss_vol_status monitor" NAME="cciss-vol-statusd" PIDFILE=/var/run/$NAME.pid STATUSFILE=/var/run/$NAME.status SCRIPTNAME=/etc/init.d/$NAME # 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) RUN_DAEMON=yes 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 . /lib/lsb/init-functions . /etc/default/rcS if [ $RUN_DAEMON = "no" ] ; then log_begin_msg "cciss-vol-statusd is disabled in /etc/default/cciss-vol-statusd, not starting." log_end_msg 0 exit 0 fi check_cciss() { echo $$ > $PIDFILE.new && mv $PIDFILE.new $PIDFILE 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-status-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 } check_daemon() { # Let's check if there is a daemon which is really running and not timing out DAEMON_RUN=`ps aux | grep "/etc/init.d/cciss-vol-statusd check_cciss" | grep -v grep | grep -v daemon` if [ -n "$DAEMON_RUN" ] ; then return 1; else return 0; fi } # # Function that starts the daemon/service. # d_start() { [ -f $PIDFILE ] && PID="`cat $PIDFILE`" if [ "$PID" ] ; then log_progress_msg "Daemon already running. Refusing to start another" return 0 elif check_daemon ; then # Use the daemon package to turn this script into a daemon start-stop-daemon --start --quiet --pidfile $PIDFILE \ --oknodo --exec /usr/bin/daemon $SCRIPTNAME check_cciss return 0 else log_progress_msg "Daemon is already running. Refusing to start another" return 0 fi } # # Function that stops the daemon/service. # d_stop() { if [ -f $PIDFILE ] ; then start-stop-daemon --oknodo --stop --quiet --pidfile $PIDFILE rm -f $PIDFILE return 0 else log_progress_msg "Daemon is already stopped." return 0 fi } # This is a workaround function which does not directly exit and # therefore can be used by a restart d_stop_by_restart() { if [ -f $PIDFILE ] ; then start-stop-daemon --oknodo --stop --quiet --pidfile $PIDFILE rm -f $PIDFILE log_end_msg 0 else log_progress_msg "Daemon is already stopped." log_end_msg 0 fi } case "$1" in start) echo -n "" log_begin_msg "Starting $DESC: $NAME" d_start ; CODE=$? log_end_msg $CODE ;; stop) log_begin_msg "Stopping $DESC: $NAME" d_stop ; CODE=$? log_end_msg $CODE ;; check_cciss) check_cciss ;; restart|force-reload) log_begin_msg "Restarting $DESC: $NAME" d_stop_by_restart sleep 1 d_start || CODE=$? log_end_msg $CODE ;; *) # echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2 echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload}" >&2 exit 1 ;; esac exit 0

