#!/bin/sh

set -e
export exim4postinstisrunning=true
. /usr/share/debconf/confmodule

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

UE4CC="/etc/exim4/update-exim4.conf.conf"

db_version 2.0

get_value() {
    db_get $1
    code="$?"
    if [ "$code" -eq "0" ]; then
	:
    else
	echo "Error getting debconf answer $1: debconf code=$code" >&2
	exit $code
    fi
}

write_header() {
	cat <<EOF > $UE4CC
# $UE4CC
#
# Edit this file and /etc/mailname by hand and execute update-exim4.conf
# yourself or use 'dpkg-reconfigure exim4-config'
#
# Please note that this is _not_ a dpkg-conffile and that automatic changes
# to this file might happen. The code handling this will honor your local
# changes, so this is usually fine, but will break local schemes that mess
# around with multiple versions of the file.
#
# update-exim4.conf uses this file to determine variable values to generate
# exim configuration macros for the configuration file.
#
# Most settings found in here do have corresponding questions in the
# Debconf configuration, but not all of them.
#
# This is a Debian specific file

EOF
}

addrootalias() {
# remove leading and ending whitespace, shrink multiple whitespace, separate
# entries with commas
poma="$(echo "$1" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//' -e 's/[[:space:];][[:space:]]*/,/g')"
if [ "none" != "$poma" ] && [ "" != "$poma" ]; then
	echo "root: ${poma}" >> /etc/aliases
fi
}

#initialize /etc/aliases
writealiases() {
echo '# /etc/aliases' > /etc/aliases.tmp
echo 'mailer-daemon: postmaster' >> /etc/aliases.tmp
for i in postmaster nobody hostmaster usenet news webmaster www ftp abuse noc security ; do
	echo "${i}: root"
done >> /etc/aliases.tmp
mv /etc/aliases.tmp /etc/aliases
}

alias stripwhitespace="sed -e 's/^[[:blank:]]*//' -e 's/[[:blank:]]*$//'"

# return success if md5sum matches file
unmodified() {
	[ "$#" -eq 1 ] || return 1
	[ -f "$1" ] || return 1
	# first line, without the leading '# '.
	checksum_current="$(sed -n -e '1s/^# //' -e '1p;1q' "$1")"

	# md5sum over the rest of the file.
	# some versions of md5sum produce
	# '68b329da9893e34099c7d8ad5cb9c940  -' others don't add the dash.
	# '68b329da9893e34099c7d8ad5cb9c940'
	checksum_new="$(sed -n '2,$p' "$1" | md5sum | cut -d\  -f1)"

	if [ "${checksum_current}" = "${checksum_new}" ] ; then
		return 0
	else
		return 1
	fi
}

convert_to_long ()
{
	case "$1" in
	internet)
		echo -n "internet site; mail is sent and received directly using SMTP"
		;;
	smarthost)
		echo -n "mail sent by smarthost; received via SMTP or fetchmail"
		;;
	satellite)
		echo -n "mail sent by smarthost; no local mail"
		;;
	local)
		echo -n "local delivery only; not on a network"
		;;
	none)
		echo -n "no configuration at this time"
		;;
	esac
}

convert_to_short ()
{
	case "$1" in
	"internet site; mail is sent and received directly using SMTP")
		echo -n "internet"
		;;
	"mail sent by smarthost; received via SMTP or fetchmail")
		echo -n	"smarthost"
		;;
	"mail sent by smarthost; no local mail")
		echo -n	"satellite"
		;;
	"local delivery only; not on a network")
		echo -n	"local"
		;;
	"no configuration at this time")
		echo -n	"none"
		;;
	esac
}

convert_transport_to_long ()
{
	case "$1" in
	maildir_home)
		echo -n "Maildir format in home directory"
		;;
	mail_spool)
		echo -n "mbox format in /var/mail/"
		;;
	*)
		echo -n "locally customized"
		;;
	esac
}
convert_transport_to_short ()
{
	case "$1" in
	"Maildir format in home directory")
		echo -n "maildir_home"
		;;
	"mbox format in /var/mail/")
		echo -n "mail_spool"
		;;
	*)
		echo -n "custom"
		;;
	esac
}

# remove orphaned autogenerated conffile if unmodified. 4.20-2.
if [ "$1" =  "configure" ] && \
	dpkg --compare-versions "$2" le-nl "4.20-1" ; then
	
	for i in /etc/exim4/conf.d/rewrite/30_exim4-config_email-addresses \
		/etc/exim4/conf.d/rewrite/35_exim4-config_masquerade ; do
		if unmodified "$i"; then 
			echo "Removing orphaned unmodified configfile $i" 1>&2
			rm "$i"
		fi
	done
	
fi
if [ "$1" =  "configure" ] && \
	dpkg --compare-versions "$2" le-nl "4.20-2" ; then
	if unmodified "/etc/exim4/conf.d/main/03_exim4-config_neverusers"; then 
		echo "Removing orphaned unmodified configfile /etc/exim4/conf.d/main/03_exim4-config_neverusers" 1>&2
		rm "/etc/exim4/conf.d/main/03_exim4-config_neverusers"
	fi
fi

#  Disable orphaned inetd-entries from exim (v3) caused by bugs #202670
#  and #182206.
if [ "$1" = "configure" ] &&\
	[ -x /usr/sbin/update-inetd ] && [ ! -x /usr/sbin/exim ] && \
   	grep -E -q '^smtp[[:space:]]*stream[[:space:]]*tcp[[:space:]]*nowait[[:space:]]*mail[[:space:]]*/usr/sbin/+exim exim -bs' /etc/inetd.conf
then
   update-inetd --comment-chars \#disabled\# \
      --pattern '/usr/sbin/exim exim -bs' --disable smtp
fi

if [ "$1" = "configure" ] &&\
	! getent passwd Debian-exim > /dev/null ; then
	echo 'Adding system-user for exim (v4)' 1>&2
	adduser --system --group --quiet --home /var/spool/exim4 \
	        --no-create-home --disabled-login --force-badname Debian-exim
fi

# fix permissions of /etc/exim4/passwd.client
if [ "$1" = "configure" ] ; then
	if ! dpkg-statoverride --list /etc/exim4/passwd.client > /dev/null 2>&1 
	then
		dpkg-statoverride --update --add root Debian-exim 0640 \
			/etc/exim4/passwd.client
	fi

	if dpkg --compare-versions "$2" le "4.30-1" ; then	
		find /etc/exim4 -user mail \( -type f -or -type d \) -print |\
		while read i ;
		do
			if ! dpkg-statoverride --list "$i" > /dev/null ; then
				chown Debian-exim "$i"
			fi
		done
		find /etc/exim4 -group mail \( -type f -or -type d \) -print |\
		while read i ;
		do
			if ! dpkg-statoverride --list "$i" > /dev/null ; then
				chgrp Debian-exim "$i"
			fi
		done
	fi
fi

case "$1" in
  configure)
	# Configure Exim##############################
	##############################################
	# valid config directives
	dc_directives="dc_eximconfig_configtype dc_other_hostnames dc_local_interfaces dc_readhost dc_relay_domains dc_minimaldns dc_relay_nets dc_smarthost CFILEMODE dc_use_split_config dc_hide_mailname dc_mailname_in_oh dc_localdelivery"
	# Generate config-file if it does not yet exist
	if [ ! -e $UE4CC ] ; then
		write_header
		for variable in ${dc_directives} ; do
			echo "${variable}="
		done >> $UE4CC
	fi

	# If this is a fresh installation generate dummy files, which
	# will be overwritten by update-exim4.conf
	# if we add stuff later, we have to compare versions:
	# if [ -z "$2" ] || [ "$2" = "<unknown>" ] || dpkg --compare-versions "$2" lt "4.14-0.4" ; then
	#	for file in /etc/exim4/conf.d/main/03_exim4-config_neverusers ;do
	#		if [ ! -f "$file" ] ; then
	#			echo "# d41d8cd98f00b204e9800998ecf8427e" > "$file"
	#			chmod 644 "$file"
	#		fi
	#	done
	#fi

	# generate defaultfile
	update-exim4defaults --init

	# source $UE4CC - needed for not
	# debconf-managed values in there.
	. $UE4CC

	# Substitute values from debconf db
	db_get exim4/dc_eximconfig_configtype || true
	dc_eximconfig_configtype="$(convert_to_short "$RET")"
	db_get exim4/dc_local_interfaces || true
	dc_local_interfaces="$(printf '%s\n' "$RET" | stripwhitespace)"
	db_get exim4/dc_other_hostnames || true
	dc_other_hostnames="$(printf '%s\n' "$RET" | stripwhitespace)"
	db_get exim4/dc_readhost || true
	dc_readhost="$(printf '%s\n' "$RET" | stripwhitespace)"
	db_get exim4/dc_relay_domains || true
	dc_relay_domains="$(printf '%s\n' "$RET" | stripwhitespace)"
	db_get exim4/dc_relay_nets || true
	dc_relay_nets="$(printf '%s\n' "$RET" | stripwhitespace)"
	db_get exim4/dc_smarthost || true
	dc_smarthost="$(printf '%s\n' "$RET" | stripwhitespace)"
	db_get exim4/dc_minimaldns || true
	dc_minimaldns="$(printf '%s\n' "$RET" | stripwhitespace)"
	db_get exim4/mailname || true
	mailname="$(printf '%s\n' "$RET" | stripwhitespace)"
	db_get exim4/use_split_config || true
	dc_use_split_config="$(printf '%s\n' "$RET" | stripwhitespace)"
	db_get exim4/hide_mailname || true
	dc_hide_mailname="$(printf '%s\n' "$RET" | stripwhitespace)"
	
	# overwrite dc_localdelivery with value stored in debconf db unless
	# it is set to something else than maildir_home or mail_spool.
	if [ "${dc_localdelivery}" = "" ] ||
		[ "$(convert_transport_to_long ${dc_localdelivery})" != "locally customized" ] ; then 
		db_get exim4/dc_localdelivery || true
		dc_localdelivery="$(convert_transport_to_short "$RET")"
	fi

	if [ -r /var/lib/exim4/addmailname2oh ] ; then
	# .config added mailname to other hostnames, 2nd run of config script
	# will have overwritten this change in debcond-db, therefore we need
	# to store this externally, too.
		. /var/lib/exim4/addmailname2oh
		rm -f /var/lib/exim4/addmailname2oh
	fi
	db_fget "exim4/dc_other_hostnames" mailname || true
	dc_mailname_in_oh="$RET"

	[ "${CFILEMODE}" = "" ] && CFILEMODE=644

	db_get exim4/dc_postmaster
	dc_postmaster="$(printf '%s\n' "$RET" | stripwhitespace)"
	
	if [ ! -e /etc/aliases ] ; then
		writealiases
	fi
	if ! grep -q '^root:[[:space:]]*[[:alnum:]]' /etc/aliases && \
		[ "${dc_postmaster}" != "none" ]; then
		addrootalias "${dc_postmaster}"
	fi

	### write configuration to files #
	# add missing items
	for variable in ${dc_directives} ; do
		if ! grep -E -q "^[[:space:]]*${variable}=" $UE4CC ; then
			echo "${variable}=''" >> $UE4CC
		fi
	done
	# insert new values, remove outdated ones.

	# Use environment variables to communicate data to awk, to
	# avoid shell (or awk or sed) string expansion which may
	# expand escape sequences.  Note that the variables named in
	# ${dc_directives} (but not the variable names themselves) may
	# contain escaped characters like \N.

	export dc_directives ${dc_directives}

	awk '
            BEGIN {
                split( ENVIRON["dc_directives"], directives, "[ \t]" );
            }
            {
                written = 0;
                for ( i in directives )
                   {
                       regex = "^[ \t]*" directives[i] "=";
                       if ( ( $0 ~ regex ) && ( ! written ) )
                           {
                               # Add single quotes (\0x27) around the value.
                               print directives[i] "=\x27" ENVIRON[directives[i]] "\x27";
                               written = 1;
                               break;
                           }
                   }
                   if ( ! written )
                       print $0;
            }' < ${UE4CC} > ${UE4CC}.tmp

	mv ${UE4CC}.tmp $UE4CC

	echo $mailname > /etc/mailname
	### configuration files written ##


	if [ "${dc_eximconfig_configtype}" != "none" ]; then
		update-exim4.conf
	fi
	# If dpkg-reconfigure was used implement the changes by restarting
	# the daemon.
	if [ "${DEBCONF_RECONFIGURE}" = "1" ] ; then
		if [ -x /etc/init.d/exim4 ]; then
			# use restart instead of reload, as changing listening
			# interfaces cannot be done with HUP.
			db_stop
                	if [ -n "$EX4DEBUG" ]; then
                  	  netstat -tulpen
                  	  ls -al /var/run/exim4/
                  	  cat /var/run/exim4/exim.pid
                  	  pidof exim4
		        fi
			if [ "$dc_eximconfig_configtype" = "none" ]; then
				# we may have broken config here, ignore errors
		       		invoke-rc.d exim4 restart || true
			else
				# we must have working config here, honor errors
				invoke-rc.d exim4 restart
			fi
			if [ -n "$EX4DEBUG" ]; then
                  	  netstat -tulpen
			  ls -al /var/run/exim4/
			  cat /var/run/exim4/exim.pid
			  pidof exim4
			  if pidof exim4; then
			    echo >&2 "WARN: There are some exim4 processes still running after stopping exim"
			  fi
			fi
                fi
	fi

	;;
esac

# remove orphaned conffile if unmodified. 4.20-2.
if [ "$1" =  "configure" ] && \
	dpkg --compare-versions "$2" le-nl "4.20-1" && \
	[ -e /etc/exim4/email-addresses ] && \
	[ "$(md5sum /etc/exim4/email-addresses | cut -d\  -f1)" = "6bea09fbb18e4676012105fa5fc726c6" ]
then
	echo "Removing orphaned unmodified configfile /etc/exim4/email-addresses" 1>&2 
	rm /etc/exim4/email-addresses
fi
  

#DEBHELPER#
