]> git.sven.stormbind.net Git - sven/mpt-status.git/blob - mpt-status.init
- Remove depdency on daemonize, if you'd like to use
[sven/mpt-status.git] / mpt-status.init
1 #! /bin/sh
2
3 # Author: Petter Reinholdtsen <pere@hungry.com>
4 # Author: Sven Hoexter <sven@timegate.de>
5 # License: GNU General Public License v2 or later
6
7 # mpt-statusd - Check mpt-status values in the background.
8 #
9 # chkconfig: -
10 # description: Check mpt-status values in the background \
11 # using daemonize and the mpt-status utility.
12
13 ### BEGIN INIT INFO
14 # Provides:          mpt-statusd
15 # Required-Start:    $remote_fs $syslog
16 # Required-Stop:     $remote_fs $syslog
17 # Short-Description: Check mpt-status values in the background.
18 ### END INIT INFO
19
20 PATH=/sbin:/bin:/usr/sbin:/usr/bin
21 DESC="mpt-status monitor"
22 NAME=mpt-statusd
23 PIDFILE=/var/run/$NAME.pid
24 STATUSFILE=/var/run/$NAME.status
25 SCRIPTNAME=/etc/init.d/$NAME
26 LOCKFILE=/var/lock/subsys/$NAME
27
28 # Do not touch you can configure this in /etc/default/mpt-statusd
29 MAILTO=root   # Where to report problems
30 PERIOD=600    # Seconds between each check    (default 10 minutes)
31 REMIND=7200   # Seconds between each reminder (default 2 hours)
32 RUN_DAEMON=yes
33 ID=0
34
35 [ -e /etc/default/mpt-statusd ] && . /etc/default/mpt-statusd
36
37 # Gracefully exit if the package has been removed.
38 test -x /usr/sbin/mpt-status || exit 0
39
40 # Source function library.
41 . /etc/rc.d/init.d/functions
42
43 if [ $RUN_DAEMON = "no" ] ; then
44         echo "mpt-statusd is disabled in /etc/default/mpt-statusd, not starting." && failure
45         exit 0
46 fi
47
48
49 #Try to blindly load the mptctl module
50 modprobe mptctl || true
51
52 if ! [ -e "/proc/mpt/version" ] ; then
53         echo "The mptctl module is missing." && failure
54         exit 0
55 fi
56
57 check_mpt() {
58     echo $$ > $PIDFILE.new && mv $PIDFILE.new $PIDFILE
59     while true ; do
60         # Check ever $PERIOD seconds, send email on every status
61         # change and repeat ever $REMIND seconds if the raid is still
62         # bad.
63         if (mpt-status -i $ID) |grep -q 'state OPTIMAL' ; then
64             BADRAID=false
65         else
66             BADRAID=true
67             logger -t mpt-statusd "detected non-optimal RAID status"
68         fi
69         STATUSCHANGE=false
70         if [ true = "$BADRAID" ] ; then
71             # RAID not OK
72             (mpt-status -i $ID) > $STATUSFILE.new
73             if [ ! -f $STATUSFILE ] ; then # RAID just became broken
74                 STATUSCHANGE=true
75                 mv $STATUSFILE.new $STATUSFILE
76             elif cmp -s $STATUSFILE $STATUSFILE.new ; then
77                 # No change.  Should we send reminder?
78                 LASTTIME="`stat -c '%Z' $STATUSFILE`"
79                 NOW="`date +%s`"
80                 SINCELAST="`expr $NOW - $LASTTIME`"
81                 if [ $REMIND -le "$SINCELAST" ]; then
82                     # Time to send reminder
83                     STATUSCHANGE=true
84                     mv $STATUSFILE.new $STATUSFILE
85                 else
86                     rm $STATUSFILE.new
87                 fi
88             else
89                 STATUSCHANGE=true
90                 mv $STATUSFILE.new $STATUSFILE
91             fi
92         else
93             # RAID OK
94             if [ -f $STATUSFILE ] ; then
95                 rm $STATUSFILE
96                 STATUSCHANGE=true
97             fi
98         fi
99                 
100         if [ true = "$STATUSCHANGE" ]; then
101             hostname="`uname -n`"
102             (
103                 cat <<EOF 
104 This is a RAID status update from mpt-statusd.  The mpt-status
105 program reports that one of the RAIDs changed state:
106
107 EOF
108                 if [ -f $STATUSFILE ] ; then
109                     cat $STATUSFILE
110                 else
111                     (mpt-status -i $ID)
112                 fi
113                 echo
114                 echo "Report from $0 on $hostname"
115             ) | mail -s "info: mpt raid status change on $hostname" $MAILTO
116         fi
117         sleep $PERIOD
118     done
119 }
120
121 check_daemon() {
122         # Let's check if there is a daemon which is really running and not timing out
123         DAEMON_RUN=`ps aux | grep "/etc/init.d/mpt-statusd check_mpt" | grep -v grep | grep -v daemon`
124         if [ -n "$DAEMON_RUN" ] ; then
125                 return 1;
126         else
127                 return 0;
128         fi
129 }
130
131 #
132 #       Function that starts the daemon/service.
133 #
134 d_start() {
135     [ -f $PIDFILE ] && PID="`cat $PIDFILE`"
136     if [ "$PID" ] ; then
137         echo "Daemon already running. Refusing to start another" && warning
138         return 0
139     elif check_daemon ; then
140         # Use daemonize to turn it into a daemon and start it with daemon().
141         daemon --pidfile $PIDFILE /usr/sbin/daemonize $SCRIPTNAME check_mpt
142         RETVAL=$?
143         [ $RETVAL -eq 0 ] && touch $LOCKFILE
144         return $RETVAL
145     else
146         echo "Daemon is already running. Refusing to start another" && warning
147         return 0
148     fi
149 }
150
151 #
152 #       Function that stops the daemon/service.
153 #
154 d_stop() {
155         if [ -f $PIDFILE ] ; then
156                 killproc $SCRIPTNAME
157                 RETVAL=$?
158                 if [ $RETVAL -eq 0 ] ; then
159                     success "$NAME stopped"
160                     rm -f $PIDFILE $LOCKFILE
161                     return 0
162                 else
163                     echo "$NAME failed to stop" && failure
164                     return 1
165                 fi
166         else
167                 echo "$NAME is already stopped." && warning
168                 return 0
169         fi
170 }
171
172 # This is a workaround function which does not directly exit and
173 # therefore can be used by a restart
174 d_stop_by_restart() {
175         if [ -f $PIDFILE ] ; then
176                 killproc -p $PIDFILE $SCRIPTNAME > /dev/null 2>&1
177                 rm -f $PIDFILE $LOCKFILE
178         else
179                 echo "Daemon is already stopped." && warning
180         fi
181 }
182
183 case "$1" in
184   start)
185         echo $"Starting $DESC: $NAME"
186         d_start
187         echo
188         ;;
189   stop)
190         echo $"Stopping $DESC: $NAME"
191         d_stop
192         echo
193         ;;
194   check_mpt)
195         check_mpt
196         ;;
197   restart|force-reload)
198         echo "Restarting $DESC: $NAME"
199         d_stop_by_restart
200         sleep 1
201         d_start
202         echo
203         ;;
204   *)
205         echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload}" >&2
206         exit 1
207         ;;
208 esac
209
210 exit 0