#!/bin/sh

# Basic support for IRIX style chkconfig
# chkconfig: 2345 50 20
# description: Kaspersky Anti-Virus ICAP server for Squid

### BEGIN INIT INFO
# Provides: kav4proxy
# Required-Start: $network $syslog
# Required-Stop:
# Default-Start:
# Default-Stop:
# Description: Kaspersky Anti-Virus ICAP server for Squid
### END INIT INFO

BIN=/opt/kaspersky/kav4proxy/sbin/kav4proxy-kavicapserver
CONF=/etc/opt/kaspersky/kav4proxy.conf
MAXFD=10000

if [ -s $CONF ] ; then
    PID_FILE=`awk '{if($1 ~/icapserver.path/){sec="icap"}; if($1 ~/PidFile/ && sec=="icap") {print $1; sec=""}}' "$CONF" </dev/null | cut -d'=' -f2`
else
    echo "Can't find config file $CONF"
    exit 1
fi

rc=0

rc() {
    err=""
    case $rc in
    0)
	;;
    30)
	err="system error"
	;;
    45)
	err="license expired" 
	;;
    50)
	err="can't load AV bases" 
	;;
    64)
	err="license error" 
	;;
    65)
	err="configuration file could not found"
	;;
    66)
        err="error configuration parameter"
	;;
    70)
        err="the component is damaged"
	;;
    ### 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"
	;;
    123)
	err="operation timeout"
	;;
    *)
	err="unknown code $rc"
    esac
    if [ -n "$err" ] ; then
	if [ -n "$1" ] ; then
	    echo "$1: $err"
	else
	    echo "$err"
	fi
    fi
}

get_kavpid() {
    if [ -s "$CONF" ] ; then
	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
    else
        # echo "Config file not found"
        return 65
    fi
}

start() {	
    if [ -x $BIN ];then
	if [ -n "$MAXFD" ] ; then
	    ulimit -n "$MAXFD"
	fi
	${BIN} -C "${CONF}"
	rc=$?
	if [ $rc -eq 0 ] ; then
	    echo 'kavicapserver started'
	else
	    rc "kavicapserver not started"
	fi
    else
	echo "$BIN was not found"
    fi
}
	
stop() {
    PID=`get_kavpid`
    rc=$?
    if [ $rc -eq 0 ] ; then
	if kill "$PID"
	then
	    wait=0
	    while [ -s "$PID_FILE" -a $wait -le 30 ]; do
		sleep 1
		wait=$(($wait + 1))
	    done
	    # remove PID file if empty
	    if [ -f "$PID_FILE" ] ; then
		if [ -s "$PID_FILE" ] ; then
		    rc=123
		else
		    rm -f "$PID_FILE"
		fi
	    fi
	else
	    rc=201
	fi	
    fi

    if [ $rc -eq 0 ] ; then
	echo 'kavicapserver stopped'
    else
	rc "kavicapserver could not be stopped"
    fi
    return $rc
}	

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

reload_avbase() {
    PID=`get_kavpid`
    rc=$?
    if [ $rc -eq 0 ] ; then
	if ! kill -USR1 "$PID" 2>/dev/null
	then
	    rc=201
        fi
    fi
    if [ $rc -eq 0 ] ; then
	echo 'kavicapserver AV bases reloaded'
    else
        rc 'kavicapserver AV bases could not be reloaded'
    fi
    return $rc
}

stats() {
    PID=`get_kavpid`
    rc=$?
    if [ $rc -eq 0 ] ; then
	if ! kill -USR2 "$PID" 2>/dev/null
	then
	    rc=201
        fi
    fi
    if [ $rc -eq 0 ] ; then
	echo 'kavicapserver updated statistics files'
    else
        rc 'kavicapserver failed update statistics files'
    fi
    return $rc
}

status() {
    pid=`get_kavpid`
    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 "kavicapserver is $status"
}

try_restart() {
    if $0 status >/dev/null 2>&1
    then
	$0 restart
	rc=$?
    else
	rc=0
    fi
}

case "$1" in

start)
    start
    ;;
stop)
    stop
    ;;
status)
    status
    ;;
restart)
    restart
    ;;
reload)
    reload
    ;;
reload_avbase)
    reload_avbase
    ;;	
stats)
    stats
    ;;	
try-restart)
    try_restart
    ;;

*)
    echo "Usage: `basename $0` {start|stop|restart|try-restart|reload|reload_avbase|stats}" >&2
    exit 1
    ;;
esac

exit $rc
