#!/bin/sh
# ===============================================
# (C) 2017 AO Kaspersky Lab. All Rights Reserved.
# ===============================================

# Basic support for IRIX style chkconfig
# chkconfig: 2345 80 15
# description: Kaspersky Network Agent

### BEGIN INIT INFO
# Provides: klnagent
# Required-Start: $syslog $network
# Required-Stop: $network $syslog
# Should-Start: $syslog $network
# Should-Stop: $network $syslog
# Default-Start: 2 3 4 5
# Default-Stop:  0 1 6
# Description: Kaspersky Network Agent
### END INIT INFO

BIN='/opt/kaspersky/klnagent64/sbin/klnagent'
PID_FILE='/var/run/klnagent.pid'

LOCK_FILE=''
if [ -d /var/lock/subsys ] ; then
    LOCK_FILE='/var/lock/subsys/klnagent'
fi

export KLCSAK_TEMP_PATH=/var/opt/kaspersky/klnagent/tmp

rc=0

rc() {
    err=""
    case $rc in
    0)
        ;;
    ### Additional error codes
    120)
        err="pid file not found"
        ;;
    121)
        err="probably is dead but pid file not deleted"
        ;;
    122)
        err="pid file is empty"
        ;;
    201)
        err="signal senging error"
        ;;
    203)
        err="pid file still exists"
        ;;
    *)
        err="unknown code $rc"
    esac
    if [ -n "$err" ] ; then
        if [ -n "$1" ] ; then
            echo "$1: $err"
        else
            echo "$err"
        fi
    fi
}

klgetpid() {
    if [ -n "$PID_FILE" -a -f "$PID_FILE" ] ; then
        PID=`head "$PID_FILE" 2> /dev/null`
        if [ -z "$PID" ] ; then
            # echo "pid file is empty"
            return 122
        fi
        echo $PID
        return 0
    else
        # echo "pid file not found"
        return 120
    fi
}

start() {
    if [ -x $BIN ] ; then
        if $0 status >/dev/null 2>&1 ; then
            echo 'klnagent already started'
        else
            ${BIN}
            rc=$?
            if [ $rc -eq 0 ] ; then
                echo 'klnagent started'
                if [ -n "$LOCK_FILE" ] ; then
                    touch "$LOCK_FILE"
                fi
            else
                rc "klnagent not started"
            fi
        fi
    else
        echo "$BIN was not found"
    fi
}

stop() {
    PID=`klgetpid`
    rc=$?
    if [ $rc -eq 0 ] ; then
        if kill "$PID"
        then
            wait=0
            while [ -f "$PID_FILE" -a $wait -le 60 ]; do
                sleep 1
                wait=$(($wait + 1))
            done
            if [ -f "$PID_FILE" ] ; then
                rc=203
            fi
        else
            rc=201
        fi
    fi

    if [ $rc -eq 0 ] ; then
        echo 'klnagent stopped'
        if [ -n "$LOCK_FILE" ] ; then
            rm -f "$LOCK_FILE"
        fi
    elif [ $rc -eq 120 ] ; then
        echo 'klnagent already stopped'
        rc=0
    else
        rc "klnagent could not be stopped"
    fi
    return $rc
}

restart() {
    stop
    start
}

reload() {
    PID=`klgetpid`
    rc=$?
    if [ $rc -eq 0 ] ; then
        if ! kill -HUP "$PID" 2>/dev/null
        then
            rc=201
        fi
    fi
    if [ $rc -eq 0 ] ; then
        echo 'klnagent reloaded'
    else
        rc "klnagent could not be reloaded"
    fi
    return $rc
}

status() {
    pid=`klgetpid`
    rc=$?
    if [ $rc -eq 0 ] ; then
        kill -0 "$pid" 2>/dev/null
        if test $? -eq 0 ; then
            status="running"
            rc=0
        else
            status="dead"
            rc=1
        fi
    else
        status="stopped"
        rc=3
    fi
    echo "klnagent is $status"
}

reload_connectors() {
    $BIN -reload-connectors
    rc=$?
    if [ $rc -eq 0 ] ; then
        echo 'klnagent connectors are reloaded'
    else
        rc "klnagent could not reload connectors"
    fi
    return $rc
}

case "$1" in
start)
    start
    ;;
stop)
    stop
    ;;
status)
    status
    ;;
restart)
    restart
    ;;
reload)
    reload
    ;;
reload-connectors)
    reload_connectors
    ;;
*)
    echo "Usage: `basename $0` {start|stop|status|restart|reload|reload-connectors}" >&2
    exit 1
    ;;
esac

exit $rc
