#!/bin/sh
#
### BEGIN INIT INFO
# Provides:          resolvconf
# Required-Start:    $local_fs
# Required-Stop:     $local_fs
# X-Start-Before:    networking ifupdown
# Default-Start:     S
# Default-Stop:      0 6
# Short-Description: Nameserver information manager
# Description:       This service manages the list of nameserver addresses
#                    used by the libc resolver and name service caches
### END INIT INFO
#
# This file is part of the resolvconf package.
#
# We really need "X-Stop-Before: networking ifupdown" too because
# terminal ifdowns shouldn't update resolv.conf;
# however there is unfortunately no such thing as "X-Stop-Before".
#
# This file is not used in Ubuntu.
#

# Don't use set -e; check return status instead.

test -x /sbin/resolvconf || exit 0

setvar PATH = "/sbin:/bin"
setvar RUN_DIR = "/run/resolvconf"
setvar ENABLE_UPDATES_FLAGFILE = ""${RUN_DIR}/enable-updates""
setvar POSTPONED_UPDATE_FLAGFILE = ""${RUN_DIR}/postponed-update""

source /lib/lsb/init-functions

# Abort if Upstart is in use, as per Policy ยง9.11.1.
case (1) {
  start|restart|force-reload {
	init_is_upstart && exit 1
	}
  stop {
	init_is_upstart && exit 0
	}
}

# $1 EXITSTATUS
# [$2 MESSAGE]
proc log_action_end_msg_and_exit {
	log_action_end_msg $1 ${2:+"$2"}
	exit $1
}

proc create_runtime_directories {
	umask 022
	if test ! -d $RUN_DIR  {
		test -L $RUN_DIR || log_action_end_msg_and_exit 1 "$RUN_DIR is neither a directory nor a symbolic link"
		# It's a symlink. Its target is not a dir.
		do { setvar RUN_CANONICALDIR = "$(readlink -f "$RUN_DIR")" && test $RUN_CANONICALDIR ; } || log_action_end_msg_and_exit 1 "Canonical path of the run directory could not be determined"
		# Create directory at the target
		mkdir $RUN_CANONICALDIR || log_action_end_msg_and_exit 1 "Error creating directory $RUN_CANONICALDIR"
	}
	# The resolvconf run directory now exists.
	if test ! -d "${RUN_DIR}/interface"  {
		mkdir "${RUN_DIR}/interface" || log_action_end_msg_and_exit 1 "Error creating directory ${RUN_DIR}/interface"
	}
	# The interface directory now exists.  We are done.
	return
}

proc wipe_runtime_directories {
	# Delete files in the resolvconf run directory (target) but not the directory itself
	test -d $RUN_DIR || return
	rm -f "$RUN_DIR"/resolv.conf
	rm -f $ENABLE_UPDATES_FLAGFILE
	rm -f $POSTPONED_UPDATE_FLAGFILE
	rm -rf "${RUN_DIR}/interface/*"
	return
}

case (1) {
  start {
	# The "start" method should only be used at boot time.
	# Don't run this on package upgrade, for example.
	log_action_begin_msg "Setting up resolvconf"
	# Wipe runtime directories in case they aren't on a tmpfs
	wipe_runtime_directories
	# Create runtime directories in case they are on a tmpfs
	create_runtime_directories
	# Request a postponed update (needed in case the base file has content).
	:> "$POSTPONED_UPDATE_FLAGFILE" || log_action_end_msg_and_exit 1 "failed requesting update"
	# Enable updates and perform the postponed update.
	resolvconf --enable-updates || log_action_end_msg_and_exit 1 "failed to enable updates"
	log_action_end_msg_and_exit 0
	}
  stop {
	# The "stop" method should only be used at shutdown time.
	log_action_begin_msg "Stopping resolvconf"
	resolvconf --disable-updates || log_action_end_msg_and_exit 1 "failed to disable updates"
	log_action_end_msg_and_exit 0
	}
  restart {
	log_action_begin_msg "Restarting resolvconf"
	resolvconf --enable-updates || log_action_end_msg_and_exit 1 "failed to enable updates"
	log_action_end_msg_and_exit 0
	}
  reload|force-reload {
	resolvconf -u || log_action_end_msg_and_exit 1 "failed to update"
	exit 0
	}
  enable-updates {
	resolvconf --enable-updates || log_action_end_msg_and_exit 1 "failed to enable updates"
	exit 0
	}
  disable-updates {
	resolvconf --disable-updates || log_action_end_msg_and_exit 1 "failed to disable updates"
	exit 0
	}
  status {
	if resolvconf --updates-are-enabled  {
		log_success_msg "resolvconf updates are enabled"
	} else {
		log_failure_msg "resolvconf updates are disabled"
	}
	exit 0
	}
  * {
	echo "Usage: /etc/init.d/resolvconf {start|stop|restart|reload|force-reload|enable-updates|disable-updates|status}" >&2
	exit 3
	}
}

# Don't reach here
exit 99