#!/bin/sh
#
# Copyright 2003 Meru Networks
# All rights reserved.
#
PROC=/opt/meru/bin/watchdog
KDIR=/opt/meru/kernel
KMODDIR=/lib/modules/2.4.18-3-meruenabled/kernel/drivers

# Set the littledog so that it can be turned off from CLI or else it will reboot when WD is disabled.
ARGS="littledog_nowayout=0"
TIMEOUT=30

START_DELAY=.2

MNAME=`basename $PROC`
PIDFILE=/opt/wlan/var/run/${MNAME}.pid
LOG=/opt/wlan/var/log/${MNAME}.log

if [ -f /etc/init.d/meru-functions ]; then
	. /etc/init.d/meru-functions
else
	echo "/etc/init.d/meru-functions must exist to use $0"; exit 1
fi

if [ ! -e /dev/watchdog ]; then
    mknod /dev/watchdog c 10 130
fi

set_platform

start() {

    vrfy_combo `cat $PIDFILE 2>/dev/null` && {
        return
    }

    echo "============ $0 start =================" >> $LOG
    cd /opt/wlan/etc
 
    case $PLATFORM in 
        MC500)
            lsmod | grep littledog >/dev/null || {
                insmod -m $KDIR/littledog.mod $ARGS > $KDIR/${mod}.map || fail "insmod failed"
            }
            ;;
        MC500a)
            lsmod | grep fw7500_wdt >/dev/null || {
                insmod -m $KDIR/fw7500_wdt.mod > $KDIR/${mod}.map || fail "insmod failed"
            }
            ;;
        MC1000)
            lsmod | grep mc1000_wdt >/dev/null || {
                insmod -m $KDIR/mc1000_wdt.mod > $KDIR/${mod}.map || fail "insmod failed"
            }
            ;;
        MC1100)
            lsmod | grep cpci_wdt >/dev/null || {
                insmod -m $KDIR/cpci_wdt.mod > $KDIR/${mod}.map || fail "insmod failed"
            }
            ;;
        MC1500)
            lsmod | grep ich_wdt >/dev/null || {
                insmod -m $KDIR/ich_wdt.mod > $KDIR/${mod}.map || fail "insmod failed"
            }
            ;;
        MC3000)
            lsmod | grep i6300_wdt >/dev/null || {
                insmod -m $KDIR/i6300_wdt.mod > $KDIR/${mod}.map || fail "insmod failed"
            }
            ;;
        MC4000|MC4100)
            lsmod | grep i810-tco >/dev/null || {
                modprobe $KMODDIR/char/i810-tco.o >/dev/null || fail "insmod failed"
            }
            ;;
        MC5000)
            lsmod | grep ipmi_watchdog >/dev/null || { 
                modprobe ipmi_watchdog &>/dev/null || fail "ipmi_watchdog insmod failed"
                lsmod | grep ipmi_si_drv &>/dev/null || modprobe ipmi_si_drv &>/dev/null || fail "ipmi_si_drv insmod failed"
            }
            ;;
        UNKNOWN)
            fail "platform is unknown"
            ;;
        * )
            fail "platform is not detected"
            ;;
    esac

    $PROC >> $LOG 2>&1 &
    sleep $START_DELAY
    check_pid
    vrfy `cat $PIDFILE 2>/dev/null` || warning "$PROC did not start. Will try again."
}

stop() {

	echo "============ $0 stop =================" >> $LOG
	die "$PROC"
	die `cat $PIDFILE 2>/dev/null`

	rm -f $PIDFILE

	case $PLATFORM in 
                MC500)
                    rmmod littledog
                    ;;
                MC500a)
                    rmmod fw7500_wdt
                    ;;
                MC1000)
                    rmmod mc1000_wdt
                    ;;
                MC1100)
                    rmmod cpci_wdt
                    ;;
                MC1500)
                    rmmod ich_wdt
                    ;;
                MC3000)
                    rmmod i6300_wdt
                    ;;
                MC4000|MC4100)
                    rmmod i810-tco
                    ;;
                MC5000)
                    rmmod ipmi_watchdog
                    rmmod ipmi_si_drv
                    rmmod ipmi_msghandler
                    ;;
                UNKNOWN)
                    fail "platform is unknown"
                    ;;
                * )
                    fail "platform is not detected"
                    ;;
	esac
}

case "$1" in
	start)
		if vrfy monit; then
			start_with_monit $MNAME
		else
			start
		fi
		;;
	stop)
		if vrfy monit; then
                        stop_with_monit $MNAME
		else
			stop
		fi
		;;
	restart)
		if vrfy monit; then
                        restart_with_monit $MNAME
		else
			stop
			start
		fi
		;;
	mstart)
		start
		;;
	mstop)
		stop
		;;
	*)
		echo $"Usage: $prog {start|stop|restart}"
		exit 1
esac

exit 0
