#!/bin/sh
# Copyright 2003 Mike Markley <mike@markley.org>
# This script is free for any purpose whatseoever so long as the above
# copyright notice remains in place.
#
# Modified for Gentoo: Benjamin Smee
# Date: Fri Sep 10 11:36:04 BST 2004

# This is the email address reports get mailed to
MAILTO=root@localhost

# Defaults
#MAILTO="${MAILTO:-root}"

# Options
opt_f=0
opt_y=0
opt_c=0
opt_b=0
config="/etc/aide/aide.conf"

aideinit_usage() {
	echo "Usage: $0 [options] -- [aide options]"
	echo "  -y|--yes         Overwrite output file"
	echo "  -f|--force       Force overwrite of database"
	echo "  -c|--config      Specify alternate config file"
	echo "  -o|--output      Specify alternate output file"
	echo "  -d|--database    Specify alternate database file"
	echo "  -b|--background  Run in the background"
}

while [ -n "$1" ]; do
	case "$1" in
	    -h|--help)
		aideinit_usage
		exit 0
		;;
	    -f|--force)
		opt_f=1
		shift
		;;
	    -y|--yes)
		opt_y=1
		shift
		;;
	    -b|--background)
		opt_b=1
		shift
		;;
	    -o|--output)
		shift
		[ -z "$1" ] && aideinit_usage && exit 1
		outfile=$1
		shift
		;;
	    -d|--database)
		shift
		[ -z "$1" ] && aideinit_usage && exit 1
		dbfile=$1
		shift
		;;
	    -c|--config)
		opt_c=1
		shift
		[ -z "$1" ] && aideinit_usage && exit 1
		config=$1
		shift
		;;
	    --)
	    	shift
		break 2
		;;
	    *)
		echo "Unknown option $1 (use -- to delimit aideinit and aide options)"
		exit
		;;
	esac
done

if [ ! -f "$config" ]; then
	echo "$0: $config: file not found"
	exit 1
fi

if [ -z "$outfile" ]; then
	outfile=`egrep "database_out=file:" $config | cut -d: -f2`
	[ -z "$outfile" ] && outfile="/var/lib/aide/aide.db.new"
fi
if [ -z "$dbfile" ]; then
	dbfile=`egrep "database=file:" $config | cut -d: -f2`
	[ -z "$dbfile" ] && dbfile="/var/lib/aide/aide.db"
fi

if [ -f $outfile ]; then
	if [ $opt_y -eq 0 ]; then
		echo -n "Overwrite existing $outfile [Yn]? "
		read yn
		case "$yn" in
		    [Nn]*)
			exit 0
			;;
		esac
	fi
fi

extraflags=""

if [ $opt_c -eq 1 ]; then
	extraflags="$extraflags --config $config"
fi

if [ $opt_b -eq 1 ]; then
	(aide --init $extraflags $@ >/var/log/aide/aideinit.log 2>/var/log/aide/aideinit.errors
	if [ -f "$dbfile" -a $opt_f -eq 0 ]; then
		echo "$dbfile exists and -f was not specified" >> /var/log/aide/aideinit.errors
	fi
	lines=`wc -l /var/log/aide/aideinit.errors | awk '{ print $1 }'`
	if [ "$lines" -gt 0 ]; then
		(echo "AIDE init errors:"; cat /var/log/aide/aideinit.errors) | /bin/mail -s "AIDE initialization problem" $MAILTO
	else
		cp -f $outfile $dbfile
	fi) &
	exit 0
fi

echo "Running aide --init..."
aide --init $extraflags $@

return=$?
if [ $return -ne 0 ]; then
	echo "Something didn't quite go right; see $outfile for details" >&2
	exit $return
fi

if [ -f "$dbfile" -a $opt_f -eq 0 ]; then
	echo -n "Overwrite $dbfile [yN]? "
	read yn
	case "$yn" in
	    [yY]*)
		cp -f $outfile $dbfile
		;;
	esac
else
	cp -f $outfile $dbfile
fi
