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

AVDIR='/usr/lib/AntiVir'
LICENSE_CHECK='--check-product'

# check if platform is supported
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


# check which product update was started and set some defaults
case "`basename $0`" in
	avupdate-mailgate)
		MAIN_PRODUCT='mailgate'
		INSTALL_SUBDIR="$MAIN_PRODUCT"
		PRODUCT_SCANNER='savapi3_mailgate'
		if [ -x "$AVDIR/mailgate/avmailgate.bin" ]
		then
			INSTALLED_PRODUCTS='MailGate Scanner'
		else
			echo 'MailGate installation is incorrect'
			exit 2
		fi
	;;
	avupdate-webgate)
		MAIN_PRODUCT='webgate'
		INSTALL_SUBDIR="$MAIN_PRODUCT"
		PRODUCT_SCANNER='savapi3_webgate'
		if [ -x "$AVDIR/webgate/avwebgate.bin" ]
		then
			INSTALLED_PRODUCTS='WebGate Scanner'
		else
			echo 'WebGate installation is incorrect'
			exit 2
		fi
	;;
	avupdate-guard)
		MAIN_PRODUCT='guard'
		INSTALL_SUBDIR="$MAIN_PRODUCT"
		PRODUCT_SCANNER='savapi3_guard'
		if [ -x "$AVDIR/guard/avguard.bin" ]
		then
			INSTALLED_PRODUCTS='Guard Scanner'
		else
			echo 'Guard installation is incorrect'
			exit 2
		fi
	;;
	avupdate-savapi3)
		MAIN_PRODUCT='savapi3'
		INSTALL_SUBDIR="savapi3_oem"
		PRODUCT_SCANNER="savapi3_oem"
		if [ -x "$AVDIR/savapi3_oem/savapi" ]
		then 
			INSTALLED_PRODUCTS='Savapi3_oem'
		else 
			echo 'Savapi3_oem installation is incorrect'
			exit 2
		fi
	;;
	avupdate-agent)
		MAIN_PRODUCT='agent'
		INSTALL_SUBDIR="$MAIN_PRODUCT"
		PRODUCT_SCANNER=''
		LICENSE_CHECK=''
		if [ -x "$AVDIR/agent/agent" ]
		then
			INSTALLED_PRODUCTS='Agent'
		else
			echo 'Smc Agent installation is incorrect'
			exit 2
		fi
	;;
	avupdate-scancl)
		MAIN_PRODUCT='scancl'
		INSTALL_SUBDIR=""
		PRODUCT_SCANNER=''
		if [ -x "$AVDIR/scancl" ]
		then
			INSTALLED_PRODUCTS='Scancl'
		else
			echo 'Scancl installation is incorrect'
			exit 2
		fi
	;;
	avupdate-ium)
		MAIN_PRODUCT='ium'
		INSTALL_SUBDIR="$MAIN_PRODUCT"
		PRODUCT_SCANNER=''
		LICENSE_CHECK=''
		if [ -x "$AVDIR/ium/ium" ]
		then
			INSTALLED_PRODUCTS='IUM'
		else
			echo 'IUM installation is incorrect'
			exit 2
		fi
	;;
	*)
		echo 'Could not determine the installation type'
		exit 2
	;;
esac
CONFIG="--config=/etc/avira/avupdate-$MAIN_PRODUCT.conf"

# create a new avupdate conf file for each product
if [ ! -f "/etc/avira/avupdate-$MAIN_PRODUCT.conf" -a -f '/etc/avira/avupdate.conf' ]
then
	cp /etc/avira/avupdate.conf /etc/avira/avupdate-$MAIN_PRODUCT.conf
	if [ "$?" -eq 0 ]
	then
		echo 
		echo '************************************************************'
		echo ' INFO: /etc/avira/avupdate.conf was merged to'
		echo "       /etc/avira/avupdate-$MAIN_PRODUCT.conf, because"
		echo '        of the new product update structure. This'
		echo '        change will effect your next update'
		echo '************************************************************'
		exit 0
	fi

	grep "temp-dir=/tmp/avira_update/$INSTALL_SUBDIR" /etc/avira/avupdate-$MAIN_PRODUCT.conf > /dev/null 2>&1
	if [ "$?" -eq "0" ]
	then
		echo "patching /etc/avira/avupdate-$MAIN_PRODUCT.conf ... "
		cp /etc/avira/avupdate-$MAIN_PRODUCT.conf /etc/avira/avupdate-$MAIN_PRODUCT.conf.tmp
		cat /etc/avira/avupdate-$MAIN_PRODUCT.conf.tmp | sed 's,temp-dir=/tmp/avira_update,temp-dir=/tmp/avira_update/'$INSTALL_SUBDIR',' > /etc/avira/avupdate-$MAIN_PRODUCT.conf
		rm /etc/avira/avupdate-$MAIN_PRODUCT.conf.tmp
	fi
fi

# functions
display_help ()
{
	echo 
	echo "Usage: `basename $0` [optional parameters] --product='Product'"
	echo 
	echo 'Available products:'
	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-$MAIN_PRODUCT.conf)"
	echo '   -c|--check               (only check if updates are available)'
	echo '   --force                  (forces an update when there is a problem with the license check)'
	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 any avupdate.conf'
	echo 'option as an avupdate script parameter.'
}



# main
PROD_FOUND='0'
PROD_SPECIFIED='0'
CHECK=''
UNKNOWN_AVUPDATE_PARAMETER=''


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 | sed -e 's,^--product=,,' | dd conv=lcase 2>/dev/null`"
			PROD_SPECIFIED='1'
			# check if update is for installed product

			if [ "$PRODUCT" = "engine" -o "$PRODUCT" = "signatures" -o "$PRODUCT" = 'scanner' ]
			then
				PRODUCT="$MAIN_PRODUCT"
				MODULES_LIST="--update-modules-list=AVE2,VDF"
			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 available for update or invalid product specified'
				display_help
				exit 2
			fi
			;;

		--config=*)
			CONFIG="$PARAM"
			;;

		-c | --check)
			CHECK='--check-if-update-available'
			;;

		-h | --help)
			display_help
			exit 0
			;;

		--force)
			LICENSE_CHECK=''
			;;

		-v | --version)
			$AVDIR/$INSTALL_SUBDIR/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 0 ]
then
	# default is to update product since script name suggests already
	PRODUCT="$MAIN_PRODUCT"

fi

if [ ! -x "$AVDIR/$INSTALL_SUBDIR/avupdate.bin" ]
then
	echo 
	echo "Cannot execute $AVDIR/$INSTALL_SUBDIR/avupdate.bin"
	exit 2
fi
# 	set product idx and info.gz files
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/$INSTALL_SUBDIR/avupdate.bin $CONFIG $CHECK --product-file=${PRODUCT_FILE} --product-info-file=${PRODUCT_INFO_FILE} ${MODULES_LIST} --update-dir=$AVDIR/$INSTALL_SUBDIR --skip-master-file --show-progress $LICENSE_CHECK ${UNKNOWN_AVUPDATE_PARAMETER}
EXIT_CODE="$?"
if [ $EXIT_CODE -eq '1' ] # this happens when there is nothing to update
then
	EXIT_CODE='0'
fi

if [ $PRODUCT = 'savapi3_webgate' ]
then
	#update_webcat also in this case
	$AVDIR/$INSTALL_SUBDIR/avupdate.bin $CONFIG $CHECK --product-file="/update/idx/webgate-${CLASS}-en.idx" --product-info-file="/update/idx/webgate-${CLASS}-en.info.gz" --update-modules-list=WEBCAT --update-dir=$AVDIR/$INSTALL_SUBDIR --skip-master-file --show-progress $LICENSE_CHECK ${UNKNOWN_AVUPDATE_PARAMETER}
	EXIT_CODE_WEBCAT="$?"
	if [ $EXIT_CODE_WEBCAT -eq '1' ] # this happens when there is nothing to update
	then
		EXIT_CODE_WEBCAT='0'
	fi
fi

if [ $EXIT_CODE -eq '0' ]
then
	# main update was successful, maybe there was an webcat update error
	exit $EXIT_CODE_WEBCAT
fi
# return the main update error code
exit $EXIT_CODE
# AVCS4F3A4200C37O030000000203000002A4010000000000000000000000000303000000650300000200P000000000000000030969C6268248AC299760C966FDA5F532DC60EE787728FF5270552CC119C292B471DF92584CA934056E17BA96279D69886C747BCCC278BEA255A1B3B8EEEA401DE71E269C7DA25B89BDAB4866975DBD3DCA83BCDF5705FB41BE3C5067F36BFB238329518DCE1CC0D8177D12200FC2A702DB24847E72B3F71396444734C15D27947FCCE97850B04478B324F9E224D5166865AEA3498A9B8F4D40ECD33FE7604CE652AF0D4A32760510019E36E25AFF3DCD846FB63291D0545A6366E87BFBCA0839BAB09D46FC6B0D897059B90D7F0A8E6C5EE5A6EE52D575D8ED797FAB471020662EE08D747D34BD8E639ABD1CEDA674E5FF308B8D5F38F54856B29E14B40ED1D00000000000000000000000000000292030000000003T62F3AB0132FAVCSE