#!/bin/sh
#
# kavehost        Startup script for the Kavehost
# chkconfig: 345 81 29
# description: Kaspersky AntiVirus service.
#
# processname: kavehost
# pidfile: /var/run/kav/pid
#
#
### BEGIN INIT INFO
# Provides:       kavehost
# Required-Start: $network $syslog $remote_fs
# X-UnitedLinux-Should-Start:
# Required-Stop:
# Default-Start:  3 5
# Default-Stop:
# Description:    start Kaspersky AntiVirus service
### END INIT INFO

CONFIG="/etc/kavehost.xml"

SDK_HOME=/opt/kav/sdk8l3
KL_PLUGINS_PATH="${SDK_HOME}/ppl"
export KL_PLUGINS_PATH
LD_LIBRARY_PATH=$KL_PLUGINS_PATH:$LD_LIBRARY_PATH
RUNDIR=/var/run/kav
PIDFILE=`sed -n 's/^.*<PidPath>\(.*\)<\/PidPath>.*/\1/p' < ${CONFIG}`
KAVEHOST=${SDK_HOME}/bin/kavehost
PROG=kavehost

if [ "x$KL_PLUGINS_PATH" = "x" ]; then
    KL_PLUGINS_PATH=$HOME/builds/`uname -s`-x86/bin
    export KL_PLUGINS_PATH
    LD_LIBRARY_PATH=$KL_PLUGINS_PATH:$LD_LIBRARY_PATH
    export LD_LIBRARY_PATH
fi

# Check config file
if [ ! -f "${CONFIG}" ] ; then
    echo -n "Config file [${CONFIG}] does not exist .";
    echo
    exit 1;
fi

if [ ! -d $RUNDIR ] ; then
    mkdir $RUNDIR
    [ -e /sbin/restorecon ] && /sbin/restorecon -r $RUNDIR
fi

# For SELinux we need to use 'runuser' not 'su'
if [ -x /sbin/runuser ]
then
    SU=runuser
else
    SU=su
fi

is_running()
{
	local pid
	local ps_pid="ps ax -o pid"

	if [ -e ${PIDFILE} ]; then
		pid=`cat ${PIDFILE}`
		exists="`ps ax -o pid | awk -v pid="$pid" '{if ($1 == pid) {print "yes";}}'`"
		[ -n "$exists" ] && return 0
	fi

	return 1
}

show_result()
{
	local status=$1

	if [ $status -eq 0 ]; then
		echo -n "[ OK ]\r"
	else
		echo -n "[ FAILED ]\r"
	fi

	echo
	return $status
}

show_status()
{
	local status=$1
	[ $status -eq 0 ] && echo -n "kavehost is already running." || echo -n "kavehost is not running."
}

start()
{
	echo -n "Starting $PROG: "
	is_running && show_status 0 && show_result 1 && return 1

	cd ${SDK_HOME}/bin && $KAVEHOST -c ${CONFIG}

	show_result $? && return 0

	return 1
}

stop()
{
	echo -n "Stopping $PROG: "
	is_running || { show_status 1; show_result 0; return 1; }

	kill -TERM `cat ${PIDFILE}`

	for i in 1 1 2 2 4; do
		is_running || {
			show_result 0
			rm -f $RUNDIR/com* $RUNDIR/scan* $RUNDIR/evt*
			return 0
		}
		sleep $i;
	done

	show_result 1
	return 1
}

reloaddb()
{
	echo -n "Reload databases $PROG: "
	is_running || { show_status 1; show_result 1; return 1; }

	kill -USR1 `cat ${PIDFILE}`
	show_result 0

	return 0
}

status()
{
	is_running && show_status 0 && echo && return 0

	show_status 1
	echo
	return 1
}

case "$1" in
  start)
    start
    ;;
  stop)
    stop
    ;;
  reload|reloaddb)
    reloaddb
    ;;
  status)
    status
    ;;
  restart)
    stop
    start
    ;;
  *)
    echo "Usage: $PROG {start|stop|restart|reload|reloaddb|status}"
    exit 1
esac

exit $?
