#!/bin/sh
set -e

type=$1
preversion=$2

checkpkgver () {
    local status pkg
    pkg=$1
    status=$(dpkg -s $pkg 2>/dev/null | grep ^Status: | sed -e 's/^Status: \(.*\) \(.*\) \(.*\)/\3/g')
    if [ -n "$status" ] && [ "$status" != "not-installed" ] && [ "$status" != "config-files" ]; then
	echo $(dpkg -s $pkg 2>/dev/null | grep ^Version: | sed -e 's/^Version: *//');
    fi
}

if [ "$type" = "configure" ]
then
    # /etc/ld.so.nohwcap code:
        # Handle upgrades when libc-opt package has been installed.
    # When a /etc/ld.so.nohwcap file exists, ld.so only use libraries
    # from /lib, and ignore all optimised libraries. This file is
    # inconditionaly created in the preinst script of libc.
 
    # We check the version between the current installed libc and
    # all optimized packages. Due to multiarch, this has to be done
    # independently of the architecture of the package.
    all_upgraded=yes
    for pkg in libc6.1-alphaev67 ; do
        ver=$(dpkg-query -l $pkg 2>/dev/null | sed -e '/^[a-z][a-z]\s/!d;/^.[nc]/d;' -e "s/^..\s\+$pkg[0-9a-z:]*\s\+//;s/\s.*//g")
        if [ -n "$ver" ] && [ "$ver" != "2.36-9+deb12u8" ]; then
            all_upgraded=no
        fi
    done

    # If the versions of all optimized packages are the same as the libc
    # one, we could remove /etc/ld.so.nohwcap. Otherwise, it will be removed
    # when all optimized packages are upgraded or removed.
    if [ "$all_upgraded" = yes ] ; then
        rm -f "$DPKG_ROOT/etc/ld.so.nohwcap"
    fi

fi

if [ "$type" = configure ]
then
    # Load debconf module if available
    if [ -f /usr/share/debconf/confmodule ] ; then
	. /usr/share/debconf/confmodule
    fi

    # Only change LC_ALL after loading debconf to ensure the debconf templates
    # are properly localized.
    export LC_ALL=C

    if [ -n "$preversion" ] && [ -x "$(command -v ischroot)" ] && ! ischroot; then
	if dpkg --compare-versions "$preversion" lt 2.36; then
	    check="apache2.2-common apache apache-ssl apache-perl autofs at"
	    check="$check boa cucipop courier-authdaemon cron cups exim"
	    check="$check exim4-base dovecot-common cucipop incron lprng lpr"
	    check="$check lpr-ppd mysql-server nis openbsd-inetd"
	    check="$check openldapd openssh-server postgresql-common proftpd"
	    check="$check postfix postfix-tls rsync samba sasl2-bin slapd"
	    check="$check smail sendmail snmpd spamassassin vsftpd"
	    check="$check wu-ftpd wu-ftpd-academ wwwoffle"
	    check="$check webmin dropbear gdm"
	    # NSS services check: 
	    	    echo -n "Checking for services that may need to be restarted..."
	    # Only get the ones that are installed, of the same architecture
	    # as libc (or arch all) and configured. Restart openssh-server even
	    # if only half-configured to continue accepting new connections
	    # during the upgrade.
	    check=$(dpkg-query -W -f='${binary:Package} ${Status} ${Architecture}\n' $check 2> /dev/null | \
			grep -E "(^openssh-server .* unpacked|installed) (all|${DPKG_MAINTSCRIPT_ARCH})$" | sed 's/[: ].*//')
	    # some init scripts don't match the package names
	    check=$(echo $check | \
		    sed -e's/\bapache2.2-common\b/apache2/g' \
			-e's/\bat\b/atd/g' \
			-e's/\bdovecot-common\b/dovecot/g' \
			-e's/\bexim4-base\b/exim4/g' \
			-e's/\blpr\b/lpd/g' \
			-e's/\blpr-ppd\b/lpd-ppd/g' \
			-e's/\bmysql-server\b/mysql/g' \
			-e's/\bopenssh-server\b/ssh/g' \
			-e's/\bsasl2-bin\b/saslauthd/g' \
			-e's/\bsamba\b/smbd/g' \
			-e's/\bpostgresql-common\b/postgresql/g' \
		    )
	    echo
	    echo "Checking init scripts..."
	    for service in $check; do
		invoke-rc.d ${service} status >/dev/null 2>/dev/null && status=0 || status=$?
		if [ "$status" = "0" ] || [ "$status" = "2" ] ; then
		    services="$service $services"
		elif [ "$status" = "100" ] ; then
		    echo "WARNING: init script for $service not found."
		fi
	    done

	    if [ -n "$services" ]; then

	        if [ -f /usr/share/debconf/confmodule ] ; then
		    db_version 2.0
		    db_input critical libraries/restart-without-asking || true
		    db_go || true
		    db_get libraries/restart-without-asking
		    if [ "$RET" != true ]; then
			db_reset glibc/restart-services
			db_set glibc/restart-services "$services"
			db_input critical glibc/restart-services || true
			db_go || true
			db_get glibc/restart-services
			if [ "x$RET" != "x" ]
			then
			    services="$RET"
			else
			    services=""
			fi
		    fi
		else
		    echo
		    echo "Name Service Switch update in the C Library: post-installation question."
		    echo
		    echo "Running services and programs that are using NSS need to be restarted,"
		    echo "otherwise they might not be able to do lookup or authentication any more"
		    echo "(for services such as ssh, this can affect your ability to login)."
		    echo "Note: restarting sshd/telnetd should not affect any existing connections."
		    echo
		    echo "The services detected are: "
		    echo "        $services"
		    echo
		    echo "If other services have begun to fail mysteriously after this upgrade, it is"
		    echo "probably necessary to restart them too.  We recommend that you reboot your"
		    echo "machine after the upgrade to avoid NSS-related troubles."
		    echo
		    frontend=`echo "$DEBIAN_FRONTEND" | tr '[:upper:]' '[:lower:]'`
		    if [ "$frontend" = noninteractive ]; then
		    	echo "Non-interactive mode, restarting services"
		    	answer=yes
		    else
		    	echo -n "Do you wish to restart services? [Y/n] "
		    	read answer
		    	case $answer in
			    N*|n*) services="" ;;
			    *) ;;
		        esac
		    fi
		fi
		echo
		if [ "$services" != "" ]; then
		    echo "Restarting services possibly affected by the upgrade:"
		    failed=""
		    for service in $services; do
			case "$service" in
			    gdm)
				echo -n "  $service: reloading..."
				if invoke-rc.d ${service} reload > /dev/null 2>&1; then
				    echo "done."
				else
				    echo "FAILED! ($?)"
				    failed="$service $failed"
				fi
				;;
			    *)
				echo -n "  $service: restarting..."
				if invoke-rc.d ${service} restart > /dev/null 2>&1; then
				    echo "done."
				else
				    echo "FAILED! ($?)"
				    failed="$service $failed"
				fi
				;;
			esac
		    done
		    echo
		    if [ -n "$failed" ]; then
	        	if [ -f /usr/share/debconf/confmodule ] ; then
		    	    db_fset glibc/restart-failed seen false
			    db_subst glibc/restart-failed services "$failed"
			    db_input critical glibc/restart-failed || true
			    db_go || true
			else
			    echo "The following services failed to start: $failed"
			    echo
			    echo "You will need to start these manually by running \`invoke-rc.d <service> start'"
			    echo "If the service still fails to start, you may need to file a bug on"
			    echo "${DPKG_MAINTSCRIPT_PACKAGE}:${DPKG_MAINTSCRIPT_ARCH} or the service involved."
			    frontend=`echo "$DEBIAN_FRONTEND" | tr '[:upper:]' '[:lower:]'`
			    if [ "$frontend" != noninteractive ]; then
			    	echo
			    	echo -n "Press ENTER to continue: "
			    	read foo
			    fi
			fi
		    else
			echo "Services restarted successfully."
                    fi
		fi
                # Shut down the frontend, to make sure none of the
		# restarted services keep a connection open to it
	        if [ -f /usr/share/debconf/confmodule ] ; then
		    db_stop
		fi
	    else
		echo "Nothing to restart."
	    fi
	fi # end upgrading and $preversion lt 2.36
    fi # Upgrading

    # Restart init.  Currently handles chroots, systemd and upstart, and
    # assumes anything else is going to not fail at behaving like
    # sysvinit:
    TELINIT=yes
    if ischroot 2>/dev/null; then
        # Don't bother trying to re-exec init from a chroot:
        TELINIT=no
    elif [ -n "${DPKG_ROOT:-}" ]; then
        # Do not re-exec init if we are operating on a chroot from outside:
        TELINIT=no
    elif [ -d /run/systemd/system ]; then
        # Restart systemd on upgrade, but carefully.
        # The restart is wanted because of LP: #1942276 and Bug: #993821
        # The care is needed because of https://bugs.debian.org/753725
        # (if systemd --help fails the system might still be quite broken but
        # that seems better than the kernel panic that results if systemd
        # cannot reexec itself).
        TELINIT=no
        if systemd --help >/dev/null 2>/dev/null; then
            systemctl daemon-reexec
        else
            echo "Error: Could not restart systemd, systemd binary not working" >&2
        fi
    fi
    if [ "$TELINIT" = "yes" ]; then
        telinit u 2>/dev/null || true ; sleep 1
    fi
fi



exit 0
