#!/bin/bash

### BEGIN INIT INFO
# Provides:          gearmand
# Required-Start:    $local_fs
# Required-Stop:     $local_fs
# Should-Start:
# Should-Stop:
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start/Stop the gearman daemon
### END INIT INFO

# Check if Mod-Gearman is enabled in OMD. If not terminate.
. etc/omd/site.conf
if [ "$CONFIG_MOD_GEARMAN" != "on" -o "$CONFIG_GEARMAND" != "on" ] ; then
    exit 5
fi
. lib/omd/init_profile

NAME=gearmand
DAEMON="$OMD_ROOT/version/bin/gearmand"
OPTIONS="--daemon --threads=0 -q libsqlite3 --libsqlite3-db=$OMD_ROOT/var/gearmand.db --store-queue-on-shutdown"
PORT=`echo $CONFIG_GEARMAND_PORT | awk -F: {'print $2'}`
LISTEN=`echo $CONFIG_GEARMAND_PORT | awk -F: {'print $1'}`
PIDFILE=$OMD_ROOT/tmp/run/gearmand.pid
LOGFILE=$OMD_ROOT/var/log/gearman/gearmand.log
USER=$OMD_SITE
SHUTDOWN_TIME=5
LOGLEVEL="ERROR"

for f in $( which netcat nc 2>/dev/null ) ; do
  if [ -x "$f" ]; then
    NC=$f
  fi
done

# create state dir
mkdir -p $(dirname $LOGFILE)
chown $USER: $(dirname $LOGFILE)

get_status() {
        pid=$( cat $PIDFILE 2>/dev/null )
        if [ -n "$pid" ]; then
            if ps -p $pid > /dev/null 2>&1 ; then
                echo "$NAME is running with pid $pid"
                return 0;
            fi
        fi
        echo "$NAME is not running"
        return 1;
}

kill_gearmand() {
    printf '%s' "Killing $NAME..."
    pid=$( cat $PIDFILE 2>/dev/null )
    if [ -z "$pid" ]; then
        echo ". Not running."
    else
        # do a kill if still not down
        ps -p $pid > /dev/null 2>&1 && kill $pid
        for x in $(seq 150); do
            [ $((x%5))  -eq 0 ] && printf "."
            [ $((x%7))  -eq 0 ] && kill -2 $pid >/dev/null 2>&1
            [ $((x%15)) -eq 0 ] && kill -9 $pid >/dev/null 2>&1
            ps -p $pid > /dev/null 2>&1 || break
            sleep 0.1
        done
        if ! ps -p $pid > /dev/null 2>&1 ; then
            echo "OK"
            exit 0;
        else
            echo "failed"
            exit 1;
        fi
    fi
}

WHO=$( whoami )
__init_hook $0 $1 pre
case "$1" in
    start)
        printf '%s' "Starting $NAME..."
        mkdir -p $OMD_ROOT/var/log/gearman
        if get_status > /dev/null ; then
            echo "failed"
            echo "$NAME already running"
            exit 0;
        fi
        if [ ! -x "$DAEMON" ]; then
            echo "Cannot start. Make sure $DAEMON exists and is executable"
            exit 1;
        fi

        # gearman opens lot of connections, so increase default ulimit to our hard limit
        ulimit -n $(ulimit -Hn) >/dev/null 2>&1

        CMD="$DAEMON --port=$PORT --pid-file=$PIDFILE $OPTIONS --log-file=$LOGFILE --verbose=$LOGLEVEL ${LISTEN:+--listen=$LISTEN}"
        if [ "$WHO" = "root" ]; then
            # try to exec commands as user
            su - $USER -c /bin/true
            if [ $? -ne 0 ]; then
                echo "cannot exec commands as user $USER, make sure user has a valid shell"
                exit 1;
            fi
            su - $USER -c  "$CMD >>$LOGFILE 2>&1"
        else
            $CMD > $LOGFILE 2>&1
        fi
        if [ $? -eq 0 ]; then
            echo "OK"
            __init_hook $0 $1 post
            exit 0;
        else
            echo "failed"
            exit 1;
        fi
        ;;
    stop)
        printf '%s' "Stopping $NAME..."
        pid=$( cat $PIDFILE 2>/dev/null )
        if [ -z "$pid" ]; then
            echo ". Not running."
        else
            kill -TERM $pid >/dev/null 2>&1
            # do a shutdown
            x=$( expr $SHUTDOWN_TIME \* 10 )
            while [ $x -gt 0 ]; do
                [ $((x%5)) -eq 0 ] && printf "."
                ps -p $pid > /dev/null 2>&1 && sleep 0.1 || x=0;
                x=$( expr $x - 1 )
            done

            if ! ps -p $pid > /dev/null 2>&1 ; then
                __init_hook $0 $1 post
                echo "OK"
                exit 0;
            else
                echo "failed"
            fi

            # kill if still running
            ps -p $pid > /dev/null 2>&1 && kill_gearmand;
            __init_hook $0 $1 post
        fi
        ;;
    kill)
        kill_gearmand;
        ;;
    reload|force-reload)
        printf '%s' "Reloading $NAME configuration files..."
        pid=$( cat $PIDFILE 2>/dev/null )
        if [ -n "$pid" ]; then
            $0 stop && sleep 1 && $0 start
            exit $?
        else
            echo "$NAME is not running"
            exit 1;
        fi
    ;;
    status)
        get_status;
        exit $?;
    ;;
    restart)
        $0 stop && sleep 1 && $0 start
        exit $?
        ;;
    check)
    ;;
    *)
        echo "Usage: $NAME {start|stop|kill|status|restart}"
        exit 1
        ;;
esac

exit 0
