#!/bin/sh
#
# Uninstalls AVIRA products
#
# Copyright (c) 2004, 2005 AVIRA GmbH
#
# VERSION 1.2

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

check_os()
{
	OS="`uname | tr '[:upper:]' '[:lower:]'`"
	PRETTY_OS="`uname`"
	OSREL="`uname -r`"
	KERNELVERSION="${OS}-${OSREL}"

	case "${OS}" in
	   linux)
		PRETTY_OS="GNU/Linux"
		if [ "${OSREL#2.6.}" != "${OSREL}" ]; then
			OS="linux26"
		fi

		# Determine the Linux distribution type
		DISTRO="unknown"
		PRETTY_DISTRO="an unknown"

		[ -e /etc/redhat-release ] && \
			DISTRO="redhat" PRETTY_DISTRO="a Red Hat"

		[ -e /etc/mandrake-release -o \
		  -e /etc/mandrakelinux-release ] && \
			DISTRO="mandrake" PRETTY_DISTRO="a Mandrake"

		[ -e /etc/fedora-release ] && \
			DISTRO="fedora" PRETTY_DISTRO="a Fedora Core"

		[ -e /etc/SuSE-release ] && \
			DISTRO="suse" PRETTY_DISTRO="a SuSE"

		[ -e /etc/debian_version ] && \
			EXELIST="$EXELIST update-rc.d" \
			DISTRO="debian" PRETTY_DISTRO="a Debian"

		[ -e /etc/slackware-version ] && \
			DISTRO="slackware" PRETTY_DISTRO="a Slackware"

		[ -e /etc/gentoo-release ] && \
			EXELIST="$EXELIST rc-update" \
			DISTRO="gentoo" PRETTY_DISTRO="a Gentoo"

		[ -e /etc/turbolinux-release ] && \
			DISTRO="turbolinux" PRETTY_DISTRO="a Turbolinux"
		;;

	   *)
		DISTRO="$OS"
		;;
	esac

	echo ""
	if [ "$DISTRO" != "$OS" ]
	then
		echo "This seems to be a "$PRETTY_OS" operating system" \
		     "with "$PRETTY_DISTRO" layout."
	else
		echo "This seems to be a "$PRETTY_OS" operating system."
	fi	
}


echo_sunos()
{
    if [ "X$1" = "X-n" ]
	then
    	    shift
	    printf "%s" "$*"
	else
	    printf "%s\n" "$*"
    fi
}

set_commands()
{
	case "${OS}" in
		sunos)
			ECHO="echo_sunos"
			PSAX="ps -Af"
			;;
		*)
			ECHO="echo"
			PSAX="ps ax"
			;;
	esac
}

check_executables()
{
	for EXE in $EXELIST
	do
		if [ ! -x "`which $EXE`" ]
		then
			$ECHO ""
			$ECHO "This script requires '$EXE' to run."
			$ECHO " "
			exit 1
		fi
	done
}

display_help()
{
	$ECHO "\`uninstall' removes AVIRA Products."
	$ECHO " "
	$ECHO "Usage: ./uninstall [OPTION]..."
	$ECHO " "
	$ECHO "Options:"
	$ECHO "  mailgate     uninstalls AVIRA MailGate"
	$ECHO "  milter       uninstalls AVIRA for Sendmail-Milter"
	$ECHO "  webgate      uninstalls AVIRA WebGate"
	$ECHO "  server       uninstalls AVIRA for UNIX Server"
	$ECHO "  desktop      uninstalls AVIRA Desktop for UNIX"
	$ECHO "  -h, --help   display this help and exit"
	$ECHO "  -f, --fast   uninstalls without delays"
	$ECHO "  -w, --wipe   removes also the configuration files from /etc"
	$ECHO " "
}

identify_rcd()
{

#
# RCDIR 	= directory where the symlinked runlevel init scripts reside
# INITDIR	= directory where the service init scripts reside
# INITSCRIPT	= the source file for the init script (either in /usr/lib/AVIRA,
#							or a link in $INITDIR)

	case $OS in
		freebsd)
			RCDIR="/usr/local/etc"
			INITDIR=""
			if [ ! -d "$RCDIR/rc.d" ]
			then
				RCDIR=""
			fi
			;;

		openbsd)
			RCDIR="/etc"
			INITDIR=""
			;;

		sunos)
			RCDIR="/etc"
			INITDIR="/etc/init.d"
			;;

		*)
			case $DISTRO in
				gentoo)
					RCDIR=""
					INITDIR="/etc/init.d"
					;;

				slackware)
					RCDIR=""
					INITDIR="/etc/rc.d"
					;;

				redhat|mandrake|fedora)
					RCDIR="/etc/rc.d"
					INITDIR="/etc/rc.d/init.d"

					# Check, just in case...
					if [ ! -d "$RCDIR/rc0.d" ]
					then
						RCDIR="/etc"
						if [ ! -d "$RCDIR/rc0.d" ]
						then
							RCDIR=""
						fi
					fi
					;;

				suse)
					RCDIR="/etc/init.d"
					INITDIR="/etc/init.d"

					# Check, just in case
					if [ ! -d "$RCDIR/rc0.d" ]
					then
						RCDIR="/etc/rc.d"
						if [ ! -d "$RCDIR/rc0.d" ]
						then
							RCDIR=""
						fi
					fi
					;;

				debian)
					RCDIR="/etc"
					INITDIR="/etc/init.d"

					# Check, just in case
					if [ ! -d "$RCDIR/rc0.d" ]
					then
						RCDIR="/etc/rc.d"
						if [ ! -d "$RCDIR/rc0.d" ]
						then
							RCDIR=""
						fi
					fi
					;;

				*)
					# Generic case for any OS, any distribution
					RCDIR="/etc"
					if [ ! -d "$RCDIR/rc0.d" ]
					then
						RCDIR="/etc/rc.d"
						if [ ! -d "$RCDIR/rc0.d" ]
						then
							RCDIR=""
						fi
					fi

					INITDIR="$RCDIR"
					;;
			esac

			# Check INITDIR
			if [ ! -d "$INITDIR" ]
			then
				INITDIR=""
			fi
			;;
	esac

	[ ! -z "$INITDIR" ] && $ECHO "Your system seems to keep the init scripts in $INITDIR"
	[ ! -z "$RCDIR" ] && $ECHO "Your system seems to keep the runlevel scripts in $RCDIR"
}

get_procs()
{
        PROCESSLIST=""
        case "${OS}" in
                sunos)
                        for PROC in `ps -Ao pid,args | grep ${PROCNAME}`
                        do
                                if [ -z "`$ECHO ${PROC} | sed -e s/[0-9]//g`" ]
                                then
                                        PROCESSLIST="${PROCESSLIST} ${PROC}"
                                fi
                        done
                        ;;
                *)
                        PROCESSLIST=`$PSAX | \
                                egrep "[ ]((${AVDIR}|/usr/sbin)/${PROCNAME}|\[${PROCNAME}\])( .*)*$" | \
                                sed -e 's/^[^0-9]*//' -e 's/ .*$//' | xargs`
                        ;;
        esac
}

stop_updater()
{
	PROCNAME="avira.*[-]-updater-daemon"
	get_procs
	if [ ! -z "$PROCESSLIST" ]
	then
		$ECHO "A version of Internet Updater appears to be running. Trying to stop it..."
		"$AVDIR/$UPDATERSCRIPT" stop
                if [ $? -ne 0 ]
                then
			$ECHO ""
			$ECHO "Failed to stop running Internet Updater. Uninstall stopped."
			$ECHO ""
			exit 1
		fi
		$ECHO ""
	fi
}

stop_webgate()
{
	PROCNAME="aiwebgate.[b]in"
	get_procs
	if [ ! -z "$PROCESSLIST" ]
	then
		$ECHO "A version of WebGate appears to be running. Trying to stop it..."
		"$AVDIR/$WEBGATESCRIPT" stop
                if [ $? -ne 0 ]
                then
			$ECHO ""
			$ECHO "Failed to stop running WebGate. Uninstall stopped."
			$ECHO ""
			exit 1
		fi
		$ECHO ""
	fi
}

stop_aiguard()
{
	PROCNAME="avira.*-[-]workstation"
	get_procs
	TEMPLIST="$PROCESSLIST"

	PROCNAME="avira.*-[-]server"
	get_procs

	if [ ! -z "$TEMPLIST" -o ! -z "$PROCESSLIST" ]
	then
		$ECHO "A version of AiGuard appears to be running. Trying to stop it..."
		"$AVDIR/$GUARDSCRIPT" stop
                if [ $? -ne 0 ]
                then
			$ECHO ""
			$ECHO "Failed to stop running AiGuard. Uninstall stopped."
			$ECHO ""
			exit 1
		fi
		$ECHO ""
	fi
}

stop_mailgate()
{
	PROCNAME="aigate[df]"
	get_procs
	if [ ! -z "$PROCESSLIST" ]
	then
		$ECHO "A version of MailGate appears to be running. Trying to stop it..."
		$MAILGATESCRIPT stop
                if [ $? -ne 0 ]
                then
			$ECHO ""
			$ECHO "Failed to stop running MailGate. Uninstall stopped"
			$ECHO ""
			exit 1
		fi
		$ECHO ""
	fi
}

stop_milter()
{
	PROCNAME="aimilte[r]"
	get_procs
	if [ ! -z "$PROCESSLIST" ]
	then
		$ECHO "A version of Milter appears to be running. Trying to stop it..."
		$MILTERSCRIPT stop
                if [ $? -ne 0 ]
                then
			$ECHO ""
			$ECHO "Failed to stop running Milter. Uninstall stopped"
			$ECHO ""
			exit 1
		fi
		$ECHO ""
	fi
}

remove_startup_links()
{
	case $OS in
		freebsd)
			rm -f "$RCDIR/rc.d/$LINKNAME.sh"
			;;

		openbsd)
			# We don't need to do anything here, as for OpenBSD there
			# shouldn't be AVIRA scripts outside $AVDIR and the
			# entries in /etc/rc.local are harmless without an $AVDIR
			;;

		*)
			if [ ! -z "$INITDIR" ]
			then
				rm -f "$INITDIR/$LINKNAME"
			fi

			case $DISTRO in
			  gentoo)
			  	# Gentoo Linux does not use symlinked init scripts
				$SLEEP 1
				$ECHO -n "Updating init scripts table ... "
				rc-update del $LINKNAME >/dev/null
				$ECHO "done"
				rm -f "$INITDIR/$LINKNAME"
				;;
			  debian)
			  	# Debian Linux has a special tool: update-rc.d
				$SLEEP 1
				$ECHO -n "Updating init scripts table ... "
				update-rc.d -f $LINKNAME remove >/dev/null
				$ECHO "done"
				;;	
			  slackware)
			  	# Slackware Linux uses a BSD-style rc.local startup script
				# We should remove the inserted startup sequence from
				# /etc/rc.d/rc.local, but that doesn't execute anyway because
				# the init script is already removed
				;;
			  	
			  *)
				for LEVEL in 0 1 2 3 4 5 6
				do
					rm -f "$RCDIR/rc$LEVEL.d/S20$LINKNAME"
					rm -f "$RCDIR/rc$LEVEL.d/K20$LINKNAME"
				done
					;;
			esac
			;;
	esac
}

remove_updater()
{
	stop_updater
	LINKNAME=aiupdater
	$ECHO "Removing Internet Updater start-up links..."
	$SLEEP 2
	remove_startup_links
	$ECHO "Removing Internet Updater specific files..."
	$SLEEP 2
	rm -f "$AVDIR/aiupdater"
}

remove_docs()
{
	rm -rf "$AVDIR"/doc/"$1"
}

remove_configs()
{
	for config_file in $*
	do
		rm -f /etc/$config_file
	done
}

remove_webgate()
{
	stop_webgate
	LINKNAME=aiwebgate
	$ECHO "Removing WebGate start-up links..."
	$SLEEP 2
	remove_startup_links
	$ECHO "Removing WebGate specific files..."
	$SLEEP 2
	rm -f "$AVDIR"/README.aiwebgate "$AVDIR"/aiwebgate*
	rm -rf "$AVDIR"/alert
	remove_docs webgate
	if [ $WIPE -eq 1 ]
	then
		$ECHO "Removing WebGate configuration files as instructed..."
		$SLEEP 2
		remove_configs aiwebgate.conf
	fi
	WGT_FOUND=0
	remove_core_files
}

remove_aiguard()
{
	stop_aiguard
	LINKNAME=aiguard
	$ECHO "Removing AiGuard start-up links..."
	$SLEEP 2
	remove_startup_links
	$ECHO "Removing AiGuard specific files..."
	$SLEEP 2
	rm -f "$AVDIR"/*guard
	rm -f /usr/sbin/aiguard
	remove_docs $AIG_VAR
	if [ $WIPE -eq 1 ]
	then
		$ECHO "Removing AiGuard configuration files as instructed..."
		$SLEEP 2
		remove_configs aiguard.conf
	fi
	AIG_FOUND=0
	remove_core_files
}


remove_mailgate()
{
	stop_mailgate
	LINKNAME=aigate
	$ECHO "Removing MailGate start-up links..."
	$SLEEP 2
	remove_startup_links
	rm -f /etc/rc.d/aigate /etc/init.d/aigate /sbin/init.d/aigate \
		"`which rcaigate 2>/dev/null`" "`which aiq 2>/dev/null`" "$AVDIR"/aigate
	$ECHO "Removing MailGate specific files..."
	$SLEEP 2
	if [ -z "$MANPATH" ]
	then 
		MGTMANPATH="/usr/share/man"
	else
		MGTMANPATH=`echo ${MANPATH} | cut -d : -f 1`
	fi
	rm -f "`which aigated 2>/dev/null`" "`which aigatefwd 2>/dev/null`"
	rm -f "$MGTMANPATH"/man5/aimailgate.conf.5 "$MGTMANPATH"/man8/aimailgate.8
	remove_docs mailgate
	if [ $WIPE -eq 1 ]
	then
		$ECHO "Removing MailGate configuration files as instructed..."
		$SLEEP 2
		remove_configs aimailgate.conf aimailgate.ignore \
		aimailgate.scan aimailgate.warn aimailgate.acl
	fi
	SPOOL_WARN=1
	MGT_FOUND=0
	remove_core_files
}

remove_milter()
{
	stop_milter
	LINKNAME=aimilter
	$ECHO "Removing Milter start-up links..."
	$SLEEP 2
	remove_startup_links
	rm -f /etc/rc.d/aimilter /etc/init.d/aimilter /sbin/init.d/aimilter \
		"`which rcaimilter 2>/dev/null`" "`which aiq 2>/dev/null`" "$AVDIR"/aimilter
	$ECHO "Removing Milter specific files..."
	$SLEEP 2
	rm -f "`which aimilter 2>/dev/null`"
	remove_docs milter
	if [ $WIPE -eq 1 ]
	then
		$ECHO "Removing Milter configuration files as instructed..."
		$SLEEP 2
		remove_configs aimilter.conf aimilter.ignore \
		aimilter.scan aimilter.warn
	fi
	SPOOL_WARN=1
	MLT_FOUND=0
	remove_core_files
}

remove_core_files()
{
	if [ `expr $MGT_FOUND + $MLT_FOUND + $WGT_FOUND + $AIG_FOUND` -eq 0 ]
	then
		$ECHO ""
		$ECHO "It seems that there are no other AVIRA products installed."
		remove_updater
		$ECHO ""
		$ECHO -n "Would you like to remove the $AVDIR directory? (y/[n]) "
		read INPUT
		case $INPUT in
			y*|Y*)
				$ECHO ""
				$ECHO "Removing AVIRA core files..."
				$SLEEP 2
				rm -rf "$AVDIR"
				rm -f /usr/bin/avira
				if [ $WIPE -eq 1 ]
				then
					$ECHO "Removing AVIRA core configuration files as instructed..."
					$SLEEP 2
					remove_configs avira.conf
				fi
				$ECHO ""
				;;
			*)
				$ECHO ""
				$ECHO "AVIRA core files were not removed..."
				$ECHO ""
				$SLEEP 1
		esac
	else
		$ECHO
		$ECHO "You have at least one more AVIRA product installed."
		$ECHO "AVIRA core files and AVIRA updater were not removed."
		$ECHO ""
		$SLEEP 1
	fi
	
}



# main ()
MIN_ARGS=1
SLEEP="sleep"
AVDIR="/usr/lib/AVIRA"
EXELIST="which id cat grep cp uname ps sed true"
UPDATERSCRIPT="aiupdater"
WEBGATESCRIPT="aiwebgate"
GUARDSCRIPT="aiguard"
MAILGATESCRIPT="rcaigate"
MILTERSCRIPT="rcaimilter"
WIPE=0

check_os
set_commands
check_executables

$ECHO ""
$ECHO "Starting AVIRA Uninstall..."
$ECHO ""


for arg in $@
do
	case $arg in
		--fast|-f|--nosleep)
			SLEEP="true"
			MIN_ARGS=2
			;;
		--help|-h)
			display_help
			exit 0
			;;
		--wipe|-w)
			WIPE=1
			;;
	esac
done

ID="`id`"
CUT="`echo $ID | sed -e s/\^uid=0\(//`"

if [ "$CUT" = "$ID" ]
then
	$ECHO ""
	$ECHO "This script must be run as root."
	$ECHO " "
	exit 1
fi

identify_rcd
$ECHO " "

MGT_FOUND=0
MLT_FOUND=0
WGT_FOUND=0
AIG_FOUND=0
SPOOL_WARN=0
AIG_VAR="none"

if [ -d "$AVDIR" ]
then
	if [ -x "$AVDIR/$WEBGATESCRIPT" ]
	then
		$SLEEP 1
		WGT_FOUND=1
		$ECHO "AVIRA WebGate found..."
		$SLEEP 1
	fi
	if [ -x "$AVDIR/$GUARDSCRIPT" ]
	then
		$SLEEP 1
		AIG_FOUND=1
		if grep -q ^GUARD_TYPE=\"server\" "$AVDIR/$GUARDSCRIPT"
		then
			$ECHO "AVIRA for UNIX Server found..."
			AIG_VAR="server"
			$SLEEP 1
		else
			$ECHO "AVIRA Desktop for UNIX found..."
			AIG_VAR="desktop"
			$SLEEP 1
		fi
	fi	
	if [ -x "`which $MAILGATESCRIPT 2>/dev/null`" ] # It's a bit different for MailServer...
	then
		$SLEEP 1
		MGT_FOUND=1
		$ECHO "AVIRA MailGate found..."
		$SLEEP 1
	fi	
	if [ -x "`which $MILTERSCRIPT 2>/dev/null`" ] # It's a bit different for MailServer...
	then
		$SLEEP 1
		MLT_FOUND=1
		$ECHO "AVIRA for Sendmail-Milter found..."
		$SLEEP 1
	fi
else
	$ECHO "It seems that there are no AVIRA products installed!"
	$ECHO ""
	exit 1
fi

if [ `expr $MGT_FOUND + $MLT_FOUND + $WGT_FOUND + $AIG_FOUND` -eq 0 ]
	then
		$ECHO "It seems that there are no AVIRA products installed, although $AVDIR exists."
		$ECHO ""
		exit 1
fi

$ECHO ""
for arg in $@
do
	case $arg in
		mailgate)
			if [ $MGT_FOUND -eq 1 ]
			then
				remove_mailgate
			else
				$ECHO "AVIRA MailGate installation not found or corrupted."
				$ECHO ""
				exit 1
			fi
			;;
		milter)
			if [ $MLT_FOUND -eq 1 ]
			then
				remove_milter
			else
				$ECHO "AVIRA for Sendmail-Milter installation not found or corrupted!"
				$ECHO ""
				exit 1
			fi
			;;
		webgate)
			if [ $WGT_FOUND -eq 1 ]
			then
				remove_webgate
			else
				$ECHO "AVIRA WebGate installation not found or corrupted!"
				$ECHO ""
				exit 1
			fi
			;;
		server)
			if [ $AIG_VAR = "server" ]
			then
				remove_aiguard
			else
				$ECHO "AVIRA for UNIX Server installation not found or corrupted!"
				$ECHO ""
				exit 1
			fi
			;;
		desktop)
			if [ $AIG_VAR = "desktop" ]
			then
				remove_aiguard
			else
				$ECHO "AVIRA Desktop for UNIX installation not found or corrupted!"
				$ECHO ""
				exit 1
			fi
			;;
		--fast|-f|--nosleep)
			true
			;;
		--wipe|-w)
			true
			;;
		*)
			$ECHO "Unknown option \`$arg'!"
			$ECHO ""
			exit 1
			;;
	esac
done

if [ $# -lt $MIN_ARGS ]
then
	display_help
	exit 1
fi

$ECHO "AVIRA logs were not removed."
$SLEEP 1
if [ $WIPE -eq 0 ]
then
	$ECHO "AVIRA configuration files in /etc were not removed."
	$SLEEP 1
fi
if [ $SPOOL_WARN -eq 1 ]
then
	$ECHO "Spool directories of the freshly uninstalled AVIRA product were not removed."
	$SLEEP 1
fi
$ECHO ""
$ECHO "AVIRA Uninstall has finished succesfully."
$ECHO ""
exit 0


