#!/bin/sh
# update-exim4defaults(8): manage entries in /etc/default/exim4
# per script

if [ -n "$EX4DEBUG" ]; then
  echo "now debugging $0 $@"
  set -x
fi

unset LC_ALL
export LC_CTYPE=C

defaultfile=/etc/default/exim4

EX4DEF_INIT=false
EX4DEF_FORCE=false


if [ -r ${defaultfile} ]; then
	. ${defaultfile}
fi


# initialize variables
EX4DEF_QUEUERUNNER="${QUEUERUNNER}"
EX4DEF_QUEUEINTERVAL="${QUEUEINTERVAL}"
EX4DEF_COMMONOPTIONS="${COMMONOPTIONS}"
EX4DEF_QUEUERUNNEROPTIONS="${QUEUERUNNEROPTIONS}"
EX4DEF_QFLAGS="${QFLAGS}"
EX4DEF_SMTPLISTENEROPTIONS="${SMTPLISTENEROPTIONS}"

EX4DEF_FLAGOPTIONS=false
EX4DEF_FLAGREMOVE=false

ex4def_usage ()
{
	echo "update-exim4defaults: manage entries in /etc/default/exim4"
	echo "   usage: update-exim4defaults [[--queuerunner combined|separate|queueonly|ppp|no|nodaemon]"
	echo "          [--qflags flags ] [--queuetime time] [--commonoptions options]"
	echo "          [--queuerunneroptions options] [--smtplisteneroptions options]]"
	echo "          [--remove-common options] [--remove-queue options]"
	echo "          [--remove-smtp options]"
	echo "          [--force|-f] [--help|-h]"
	echo "          [--init]"
}


# used for initialzing and with --force.
ex4def_write(){
	EX4DEF_TMP="$(tempfile -m 600 -p ex4)"
	cat << EOF > "${EX4DEF_TMP}"
# /etc/default/exim4
EX4DEF_VERSION='${EX4DEF_VERSION}'

# 'combined' -	 one daemon running queue and listening on SMTP port
# 'no'       -	 no daemon running the queue
# 'separate' -	 two separate daemons
# 'ppp'      -   only run queue with /etc/ppp/ip-up.d/exim4.
# 'nodaemon' - no daemon is started at all.
# 'queueonly' - only a queue running daemon is started, no SMTP listener.
# setting this to 'no' will also disable queueruns from /etc/ppp/ip-up.d/exim4
QUEUERUNNER='${EX4DEF_QUEUERUNNER}'
# how often should we run the queue
QUEUEINTERVAL='${EX4DEF_QUEUEINTERVAL}'
# options common to quez-runner and listening daemon
COMMONOPTIONS='${EX4DEF_COMMONOPTIONS}'
# more options for the daemon/process running the queue (applies to the one
# started in /etc/ppp/ip-up.d/exim4, too.
QUEUERUNNEROPTIONS='${EX4DEF_QUEUERUNNEROPTIONS}'
# special flags given to exim directly after the -q. See exim(8)
QFLAGS='${EX4DEF_QFLAGS}'
# Options for the SMTP listener daemon. By default, it is listening on
# port 25 only. To listen on more ports, it is recommended to use
# -oX 25:587:10025 -oP /run/exim4/exim.pid
SMTPLISTENEROPTIONS='${EX4DEF_SMTPLISTENEROPTIONS}'
EOF
	cat "${EX4DEF_TMP}" > "${defaultfile}"
	rm -f "${EX4DEF_TMP}"
}

## Parse commandline
TEMP=$(getopt -n update-exim4defaults \
	-l qflags:,queuerunner:,queuetime:,commonoptions:,queuerunneroptions:,smtplisteneroptions:,remove-common:,remove-queue:,remove-smtp:,force,help,init -- \
	+fh "$@")

if test "$?" != 0; then
	echo "Terminating..." >&2
	exit 1
fi

eval set -- ${TEMP}
while test "$1" != "--"; do
	case $1 in
		-f|--force)
			EX4DEF_FORCE=true
		;;
		-h|--help)
			ex4def_usage
			exit 0
		;;
		--qflags)
			shift
			EX4DEF_QFLAGS="$1"
			;;
		--queuerunner)
			shift
			EX4DEF_QUEUERUNNER="$1"
			if ! expr match "${EX4DEF_QUEUERUNNER}" '\(ppp\|no\|combined\|nodaemon\|queueonly\|separate\)$' >/dev/null ; then
				echo "invalid argument ${EX4DEF_QUEUERUNNER} for --queuerunner" 1>&2
				exit 1
			fi
		;;
		--queuetime)
			shift
			EX4DEF_QUEUEINTERVAL="$1"
		;;
		--commonoptions)
			shift
			EX4DEF_COMMONOPTIONS="$1"
			EX4DEF_FLAGOPTIONS=true
		;;
		--queuerunneroptions)
			shift
			EX4DEF_QUEUERUNNEROPTIONS="$1"
			EX4DEF_FLAGOPTIONS=true
		;;
		--smtplisteneroptions)
			shift
			EX4DEF_SMTPLISTENEROPTIONS="$1"
			EX4DEF_FLAGOPTIONS=true
		;;
		--remove-common)
			shift
			EX4DEF_REMOVECOMMON="$1"
			EX4DEF_FLAGREMOVE=true
		;;
		--remove-queue)
			shift
			EX4DEF_REMOVEQUEUE="$1"
			EX4DEF_FLAGREMOVE=true
		;;
		--remove-smtp)
			shift
			EX4DEF_REMOVESMTP="$1"
			EX4DEF_FLAGREMOVE=true
		;;
		--init)
			EX4DEF_INIT=true
		;;
	esac
	shift
done
shift

# No non-option arguments allowed.
if [ "$#" -ne 0 ]; then
	echo "No non option arguments allowed" >&2
	ex4def_usage >&2
	exit 1
fi

if [ "${EX4DEF_FLAGREMOVE}" = "true" ] && [ "${EX4DEF_FLAGOPTIONS}" = "true" ] ; then
	echo "Cannot use --remove-something together with --somethingoptions" >&2
	ex4def_usage >&2
	exit 1
fi

#if [ ! -r ${defaultfile} ]; then
#	echo "Cannot read ${defaultfile}, terminating" >&2
#	exit 1
#fi

if "${EX4DEF_INIT}" = "true" ] ; then
	[ -e "${defaultfile}" ] && [ "${EX4DEF_FORCE}" != "true" ] && exit 0
	# Reset to default values
	EX4DEF_QUEUERUNNER='combined'
	EX4DEF_QUEUEINTERVAL='30m'
	EX4DEF_COMMONOPTIONS=''
	EX4DEF_QUEUERUNNEROPTIONS=''
	EX4DEF_QFLAGS=''
	EX4DEF_SMTPLISTENEROPTIONS=''
	
	ex4def_write
	exit 0
fi

#Try removing
if [ "${EX4DEF_FLAGREMOVE}" = "true" ] ; then
	EX4DEF_REMOVEERROR="false"
	if [ ! -z "${EX4DEF_REMOVECOMMON}" ] ; then
		EX4DEF_COMMONOPTIONS=$(echo "${COMMONOPTIONS}" | \
			sed -e "sÄ${EX4DEF_REMOVECOMMON}ÄÄ" -e "s/  / /g" -e 's/^ //' -e 's/ $//')
		[ "${EX4DEF_COMMONOPTIONS}" = "${COMMONOPTIONS}" ] && \
			EX4DEF_REMOVEERROR="true"
	fi
	if [ ! -z "${EX4DEF_REMOVEQUEUE}" ] ; then
		EX4DEF_QUEUERUNNEROPTIONS=$(echo "${QUEUERUNNEROPTIONS}" | \
			sed -e "sÄ${EX4DEF_REMOVEQUEUE}ÄÄ" -e "s/  / /g" -e 's/^ //' -e 's/ $//')
		[ "${EX4DEF_QUEUERUNNEROPTIONS}" = "${QUEUERUNNEROPTIONS}" ] && \
			EX4DEF_REMOVEERROR="true"
	fi
	if [ ! -z "${EX4DEF_REMOVESMTP}" ] ; then
		EX4DEF_SMTPLISTENEROPTIONS=$(echo "${SMTPLISTENEROPTIONS}" | \
			sed -e "sÄ${EX4DEF_REMOVESMTP}ÄÄ" -e "s/  / /g" -e 's/^ //' -e 's/ $//')
		[ "${EX4DEF_SMTPLISTENEROPTIONS}" = "${SMTPLISTENEROPTIONS}"] && \
			EX4DEF_REMOVEERROR="true"
	fi
	if [ "${EX4DEF_REMOVEERROR}" = "true" ] ; then
		echo "$0: removing failed, no changes" >&2
		exit 64
	fi

	EX4DEF_TMP="$(tempfile -m 600 -p ex4)"
	sed -e "sÄ^QFLAGS=.*ÄQFLAGS='${EX4DEF_QFLAGS}'Ä" \
		-e "sÄ^QUEUERUNNER=.*ÄQUEUERUNNER='${EX4DEF_QUEUERUNNER}'Ä" \
		-e "sÄ^QUEUEINTERVAL=.*ÄQUEUEINTERVAL='${EX4DEF_QUEUEINTERVAL}'Ä" \
		-e "sÄ^COMMONOPTIONS=.*ÄCOMMONOPTIONS='${EX4DEF_COMMONOPTIONS}'Ä" \
		-e "sÄ^QUEUERUNNEROPTIONS=.*ÄQUEUERUNNEROPTIONS='${EX4DEF_QUEUERUNNEROPTIONS}'Ä" \
		-e "sÄ^SMTPLISTENEROPTIONS=.*ÄSMTPLISTENEROPTIONS='${EX4DEF_SMTPLISTENEROPTIONS}'Ä" \
		< $defaultfile > "${EX4DEF_TMP}"
	mv "${EX4DEF_TMP}" $defaultfile
	rm -f "${EX4DEF_TMP}"
	exit 0
fi

if [ "${EX4DEF_FORCE}" = "true" ] ; then
	ex4def_write
	exit 0

else
	EX4DEF_DOANYTHING=0
	EX4DEF_NOTALLOWED=0
	if [ "${QUEUERUNNER}" != "${EX4DEF_QUEUERUNNER}" ]; then
		EX4DEF_DOANYTHING=$((${EX4DEF_DOANYTHING}+1))
		# switching the QUEUERUNNER modus is always allowed
		#[ -z "${QUEUERUNNER}" ] || EX4DEF_NOTALLOWED=$((${EX4DEF_NOTALLOWED}+1))
	fi
	if [ "${QUEUEINTERVAL}" != "${EX4DEF_QUEUEINTERVAL}" ] ; then
		EX4DEF_DOANYTHING=$((${EX4DEF_DOANYTHING}+2))
		[ -z "${QUEUEINTERVAL}" ] || \
			EX4DEF_NOTALLOWED=$((${EX4DEF_NOTALLOWED}+2))
	fi
	if [ "${COMMONOPTIONS}" != "${EX4DEF_COMMONOPTIONS}" ] ; then
		EX4DEF_DOANYTHING=$((${EX4DEF_DOANYTHING}+4))
		[ -z "${COMMONOPTIONS}" ] || \
			EX4DEF_NOTALLOWED=$((${EX4DEF_NOTALLOWED}+4))
	fi
	if [ "${QUEUERUNNEROPTIONS}" != "${EX4DEF_QUEUERUNNEROPTIONS}" ] ; then
		EX4DEF_DOANYTHING=$((${EX4DEF_DOANYTHING}+8))
		[ -z "${QUEUERUNNEROPTIONS}" ] || \
			EX4DEF_NOTALLOWED=$((${EX4DEF_NOTALLOWED}+8))
	fi
	if [ "${SMTPLISTENEROPTIONS}" != "${EX4DEF_SMTPLISTENEROPTIONS}" ] ; then
		EX4DEF_DOANYTHING=$((${EX4DEF_DOANYTHING}+16))
		[ -z "${SMTPLISTENEROPTIONS}" ] || \
			EX4DEF_NOTALLOWED=$((${EX4DEF_NOTALLOWED}+16))
	fi
	if [ "${QFLAGS}" != "${EX4DEF_QFLAGS}" ] ; then
		EX4DEF_DOANYTHING=$((${EX4DEF_DOANYTHING}+32))
		[ -z "${QFLAGS}" ] || \
			EX4DEF_NOTALLOWED=$((${EX4DEF_NOTALLOWED}+32))
	fi

	[ ${EX4DEF_DOANYTHING} -eq 0 ] && exit 0
	if [ ${EX4DEF_NOTALLOWED} -ne 0 ] ; then
		echo "setting(s) conflict with current one, terminating" >&2
		exit ${EX4DEF_NOTALLOWED}
	fi
	
	EX4DEF_TMP="$(tempfile -m 600 -p ex4)"
	sed -e "sÄ^QFLAGS=.*ÄQFLAGS='${EX4DEF_QFLAGS}'Ä" \
		-e "sÄ^QUEUERUNNER=.*ÄQUEUERUNNER='${EX4DEF_QUEUERUNNER}'Ä" \
		-e "sÄ^QUEUEINTERVAL=.*ÄQUEUEINTERVAL='${EX4DEF_QUEUEINTERVAL}'Ä" \
		-e "sÄ^COMMONOPTIONS=.*ÄCOMMONOPTIONS='${EX4DEF_COMMONOPTIONS}'Ä" \
		-e "sÄ^QUEUERUNNEROPTIONS=.*ÄQUEUERUNNEROPTIONS='${EX4DEF_QUEUERUNNEROPTIONS}'Ä" \
		-e "sÄ^SMTPLISTENEROPTIONS=.*ÄSMTPLISTENEROPTIONS='${EX4DEF_SMTPLISTENEROPTIONS}'Ä" \
		< $defaultfile > "${EX4DEF_TMP}"
	mv "${EX4DEF_TMP}" $defaultfile
	rm -f "${EX4DEF_TMP}"
	exit 0
fi