#!/bin/sh
#
# Copyright (c) 2009 AVIRA GmbH
#
# This script updates installed AVIRA products and their components

OS=`uname | env LANG=C LC_ALL=C LC_CTYPE=C tr '[:upper:]' '[:lower:]'`
case "${OS}" in
	linux)
		CLASS='linux_glibc22'
		;;
	sunos)
		CLASS='solaris_sparc'
		;;
	*)
		echo 'Platform not supported'
		exit 2
		;;
esac

update_prod ()
{
	case $PRODUCT in
		ium)
			LICENSE_CHECK=''
			if [ -f '/etc/avira/avupdate-ium.conf' -a ! -f '/etc/avira/avupdate.conf' ]
			then
				grep -v product-file /etc/avira/avupdate-ium.conf > /etc/avira/avupdate.conf
				if [ "$?" -eq 0 ]
				then
					echo '************************************************************'
					echo ' INFO: /etc/avira/avupdate-ium.conf was merged to'
					echo '       /etc/avira/avupdate.conf, because of the new'
					echo '       avupdate structure'
					echo '************************************************************'
				fi
			fi
			;;

		agent)
			LICENSE_CHECK=""
			;;

		scanner|engine|signatures)
			PRODUCT='savapi3'
			if [ -x "$AVDIR/avwebgate.bin" ]
			then
				# webcat update when avwebgate.bin is available
				UPDATE_WEBCAT="1"

				WEBCAT_PRODUCT='webgate'
				WEBCAT_MODULES_LIST='--update-modules-list=WEBCAT'
				WEBCAT_PRODUCT_FILE="/update/idx/${WEBCAT_PRODUCT}-${CLASS}-en.idx"
				WEBCAT_PRODUCT_INFO_FILE="/update/idx/${WEBCAT_PRODUCT}-${CLASS}-en.info.gz"
			fi
			;;
	esac
	
	PRODUCT_FILE="/update/idx/${PRODUCT}-${CLASS}-en.idx"
	PRODUCT_INFO_FILE="/update/idx/${PRODUCT}-${CLASS}-en.info.gz"

	if [ "$CHECK" ]
	then
		echo 'Checking for updates...'
	else
		echo 'Updating, please wait...'
	fi
	$AVDIR/avupdate.bin $CONFIG $CHECK --product-file=${PRODUCT_FILE} --product-info-file=${PRODUCT_INFO_FILE} ${MODULES_LIST} --skip-master-file $LICENSE_CHECK ${UNKNOWN_AVUPDATE_PARAMETER}
	UPDATE_ERR1="$?"
	if [ "$UPDATE_WEBCAT" -eq "1" ]
	then
		if [ -x $AVDIR/avwebgate_reload.sh ]
		then
			if [ "$CHECK" ]
			then
				echo 'Checking for WebCat updates...'
			else
				echo 'Updating WebCat files, please wait...'
			fi
			$AVDIR/avupdate.bin $CONFIG $CHECK --product-file=${WEBCAT_PRODUCT_FILE} --product-info-file=${WEBCAT_PRODUCT_INFO_FILE} ${WEBCAT_MODULES_LIST} --skip-master-file $LICENSE_CHECK ${UNKNOWN_AVUPDATE_PARAMETER}
			UPDATE_ERR2="$?"
		else
			UPDATE_ERR2="0"
			echo "INFO: Please update your WebGate to receive also the webcat updates."
		fi
	fi
}

display_help ()
{
	echo 
	echo `basename $0` - Updates AVIRA AntiVir products
	echo 
	echo "Usage:  $0 [optional parameters] --product='Product'"
	echo 
	echo 'Products installed:'

	for PROD in $INSTALLED_PRODUCTS
	do
		case "$PROD" in
			MailGate)
				echo '   MailGate       (includes Scanner, Engine and Signatures)'
				;;

			WebGate)
				echo '   WebGate        (includes Scanner, Engine and Signatures)'
				;;

			Guard)
				echo '   Guard          (includes Scanner, Engine and Signatures)'
				;;

			*)
				echo "   $PROD"
				;;
		esac
	done

	echo
	echo 'Optional parameters:'
	echo "   --config='PATH'          (specify a different configuration file than /etc/avira/avupdate.conf)"
	echo '   -c|--check               (only check if updates are available)'
	echo
	echo 'Other options:'
	echo '   -h|--help                (this help message)'
	echo '   -v|--version             (displays avupdate.bin version)'
	echo " "
	echo "For more informations please read the avupdater.txt file. You can also use all avupdate.conf"
	echo "options as an avupdate script parameter."
}

# main
AVDIR='/usr/lib/AntiVir'
if [ ! -x "$AVDIR/avupdate.bin" ]
then
	echo ''
	echo "Cannot execute $AVDIR/avupdate.bin"
	exit 2
fi

INSTALLED_PRODUCTS=''
if [ -x "$AVDIR/avguard.bin" ]
then
	INSTALLED_PRODUCTS="$INSTALLED_PRODUCTS Guard"
fi
if [ -x "$AVDIR/avmailgate.bin" ]
then
	INSTALLED_PRODUCTS="$INSTALLED_PRODUCTS MailGate"
fi
if [ -x "$AVDIR/avwebgate.bin" ]
then
	INSTALLED_PRODUCTS="$INSTALLED_PRODUCTS WebGate"
fi
if [ -x "$AVDIR/ium/ium" ]
then
	INSTALLED_PRODUCTS="$INSTALLED_PRODUCTS IUM"
fi
if [ -x "$AVDIR/agent/agent" ]
then
	INSTALLED_PRODUCTS="$INSTALLED_PRODUCTS Agent"
fi
if [ -x "$AVDIR/savapi" -o -x "$AVDIR/aeset.dat" ]
then
	INSTALLED_PRODUCTS="$INSTALLED_PRODUCTS Scanner"
fi
if [ "$INSTALLED_PRODUCTS" = '' ]
then
	echo 'No AVIRA products installed'
	exit 2
fi

if [ -z "$1" ]
then
	echo 'No product specified'
	display_help
	exit 2
fi

CHECK=''
CONFIG='--config=/etc/avira/avupdate.conf'
PRODUCT=''
LICENSE_CHECK='--check-product'
UNKNOWN_AVUPDATE_PARAMETER=""
UPDATE_WEBCAT="0"
PROD_FOUND="0"
PROD_SPECIFIED="0"
UPDATE_ERR1="0"
UPDATE_ERR2="0"

for PARAM in "$@"
do
	case ${PARAM} in
		--product=*)
			if [ "$PROD_SPECIFIED" -eq 1 ]
			then
				echo 'Cannot update more than one product at once'
				display_help
				exit 2
			fi
			PRODUCT=`echo $PARAM | cut -d'=' -f2 | dd conv=lcase 2>/dev/null`
			PROD_SPECIFIED="1"

			# check if update is for installed product
			if [ "$PRODUCT" = "engine" -o "$PRODUCT" = "signatures" ]
			then
				PRODUCT="scanner"
			fi

			for ITEM in `echo $INSTALLED_PRODUCTS | dd conv=lcase 2>/dev/null`
			do
		        	if [ "$PRODUCT" = "$ITEM" ]
				then
		        	        PROD_FOUND=1
        			fi
			done
			if [ $PROD_FOUND -eq 0 ]
			then
				echo "Product" `echo $PARAM | cut -d'=' -f2` "not installed or invalid product specified"
				display_help
				exit 2
			fi
			;;

		--config=*)
			CONF_LOCATION=`echo $PARAM | cut -d '=' -f2`
			# check for valid configuration file
			if [ ! -f "$CONF_LOCATION" ]
			then
				echo 
				echo "$CONF_LOCATION not found"
				exit 2
			fi
			CONFIG=$PARAM
			;;

		-c|--check)
			CHECK='--check-if-update-available'
			;;
		-h|--help)
			display_help
			exit 0
			;;

		-v|--version)
			$AVDIR/avupdate.bin --version
			exit 0
			;;

		*)
			echo "unkown script parameter found. the parameter will be used for direct avupdate.bin start ... "
			UNKNOWN_AVUPDATE_PARAMETER="${PARAM} ${UNKNOWN_AVUPDATE_PARAMETER}"
			;;
	esac
done

if [ $PROD_SPECIFIED -eq 1 ]
then
	update_prod
	if [ "$UPDATE_ERR2" -eq "0" -o "$UPDATE_ERR2" -eq "1" -o "$UPDATE_ERR1" -eq "0" -o "$UPDATE_ERR1" -eq "1" ]
	then
		exit 0
	else
		exit "$UPDATE_ERR1"
	fi
else
	echo 'No product specified'
	display_help
	exit 2
fi
