#!/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 < $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" = "" ] || 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#