#!/bin/sh
#
# Start/Stop AvUpdater
#
# Copyright 2007 Avira GmbH
#

PATH="/bin:/usr/bin:/usr/local/bin:/sbin:/usr/sbin:/usr/local/sbin"

DAEMONNAME="antivir"
AVDIR="/usr/lib/AntiVir"

DAEMON="${AVDIR}/${DAEMONNAME}"
DAEMONPARAMS="--updater-daemon"
SERVICENAME="avupdater"
OS=`uname | tr "[:upper:]" "[:lower:]"`
PROCCMD=""
STOPTIMEOUT="10"

case "${OS}" in
	sunos)
		ECHO="/usr/lib/AntiVir/echo_sunos"
		if [ ! -x "${ECHO}" ]
		then
			ECHO="echo"
		fi
		STOPTIMEOUT="20"
		;;
	*)
		ECHO="echo"
		;;
esac

startEXIT()
{
	if [ $1 -eq 0 ]
	then
		${ECHO} "."
	fi
	exit $1
}

stopEXIT()
{
	if [ $1 -ne 1 ]
	then
		${ECHO} "."
	fi
	exit $1
}

statusEXIT()
{
	${ECHO} "."
	exit $1
}

tryrestartEXIT()
{
	exit $1
}

restartEXIT()
{
	exit $1
}

forcereloadEXIT()
{
	exit $1
}

reloadEXIT()
{
	exit $1
}

probeEXIT()
{
	exit $1
}

testPROCCMD()
{
	$PROCCMD > /dev/null 2>&1
}

getPROCESSLIST()
{
	PROCESSLIST=""

	if [ -z "$PROCCMD" ]
	then
		PROCCMD="ps axw -o pid,command"
		testPROCCMD
		if [ $? -ne 0 ]
		then
			PROCCMD="ps -A -o pid,args"
			testPROCCMD
			if [ $? -ne 0 ]
			then
				PROCCMD="ps axw"
			fi
		fi
	fi

	for PROC in `$PROCCMD | grep ${DAEMONNAME}.*${DAEMONPARAMS} | grep -v grep`
	do
		if [ -z "`$ECHO ${PROC} | sed -e s/[0-9]//g`" ]
		then
			PROCESSLIST="${PROCESSLIST} ${PROC}"
		fi
	done
}

case "$1" in
	start)
		${ECHO} -n "Starting AntiVir: ${SERVICENAME}"

		if [ ! -x "${DAEMON}" ]
		then
			# daemon missing

			${ECHO} " (FAILED)"
			${ECHO} " "
			${ECHO} "error: ${DAEMON} missing"
			${ECHO} " "
			startEXIT 5
		fi

		ERROR=0

		# start daemon
		${DAEMON} ${DAEMONPARAMS} > /dev/null 2>&1
		if [ $? -ne 0 ]
		then
			ERROR=1
		fi

		# give the daemons a chance to "get organized"
		sleep 1

		getPROCESSLIST
		if [ ${ERROR} -ne 0 -o -z "${PROCESSLIST}" ]
		then
			# daemon failed to start, there is a problem

			${ECHO} " (FAILED)"
			${ECHO} " "
			${ECHO} "error: ${DAEMON} failed"
			${ECHO} "See log files for details."
			${ECHO} " "
			startEXIT 1
		fi

		startEXIT 0
		;;
	stop)
		${ECHO} -n "Stopping AntiVir: ${SERVICENAME}"

		getPROCESSLIST
		if [ -z "${PROCESSLIST}" ]
		then
			stopEXIT 7
		fi

		# daemon running

		# find and send TERM signals to all daemons
		# (we already have PROCESSLIST)
		for PROC in ${PROCESSLIST}
		do
			kill -TERM ${PROC} > /dev/null 2>&1
		done

		# give the processes a chance to shutdown
		while [ ${STOPTIMEOUT} -gt 0 ]
		do
			getPROCESSLIST
			if [ -z "${PROCESSLIST}" ]
			then
				break
			else
				sleep 1
			fi

			STOPTIMEOUT=`expr ${STOPTIMEOUT} - 1`
		done

		# all processes should now be stopped

		# check if there are any processes
		getPROCESSLIST
		if [ ! -z "${PROCESSLIST}" ]
		then
			# there are still processes running? this may be a problem

			${ECHO} " (FAILED)"
			${ECHO} " "
			${ECHO} "There may be processes still running."
			${ECHO} " "
			stopEXIT 1
		fi

		stopEXIT 0
		;;
	status)
		${ECHO} -n "AntiVir Status: ${SERVICENAME} "

		getPROCESSLIST

		# display the results of what we found
		if [ -z "${PROCESSLIST}" ]
		then
			${ECHO} -n "not running"
			statusEXIT 3
		else
			${ECHO} -n "running"
			statusEXIT 0
		fi
		;;
	try-restart|condrestart)
		if [ "$1" = "condrestart" ]
		then
			${ECHO} "${attn} Use try-restart ${done}(LSB)${attn} rather than condrestart ${warn}(RH)${norm}"
		fi
		$0 status
		if [ $? -eq 0 ]
		then
			$0 restart
			tryrestartEXIT $?
		else
			tryrestartEXIT 0
		fi
		;;
	restart)
		$0 stop
		$0 start
		restartEXIT $?
		;;
	force-reload)
		$0 try-restart
		forcereloadEXIT $?
		;;
	reload)
		${ECHO} "${attn} reload not available, please use restart${norm}"
		reloadEXIT 3
		;;
	probe)
		${ECHO} restart
		probeEXIT 0
		;;
	*)
		${ECHO} "usage: $0 {start|stop|status|try-restart|restart|force-reload|reload|probe}"
		exit 1
		;;
esac

