#!/bin/sh -e

### BEGIN INIT INFO
# Provides:          bind bind9
# Required-Start:    $remote_fs
# Required-Stop:     $remote_fs
# Should-Start:      $network $syslog
# Should-Stop:       $network $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start and stop BIND 9 Domain Name Server
# Description:       BIND 9 is a Domain Name Server (DNS)
#        which translates ip addresses to and from internet names
### END INIT INFO

PATH=/sbin:/bin:/usr/sbin:/usr/bin

# for a chrooted server: "-u bind -t /var/lib/named"
# Don't modify this line, instead change or create /etc/default/named.
OPTIONS=""
RESOLVCONF=no

test -f /etc/default/named && . /etc/default/named

test -x /usr/sbin/rndc || exit 0

. /lib/lsb/init-functions
PIDFILE=/run/named/named.pid

check_network() {
	result=0
	if [ -x /usr/bin/uname ] && [ "X$(/usr/bin/uname -o)" = XSolaris ]; then
		LIST_NICS_IP=$(ifconfig -au) || result=$?
	else
		LIST_NICS_IP=$(ip addr) || result=$?
	fi
	if [ $result -ne 0 ] || [ -z "${LIST_NICS_IP}" ]; then
		#log_action_msg "No networks configured."
		return 1
	fi
	return 0
}

case "$1" in
start)
	log_daemon_msg "Starting domain name service..." "named"

	modprobe capability >/dev/null 2>&1 || true

	# dirs under /run can go away on reboots.
	mkdir -p /run/named
	chmod 775 /run/named
	chown root:bind /run/named >/dev/null 2>&1 || true

	if [ ! -x /usr/sbin/named ]; then
		log_action_msg "named binary missing - not starting"
		log_end_msg 1
	fi

	if ! check_network; then
		log_action_msg "no networks configured"
		log_end_msg 1
	fi

	if start-stop-daemon --start --oknodo --quiet --exec /usr/sbin/named \
		--pidfile ${PIDFILE} -- $OPTIONS; then
		if [ "X$RESOLVCONF" != "Xno" ] && [ -x resolvconf ]; then
			echo "nameserver 127.0.0.1" | resolvconf -a lo.named
		fi
		log_end_msg 0
	else
		log_end_msg 1
	fi
	;;

stop)
	log_daemon_msg "Stopping domain name service..." "named"
	if ! check_network; then
		log_action_msg "no networks configured"
		log_end_msg 1
	fi

	if [ "X$RESOLVCONF" != "Xno" ] && [ -x resolvconf ]; then
		resolvconf -d lo.named
	fi
	pid=$(/usr/sbin/rndc stop -p | awk '/^pid:/ {print $2}') || true
	if [ -z "$pid" ]; then # no pid found, so either not running, or error
		pid=$(pgrep -f ^/usr/sbin/named) || true
		start-stop-daemon --stop --oknodo --quiet --exec /usr/sbin/named \
			--pidfile ${PIDFILE} -- $OPTIONS
	fi
	if [ -n "$pid" ]; then
		sig=0
		n=1
		while kill -$sig "$pid" 2>/dev/null; do
			if [ $n -eq 1 ]; then
				echo "waiting for pid $pid to die"
			fi
			if [ $n -eq 11 ]; then
				echo "giving up on pid $pid with kill -0; trying -9"
				sig=9
			fi
			if [ $n -gt 20 ]; then
				echo "giving up on pid $pid"
				break
			fi
			n=$((n + 1))
			sleep 1
		done
	fi
	log_end_msg 0
	;;

reload | force-reload)
	log_daemon_msg "Reloading domain name service..." "named"
	if ! check_network; then
		log_action_msg "no networks configured"
		log_end_msg 1
	fi

	if /usr/sbin/rndc reload >/dev/null; then
		log_end_msg 0
	else
		log_end_msg 1
	fi
	;;

restart)
	if ! check_network; then
		log_action_msg "no networks configured"
		exit 1
	fi

	$0 stop
	$0 start
	;;

status)
	ret=0
	status_of_proc -p ${PIDFILE} /usr/sbin/named bind 2>/dev/null || ret=$?
	exit $ret
	;;

*)
	log_action_msg "Usage: /etc/init.d/named {start|stop|reload|restart|force-reload|status}"
	exit 1
	;;
esac

exit 0
