#!/bin/sh
#
# AVIRA Multi Product Start/Stop script
#
# Copyright (c) 2010 AVIRA GmbH
#
#
# chkconfig: 35 20 80
# description: avguard startup script (RedHat) 

### BEGIN INIT INFO
# Provides: guard
# Required-Start:
# Should-Start:
# Required-Stop:
# Default-Start: 3 5
# Default-Stop: 0 1 2 6
# Short-Description: Guard
# Description: AVIRA AntiVir Guard (UNIX)
### END INIT INFO

OS=`uname | env LANG=C LC_ALL=C LC_CTYPE=C tr "[:upper:]" "[:lower:]"`
PROCCMD=""

case "${OS}" in
	solaris|sunos)
		PROCCMD="ps -ef -o pid,comm,args"
		;;

	*)
		PROCCMD="ps axw -o pid,command"
		;;
esac

AVDIR="/usr/lib/AntiVir"
SAVAPI3="$AVDIR/savapi"
KMODULE="/usr/kernel/drv/sparcv9/dazuko"
DEVNAME="dazuko"
DEVFILE="/dev/$DEVNAME"
DAEMONTIMEOUT="20"
SAVAPITIMEOUT="40"
DAEMONPARAMS=""
EXEC_ENV_PROG=""
AUTODETECT=""

get_guard_version()
{
	$AVDIR/avlinfo -i $AVDIR 2>/dev/null | grep Server > /dev/null 2>&1
	if [ "$?" -eq 0 ]
	then
		FULLPRODUCTNAME="AVIRA AntiVir Server"
		DAEMONPARAMS="--server $DAEMONPARAMS"
		return 0
	fi

	$AVDIR/avlinfo -i $AVDIR 2>/dev/null | grep Workstation > /dev/null 2>&1
	if [ "$?" -eq 0 ]
	then
		FULLPRODUCTNAME="AVIRA AntiVir Workstation"
		DAEMONPARAMS="--workstation $DAEMONPARAMS"
		return 0
	fi

	$AVDIR/avlinfo -i $AVDIR 2>/dev/null | grep Personal > /dev/null 2>&1
	if [ "$?" -eq 0 ]
	then
		FULLPRODUCTNAME="AVIRA AntiVir Workstation Personal"
		DAEMONPARAMS="--workstation $DAEMONPARAMS"
		return 0
	fi
}

case `basename "$0"` in
	*avmailgate)
		AVDIR="/usr/lib/AntiVir/mailgate"

		FULLPRODUCTNAME="AVIRA AntiVir MailGate"
		BINARY="avmailgate.bin"
		CONFFILE="/etc/avmailgate-scanner.conf"
		;;
	*avwebgate)
		AVDIR="/usr/lib/AntiVir/webgate"

		FULLPRODUCTNAME="AVIRA AntiVir WebGate"
		BINARY="avwebgate.bin"
		CONFFILE="/etc/avwebgate-scanner.conf"
		;;

	*avium)
		AVDIR="/usr/lib/AntiVir/ium"

		FULLPRODUCTNAME="AVIRA Internet Update Manager"
		BINARY="ium"
		CONFFILE="/etc/avira/ium.conf"
		;;

	*smc-agent)
		AVDIR="/usr/lib/AntiVir/agent"

		FULLPRODUCTNAME="AVIRA SMC Agent"
		BINARY="agent"
		if [ $OS = "sunos" ]
		then
			EXEC_ENV_PROG="env LD_LIBRARY_PATH="/usr/local/lib:/usr/lib/AntiVir/agent""
		fi
		;;

	*avguard)
		AVDIR="/usr/lib/AntiVir/guard"

		BINARY="avguard.bin"
		CONFFILE="/etc/avira/avguard-scanner.conf"
		get_guard_version
		;;

	*)
		echo "Product not supported"
		exit 1    # this product is not supported by the all-in-one start/stop script
		;;
esac

if [ ! -f "$CONFFILE" -a "$BINARY" != "agent" ]
then
	echo "No $CONFFILE found"
	exit 1    # no product conf file found
fi

DAEMON="${AVDIR}/${BINARY}"
if [ "$BINARY" = "avguard.bin" ]
then
	PROCESSLIST="${AVDIR}/avguard-scanner ${AVDIR}/avsavapi-super  ${AVDIR}/avguard-ondemand-mgmt ${AVDIR}/avguard.bin ${AVDIR}/gui/bin/avgu_stats"
else
	PROCESSLIST="$DAEMON"
fi

### SUSE/Novell specific functions definition
rc_check()
{
	return 0
}

doRC()
{
	return 0
}

rc_check()
{
	return 0
}

rc_status()
{
	return 0
}

rc_exit()
{
	return 0
}

if [ -f /etc/rc.status ]
then
	. /etc/rc.status
	rc_reset
fi

doRC()
{
	return $1
}

startEXIT()
{
	doRC $1
	rc_check
	rc_status -v
	rc_exit
	exit $1
}

stopEXIT()
{
	doRC $1
	rc_check
	rc_status -v
	rc_exit
	exit $1
}

statusEXIT()
{
	doRC $1
	rc_check
	rc_status -v
	rc_exit
	exit $1
}

tryrestartEXIT()
{
	doRC $1
	rc_status
	rc_exit
	exit $1
}

restartEXIT()
{
	doRC $1
	rc_status
	rc_exit
	exit $1
}

forcereloadEXIT()
{
	doRC $1
	rc_status
	rc_exit
	exit $1
}

reloadEXIT()
{
	doRC $1
	rc_status -v
	rc_exit
	exit $1
}

probeEXIT()
{
	doRC $1
	rc_exit
	exit $1
}
### END of Novell/SuSE specific functions

### START of dazuko specific functions
getDEV()
{
	case "${OS}" in
		sunos)
			DEV=`modinfo | grep ${DEVNAME}`
			;;
		*)
			DEV=""
			if [ -f "/proc/devices" ]
			then
				DEV=`grep ${DEVNAME} /proc/devices`
			fi
			;;
	esac
}

autoloadModule()
{
	case "${OS}" in
		sunos)
			modload ${KMODULE} > /dev/null 2>&1
			sleep 3
			;;
		*)
			modprobe ${DEVNAME} > /dev/null 2>&1
			;;
	esac
}

getDEVMAJOR()
{
	case "${OS}" in
		freebsd)
			DEVMAJOR=33
			;;
		*)
			set -- ${DEV}

			DEVMAJOR=${1}
			;;
	esac
}

makeNode()
{
	case "${OS}" in
		sunos)
			# node created automatically for sunos
			;;
		*)
			mknod -m 600 ${DEVFILE} c ${DEVMAJOR} 0
			;;
	esac
}
### END of dazuko specific functions

start_savapi()
{
	if [ "${BINARY}" = "ium" -o "${BINARY}" = "avguard.bin" -o "${BINARY}" = "agent" ]
        then
                return 0
        fi

	if [ ! -x "${SAVAPI3}" ]
	then
		# daemon missing
		echo " (FAILED)"
		echo
		echo "error: ${SAVAPI3} missing"
		echo 
		startEXIT 5
	fi

	echo "Starting: savapi"
	${SAVAPI3} --config=$CONFFILE --allow-remote-shutdown
	if [ "$?" -ne 0 ]
	then
		# savapi failed to start, there is a problem
		echo " (FAILED)"
		echo 
		echo "error: ${SAVAPI3} failed"
		echo 
		startEXIT 1
	fi

	while [ "$SAVAPITIMEOUT" -gt 0 ]
	do
		${SAVAPI3} --status --config=$CONFFILE > /dev/null 2>&1
		if [ "$?" -eq 0 ]
		then
			return 0
		fi

		sleep 1
		SAVAPITIMEOUT=`expr ${SAVAPITIMEOUT} - 1`
	done

	# savapi failed to start, there is a problem
	echo " (FAILED)"
	echo 
	echo "error: Timeout reached while trying to start ${SAVAPI3}"
	echo 
	startEXIT 1
}

stop_savapi()
{
	if [ "${BINARY}" = "ium" -o "${BINARY}" = "avguard.bin" -o "${BINARY}" = "agent" ]
	then
		return 1
	fi

	$SAVAPI3 --stop --config=$CONFFILE > /dev/null 2>&1
	ERR="$?"
	case "$ERR" in
		"0")
			echo "Stopping: savapi"
			return 0
			;;

		"219")
			echo "Scanner is not running"
			return 219
			;;

		*)
			# savapi failed to stop, there is a problem
			echo " (FAILED)"
			echo 
			echo "error: ${SAVAPI3} failed"
			echo 
			return 2
			;;
	esac
}

status_savapi()
{
	if [ "${BINARY}" = "ium" -o "${BINARY}" = "avguard.bin" -o "${BINARY}" = "agent" ]
	then
		return 0
	fi

	if $SAVAPI3 --status --config=$CONFFILE > /dev/null 2>&1
	then
		echo "Status: savapi running"
	else
		echo "Status: savapi not running"
	fi
}

check_DAEMON_PROCESSES()
{
	PIDLIST=""
	for PROC in $PROCESSLIST
	do
		for PID in `$PROCCMD | grep "$PROC" | grep -v grep | awk -F' ' '{ print $1 }'`
		do
			PIDLIST="$PIDLIST $PID"
		done
	done
}


case "$1" in
	start)
		if [ "$BINARY" = "avguard.bin" ]
		then
			ls -la $AVDIR/libdazuko.so | grep libdazuko2.so > /dev/null 2>&1
			DAZUKO_2="$?"
			if [ "$DAZUKO_2" -eq "0" ]
			then
				# get Dazuko device information
				getDEV
				if [ -z "${DEV}" ]
				then
					# no Dazuko device information, Dazuko is not loaded
					# try to load a system-installed module
					autoloadModule
		
					# get Dazuko device information
					getDEV
					if [ -z "${DEV}" ]
					then
						# no Dazuko device information, there is a problem
		
						echo " (FAILED)"
						echo " "
						echo "error: device ${DEVNAME} not loaded"
						echo "Was Dazuko correctly installed?"
						echo " "
						startEXIT 1
					fi
				fi
		
				# at this point, Dazuko is loaded
		
				if [ "${OS}" != "sunos" ]
				then
					# check if device node is available
					if [ -c "${DEVFILE}" ]
					then
						# device node is available, check if it works
						# (we grab 10 bytes because of a bug in Dazuko reading)
		
						env - dd if=/dev/${DEVNAME} bs=10 count=1 > /dev/null 2>&1
						if [ $? -ne 0 ]
						then
							# unable to read from device, this device node is not correct
		
							# remove the device node
							rm -f "${DEVFILE}"
						fi
					fi
		
					# check if we need to create a device node
					if [ ! -c "${DEVFILE}" ]
					then
						# there is no device node, so we need to make one
		
						# get device major number for Dazuko
						getDEVMAJOR
		
						# make the device node
						makeNode
		
						# set permissions on the device node
						chown 0:0 "${DEVFILE}"
						if [ $? -ne 0 ]
						then
							# unable to set permissions? there is a problem
		
							echo " (FAILED)"
							echo " "
							echo "error: could not create node ${DEVFILE}"
							echo "Please send a problem description to support@avira.com"
							echo "Very helpful would be the output of 'uname -a' and the name of"
							echo "your UNIX distribution."
							echo " "
							startEXIT 1
						fi
					fi
		
					# Dazuko is loaded and the device node has been created
				fi
			fi
		fi

		if [ ! -x "${DAEMON}" ]
		then
			# daemon missing
			echo " (FAILED)"
			echo 
			echo "error: ${DAEMON} missing"
			echo 
			startEXIT 5
		fi

		echo "Starting $FULLPRODUCTNAME ..."
		check_DAEMON_PROCESSES
		if [ "$PIDLIST" ]
		then
			echo "Other processes from another instance are still running, you should stop them first"
			exit 1
		fi

		rm -f /tmp/ondemand-scan-trigger.txt

		start_savapi
		echo "Starting: ${BINARY}"
	
		# start daemon
		${EXEC_ENV_PROG} ${DAEMON} ${DAEMONPARAMS}
		ERR="$?"

		if [ "$ERR" -eq "249" -a "${BINARY}" = "avguard.bin" ]
		then
			echo "It was not possible to connect to the dazuko device."
			exit 249
		fi
		
		# give the daemons a chance to "get organized"
		sleep 1
		check_DAEMON_PROCESSES

		if [ "${ERR}" -ne 0 -o -z "${PIDLIST}" ]
		then
			# daemon failed to start, there is a problem
			echo " (FAILED)"
			echo 
			echo "error: ${DAEMON} failed"
			echo "See log files for details."
			echo 
		
			if [ -z "${PIDLIST}" ]
			then
				stop_savapi
			fi

			startEXIT 2
		fi

		startEXIT 0
		;;

	stop)
		echo "Stopping $FULLPRODUCTNAME ..."
		echo "Stopping: ${BINARY}"

		check_DAEMON_PROCESSES

		if [ -z "${PIDLIST}" ]
		then
			stop_savapi
			if [ "$?" -eq 0 ]
			then
				stopEXIT 7
			else
				stopEXIT 0
			fi
		fi
		# daemon running
	
		# find and send TERM signals to all daemons
		# (we already have PIDLIST)

		if [ "$BINARY" = "ium" -o "${BINARY}" = "agent" -o "${BINARY}" = "avwebgate.bin" ]
		then
			for PID in ${PIDLIST}
			do
				kill -TERM ${PID} >/dev/null 2>&1
			done

		else
			${DAEMON} --stop
		fi

		# give the processes a chance to shutdown
		while [ "${DAEMONTIMEOUT}" -gt 0 ]
		do
			check_DAEMON_PROCESSES
			if [ -z "${PIDLIST}" ]
			then
				break
			else
				sleep 1
			fi
			DAEMONTIMEOUT=`expr ${DAEMONTIMEOUT} - 1`
		done

		stop_savapi
		
		# all processes should now be stopped
		# check if there are any processes
		for SIG in TERM KILL 
		do
			check_DAEMON_PROCESSES
			if [ "$PIDLIST" ]
			then
				for PID in ${PIDLIST}
				do
					kill -$SIG ${PID}  >/dev/null 2>&1
				done
			fi
		done
		stopEXIT 0
		;;

	status)
	
		check_DAEMON_PROCESSES
	
		# display the results of what we found
		if [ -z "${PIDLIST}" ]
		then
			echo "Status: ${BINARY} not running "
			status_savapi
			statusEXIT 3
		else
			echo "Status: ${BINARY} running "
			status_savapi
			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)
		if [ "$BINARY" = "avguard.bin" ]
		then
			if [ -z "`$PROCCMD | grep "$AVDIR/avguard.bin" | grep -v grep`" ]
			then
				for SIG in TERM KILL
				do
					check_DAEMON_PROCESSES
					if [ "$PIDLIST" ]
					then
						for PID in ${PIDLIST}
						do
							kill -$SIG ${PID}  >/dev/null 2>&1
						done
					fi
				done

				$0 start
				startEXIT $?
			else
				echo "Reloading Guard..."
				$AVDIR/avguard.bin ${DAEMONPARAMS} --restart
				restartEXIT $?
	                fi
		else
			$0 stop
			$0 start
			restartEXIT $?
		fi
		;;

	force-reload)
		$0 try-restart
		forcereloadEXIT $?
		;;

	reload)
		if [ "$BINARY" = "avguard.bin" ]
		then
			$0 restart
		else
			echo "${attn} reload not available, please use restart${norm}"
			reloadEXIT 1
		fi
		;;

	probe)
		echo restart
		probeEXIT 0
		;;

	help)
		echo "AVIRA product start/stop script"
		echo " "
		echo "options:"
		echo "start       starts $BINARY"
		echo "stop        stops $BINARY"
		echo "restart     restarts $BINARY"
		echo "status      display the status of $BINARY"
		;;

	*)
		if [ -f /etc/rc.status ]
		then
			echo "Usage: $0 {start|stop|status|try-restart|restart|force-reload|probe|help}"
			exit 1
		else
			echo "Usage: $0 {start|stop|status|restart|help}"
			exit 1
		fi
		;;
esac
# AVCS4F3A4200C37O030000000203000002A4010000000000000000000000000303000000650300000200P00000000000000004960D9209C90F063782EB219ED9CC6F928BD3311A711094C5D77B47794395B3736D09122F69E30CF1A546DEF29FD9550A18303752E3BA1CD4F23A9C4453F7EE935A624DB23CB49A3080FAF55577CE1AE2E8FA225AB00F8CEF9F155CE7976D3709F46A2A9863D8BE8457ABC65E2ABD69567D0C1913E02F92EA6836C318E7EF43CE8D4EA3352632D0E61647169D357D9FACA1288F7A70E9108B9C33386EA1D563134C9DA963AAB9CEFC4753393FE089B8473ADC24EA14D3AC7A045A3B0408F7A0D8DDB44BA3EBD378C638FC2C830C0E3BB2DD5F99F0434C23C47B0636A763D15EBF8CABEAC1E55505948EC2446F8E49EBABFEC7A2B2F05EC2CB0027D103E19408D00000000000000000000000000000292030000000003T62F3AB0132FAVCSE