#!/bin/sh

### 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

NAME=gearmand
DAEMON="/opt/projects/gearmand/gearmand/gearmand"
OPTIONS="-d -j 0"
PORT=4730
LISTEN=0.0.0.0
PIDFILE=/usr/local/var/mod_gearman/gearmand.pid
LOGFILE=/usr/local/var/mod_gearman/gearmand.log
USER=nagios
GRACEFUL_SHUTDOWN_TIME=30
LIBEVENTMINVERSION=1.4
for f in $( which netcat nc 2>/dev/null ) ; do
  if [ -x "$f" ]; then
    NC=$f
  fi
done

# check libevent version
# io threads are only supported in lib event >= 1.4
LIBEVENTVERSION=`/sbin/ldconfig -p 2>&1 | grep libevent- | tail -n 1 | sed -e 's/.*libevent\-\(.*\)\.so.*/\1/g' -e 's/[^0-9\.]//g'`
if [ ! -z "$LIBEVENTVERSION" ]; then
  [ `echo "$LIBEVENTVERSION $LIBEVENTMINVERSION" | awk '{if ($1 >= $2) print 1}'` ] && OPTIONS="$OPTIONS -t 10"
fi

# 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 now down
        ps -p $pid > /dev/null 2>&1 && kill $pid
        for x in 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5; do
            printf "."
            ps -p $pid > /dev/null 2>&1 && sleep 1;
        done
        if ! ps -p $pid > /dev/null 2>&1 ; then
            echo "OK"
            exit 0;
        else
            echo "failed"
            exit 1;
        fi
    fi
}

WHO=$( whoami )
case "$1" in
    start)
        printf '%s' "Starting $NAME..."
        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

        CMD="$DAEMON -p $PORT -P $PIDFILE $OPTIONS --log-file=$LOGFILE -v -v --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"
            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
            # do a graceful shutdown
            if [ ! -z $NC ]; then
                printf '%s' " gracefully "
                echo "shutdown graceful" | $NC -w 1 -i 1 $LISTEN $PORT > /dev/null
                x=$GRACEFUL_SHUTDOWN_TIME
                while [ $x -gt 0 ]; do
                    printf "."
                    ps -p $pid > /dev/null 2>&1 && sleep 1 || x=0;
                    x=$( expr $x - 1 )
                done

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

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

exit 0
