#!/bin/sh

### BEGIN INIT INFO
# Provides:          sw-cp-server
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     1 2 3 4 5
# Default-Stop:      0 6
# Short-Description: SWsoft control panels server
# Description:       HTTP server for SWsoft control panels based on lighttp
### END INIT INFO

. /etc/rc.status

sw_cpserver_start () {
    startproc -p $PIDFILE $DAEMON $DAEMONARGS
}

sw_cpserver_stop () {
    killproc -p $PIDFILE $DAEMON -$1
}

sw_rc_status () {
    rc_status -v
}

DAEMON=/usr/sbin/sw-cp-serverd
test -x $DAEMON || exit 5

DESC="SWsoft control panels server"

PIDFILE=/var/run/sw-cp-server.pid

CONFIGFILE=/etc/sw-cp-server/config
DAEMONARGS="-f $CONFIGFILE"

# defines sw_check_pid_result
# one of NONE, OK, STALE
sw_check_pid()
{
    pid=`cat "$PIDFILE" 2>/dev/null`
    if [ $? -ne 0 ]; then
	sw_check_pid_result=NONE
	return
    fi

    if ! [ "$pid" -gt 0 ] 2>/dev/null; then
	# invalid contents of pidfile
	sw_check_pid_result=STALE
	return
    fi

    if ps -o comm -p "$pid"|tail -n +1|grep -q sw-cp-serverd; then
        sw_check_pid_result=OK
    else
        sw_check_pid_result=STALE
    fi
}

sw_stop_wait()
{
    local i=0
    # wait for 1 minute
    # test each sec at first 10 secs
    #  and each 5 secs the rest
    while [ $i -lt 20 ]; do
	sw_check_pid
	case $sw_check_pid_result in
	OK) ;;
	NONE) return 0;;
	STALE)
	    echo -n " stale pidfile. "
	    rm -f "$PIDFILE"
	    return 0
	    ;;
	esac
	if [ $i -lt 10 ]; then
	    sleep 1
	else
	    echo -n .
	    sleep 5
	fi
	i=`expr $i + 1`
    done
    echo -n " still running. "
    return 1
}

sw_cpserver_restart()
{
    sw_cpserver_stop "$1"
    if sw_stop_wait; then
	sw_cpserver_start
    else
	false
    fi
}

case "$1" in
    start)
	echo -n "Starting $DESC..."
	sw_check_pid
	case $sw_check_pid_result in
	OK)
	    echo -n " already running. "
	    true;;
	NONE) sw_cpserver_start;;
	STALE)
	    echo -n " stale pidfile. "
	    rm -f "$PIDFILE"
	    sw_cpserver_start
	    ;;
	esac
	sw_rc_status
        ;;
    stop)
        echo -n "Stoppping $DESC..."
        sw_cpserver_stop TERM
	sw_stop_wait
        sw_rc_status
        ;;
    restart)
        echo -n "Restarting $DESC..."
	sw_cpserver_restart TERM
        sw_rc_status
        ;;
    reload)
        echo -n "Reloading $DESC..."
	sw_check_pid
	case $sw_check_pid_result in
	OK)
	    (
		nohup "$0" impl-reload-daemon 2>&1 		| logger -t sw-cp-server_init -p daemon.info
	    ) >/dev/null 2>&1 &
	    ;;
	STALE|NONE)
	    rm -f "$PIDFILE"
	    echo -n " not running. "
	    true
	    ;;
	esac
        sw_rc_status
        ;;
    impl-reload-daemon)
	sw_cpserver_restart INT
	if [ $? -ne 0 ]; then
	    logger -t sw-cp-server_init -p daemon.warning "sw-cp-server reload failed"
	fi
	;;
    *)
        echo "Usage: $0 (start|stop|reload|restart)"
        exit 1
esac

