File: /var/lib/dpkg/info/ispmanager-pkg-exim.postinst
#!/bin/bash
# postinst script for coremanager
#
# see: dh_installdeb(1)
#set -e
# summary of how this script can be called:
# * <postinst> `configure' <most-recently-configured-version>
# * <old-postinst> `abort-upgrade' <new version>
# * <conflictor's-postinst> `abort-remove' `in-favour' <package>
# <new-version>
# * <postinst> `abort-remove'
# * <deconfigured's-postinst> `abort-deconfigure' `in-favour'
# <failed-install-package> <version> `removing'
# <conflicting-package> <version>
# for details, see http://www.debian.org/doc/debian-policy/ or
# the debian-policy package
COREDIR=/usr/local/mgr5
CONFNAME=mta.conf
. ${COREDIR}/lib/pkgsh/core_pkg_funcs.sh
. ${COREDIR}/lib/pkgsh/ispmgr_pkg_funcs.sh
CONFFILE=${COREDIR}/etc/conf.d/exim.conf
EximFile() {
if [ ! -f /etc/exim4/$1 ]; then
touch /etc/exim4/$1
chown Debian-exim:Debian-exim /etc/exim4/$1
chmod 600 /etc/exim4/$1
fi
echo /etc/exim4/$1
}
HasFeatureEAI() {
EXIM_OUT=$(exim --version)
EXIM_VERSION=$(echo "${EXIM_OUT}" | grep -i "exim version" | awk '{print $3}')
if version_ge "${EXIM_VERSION}" "4.93" ; then
EXIM_SUPPORT=$(echo "${EXIM_OUT}" | grep -i "support for: " | cut -c14-)
for exim_feature in $EXIM_SUPPORT
do
if [ $exim_feature = I18N ]; then
return 0
fi
done
fi
return 1
}
case "$1" in
configure)
if [ -z ${2} ]; then
if [ "#${ISPCONVERT}" = "#yes" ]; then
PATHLIST="exim-passwd exim-domains exim-aliases exim-pipe-aliases exim-whitelist exim-blacklist exim-domainips exim-ratelimits exim-config exim-restart"
PARAMLIST="MTA EmailAuth"
PathConvert ${COREDIR}/etc/conf.d/exim.conf
ParamConvert ${COREDIR}/etc/conf.d/exim.conf
MakeConfigLink mta exim
ReloadMgr ${ISPMGR}
else
## Backuping
test -f /etc/exim4/exim4.conf.template || cp -af /etc/exim4/exim4.conf.template /etc/exim4/exim4.conf.template.orig
## Config file
## exim.conf
cp /etc/exim4/isp/exim.config /etc/exim4/exim4.conf.template
chmod 644 /etc/exim4/exim4.conf.template
chown root:mail /etc/exim4/exim4.conf.template
## Get ip
DEV=$(ip route | awk '$1=="default" {print $5}')
ip addr show dev ${DEV} | awk '$1=="inet" {print $2}'| cut -d/ -f1 >> $(EximFile relay_from_hosts)
sed -i -r "s|__ISP_RELAY_HOSTS__|$(EximFile relay_from_hosts)|g" /etc/exim4/exim4.conf.template
## User/Group
sed -i -r "s|__ISP_USER__|Debian-exim|g" /etc/exim4/exim4.conf.template
sed -i -r "s|__ISP_GROUP__|Debian-exim|g" /etc/exim4/exim4.conf.template
sed -i -r "s|__ISP_WWW_USER__|www-data|g" /etc/exim4/exim4.conf.template
## Domains
sed -i -r "s|__ISP_DOMAINS__|$(EximFile domains)|g" /etc/exim4/exim4.conf.template
## Ratelimits
sed -i -r "s|__ISP_RATELIMITS__|$(EximFile ratelimits)|g" /etc/exim4/exim4.conf.template
## Whitelist/Blacklist
sed -i -r "s|__ISP_WHITEL__|$(EximFile whitelist)|g" /etc/exim4/exim4.conf.template
sed -i -r "s|__ISP_BLACKL__|$(EximFile blacklist)|g" /etc/exim4/exim4.conf.template
## Passwd
sed -i -r "s|__ISP_PASSWD__|$(EximFile passwd)|g" /etc/exim4/exim4.conf.template
## Aliases
sed -i -r "s|__ISP_ALIASES__|$(EximFile aliases)|g" /etc/exim4/exim4.conf.template
## LDA
sed -i -r "s|__ISP_LDA__|dovecot_deliver|g" /etc/exim4/exim4.conf.template
sed -i -r "s|__ISP_LDA_BIN__|/usr/local/mgr5/sbin/dovecot_lda|g" /etc/exim4/exim4.conf.template
## Domain_ips
sed -i -r "s|__ISP_DOMAINIPS__|$(EximFile domainips)|g" /etc/exim4/exim4.conf.template
## DNSBL
sed -i -r "s|__ISP_DNSBL__|$(EximFile dnsbllist)|g" /etc/exim4/exim4.conf.template
grep -qE "path\s+exim-dnsbllist" ${CONFFILE} || echo "path exim-dnsbllist $(EximFile dnsbllist)" >> ${CONFFILE}
## Certificates
mkdir -p /etc/exim4/ssl
chmod 750 /etc/exim4/ssl
chown Debian-exim:Debian-exim /etc/exim4/ssl
if [[ $(lsb_release -s -c) =~ jammy|focal|buster|bullseye|bookworm|noble ]]; then
keylen=2048
fi
CreateCert /etc/exim4/ssl/exim.key /etc/exim4/ssl/exim.crt ${keylen}
chown Debian-exim:Debian-exim /etc/exim4/ssl/*
chmod 0444 /etc/exim4/ssl/exim.crt
chmod 0400 /etc/exim4/ssl/exim.key
sed -i -r "s|__SSL_DIR__|/etc/exim4/ssl|g" /etc/exim4/exim4.conf.template
export EXIM_SNI=yes
sed -i -r "s|__SSL_CRTFILE__|/etc/exim4/ssl/exim.crt|g" /etc/exim4/exim4.conf.template
sed -i -r "s|__SSL_KEYFILE__|/etc/exim4/ssl/exim.key|g" /etc/exim4/exim4.conf.template
## Support internalization
if HasFeatureEAI ; then
sed -i -r 's|__ISP_ACL_SMTP_MAIL__|acl_smtp_mail = acl_check_mail|' /etc/exim4/exim4.conf.template
sed -i -r 's|__ISP_ACL_CHECK_MAIL__|acl_check_mail:\n\t\twarn authenticated = *\n\t\t\t\tset acl_c10 = $\{run\{/usr/local/mgr5/sbin/octalconv.sh \$authenticated_id\}\}\n\t\taccept condition = \$\{if eq\{\$\{utf8_localpart_to_alabel:\${local_part:\$acl_c10\}\}\}\{\$\{local_part:\$acl_c10\}\}\{yes\}\{no\}\}\n\t\tdeny condition = \$\{if !eq\{\$sender_address\}\{\$acl_c10\}\{yes\}\{no\}\}\n\t\t\t\tmessage = Address \$\{local_part:\$sender_address\}@\$\{utf8_domain_from_alabel:\$\{domain:\$sender_address\}\} \\\n\t\t\t\t\t\t\tdoes not match with authenticated data \$\{local_part:\$acl_c10\}@\$\{utf8_domain_from_alabel:\$\{domain:\$acl_c10\}\}. \\\n\t\t\t\t\t\t\tCheck your email program settings.\n\t\taccept\n|' /etc/exim4/exim4.conf.template
sed -i -r 's|__ISP_ACL_EAI_SECTION__|accept authenticated = *\n\t\t\t\tcondition = \$\{if !eq\{\$\{utf8_localpart_to_alabel:\$\{local_part:\$acl_c11\}\}\}\{\$\{local_part:\$acl_c11\}\}\{yes\}\{no\}\}\n\t\t\t\tcondition = \$\{if eq\{\$\{extract\{5\}\{:\}\{\$\{lookup\{\$acl_c11\}lsearch\{/etc/exim4/passwd\}\}\}\}\}\{no\} \{yes\}\{no\}\}\n\t\t\t\tcondition = \$\{if eq\{\$\{extract\{3\}\{:\}\{\$\{lookup\{\$\{domain:\$acl_c11\}\}lsearch\{/etc/exim4/domains\}\}\}\}\}\{no\} \{yes\}\{no\}\}\n\t\t\t\tremove_header = Sender\n\t\t\t\tadd_header = Sender: \$acl_c11\n\t\t\t\tcontrol = utf8_downconvert/-1|' /etc/exim4/exim4.conf.template
sed -i -r 's|__ISP_AUTHENTICATED_ID_EXPR__|set acl_c11 = ${run{/usr/local/mgr5/sbin/octalconv.sh $authenticated_id}}|' /etc/exim4/exim4.conf.template
sed -i -r "s|__ISP_AUTHENTICATED_ID__|\$acl_c11|g" /etc/exim4/exim4.conf.template
sed -i -r "s|__ISP_DOMAIN_VAR__|\$\{utf8_domain_to_alabel:\$domain\}|g" /etc/exim4/exim4.conf.template
echo "Option EmailEAI" >> ${CONFFILE}
else
sed -i -r '/__ISP_ACL_SMTP_MAIL__/d' /etc/exim4/exim4.conf.template
sed -i -r '/__ISP_ACL_CHECK_MAIL__/d' /etc/exim4/exim4.conf.template
sed -i -r '/__ISP_AUTHENTICATED_ID_EXPR__/d' /etc/exim4/exim4.conf.template
sed -i -r "s|__ISP_AUTHENTICATED_ID__|\$authenticated_id|g" /etc/exim4/exim4.conf.template
sed -i -r "s|__ISP_DOMAIN_VAR__|\$domain|g" /etc/exim4/exim4.conf.template
sed -i -r '/__ISP_ACL_EAI_SECTION__/d' /etc/exim4/exim4.conf.template
fi
if ! grep -Pzq "server_socket = /var/run/dovecot/auth-client" /etc/exim4/exim4.conf.template ; then
cat >> /etc/exim4/exim4.conf.template << EOF
auth_plain:
driver = dovecot
public_name = PLAIN
server_socket = /var/run/dovecot/auth-client
server_set_id = \$auth1
auth_login:
driver = dovecot
public_name = LOGIN
server_socket = /var/run/dovecot/auth-client
server_set_id = \$auth1
auth_cram_md5:
driver = dovecot
public_name = CRAM-MD5
server_socket = /var/run/dovecot/auth-client
server_set_id = \$auth1
EOF
fi
# patching dovecot
if ! grep -Pzq "unix_listener auth-client {\n\s*mode = 0660\n\s*user = Debian-exim\n\s*}" /etc/dovecot/conf.d/10-master.conf ; then
test -f /etc/dovecot/conf.d/10-master.conf.orig || cp -f /etc/dovecot/conf.d/10-master.conf /etc/dovecot/conf.d/10-master.conf.orig
# Далее обязательно перенос строки, иначе fail. Страшное колдунство
sed -i -r "/^service auth \{/,/^\}/{/^\}/i \ \ #SASL\n unix_listener auth-client \{\n mode = 0660\n user = Debian-exim\n \}
}" /etc/dovecot/conf.d/10-master.conf
# Настраиваем ssl для dovecot на использование тех же сертификатов, что и exim
test -d /etc/dovecot/certs || mkdir -p /etc/dovecot/certs
if ! grep -qE '!include_try /etc/dovecot/certs/*.conf' /etc/dovecot/conf.d/10-ssl.conf ; then
echo "!include_try /etc/dovecot/certs/*.conf" >> /etc/dovecot/conf.d/10-ssl.conf
fi
if grep -qE '^ssl\s*=' /etc/dovecot/conf.d/10-ssl.conf ; then
sed -i -r 's/^ssl\s*=.+/ssl = yes/' /etc/dovecot/conf.d/10-ssl.conf
else
echo "ssl = yes" >> /etc/dovecot/conf.d/10-ssl.conf
fi
if grep -qE '^ssl_cert\s*=' /etc/dovecot/conf.d/10-ssl.conf ; then
sed -i -r 's|^ssl_cert\s*=.*|ssl_cert = </etc/exim4/ssl/exim.crt|' /etc/dovecot/conf.d/10-ssl.conf
else
echo "ssl_cert = </etc/exim4/ssl/exim.crt" >> /etc/dovecot/conf.d/10-ssl.conf
fi
if grep -qE '^ssl_key\s*=' /etc/dovecot/conf.d/10-ssl.conf ; then
sed -i -r 's|^ssl_key\s*=.*|ssl_key = </etc/exim4/ssl/exim.key|' /etc/dovecot/conf.d/10-ssl.conf
else
echo "ssl_key = </etc/exim4/ssl/exim.key" >> /etc/dovecot/conf.d/10-ssl.conf
fi
ReloadService dovecot
fi
DisableService postfix
DisableService sendmail
EnableService exim4
test -f ${COREDIR}/etc/${ISPMGR}.conf.d/${CONFNAME} || ln -sf ../conf.d/exim.conf ${COREDIR}/etc/${ISPMGR}.conf.d/${CONFNAME}
ReloadMgr ${ISPMGR}
ServiceAddmon exim4
# Enable fail2ban jail
if [ -f /etc/fail2ban/jail.local ]; then
sed -i "/\[exim-isp\]/,/\[/ { s/enabled = false/enabled = true/ }" /etc/fail2ban/jail.local
ReloadService fail2ban
fi
# Afterinstall
AfterinstallModule ${ISPMGR} mta
fi
else
if [[ $(lsb_release -s -c) =~ jammy|focal|buster|bullseye|noble ]]; then
if AddFix "fix_ISP-1653_exim_key_len" && [ "$(ssh-keygen -lf /etc/exim4/ssl/exim.key | awk '{print $1;}')" = "1024" ]; then
CreateCert /etc/exim4/ssl/exim.key /etc/exim4/ssl/exim.crt 2048
ReloadService exim4
ReloadService dovecot
fi
fi
# Convert dovecot LDA
if AddFix "fix_ISP6-787_email_eai" ; then
if grep -q "command = \"/usr/lib/dovecot/dovecot-lda -d \$local_part@\$domain" /etc/exim4/exim4.conf.template ; then
sed -i 's|/usr/lib/dovecot/dovecot-lda -d \$local_part@\$domai.*|/usr/local/mgr5/sbin/dovecot_lda\"|g' /etc/exim4/exim4.conf.template
fi
if grep -q "command = \"/usr/local/mgr5/sbin/dovecot_lda.sh\"" /etc/exim4/exim4.conf.template ; then
sed -i 's|/usr/local/mgr5/sbin/dovecot_lda.sh|/usr/local/mgr5/sbin/dovecot_lda|g' /etc/exim4/exim4.conf.template
fi
ReloadService exim4
ReloadService dovecot
fi
fi
# Fix ratelimits
if grep -qE 'warn\s+set\s+acl_c9\s+=\s+\$sender_address_local_part' /etc/exim4/exim4.conf.template ; then
sed -i -r '/# check ratelimits/,/deny\s+ratelimit/s/\$sender_address_local_part/\$sender_address/g' /etc/exim4/exim4.conf.template
EXIM_RELOAD=true
fi
if ! grep -A1 -E 'accept\s+hosts\s+=\s+\+relay_from_hosts' /etc/exim4/exim4.conf.template | grep -q authenticated ; then
sed -i -r '/accept\s+hosts\s+=\s+\+relay_from_hosts/{n;/authenticated/!s/(.*)/\t\t\t!authenticated = *\n\1/}' /etc/exim4/exim4.conf.template
EXIM_RELOAD=true
fi
CONFFILE=${COREDIR}/etc/conf.d/exim.conf
if ! grep -qE "^path\s+exim-ratelimits\s" ${CONFFILE} ; then
echo "path exim-ratelimits $(EximFile ratelimits)" >> ${CONFFILE}
fi
if ! grep -qE "^path\s+exim-reload\s" ${CONFFILE} ; then
echo "path exim-reload systemctl restart exim4" >> ${CONFFILE}
fi
if [ "${EXIM_RELOAD}" = "true" ]; then
ReloadService exim4
fi
AddKeepEnvironment() {
if ! grep -qE '^keep_environment =' /etc/exim4/exim4.conf.template ; then
sed -i -r "/trusted_users = /a\\\nkeep_environment =" /etc/exim4/exim4.conf.template
ReloadService exim4
fi
}
if ! grep -qE '^keep_environment =' /etc/exim4/exim4.conf.template ; then
# If param exist do not any checks
EXIM_VERSION=$(dpkg -s exim4-daemon-heavy | awk '$1 == "Version:" {print $2}')
echo "Detected exim version: ${EXIM_VERSION}"
if [ "$(lsb_release -s -c)" = "wheezy" ]; then
if dpkg --compare-versions ${EXIM_VERSION} ge 4.80-7+deb7u2 ; then
AddKeepEnvironment
fi
elif [ "$(lsb_release -s -c)" = "jessie" ]; then
if dpkg --compare-versions ${EXIM_VERSION} ge 4.84.2-1 ; then
AddKeepEnvironment
fi
elif [ "$(lsb_release -s -c)" = "trusty" ]; then
if dpkg --compare-versions ${EXIM_VERSION} ge 4.82-3ubuntu2.1 ; then
AddKeepEnvironment
fi
elif [ "$(lsb_release -s -c)" = "xenial" ]; then
if dpkg --compare-versions ${EXIM_VERSION} ge 4.86.2-2ubuntu1 ; then
AddKeepEnvironment
fi
else
AddKeepEnvironment
fi
fi
# Disabled
if false ; then
# checking if log_selector tls_sni is enabled
if ! sed -r -n '/^log_selector/,/^\s*$/p' /etc/exim4/exim4.conf.template | grep -q tls_sni ; then
# enable log_selector tls_sni
sed -i -r '/^log_selector/,/^\s*$/{/tls/s/\\/ +tls_sni \\/}' /etc/exim4/exim4.conf.template
fi
if grep -qE "^tls_certificate\s*=\s*\/etc\/exim" /etc/exim4/exim4.conf.template ; then
sed -i -r '/^tls_certificate\s*=\s*\/etc\/exim/s|(^tls_certificate\s*)=.+|\1 = ${if exists{/etc/exim4/ssl/${tls_sni}.crt}{/etc/exim4/ssl/${tls_sni}.crt}{/etc/exim4/ssl/exim.crt}}|' /etc/exim4/exim4.conf.template
fi
if grep -qE "^tls_privatekey\s*=\s*\/etc\/exim" /etc/exim4/exim4.conf.template ; then
sed -i -r '/^tls_privatekey\s*=\s*\/etc\/exim/s|(^tls_privatekey\s*)=.+|\1 = ${if exists{/etc/exim4/ssl/${tls_sni}.key}{/etc/exim4/ssl/${tls_sni}.key}{/etc/exim4/ssl/exim.key}}|' /etc/exim4/exim4.conf.template
fi
export EXIM_SNI=yes
fi
# Bug ISP-89. Fix dkim_selector
if grep -qE "dkim_selector\s*=\s*dkim$" /etc/exim4/exim4.conf.template ; then
sed -i -r 's|(dkim_selector\s*=\s*)dkim$|\1${if exists{/etc/exim4/ssl/$sender_address_domain.txt}{${extract{1}{.}{${readfile{/etc/exim4/ssl/$sender_address_domain.txt}}}}}{dkim}}|' /etc/exim4/exim4.conf.template && Service exim reload
fi
AddPath exim-tlscert /etc/exim4/ssl/exim.crt exim
AddPath exim-tlskey /etc/exim4/ssl/exim.key exim
if [ -n "${EXIM_SNI}" ]; then
AddPath exim-certdir /etc/exim4/ssl exim
AddPath dovecot-certconf /etc/dovecot/certs dovecot
fi
AddPath exim-pid /var/run/exim4/exim.pid exim
ReloadMgr ${ISPMGR}
;;
abort-upgrade|abort-remove|abort-deconfigure)
;;
*)
echo "postinst called with unknown argument \`$1'" >&2
exit 1
;;
esac
# dh_installdeb will replace this with shell code automatically
# generated by other debhelper scripts.
exit 0