#!/bin/bash

usage="[/path/to/real_file.db [/path/to/link_file.db]] [--debug] [--verbose]"
help="
A DRAC-enabled MTA performs better by using a seldomly, instead of
constantly changing, access database.  This script creates a link
to a snapshotted database which the MTA can use.  It is designed
to run every minute from cron.  Here is an example cron configuration:

  *  *  *  *  *   $(basename "$0")
"

for i in $* ; do
	case "${i}" in
	  --verbose | -verbose | -v | --debug | -debug | -d)
		debug=1
		;;
	  --usage | -usage | -u )
		echo "usage: $(basename "$0") ${usage}"
		exit 1
		;;
	  --help | -help | -h)
		echo "${help}"
		echo "usage: $(basename "$0") ${usage}"
		echo
		exit 1
		;;
	  *)
		args[${#args}]="${i}"
		;;
	esac
done
			
debug_print() {
	if [ -n "${debug}" ] ; then
		if [ -n "$2" ] ; then
			echo -n "$1 ... "
		else
			echo "$1"
		fi
	fi
}

check_result() {
	if [ "$?" -ne 0 ] ; then
		debug_print
		if [ -n "$1" ] ; then
			echo "$(basename "$0"): $1, exiting ..."
		else
			echo "$(basename "$0"): exiting ..."
		fi
		exit 1
	fi
}

debug_print "finding current minute" "1"
min="$(date '+%-M')" && \
[ -n "${min}" ]
check_result "can't determine current minute"
debug_print "success! (${min})"

debug_print "finding drac database file" "1"
real="${args[0]:-/var/lib/drac/drac.db}" && \
[ -n "${real}" -a -f "${real}" ]
check_result "can't find drac database file"
debug_print "success! (${real})"

debug_print "setting drac link file" "1"
link="${args[1]:-/var/lib/drac/drac_link.db}" && \
[ -n "${link}" -a -d "$(dirname "${link}")" ]
check_result "can't set drac link file"
debug_print "success! (${link})"

debug_print "finding new drac database" "1"
new="${real}$(( ${min} % 3 ))" && \
[ "${new}" != "${real}" ]
check_result "can't set new drac database"
debug_print "success! (${new})"

debug_print "finding old drac database" "1"
old="${real}$(( (${min} + 1) % 3 ))" && \
[ "${old}" != "${real}" -a "${old}" != "${new}" ]
check_result "can't set old drac database"
debug_print "success! (${old})"

debug_print "creating new drac database" "1"
cp "${real}" "${new}"
check_result "can't create new drac database"
debug_print "success! ($(basename "${real}") -> $(basename "${new}"))"

debug_print "linking new drac database" "1"
ln -sf "${new}" "${link}"
check_result "can't link new drac database"
debug_print "success! ($(basename "${new}") -> $(basename "${link}"))"

debug_print "removing old drac database" "1"
rm -f "${old}"
check_result "can't remove old drac database"
debug_print "success! (${old})"
