diff options
Diffstat (limited to 'debian/postfix.preinst')
-rw-r--r-- | debian/postfix.preinst | 371 |
1 files changed, 371 insertions, 0 deletions
diff --git a/debian/postfix.preinst b/debian/postfix.preinst new file mode 100644 index 0000000..c0edce2 --- /dev/null +++ b/debian/postfix.preinst @@ -0,0 +1,371 @@ +#!/bin/sh -e + +# Debian Postfix preinst +# LaMont Jones <lamont@debian.org> +# Modified to use debconf by Colin Walters <levanti@verbum.org> + +# do we have debconf? +if [ -f /usr/share/debconf/confmodule ]; then + . /usr/share/debconf/confmodule + DEBCONF=true +else + DEBCONF= +fi + +dpkg_vers=$(dpkg --status dpkg | sed -n '/Version: /s/^Version: //p') +CONFIG=/etc/postfix/main.cf +MASTER=/etc/postfix/master.cf +POSTDROP=/usr/sbin/postdrop + +compat_conversion_warning() { + if [ -n "$DEBCONF" ]; then + db_input medium postfix/compat_conversion_warning || true + db_go || true + db_get postfix/compat_conversion_warning + if [ "$RET" = "false" ]; then + echo "aborting postfix install" + exit 1 + fi + else + cat << EOF +This upgrade of postfix changes some default values in the configuration. As +part of this upgrade, the following will be changed: (1) chrooted components +will be changed from '-' to 'y' in master.cf, and (2) myhostname will be set +to a fully-qualified domain name if it is not already such. The install will +be aborted if you do not allow the change. +EOF + echo -n "Shall I make the change? " + read line + case ${line} in + [nN]*) echo "aborting postfix install" + exit 1;; + *) ;; + esac + fi +} + +lmtp_retired_warning() { + if [ -n "$DEBCONF" ]; then + db_input medium postfix/lmtp_retired_warning || true + db_go || true + db_get postfix/lmtp_retired_warning + if [ "$RET" = "false" ]; then + echo "aborting postfix install" + exit 1 + fi + else + cat << EOF +This upgrade of postfix drops the "lmtp" symlink, and your configuration +(master.cf) refers to it: lmtp was merged into smtp long ago. The install +will be aborted if you do not allow the change. +EOF + echo -n "Shall I make the change? " + read line + case ${line} in + [nN]*) echo "aborting postfix install" + exit 1;; + *) ;; + esac + fi +} + +main_cf_conversion_warning() { + if [ -n "$DEBCONF" ]; then + db_input medium postfix/main_cf_conversion_warning || true + db_go || true + db_get postfix/main_cf_conversion_warning + if [ "$RET" = "false" ]; then + echo "aborting postfix install" + exit 1 + fi + else + cat << EOF +This upgrade of postfix changes where daemons are located, and your postfix +configuration explicitly specifies the old location. The install will be +aborted if you do not allow the change. +EOF + echo -n "Shall I make the change? " + read line + case ${line} in + [nN]*) echo "aborting postfix install" + exit 1;; + *) ;; + esac + fi +} + +dynamicmaps_conversion_warning() { + if [ -n "$DEBCONF" ]; then + db_input medium postfix/dynamicmaps_conversion_warning || true + db_go || true + db_get postfix/dynamicmaps_conversion_warning + if [ "$RET" != "false" ]; then + touch /var/spool/postfix/dynamicmaps_3.0_transition + fi + else + cat << EOF +Postfix version 3.0 changes how dynamic maps are delivered, and your +dynamicmaps.cf does not reflect that. Accept this option to convert +dynamicmaps.cf to the version required for 3.0. +EOF + echo -n "Shall I make the change? " + read line + case ${line} in + [nN]*) ;; + *) touch /var/spool/postfix/dynamicmaps_3.0_transition;; + esac + fi +} + +relay_restrictions_warning() { + if [ -n "$DEBCONF" ]; then + db_input medium postfix/relay_restrictions_warning || true + db_go || true + db_get postfix/relay_restrictions_warning + if [ "$RET" != "false" ]; then + touch /var/spool/postfix/set_relay_restrictions + fi + else + cat << EOF +Postfix version 2.10 adds smtpd_relay_restrictions, to separate relaying +restrictions from recipient restrictions, and you have a non-default value +for smtpd_recipient_restrictions. + +Failure to do this may result in deferred or bounced mail after the +upgrade. Accept this option to set smtpd_relay_restrictions to +smtpd_recipient_restrictions. +EOF + echo -n "Shall I make the change? " + read line + case ${line} in + [nN]*) ;; + *) touch /var/spool/postfix/set_relay_restrictions;; + esac + fi +} + +mydomain_warning() { + if [ -n "$DEBCONF" ]; then + db_fset postfix/mydomain_warning seen false + db_input medium postfix/mydomain_warning || true + db_go || true + db_get postfix/mydomain_warning + if [ "$RET" = "false" ]; then + echo "aborting postfix install" + exit 1 + fi + else + # no debconf, fall back + cat << EOF +Postfix version 2.3.3-2 and later require changes in main.cf. +Specifically, mydomain must be specified, since hostname(2) is not +an FQDN. +EOF + echo -n "Shall I make the change? " + read line + case ${line} in + [nN]*) echo "aborting postfix install" + exit 1 + ;; + esac + fi +} + +retry_warning() { + if [ -n "$DEBCONF" ]; then + db_fset postfix/retry_upgrade_warning seen false + db_input medium postfix/retry_upgrade_warning || true + db_go || true + db_get postfix/retry_upgrade_warning + if [ "$RET" = "false" ]; then + echo "aborting postfix install" + exit 1 + fi + else + # no debconf, fall back + cat << EOF +Postfix version 2.4 requires that the retry service be added to master.cf +EOF + echo -n "Shall I make the change? " + read line + case ${line} in + [nN]*) echo "aborting postfix install" + exit 1 + ;; + esac + fi +} + +tlsmgr_warning() { + if [ -n "$DEBCONF" ]; then + db_fset postfix/tlsmgr_upgrade_warning seen false + db_input medium postfix/tlsmgr_upgrade_warning || true + db_go || true + db_get postfix/tlsmgr_upgrade_warning + if [ "$RET" = "false" ]; then + echo "aborting postfix install" + exit 1 + fi + else + # no debconf, fall back + cat << EOF +Postfix version 2.2 has changed the invocation of tlsmgr. +EOF + echo -n "Shall I make the change? " + read line + case ${line} in + [nN]*) echo "aborting postfix install" + exit 1 + ;; + esac + fi +} + +kernel_version_warning() { + if [ -n "$DEBCONF" ]; then + db_fset postfix/kernel_version_warning seen false + db_input low postfix/kernel_version_warning || true + db_go || true + db_get postfix/kernel_version_warning + else + cat << EOF +Postfix uses features that are not found in kernels prior to 2.6. If you +proceeed with the installation, Postfix will not run. +EOF + RET=false + fi + if [ "$RET" = "false" ]; then + echo "Aborting postfix install" + exit 1 + fi +} + +(umask 022; mkdir -p /var/spool/postfix) + +case "$1" in + install) + rm -f /var/spool/postfix/restart /var/spool/postfix/reload + # workaround sendmail not unregistering itself... + if [ -e /etc/suid.conf ] && [ -x /usr/sbin/suidunregister ]; then + if grep -q sendmail /etc/suid.conf; then + /usr/sbin/suidunregister -s postfix /usr/sbin/sendmail + fi + fi + + if [ -L /etc/postfix/postfix-script ]; then + rm -f /etc/postfix/postfix-script + fi + + ;; + + upgrade) + version=$2 + if [ -d /var/spool/postfix ] && [ -f /etc/postfix/main.cf ]; then + touch /var/spool/postfix/restart + fi + export LANG=C # for the comparison of mail version... + + if [ -L /etc/postfix/postfix-script ]; then + rm -f /etc/postfix/postfix-script + fi + + # If user has not modified master/main.proto, move aside so new version + # is installed (#991513) + cmp -s /usr/share/postfix/main.cf.dist /etc/postfix/main.cf.proto && \ + mv /etc/postfix/main.cf.proto /etc/postfix/main.cf.proto.old \ + || echo "/etc/postfix/main.cf.proto modified, not updating." + cmp -s /usr/share/postfix/master.cf.dist /etc/postfix/master.cf.proto && \ + mv /etc/postfix/master.cf.proto /etc/postfix/master.cf.proto.old \ + || echo "/etc/postfix/master.cf.proto modified, not updating." + + if grep -q '^tlsmgr[[:space:]]*fifo' $MASTER; then + tlsmgr_warning + fi + + if dpkg --compare-versions $version lt 3.1.0-1; then + # check on compatibility warning issues and warn as appropriate. + # even default myhostname needs to be checked to make sure it has a '.'. + for dir in /etc/postfix $(postconf -hxn multi_instance_directories 2>/dev/null || true); do + if [ ! -f "${dir}/main.cf" ] || dpkg --compare-versions $version lt 2.11; then + # Just assume that there are issues with the chroot status, + # since postconf -F didn't exist before 2.11 + compat_conversion_warning + break + fi + SRV=$(postconf -c "$dir" -F '*/*/chroot'| sed -n '/ = -$/s/ =.*$//p') + if [ -n "$SRV" ] || \ + postconf -c "$dir" -hx myhostname | grep -qv '\.'; then + compat_conversion_warning + break + fi + done + fi + if [ -f /etc/postfix/main.cf ] && dpkg --compare-versions $version lt 3.0.4-5; then + # if daemon_directory is specifically set, and wrong, then we need + # to fix it. + for dir in /etc/postfix $(postconf -hxn multi_instance_directories); do + DD=$(postconf -c "$dir" -hxn daemon_directory) + if [ "X${DD}" = X/usr/lib/postfix ]; then + main_cf_conversion_warning + break + fi + done + fi + + if dpkg --compare-versions $version lt 3.0.3-2; then + # If we still think that it's dict_tcp.so, then we need to convert. + DM=/etc/postfix/dynamicmaps.cf + if [ ! -f ${DM} ] || grep -q "/usr/lib/postfix/dict_tcp.so" ${DM}; then + dynamicmaps_conversion_warning + fi + fi + + if dpkg --compare-versions $version lt 2.10.0-2; then + RECIP=$(postconf -hx smtpd_recipient_restrictions 2>/dev/null || true) + DEFAULT="permit_mynetworks, reject_unauth_destination" + if [ "$RECIP" != "$DEFAULT" ]; then + # 2.10.0-1 is special because it was broken. If they haven't fixed + # it themselves, deal with it. + if dpkg --compare-versions $version ge 2.10.0-1; then + if [ -n "$RECIP" ] && [ -z "$(postconf -n smtpd_relay_restrictions)" ]; then + relay_restrictions_warning + fi + else + # if they have the default recipient_restrictions then no need to ask. + relay_restrictions_warning + fi + fi + fi + + if ! grep -q '^retry[[:space:]]' $MASTER; then + retry_warning + fi + invoke-rc.d --quiet postfix stop || true + ;; + + abort-upgrade) + if [ -f /etc/postfix/main.cf.proto.old ]; then + mv /etc/postfix/main.cf.proto.old /etc/postfix/main.cf.proto + echo "Restoring old /etc/postfix/main.cf.proto on failed upgrade." + fi + if [ -f /etc/postfix/master.cf.proto.old ]; then + mv /etc/postfix/master.cf.proto.old /etc/postfix/master.cf.proto + echo "Restoring old /etc/postfix/master.cf.proto on failed upgrade." + fi + ;; + + *) + echo "preinst called with unknown argument \`$1'" >&2 + exit 1 + ;; +esac + +if [ install = "$1" -o upgrade = "$1" ]; then + # cleanup after past mistakes. + rm -f /usr/sbin/postconf.postfix + dpkg-divert --package postfix-tls --remove \ + --divert /usr/sbin/postconf.postfix \ + /usr/sbin/postconf >/dev/null 2>/dev/null +fi + +#DEBHELPER# |