#!/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

is_immutable_file() {
	[ "$1" ] || return 2
	[ -e "$1" ] || return 1
	[ ! -L "$1" ] || return 1

	ATTR=$(lsattr "$1" 2>/dev/null)
	[ -z "$ATTR" ] && return 1
	echo $ATTR | awk '$1 ~ /i/ { exit 0; }; { exit 1; }'
}

### 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
			db_input critical resolvconf/fixing-immutable
			db_go
			chattr -i /etc/resolv.conf
		fi

		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

	# 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
