#!/bin/sh -e
# This script can be called in the following ways:
#
# After the package was installed:
#	<postinst> configure <old-version>
#
#
# If prerm fails during upgrade or fails on failed upgrade:
#	<old-postinst> abort-upgrade <new-version>
#
# If prerm fails during removal:
#	<old-postinst> abort-remove
#
# If prerm fails during deconfiguration of a package:
#	<postinst> abort-deconfigure in-favour <new-package> <version>
#		   removing <old-package> <version>
#
# If prerm fails during replacement due to conflict:
#	<postinst> abort-remove in-favour <new-package> <version>


# Create the database files if they don't already exist
create_database() {
    admindir=/var/lib/dpkg

    for file in diversions statoverride status; do
	if [ ! -f "$admindir/$file" ]; then
	    touch "$admindir/$file"
	fi
    done
}


# Move the info directory from /usr/info to /usr/share/info
move_info_directory() {
    if [ -d /usr/info ] && [ ! -L /usr/info ] \
	&& [ -f /usr/info/dir ] && [ ! -L /usr/info/dir ]
    then
	echo "Moving /usr/info/dir to /usr/share/info/dir ..."
	mv /usr/info/dir /usr/share/info/dir
	if [ -f /usr/info/dir.old ]; then
	    mv /usr/info/dir.old /usr/share/info/dir.old
	fi
    fi
}


# Remove the /usr/info symlinks we used to generate
remove_info_symlink() {
    if [ -L /usr/info ]; then
	echo "Removing /usr/info symlink ..."
	rm /usr/info
    elif [ -L /usr/info/dir ]; then
	echo "Removing /usr/info/dir symlink ..."
	rm /usr/info/dir
    fi
}


# Repair damage to /usr/info caused by broken install-info
fix_damaged_info() {
    echo -n "
The version of dpkg you're upgrading from had a problem with the
install-info program used to maintain the /usr/info/dir file.  It may
have corrupted the file, for example by placing new entries for the
menu in it before the \`* Menu' line (thus making them ineffective) or
by creating several identical sections.

I can try to sort these problems out, but beware that this process is
not guaranteed not to mess up a dir file which has things that look
like menu entries in the introductory paragraphs.  The distributed dir
files do not do this, so if you haven't edited /usr/info/dir it's
almost certainly safe to say \"yes\" to the next question.

If you say \"no\" you may wish to check and/or edit /usr/info/dir yourself.

Try to check/repair /usr/info/dir automatically ? [y/n] "
    read response
    case "$response" in
	[yY]*|"")
            echo "Checking/repairing /usr/info/dir ..."
	    cleanup-info --unsafe
	    ;;
	*)
	    echo "OK, leaving it alone."
	    ;;
    esac
}


# Remove stop links from runlevels which also have start links
# Dates back to the days when update-rc.d was part of dpkg.
remove_duplicate_daemons() {
    for lvl in 0 1 2 3 4 5 6; do
	cd /etc/rc$lvl.d
	for kill in K[0-9][0-9]*; do
	    if [ -n "`echo \"x$kill\" | tr -d 0-9A-Za-z_-`" ]; then
		continue
	    fi

	    start="`echo $kill | sed -e 's/^K/S/'`"
	    if ! [ -L $start ] && [ -L $kill ] \
		|| [ "`ls -Li $kill 2>/dev/null | awk '{print $1}'`" != \
		"`ls -Li $start 2>/dev/null | awk '{print $1}'`" ]
	    then
		continue
	    fi

	    removes="$removes rc$lvl.d/$kill"
	done
    done

    if [ -n "$removes" ]; then
	echo -n "
Some daemons and similar services whose scripts have links in the
/etc/rcN.d directories have both start (S) and stop (K) links in
some runlevels.  Thus these services get stopped and immediately
restarted at some runlevel changes, which is probably not what
you want.

I can remove these probably-spurious K links if you like:
  $removes

If you're not sure what to do, say \"no\", and then run delete them
by hand later.

Shall I remove these links ? [y/n] "
	read response
	case "$response" in
	    [yY]*|"")
                echo "Removing duplicate K links ..."
		cd /etc
		rm $removes
		;;
	    *)
	        echo "OK, leaving them."
		;;
	esac
    fi
}


# Create log file and set default permissions if possible
create_logfile() {
    logfile=/var/log/dpkg.log
    touch $logfile
    chmod 640 $logfile
    chown root:adm $logfile 2>/dev/null || chown 0:4 $logfile
}


case "$1" in
    configure)
	create_database
	create_logfile

	case "$2" in
	    0.* | 1.0.* | 1.1.0 | 1.1.0[^0-9]* | '' )
	        remove_duplicate_daemons
		;;
	    1.1.6 | 1.1.6elf | 1.2.[0123] | 1.2.[0123]elf)
	        fix_damaged_info
	        ;;
	esac

	move_info_directory
	remove_info_symlink

	if test -f /var/lib/dpkg/triggers/Unincorp; then
	    # Upgrade from broken trigger interest recorder
	    #  (bugs.launchpad.net/133172).  We remove this
	    #  old stale file:
	    rm -f /var/lib/dpkg/triggers/Deferred
	fi

	;;

    abort-upgrade|abort-deconfigure|abort-remove)
	;;

    *)
	echo "$0 called with unknown argument \`$1'" 1>&2
	exit 1
	;;
esac

#DEBHELPER#
exit 0
