#!/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" ] &&\
which update-inetd > /dev/null && which exim > /dev/null && \
[ -f /etc/inetd.conf ] && \
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 /run/exim4/
cat /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 /run/exim4/
cat /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