diff options
Diffstat (limited to 'debian/exim4-config.postinst')
-rw-r--r-- | debian/exim4-config.postinst | 408 |
1 files changed, 408 insertions, 0 deletions
diff --git a/debian/exim4-config.postinst b/debian/exim4-config.postinst new file mode 100644 index 0000000..42d7b53 --- /dev/null +++ b/debian/exim4-config.postinst @@ -0,0 +1,408 @@ +#!/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 + + +#DEBHELPER# |