summaryrefslogtreecommitdiffstats
path: root/debian/exim4-config.postinst
diff options
context:
space:
mode:
Diffstat (limited to 'debian/exim4-config.postinst')
-rw-r--r--debian/exim4-config.postinst349
1 files changed, 349 insertions, 0 deletions
diff --git a/debian/exim4-config.postinst b/debian/exim4-config.postinst
new file mode 100644
index 0000000..ebd6ec1
--- /dev/null
+++ b/debian/exim4-config.postinst
@@ -0,0 +1,349 @@
+#!/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
+}
+
+# Disable orphaned inetd-entries from exim (v3) caused by bugs #202670
+# and #182206.
+if [ "$1" = "configure" ] &&\
+ command -v update-inetd > /dev/null && command -v 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
+
+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
+
+ # 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
+
+
+#DEBHELPER#