#!/bin/bash
#
# autotestd       Start up the autotest scheduler daemon
#
# Copyright 2009 Red Hat, Inc.
#
# This software may be freely redistributed under the terms of the GNU
# general public license.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#
# chkconfig: - 65 25
# description: Autotest is a framework for fully automated testing.
# processname: monitor_db.py
# pidfile: /var/run/autotest/monitor_db_babysitter.pid
#
### BEGIN INIT INFO
# Provides: autotest
# Required-Start: $syslog $local_fs
# Required-Stop: $syslog $local_fs
# Default-Stop: 0 1 6
# Short-Description: Start the autotest scheduler daemon
# Description: Autotest is a framework for fully automated testing.
### END INIT INFO

# source function library
. /etc/rc.d/init.d/functions

# pull in sysconfig settings
[ -f /etc/sysconfig/autotest ] && . /etc/sysconfig/autotest

PROG="autotest"
BECOME_USER=$PROG
LOCKFILE=/var/lock/subsys/$PROG

# Autotest paths
AUTOTEST_DIR="/usr/local/$PROG"
BABYSITTER="$AUTOTEST_DIR/scheduler/monitor_db_babysitter"
SCHEDULER="$AUTOTEST_DIR/scheduler/monitor_db.py"

# Scheduler options
OPTIONS="--background"

# Where to locate PID files
PID_PATH="$AUTOTEST_DIR" # "/var/run/$PROG"
BABYSITTER_PIDFILE="$PID_PATH/monitor_db_babysitter.pid"
SCHEDULER_PIDFILE="$PID_PATH/monitor_db.pid"

# Assume pass
RETVAL=0

start()
{
    [ -f $BABYSITTER ] || exit 5

    echo -n $"Starting $PROG: "
    daemon --user $BECOME_USER --check $PROG $BABYSITTER $OPTIONS
    RETVAL=$?
    echo
    [ "$RETVAL" = 0 ] && touch $LOCKFILE
    return $RETVAL
}

stop()
{
    echo -n $"Stopping $PROG: "

    killproc $BABYSITTER

    RETVAL=$?
    echo
    if [ "$RETVAL" = 0 ]; then
         rm -f $LOCKFILE
         rm -f $BABYSITTER_PIDFILE
         rm -f $SCHEDULER_PIDFILE
    fi
    return $RETVAL
}

reload()
{
    echo -n $"Reloading $PROG: "
    killproc -p $BABYSITTER_PIDFILE $PROG -HUP
    RETVAL=$?
    echo
    return $RETVAL
}

restart() {
    stop
    start
}

force_reload() {
    restart
}

case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart)
        restart
        ;;
    reload)
        reload
        ;;
    condrestart|try-restart)
        if [ -f $LOCKFILE ] ; then
            if [ "$RETVAL" = 0 ] ; then
                stop
                # avoid race
                sleep 3
                start
            else
                RETVAL=6
            fi
        fi
        ;;
    status)
        # status -p $PIDFILE $PROG
        status $BABYSITTER
        status $SCHEDULER
        RETVAL=$?
        ;;
    *)
        echo $"Usage: $0 {start|stop|restart|reload|condrestart|try-restart|status}"
        RETVAL=2
esac
exit $RETVAL
