#!/bin/sh
#
# This file is part of the resolvconf package.
#

set -e

. /usr/share/debconf/confmodule

MYNAME=resolvconf.postinst
report() { echo "${MYNAME}: $*" ; }
report_err() { report "Error: $*" >&2 ; }
report_warn() { report "Warning: $*" >&2 ; }
report_info() { report "$*" >&2 ; }

OLD_RUN_DIR=/var/run

echo_first_arg() { echo "$1" ; }
is_immutable_file() {
	[ "$1" ] || return 2
	[ -e "$1" ] || return 1
	[ ! -L "$1" ] || return 1
	which lsattr >/dev/null 2>&1 || return 2
	echo_first_arg $(lsattr "$1") | grep -sq i
}

### Symlink ###

case "$1" in
  configure)
	# Linkify /etc/resolv.conf if appropriate
	db_get resolvconf/linkify-resolvconf
	if [ "$RET" = "true" ] || [ -e /var/lib/resolvconf/convert ]; then
		# Cleanup flag from previous implementation where the symlink
		# would be created by the upstart job (wasn't working because of / writability)
		# FIXME: This code and the above || [ -e /var/lib/resolvconf/convert ] can be
		#        dropped in Ubuntu 12.10.
		rm -rf /var/lib/resolvconf

		if is_immutable_file /etc/resolv.conf ; then
			report_err "Cannot replace the current /etc/resolv.conf with a symbolic link because it is immutable. To correct this problem, gain root privileges in a terminal and run 'chattr -i /etc/resolv.conf' and then 'dpkg --configure resolvconf'. Aborting."
			exit 1
		else
			if [ -f /etc/resolv.conf ] \
			   && [ ! -L /etc/resolv.conf ]
			then
				# Back up original file
				if [ ! -e /etc/resolvconf/resolv.conf.d/original ] ; then
					cp -a /etc/resolv.conf /etc/resolvconf/resolv.conf.d/original
					db_get resolvconf/link-tail-to-original
					if [ "$RET" = "true" ]; then
						ln -s original /etc/resolvconf/resolv.conf.d/tail
					fi
				else
					cp -a /etc/resolv.conf /etc/resolv.conf.dpkg-old
				fi

				# Even though we create this dir in the preinst,
				# don't assume that it's still here; a reboot
				# after unpack may have left us with no upstart
				# job in place and /run cleaned out.
				mkdir -p /run/resolvconf/interface

				# Before creating the link, make sure that the original file is
				# at the target of the link.  /sbin/resolvconf will overwrite
				# this when it does an update, of course.
				if [ ! -e /run/resolvconf/resolv.conf ] ; then
					cp -a /etc/resolv.conf /run/resolvconf/resolv.conf
				fi
				# Add the original file to the database so that its contents
				# are included when resolvconf updates.
				# Yes, this is an ugly workaround for the problem that there
				# is no way to obtain nameserver information from interface
				# configurers after they have done their configuration work.
				cp -a /etc/resolv.conf /run/resolvconf/interface/original.resolvconf
			fi
			# Create the link and make sure we don't convert it again on upgrade
			# The link is relative to allow for cp from outside a chroot into a chroot
			# to work without overwriting the file outside the chroot (or failing)
			ln -nsf ../run/resolvconf/resolv.conf /etc/resolv.conf
			db_set resolvconf/linkify-resolvconf false
		fi
	fi

	# FHS violation; get rid of it, we use /run directly now.
	if [ -e /etc/resolvconf/run ]; then
		rm -rf /etc/resolvconf/run
	fi

	;;
  # triggered)
	# Don't do anything here
	# ;;
  # abort-upgrade)
	# Don't do anything here since we don't do anything in the prerm on upgrade or on failed-upgrade
	# ;;
  # abort-remove)
	# Don't do anything extra here since we don't deconfigure anything in the prerm on remove
	# ;;
  # abort-deconfigure)
	# Don't do anything extra here since we don't do anything in the prerm on deconfigure
	# ;;
esac

db_stop

#DEBHELPER#

### Notify others of our installation ###

is_installed() {
	# Same function in preinst, postinst, postrm
	[ "$1" ] || return 1
	dpkg-query -W -f='${Status}\n' "$1" 2>/dev/null | grep -siq '^[[:alpha:]]\+ [[:alpha:]]\+ installed$' >/dev/null 2>&1
}

case "$1" in
  configure)
	if [ -f /run/resolvconf/packages-to-notify ] ; then
		PACKAGES_TO_NOTIFY="$(cat /run/resolvconf/packages-to-notify)"
		rm -f /run/resolvconf/packages-to-notify
		for PKG in $PACKAGES_TO_NOTIFY ; do
			if is_installed "$PKG" ; then
				SCRPT="/usr/lib/resolvconf/dpkg-event.d/$PKG"
				if [ -x "$SCRPT" ] ; then
					"$SCRPT" install || :
				fi
			fi
		done
	fi
	;;
  # triggered)
	# Don't do anything
	# ;;
  # abort-upgrade)
	# Don't do anything here since we don't do anything in the prerm on upgrade or on failed-upgrade
	# ;;
  # abort-remove)
	# Don't do anything extra here since we don't deconfigure anything in the prerm on remove
	# ;;
  # abort-deconfigure)
	# Don't do anything extra here since we don't do anything in the prerm on deconfigure
	# ;;
esac


### (Trigger self to) enable updates ###

case "$1" in
  reconfigure)
		resolvconf --enable-updates
	;;
  configure)
	if [ "$DEBCONF_RECONFIGURE" = 1 ] ; then
		resolvconf --enable-updates
	else
		# Trigger self to enable updates later
		dpkg-trigger --no-await resolvconf-enable-updates || resolvconf --enable-updates
	fi
	;;
  triggered)
	# Runs after this and other packages have been configured
        for trggr in $2 ; do
		case "$trggr" in
		  resolvconf-enable-updates)
			resolvconf --enable-updates
			break
			;;
		esac
        done
	;;
  abort-remove)
	# We disable updates in the prerm on remove.
	# So, enable them again
	resolvconf --enable-updates
	;;
  # abort-upgrade)
	# Don't do anything here since we don't do anything in the prerm on upgrade or on failed-upgrade
	# ;;
  # abort-deconfigure)
	# Don't do anything extra here since we don't do anything in the prerm on deconfigure
	# ;;
esac

exit 0
