Package: mpt-status
Version: 1.2.0-6
Severity: normal

At line 15 of /etc/init.d/mpt-statusd in mpt-status 1.2.0-6
is included the bash internal command:

set -e

Code around line 67 of /etc/init.d/mpt-statusd in mpt-status 1.2.0-6 is:

        if [ true = "$BADRAID" ] ; then
            # RAID not OK
            (mpt-status -i $ID) > $STATUSFILE.new
            if [ ! -f $STATUSFILE ] ; then # RAID just became broken

When any abnormal condition is detected by mpt-status, its return code is non-
zero.

This exits immediately the pipeline intended to update the $STATUSFILE.new
file,
aborting the whole check_mpt loop.

The quickest (and poorest) workaround is enclosing the test line in a sort of
jail,
to immunize the outer script from exiting while a real abnormal condition is
detected

       if [ true = "$BADRAID" ] ; then
            # RAID not OK
set +e
            (mpt-status -i $ID) > $STATUSFILE.new
set -e
            if [ ! -f $STATUSFILE ] ; then # RAID just became broken




-- System Information:
Debian Release: squeeze/sid
  APT prefers testing
  APT policy: (500, 'testing')
Architecture: amd64 (x86_64)

Kernel: Linux 2.6.32-trunk-amd64 (SMP w/4 CPU cores)
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash

Versions of packages mpt-status depends on:
ii  daemon                        0.6.4-1    turns other processes into daemons
ii  libc6                         2.11.2-2   Embedded GNU C Library: Shared lib
ii  lsb-base                      3.2-23.1   Linux Standard Base 3.2 init scrip

mpt-status recommends no packages.

Versions of packages mpt-status suggests:
ii  bsd-mailx [mailx]  8.1.2-0.20100314cvs-1 simple mail user agent
ii  heirloom-mailx [ma 12.4-2                feature-rich BSD mail(1)

-- Configuration Files:
/etc/init.d/mpt-statusd changed:
set -e
PATH=/sbin:/bin:/usr/sbin:/usr/bin
DESC="mpt-status monitor"
NAME=mpt-statusd
PIDFILE=/var/run/$NAME.pid
STATUSFILE=/var/run/$NAME.status
SCRIPTNAME=/etc/init.d/$NAME
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=0
[ -e /etc/default/mpt-statusd ] && . /etc/default/mpt-statusd
test -x /usr/sbin/mpt-status || exit 0
. /lib/lsb/init-functions
[ -e /etc/default/rcS ] && . /etc/default/rcS
if [ $RUN_DAEMON = "no" ] ; then
        log_begin_msg "mpt-statusd is disabled in /etc/default/mpt-statusd, not 
starting."
        log_end_msg 0
        exit 0
fi
if ! [ -e "/proc/mpt/version" ] ; then
        log_failure_msg "The mptctl module is missing. Please have a look at 
the README.Debian.gz."
        log_end_msg 0
        exit 0
fi
check_mpt() {
    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 (mpt-status -i $ID) |grep -q 'state OPTIMAL' ; then
            BADRAID=false
        else
            BADRAID=true
            logger -t mpt-statusd "detected non-optimal RAID status"
        fi
        STATUSCHANGE=false
        if [ true = "$BADRAID" ] ; then
            # RAID not OK
set +e
            (mpt-status -i $ID) > $STATUSFILE.new
set -e
            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 mpt-statusd.  The mpt-status
program reports that one of the RAIDs changed state:
EOF
                if [ -f $STATUSFILE ] ; then
                    cat $STATUSFILE
                else
                    (mpt-status -i $ID)
                fi
                echo
                echo "Report from $0 on $hostname"
            ) | mail -s "info: mpt 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/mpt-statusd check_mpt" | grep -v 
grep | grep -v daemon`
        if [ -n "$DAEMON_RUN" ] ; then
                return 1;
        else
                return 0;
        fi
}
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 /usr/bin/daemon $SCRIPTNAME 
check_mpt
        return 0
    else
        log_progress_msg "Daemon is already running. Refusing to start another"
        return 0
    fi
}
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
}
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_mpt)
        check_mpt
        ;;
  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


-- no debconf information



-- 
To UNSUBSCRIBE, email to debian-bugs-dist-requ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org

Reply via email to