#! /bin/sh
### BEGIN INIT INFO
# Provides:          arv
# Required-Start:    $local_fs $remote_fs
# Required-Stop:     $local_fs $remote_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: arv initscript
# Description:       demarrage/arret de ARV
#                    des Modules EOLE
### END INIT INFO
#
# Author:    Equipe EOLE <eole@ac-dijon.fr>.
#

# Do NOT "set -e"

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
PYTHONPATH=$PYTHONPATH:/usr/share/eole/
DESC="Serveur ARV"
NAME=arv
DAEMON=/usr/bin/twistd
DAEMON_ARGS="-noy /usr/share/arv/website.tac"
PIDFILE=/var/run/arv/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME
ERRORFILE=/var/log/arv/error.log

export PYTHONPATH

OCF_ROOT=/usr/lib/ocf
. ${OCF_ROOT}/resource.d/heartbeat/.ocf-shellfuncs
. /lib/lsb/init-functions

# Gracefully exit if the package has been removed.
test -e $DAEMON || exit 0

if [ ! -d /var/run/arv ];then
    mkdir -p /var/run/arv
fi
chown -R root:root /var/run/arv

do_kill() {
    local sig pid killretcode
    sig=$1
    pid=$2
    killretcode=$3
    [ -n "$pid" ] || return 1
    kill -$sig $pid 2>/dev/null
    [ $? -eq $killretcode ]
}

do_kill_pid_list() {
    local RETKILL proclist
    # Trying kill 0
    RETKILL=0
    for proc in $1
    do
        do_kill 0 $proc 1
        [ ! $? -eq 0 ] && RETKILL=1
    done
    # Trying kill -9 when kill -0 is not sufficient
    if [ $RETKILL -eq 1 ]
    then
        proclist=$(pgrep -f /usr/share/arv/website.tac)
        for proc in $proclist
        do
            do_kill 9 $proc 1
        done
    fi
    proclist=$(pgrep -f /usr/share/arv/website.tac)
    [ "$proclist" = "" ] && return 0 || return 1
}

do_wait() {
    local n sig pid killretcode waitmsg
    if [ "$1" = 'start' ]; then
        killretcode=0
        waitmsg='start'
    elif [ "$1" = 'stop' ]; then
        killretcode=1
        waitmsg="die"
    fi
    if [ -f "$PIDFILE" ]; then
        pid=$(cat $PIDFILE)
    elif [ "$1" = 'stop' ]; then
        return 0
    fi
    sig=0
    n=1
    while ! do_kill "$sig" "$pid" "$killretcode" ; do
        if [ $n -eq 1 ]; then
            log_daemon_msg "waiting for process to $waitmsg" >&2
        fi
        if [ "$action" = 'stop' -a $n -eq 11 ]; then
            log_daemon_msg "giving up on pid $pid with kill -0; trying -9"
            sig=9
        fi
        if [ $n -gt 200 ]; then
            log_daemon_msg "giving up on pid $pid"
            break
        fi
        n=$(($n+1))
        sleep .1
        if [ -z "$pid" -a -f "$PIDFILE" ]; then
            pid=$(cat $PIDFILE)
        fi
    done
}

#
#    Function that starts the daemon/service.
#
d_start() {
    log_begin_msg "Starting $DESC: $NAME"
    proclist=$(pgrep -f /usr/share/arv/website.tac)
    if [ -f $PIDFILE ]
    then
        log_daemon_msg "$PIDFILE exists"
        pid=$(cat $PIDFILE)
        if [ "$pid" != "$proclist" ]
        then
            log_daemon_msg "PID in $PIDFILE not match with real PID"
            d_stop
        elif [ "$pid" = "" ]
        then
            log_daemon_msg "$PIDFILE is empty, remove it"
            rm -f $PIDFILE
        else
            log_daemon_msg "$DESC is already running..."
            return $OCF_SUCCESS
        fi
    elif [ "$proclist" != "" ]
    then
        log_daemon_msg "No $PIDFILE file but $DESC is running"
        d_stop
    fi
    start-stop-daemon -b --start --exec $DAEMON -- $DAEMON_ARGS --pidfile $PIDFILE --logfile /var/log/arv/$NAME.log --test >> $ERRORFILE || return $OCF_ERR_GENERIC
    start-stop-daemon -b --start --exec $DAEMON -- $DAEMON_ARGS --pidfile $PIDFILE --logfile /var/log/arv/$NAME.log >> $ERRORFILE
    RETVAL=$?
    do_wait 'start'
    [ $RETVAL -eq 0 ] && return  $OCF_SUCCESS || return $OCF_ERR_GENERIC
}

#
#    Function that stops the daemon/service.
#
d_stop() {
    log_begin_msg "Stopping $DESC: $NAME"
    proclist=$(pgrep -f /usr/share/arv/website.tac)
    if [ -f $PIDFILE ]
    then
        pid=$(cat $PIDFILE)
        if [ "$pid" != "$proclist" ]
        then
            log_daemon_msg "PID in $PIDFILE not match with real PID"
            do_kill_pid_list $proclist
            RETVAL=$?
            rm -f $PIDFILE
        elif [ "$pid" = "" ]
        then
            log_daemon_msg "$PIDFILE is empty, remove it"
            rm -f $PIDFILE
            RETVAL=$?
        else
            start-stop-daemon --stop --quiet -o --pidfile $PIDFILE
            RETVAL=$?
        fi
    elif [ "$proclist" != "" ]
    then
        log_daemon_msg "No $PIDFILE file but $DESC is running"
        do_kill_pid_list $proclist
        RETVAL=$?
    else
        log_daemon_msg "$DESC is already stopped"
        RETVAL=$?
    fi
    do_wait 'stop'
    [ $RETVAL -eq 0 ] && return $OCF_SUCCESS || return $OCF_ERR_GENERIC
}

d_status() {
    proclist=$(pgrep -f /usr/share/arv/website.tac)
    if [ -f $PIDFILE ]
    then
        pid=$(cat $PIDFILE)
        if [ "$pid" != "$proclist" ]
        then
            log_daemon_msg "PID in $PIDFILE not match with real PID"
            return $OCF_ERR_GENERIC
        elif [ "$pid" = "" ]
        then
            log_daemon_msg "$PIDFILE exists and is empty, $DESC is not running"
            return $OCF_NOT_RUNNING
        else
            log_daemon_msg "$DESC is running..."
            return $OCF_SUCCESS
        fi
    elif [ "$proclist" != "" ]
    then
        log_daemon_msg "No $PIDFILE file but proccess is running"
        return $OCF_ERR_GENERIC
    else
        log_daemon_msg "$DESC is stopped"
        return $OCF_NOT_RUNNING
    fi
}

d_monitor() {
    d_status
    return $?
}

case "$1" in
  start)
    d_start
    RETVAL=$?
    case "$RETVAL" in
        $OCF_SUCCESS) log_end_msg 0 ;;
        $OCF_ERR_GENERIC) log_end_msg 1 ;;
    esac
    exit $RETVAL
    ;;
  stop)
    d_stop
    RETVAL=$?
    case "$RETVAL" in
        $OCF_SUCCESS) log_end_msg 0 ;;
        $OCF_ERR_GENERIC) log_end_msg 1 ;;
    esac
    exit $RETVAL
    ;;
  restart|force-reload)
    d_stop
    RETVAL=$?
    case "$RETVAL" in
        $OCF_SUCCESS) log_end_msg 0 ;;
        $OCF_ERR_GENERIC) log_end_msg 1 ;;
    esac
    d_start
    RETVAL=$?
    case "$REVAL" in
        $OCF_SUCCESS) log_end_msg 0 ;;
        $OCF_ERR_GENERIC) log_end_msg 1 ;;
    esac
    exit $RETVAL
    ;;
  status)
    d_status
    exit $?
    ;;
  monitor)
    d_monitor
    exit $?
    ;;

  *)
    echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload}" >&2
    exit 3
    ;;
esac

exit 0
