371 lines
10 KiB
Bash
371 lines
10 KiB
Bash
#!/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
|
|
}
|
|
|
|
geneximdefaults () {
|
|
# generate /etc/default/exim4
|
|
cat > /etc/default/exim4 << EOF
|
|
# /etc/default/exim4
|
|
|
|
# Options/arguments for exim daemon when run from systemd service
|
|
# EXIMSERVICE='-bdf -q30m'
|
|
|
|
# Options/arguments for exim daemon when run from init script
|
|
# EXIMDAEMONOPTS='-bd -q30m'
|
|
|
|
# Additional options for update-exim4.conf(8)
|
|
# UPEX4OPTS=''
|
|
EOF
|
|
chmod 0644 /etc/default/exim4
|
|
}
|
|
|
|
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 \
|
|
--allow-bad-names 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 /etc/default/exim4 on fresh installations.
|
|
if test -z "$2" && test ! -e /etc/default/exim4 ; then
|
|
geneximdefaults
|
|
fi
|
|
|
|
# Related to #1053788 - removed misnamed unused file:
|
|
if test -n "$2" && \
|
|
test -e /etc/default/exim &&
|
|
dpkg --compare-versions "$2" "gt" "4.96-20" &&
|
|
dpkg --compare-versions "$2" "lt" "4.97~RC1-3" &&
|
|
[ "1f9796bd64d5abb3418f507f0b6969ab" = \
|
|
$(md5sum /etc/default/exim | cut -f1 -d' ') ]; then
|
|
rm /etc/default/exim
|
|
if test ! -e /etc/default/exim4 ; then
|
|
geneximdefaults
|
|
fi
|
|
fi
|
|
|
|
# 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#
|