#!/bin/sh

# Start PGXN API on Starman on Debian.
# Based on code blatently stolen from the Catalyst init script:

# http://github.com/arodland/cat-fcgi-init
# Copyright (c) 2009-2010, Andrew Rodland
# Distributed under the 3-clause BSD license:
# http://github.com/arodland/cat-fcgi-init/blob/master/LICENSE
#
### BEGIN INIT INFO
# Provides: pgxn_api
# Required-Start: $local_fs $network $named
# Required-Stop: $local_fs $network $named
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: The PGXN API server
### END INIT INFO 

. /lib/lsb/init-functions

APPNAME="PGXN::API"
APPDIR=/var/www/api.pgxn.org
UNIXNAME=$(echo $APPNAME | perl -pe 's/::/_/;$_=lc')
PLACKUP="$APPDIR/blib/script/${UNIXNAME}_server"
PSGI=""
PSGI_OPTS="--errors-to pgxn-admins@googlegroups.com --errors-from pgxn@pgexperts.com"
PLACK_SERVER=Starman
PLACK_SERVER_OPTS="-E prod --workers 5 --preload-app --max-requests 100"
SOCKET=127.0.0.1:7497
# Leave these unset and we won't try to setuid/setgid.
USER=pgxn
GROUP=
# Set this if you have more than one instance of the app and you don't want
# them to step on each other's pidfile.
PIDSUFFIX=

# local::lib path, if you want to use it.
LOCALLIB=

if [ -f "/etc/default/"$UNIXNAME ]; then
    . "/etc/default/"$UNIXNAME
fi

if [ $(id -u) -eq 0 ] ; then
    PIDDIR=/var/run/$UNIXNAME
    mkdir $PIDDIR >/dev/null 2>&1
    if [ -n "$USER" ] ; then
        chown $USER${GROUP:+":"}$GROUP $PIDDIR
    fi
    chmod 775 $PIDDIR
else
    PIDDIR=/tmp
fi

PIDFILE=$PIDDIR/$UNIXNAME${PIDSUFFIX:+"-$PIDSUFFIX"}.pid

if [ -n "$LOCALLIB" ] ; then
    eval `perl -I"$LOCALLIB/lib/perl5" -Mlocal::lib="$LOCALLIB"`
fi

PERL5LIB="$APPDIR/lib"${PERL5LIB:+":"}$PERL5LIB
export PERL5LIB

getpid() {
    awk '{ print $1 }' "$PIDFILE"
}

check_running() {
    [ -s $PIDFILE ] && kill -0 $(getpid) >/dev/null 2>&1
}

check_compile() {
    if [ -n "$USER" ] ; then
        if cd $APPDIR ; sudo -u $USER perl -Ilib -M$APPNAME -c $PLACKUP ; then
            return 0
        fi
        return 1
    else
        if ( cd $APPDIR ; perl -Ilib -M$APPNAME -c $PLACKUP ) ; then
            return 0
        fi
        return 1
    fi
}

_start() {
    start-stop-daemon --start --quiet --pidfile $PIDFILE --chdir $APPDIR \
    ${USER:+"--chuid"} $USER ${GROUP:+"--group"} $GROUP --background \
    --startas "$PLACKUP" -- \
    -MFile::Pid::Quick="$PIDFILE" \
    --listen "$SOCKET" ${PLACK_SERVER:+"-s"} $PLACK_SERVER $PLACK_SERVER_OPTS \
    --app "$PSGI" $PSGI_OPTS
    # start-stop-daemon --start --quiet --pidfile $PIDFILE --chdir $APPDIR \
    # ${USER:+"--chuid"} $USER ${GROUP:+"--group"} $GROUP --background \
    # --startas "$PLACKUP" -- --port "$PORT" ${PLACK_SERVER:+"-s"} \
    # $PLACK_SERVER $PLACK_SERVER_OPTS --pid $PIDFILE --daemonize --app "$PSGI"

    for i in 1 2 3 4 5 6 7 8 9 10; do
        sleep 1
        if check_running ; then
            return 0
        fi
    done
    return 1
}

start() {
    log_daemon_msg "Starting $APPNAME" $UNIXNAME
    if check_running; then
        log_progress_msg "already running"
        log_end_msg 0
        exit 0
    fi

    rm -f $PIDFILE 2>/dev/null

    _start
    log_end_msg $?
    return $?
}

_stop() {
    start-stop-daemon --stop --user $USER --quiet --oknodo --pidfile $PIDFILE \
    --retry TERM/5/TERM/30/KILL/30 \
    || log_failure_message "It won't die!"
}

stop() {
    log_daemon_msg "Stopping $APPNAME" $UNIXNAME

    _stop
    log_end_msg $?
    return $?
}

restart() {
    log_daemon_msg "Restarting $APPNAME" $UNIXNAME

    check_compile && _stop && _start
    log_end_msg $?
    return $?
}

reload() {
    log_daemon_msg "Reloading $APPNAME" $UNIXNAME

    [ -s $PIDFILE ] && kill -HUP $(getpid) >/dev/null 2>&1
    log_end_msg $?
    return $?
}

# See how we were called.
case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart)
        restart
        ;;
    reload)
        reload
        ;;
    force-reload)
        check_running && reload || restart
        ;;
    check|check-compile)
        check_compile
        ;;
    *)
        echo $"Usage: $0 {start|stop|restart|reload|force-reload|check}"
        exit 1
esac
exit $?
