diff options
Diffstat (limited to 'debian/exim4-config.config')
-rw-r--r-- | debian/exim4-config.config | 461 |
1 files changed, 461 insertions, 0 deletions
diff --git a/debian/exim4-config.config b/debian/exim4-config.config new file mode 100644 index 0000000..18668d2 --- /dev/null +++ b/debian/exim4-config.config @@ -0,0 +1,461 @@ +#!/bin/sh +set -e + +alias stripwhitespace="sed -e 's/^[[:blank:]]*//' -e 's/[[:blank:]]*$//'" + +. /usr/share/debconf/confmodule + + +# store environment variables in debconf db. +storevar2db() { + dc_eximconfig_configtype=`echo "${dc_eximconfig_configtype}" | stripwhitespace` + dc_local_interfaces=`echo "${dc_local_interfaces}" | stripwhitespace` + dc_other_hostnames=`echo "${dc_other_hostnames}" | stripwhitespace` + dc_readhost=`echo "${dc_readhost}" | stripwhitespace` + dc_relay_domains=`echo "${dc_relay_domains}" | stripwhitespace` + dc_relay_nets=`echo "${dc_relay_nets}" | stripwhitespace` + dc_smarthost=`echo "${dc_smarthost}" | stripwhitespace` + dc_minimaldns=`echo "${dc_minimaldns}" | stripwhitespace` + # store externally changed values to debconf.db + db_set exim4/dc_eximconfig_configtype "${dc_eximconfig_configtype}" + db_set exim4/dc_local_interfaces "${dc_local_interfaces}" + db_set exim4/dc_other_hostnames "${dc_other_hostnames}" + db_set exim4/dc_readhost "${dc_readhost}" + db_set exim4/dc_relay_domains "${dc_relay_domains}" + db_set exim4/dc_relay_nets "${dc_relay_nets}" + db_set exim4/dc_smarthost "${dc_smarthost}" + if [ "x${dc_minimaldns}" != "x" ]; then + db_set exim4/dc_minimaldns "${dc_minimaldns}" + fi +} + +# ipv6: replace double colons in colon-separated host lists with umlaut-o +# replace ':' with ' : ', add leading and ending whitespace. +# return empty string if custom delimiter was used: + # local_domains = <; 172.16.0.0/12; 3ffe:ffff:836f::/48 +# e.g: 'localhost : 172.16.0.1 :3ffe::ffff::836f::::: foo.org' +# ===> ' localhost : 172.16.0.1 : 3ffeöffffö836föö : foo.org ' +alias coloncolon2oe="sed -e 's/[[:blank:]]*//g' -e '/^</d' -e 's/:::::/:öö/g' -e 's/::::/öö/g' -e 's/:::/:ö/g' -e 's/::/ö/g' -e 's/:/ : /g' -e 's/^/ /' -e 's/$/ /'" + +# try to parse exim3 configuration file - works only if it was generated +# with eximconfig. +parseexim3() { + dc_mailname=`head -1 /etc/mailname | stripwhitespace` || true + + # get the .... entries from + # host_accept_relay = 127.0.0.1 : ::::1 : ...... + # if they exist, ie. parse list, and remove "127.0.0.1", "::::1" + # and "localhost" from it. + # + dc_relay_nets=`cat $1 | grep -h '^host_accept_relay[[:blank:]]*=' | sed -e 's/^host_accept_relay[[:blank:]]*=//' | coloncolon2oe | sed -e 's/ 127\.0\.0\\.1 //g' -e 's/ localhost //g' -e 's/ öö1//g' -e 's/[[:blank:]]*//g' -e 's/::/:/g' -e 's/^://' -e 's/:$//' -e 's/ö/::/g'` + + # 'local_domains = $colonhostnames', including mailname and "localhost" + # + dc_other_hostnames=`cat $1 | grep -h '^local_domains[[:blank:]]*=' | sed -e 's/^local_domains[[:blank:]]*=//' | coloncolon2oe | sed -e 's/ localhost //g' -e "s/ ${dc_mailname} //g" -e 's/[[:blank:]]*//g' -e 's/::/:/g' -e 's/^://' -e 's/:$//' -e 's/ö/::/g'` + + # relay_domains = some.domain + dc_relay_domains=`cat $1 | grep -h '^relay_domains = ' | sed -e 's/^relay_domains[[:blank:]]*=[[:blank:]]*//' -e 's/[[:blank:]]*$//'` + + # lookuphost router exist ---> dc_eximconfig_configtype=internet + # + if cat $1 | grep -h -A2 '^lookuphost:' | \ + grep -h -A1 '[[:blank:]]*driver = lookuphost' | \ + grep -h -q '[[:blank:]]*transport = remote_smtp' ; then + dc_eximconfig_configtype=internet + else + # smart:-director exists ---> dc_eximconfig_configtype=satellite + # + # Later we need the new_address directive to find dc_readhost. + # ' || true' is required for "set -e" + dc_readhost=`cat $1 | grep -h -A2 '^smart:' | grep -h -A1 '^[[:blank:]]*driver = smartuser' | grep -h '^[[:blank:]]*new_address' || true` + + # smarthost router exists --> dc_eximconfig_configtype is satellite or smarthost + # + # we need the route_list directive to find dc_smarthost + # ' || true' is required for "set -e" + dc_smarthost=`cat $1 | grep -h -A3 '^smarthost:' | grep -h -A2 '[[:blank:]]*driver = domainlist' | grep -h -A1 '^[[:blank:]]*transport = remote_smtp' | grep -h '^[[:blank:]]*route_list = "' || true` + + if [ ! -z "${dc_readhost}" ] ; then + dc_eximconfig_configtype=satellite + elif [ ! -z "${dc_smarthost}" ] ; then + dc_eximconfig_configtype=smarthost + elif ! cat "$1" | grep -h -q '^remote_smtp:'; then + # dc_eximconfig_configtype=local has no remote_smtp transport. + dc_eximconfig_configtype=local + else + # handcrafted config. We probably misparsed, reset values + # and exit. + dc_eximconfig_configtype='' + dc_local_interfaces='notset' + dc_other_hostnames='' + dc_readhost='' + dc_relay_domains='' + dc_relay_nets='' + dc_smarthost='' + return 1 + fi + fi + + case ${dc_eximconfig_configtype} in + internet|local) + #paranoia + dc_readhost='' + dc_smarthost='' + ;; + satellite) + # new_address = ${local_part}@$readhost + dc_readhost=`echo "${dc_readhost}" | sed -e 's/^.*@//' -e 's/[[:blank:]]*$//'` + # route_list = "* $smtphost bydns_a" + dc_smarthost=`echo "${dc_smarthost}" | \ + sed -e 's/^ *route_list = "\* //' -e 's/ bydns_a"//' -e 's/[[:blank:]]*$//'` + ;; + smarthost) + # route_list = "* $smtphost bydns_a" + dc_smarthost=`echo "${dc_smarthost}" | \ + sed -e 's/^ *route_list = "\* //' -e 's/ bydns_a"//' -e 's/[[:blank:]]*$//'` + ;; + esac +} + +# set to dummy value, so we can differ between unset vs (seen or set outside debconf) +dc_local_interfaces=notset + + +db_get exim4/dc_eximconfig_configtype +dc_eximconfig_configtype="$RET" + +if [ -e /etc/exim4/update-exim4.conf.conf ] ; then + . /etc/exim4/update-exim4.conf.conf || true + # set defaults using these values + storevar2db +else + # If there are no debconf answers (running first time) and we are + # making a cross upgrade from exim3, try to parse its config file + # to seed debconf db. + if [ "x${dc_eximconfig_configtype}" = "x" ] && [ -r /etc/exim/exim.conf ] ; then + # parse old configfile + if parseexim3 /etc/exim/exim.conf ; then + # set defaults using these values + storevar2db + fi + fi +fi + +## set up default values, we cannot do this in templates file because +## config script is called two times before update-exim4.conf.conf exists. +[ "x${dc_eximconfig_configtype}" = "x" ] && \ + dc_eximconfig_configtype="local" && \ + db_set exim4/dc_eximconfig_configtype "${dc_eximconfig_configtype}" + + +if [ -e /etc/mailname ] ; then + dc_mailname=`head -1 /etc/mailname | stripwhitespace` || true + # store values + db_set exim4/mailname "${dc_mailname}" +else + db_get exim4/mailname + dc_mailname="$RET" +fi + +#Set default mailname +if [ "x${dc_mailname}" = "x" ] ; then + dc_mailname=`hostname --fqdn` || dc_mailname=`hostname` && \ + dc_mailname=`echo "${dc_mailname}" | stripwhitespace` && \ + db_set exim4/mailname "${dc_mailname}" +fi + +# initialize env-vars from debconf_db, if they haven't been set yet either by +# parseexim3() or by sourcing /etc/exim4/update-exim4.conf.conf +if [ "x${dc_readhost}" = "x" ] ; then + db_get exim4/dc_readhost + dc_readhost="$RET" +fi +if [ "x${dc_smarthost}" = "x" ] ; then + db_get exim4/dc_smarthost + dc_smarthost="$RET" +fi +# Tricky! An empty value for this option is significant, therefore both +# envvar and debconf-value default to "nonset" instead of "", the +# following line will only change then envvars value if the config-script +# runs the second time without existing /etc/exim4/update-exim4.conf.conf or +# if the debconf-db has been preseeded by other means. +if [ "x${dc_local_interfaces}" = "xnotset" ]; then + db_get exim4/dc_local_interfaces + dc_local_interfaces="$RET" +fi +if [ "x${dc_minimaldns}" = "x" ] ; then + db_get exim4/dc_minimaldns + dc_minimaldns="$RET" +fi + + +db_version 2.0 + +db_capb backup +# initial state +STATE=1 +# last valid state +STATELIMIT=30 +while [ "$STATE" != 0 -a "$STATE" -le "$STATELIMIT" ]; do + case "$STATE" in + 1) + db_input medium exim4/mailname || true + PREVSTATE=$STATE + NEXTSTATE=$(($STATE + 1)) + ;; + 2) + PREVSTATE=$(($STATE - 1)) + NEXTSTATE=$(($STATE + 1)) + db_input critical exim4/dc_eximconfig_configtype || true + ;; + 3) + db_get exim4/dc_eximconfig_configtype + dc_eximconfig_configtype="$RET" + db_get exim4/mailname + dc_mailname="$RET" + db_subst exim4/dc_other_hostnames mailname ${dc_mailname} + PREVSTATE=$(($STATE - 1)) + case "${dc_eximconfig_configtype}" in + none) + # dont ask more questions + NEXTSTATE=$(($STATELIMIT + 1)) + ;; + internet) + NEXTSTATE=7 + ;; + smarthost) + NEXTSTATE=14 + ;; + satellite) + NEXTSTATE=21 + ;; + local) + NEXTSTATE=28 + ;; + *) + # Should not happen. Break loop + NEXTSTATE=$(($STATELIMIT + 1)) + ;; + esac + ;; + + 7) + # internet site + PREVSTATE=2 + NEXTSTATE=$(($STATE + 1)) + if [ "x${dc_local_interfaces}" = "xnotset" ] ; then + dc_local_interfaces='' + db_set exim4/dc_local_interfaces '' + fi + db_input medium exim4/dc_local_interfaces || true + ;; + 8) + PREVSTATE=$(($STATE - 1)) + NEXTSTATE=$(($STATE + 1)) + db_input medium exim4/dc_other_hostnames || true + ;; + 9) + db_input medium exim4/dc_relay_domains || true + PREVSTATE=$(($STATE - 1)) + NEXTSTATE=$(($STATE + 1)) + ;; + 10) + db_input medium exim4/dc_relay_nets || true + PREVSTATE=$(($STATE - 1)) + NEXTSTATE=$(($STATE + 1)) + ;; + 11) + PREVSTATE=$(($STATE - 1)) + NEXTSTATE=$(($STATELIMIT + 1)) + db_input low exim4/dc_minimaldns || true + ;; + + 14) + # internet site with smarthost + PREVSTATE=2 + NEXTSTATE=$(($STATE + 1)) + if [ "x${dc_local_interfaces}" = "xnotset" ] ; then + dc_local_interfaces='' + db_set exim4/dc_local_interfaces '' + fi + db_input medium exim4/dc_local_interfaces || true + ;; + 15) + PREVSTATE=$(($STATE - 1)) + NEXTSTATE=$(($STATE + 1)) + db_input medium exim4/dc_other_hostnames || true + ;; + 16) + db_input medium exim4/dc_relay_domains || true + PREVSTATE=$(($STATE - 1)) + NEXTSTATE=$(($STATE + 1)) + ;; + 17) + db_input medium exim4/dc_relay_nets || true + PREVSTATE=$(($STATE - 1)) + NEXTSTATE=$(($STATE + 1)) + ;; + 18) + if [ "x${dc_smarthost}" = "x" ] ; then + # default to mail.mailname + dc_smarthost="mail.${dc_mailname}" + db_set exim4/dc_smarthost "${dc_smarthost}" + fi + db_input high exim4/dc_smarthost || true + PREVSTATE=$(($STATE - 1)) + NEXTSTATE=$(($STATE + 1)) + ;; + 19) + PREVSTATE=$(($STATE - 1)) + NEXTSTATE=$(($STATELIMIT + 1)) + db_input low exim4/dc_minimaldns || true + ;; + + 21) + # satellite + PREVSTATE=2 + NEXTSTATE=$(($STATE + 1)) + if [ "x${dc_local_interfaces}" = "xnotset" ] ; then + dc_local_interfaces='127.0.0.1' + db_set exim4/dc_local_interfaces '127.0.0.1' + fi + db_input medium exim4/dc_local_interfaces || true + ;; + 22) + PREVSTATE=2 + NEXTSTATE=$(($STATE + 1)) + db_input medium exim4/dc_other_hostnames || true + ;; + 23) + PREVSTATE=$(($STATE - 1)) + NEXTSTATE=$(($STATE + 1)) + if [ "x${dc_readhost}" = "x" ] ; then + # default to domain of mailname + dc_readhost=`echo ${dc_mailname} | sed -e 's/^[^.][^.]*\.//'` + db_set exim4/dc_readhost "${dc_readhost}" + fi + db_input high exim4/dc_readhost || true + ;; + 24) + PREVSTATE=$(($STATE - 1)) + NEXTSTATE=$(($STATE + 1)) + db_get exim4/dc_readhost + dc_readhost="$RET" + if [ "x${dc_smarthost}" = "x" ] ; then + # default to read_host + dc_smarthost="${dc_readhost}" + db_set exim4/dc_smarthost "${dc_smarthost}" + fi + db_input high exim4/dc_smarthost || true + ;; + 25) + PREVSTATE=$(($STATE - 1)) + NEXTSTATE=$(($STATE + 1)) + # satellite-system! Only ask for relay_nets/relay_domains if they are + # nonempty - we cannot distinguish whether they were set outside debconf + # or whether the user switched dc_eximconfig_configtype + db_get exim4/dc_relay_nets || true + dc_relay_nets="$RET" + db_get exim4/dc_relay_domains || true + dc_relay_domains="$RET" + if [ "x${dc_relay_nets}" != "x" ] ; then + db_input medium exim4/dc_relay_nets || true + NEXTSTATE=$(($STATE + 1)) + fi + if [ "x${dc_relay_domains}" != "x" ] ; then + NEXTSTATE=$(($STATE + 1)) + db_input medium exim4/dc_relay_domains || true + fi + ;; + 26) + PREVSTATE=$(($STATE - 1)) + NEXTSTATE=$(($STATELIMIT + 1)) + db_input low exim4/dc_minimaldns || true + ;; + + 28) + # local mail only + PREVSTATE=2 + NEXTSTATE=$(($STATE + 1)) + if [ "x${dc_local_interfaces}" = "xnotset" ] ; then + dc_local_interfaces='127.0.0.1' + db_set exim4/dc_local_interfaces '127.0.0.1' + fi + db_input medium exim4/dc_local_interfaces || true + ;; + 29) + PREVSTATE=$(($STATE - 1)) + NEXTSTATE=$(($STATELIMIT + 1)) + # local mail only -system! Only ask for relay_nets/relay_domains if they are + # nonempty - we cannot distinguish whether they were set outside debconf + # or whether the user switched dc_eximconfig_configtype + db_get exim4/dc_relay_nets || true + dc_relay_nets="$RET" + db_get exim4/dc_relay_domains || true + dc_relay_domains="$RET" + + if [ "x${dc_relay_nets}" != "x" ] ; then + db_input medium exim4/dc_relay_nets || true + NEXTSTATE=$(($STATE + 1)) + fi + if [ "x${dc_relay_domains}" != "x" ] ; then + NEXTSTATE=$(($STATELIMIT + 1)) + db_input medium exim4/dc_relay_domains || true + fi + ;; + 30) + PREVSTATE=$(($STATE - 1)) + NEXTSTATE=$(($STATELIMIT + 1)) + db_input low exim4/dc_minimaldns || true + ;; + + esac + if db_go; then + STATE=$NEXTSTATE + else + STATE=$PREVSTATE + fi +done + +# make sure dc_local_interfaces is set to sane value +if [ "x${dc_local_interfaces}" = "xnotset" ] ; then + dc_local_interfaces='' + db_set exim4/dc_local_interfaces '' +fi + +if [ ! -e /etc/aliases ] ; then + db_input high exim4/dc_postmaster || true + db_go || true +fi + +db_get exim4/dc_postmaster || true +dc_postmaster=`echo "$RET" | stripwhitespace` + +if [ -e /etc/aliases ] && + ! grep -q '^root:[[:space:]]*[[:alnum:]]' /etc/aliases && \ + [ "x${dc_postmaster}" != "xnone" ]; then + # no alias for root and exim4/dc_postmaster != "none". + db_input high exim4/dc_noalias_regenerate || true + db_go || true + db_get exim4/dc_noalias_regenerate + dc_noalias_regenerate="$RET" + if [ "x${dc_noalias_regenerate}" = "xtrue" ] ; then + db_input high exim4/dc_postmaster || true + db_go || true + db_get exim4/dc_postmaster || true + dc_postmaster=`echo "$RET" | stripwhitespace` + fi +fi + +if [ "x${dc_postmaster}" = "x" ] ; then + # FIXME convert empty string to "none" + db_set exim4/dc_postmaster "none" + dc_postmaster="none" +fi + +# if [ "x${dc_eximconfig_configtype}" = "xsatellite" ] || [ "x${dc_eximconfig_configtype}" = "xlocal" ] ; then +# # reset dc_relay_domains dc_relay_nets and dc_other_hostnames +# db_set exim4/dc_relay_domains "" +# db_set exim4/dc_relay_nets "" +# db_set exim4/dc_other_hostnames "" +# fi |