#!/bin/sh
### BEGIN INIT INFO
# Provides:       dnsmasq
# Required-Start: $network $remote_fs $syslog
# Required-Stop:  $network $remote_fs $syslog
# Default-Start:  2 3 4 5
# Default-Stop:   0 1 6
# Description:    DHCP and DNS server
### END INIT INFO

set +e   # Don't exit on error status

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/sbin/dnsmasq
NAME=dnsmasq
DESC="DNS forwarder and DHCP server"

# Most configuration options in /etc/default/dnsmasq are deprecated
# but still honoured.

ENABLED=1
if [ -r /etc/default/$NAME ]; then
	. /etc/default/$NAME
fi

test "$ENABLED" != "0" || exit 0
test -x $DAEMON || exit 0

# Provide skeleton LSB log functions for backports which don't have LSB functions.
if [ -f /lib/lsb/init-functions ]; then
         . /lib/lsb/init-functions
else
         log_warning_msg () {
            echo -n " ($@)"
         }

         log_daemon_msg () {
            echo -n "${1}: $2"
         }

	 log_end_msg () {
            echo "."; 
         }
fi

# RESOLV_CONF:
# If the resolvconf package is installed then use the resolv conf file
# that it provides as the default.  Otherwise use /etc/resolv.conf as
# the default.
#
# This setting can be overridden by setting the RESOLV_CONF environment
# variable in /etc/default/dnsmasq or by including a resolv-file
# line in /etc/dnsmasq.conf .

if [ ! "$RESOLV_CONF" ] &&
   [ -x /sbin/resolvconf ]
then
	RESOLV_CONF=/var/run/dnsmasq/resolv.conf
fi

for INTERFACE in $DNSMASQ_INTERFACE; do
	DNSMASQ_INTERFACES="$DNSMASQ_INTERFACES -i $INTERFACE"
done

for INTERFACE in $DNSMASQ_EXCEPT; do
	DNSMASQ_INTERFACES="$DNSMASQ_INTERFACES -I $INTERFACE"
done

if [ ! "$DNSMASQ_USER" ]; then
   DNSMASQ_USER="dnsmasq"
fi

start()
{
	# Return
	#   0 if daemon has been started
	#   1 if daemon was already running
	#   2 if daemon could not be started
	start-stop-daemon --start --quiet --pidfile /var/run/$NAME.pid --exec $DAEMON --test > /dev/null || return 1
	start-stop-daemon --start --quiet --pidfile /var/run/$NAME.pid --exec $DAEMON -- \
		${MAILHOSTNAME:+ -m $MAILHOSTNAME} \
		${MAILTARGET:+ -t $MAILTARGET} \
		${DNSMASQ_USER:+ -u $DNSMASQ_USER} \
		${DNSMASQ_INTERFACE:+ $DNSMASQ_INTERFACES} \
		${DHCP_LEASE:+ -l $DHCP_LEASE} \
		${DOMAIN_SUFFIX:+ -s $DOMAIN_SUFFIX} \
		${RESOLV_CONF:+ -r $RESOLV_CONF} \
		${CACHESIZE:+ -c $CACHESIZE} \
		${DNSMASQ_OPTS:+ $DNSMASQ_OPTS} \
		|| return 2
}

start_resolvconf()
{
# If interface "lo" is explicitly disabled in /etc/default/dnsmasq
# Then dnsmasq won't be providing local DNS, so don't add it to
# the resolvconf server set.
	for interface in $DNSMASQ_EXCEPT
	do
		[ $interface = lo ] && return
	done

        if [ -x /sbin/resolvconf ] ; then
		echo "nameserver 127.0.0.1" | /sbin/resolvconf -a lo.$NAME
	fi
	return 0
}

stop()
{
	# Return
	#   0 if daemon has been stopped
	#   1 if daemon was already stopped
	#   2 if daemon could not be stopped
	#   other if a failure occurred
	start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile /var/run/$NAME.pid --name $NAME
	RETVAL="$?"
	[ "$RETVAL" = 2 ] && return 2
	# Wait for children to finish too
	start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
	[ "$?" = 2 ] && return 2
	rm -f /var/run/$NAME.pid   # Doesn't delete its own pidfile
	return "$RETVAL"
}

stop_resolvconf()
{
	if [ -x /sbin/resolvconf ] ; then
		/sbin/resolvconf -d lo.$NAME
	fi
	return 0
}

status()
{
	# Return
	#   0 if daemon is running
	#   1 if daemon is dead and pid file exists
	#   3 if daemon is not running
	#   4 if daemon status is unknown
	start-stop-daemon --start --quiet --pidfile /var/run/$NAME.pid --exec $DAEMON --test > /dev/null
	case "$?" in
		0) [ -e "/var/run/$NAME.pid" ] && return 1 ; return 3 ;;
		1) return 0 ;;
		*) return 4 ;;
	esac
}

case "$1" in
  start)
	log_daemon_msg "Starting $DESC" "$NAME"
	start
	case "$?" in
		0)
			log_end_msg 0
			start_resolvconf
			exit 0
			;;
		1)
			log_warning_msg "already running"
			log_end_msg 0
			exit 0
			;;
		*)
			log_warning_msg "failed"
			log_end_msg 1
			exit 1
			;;
	esac
	;;
  stop)
	stop_resolvconf
	log_daemon_msg "Stopping $DESC" "$NAME"
	stop
	case "$?" in
		0) log_end_msg 0 ; exit 0 ;;
		1) log_warning_msg "not running" ; log_end_msg 0 ; exit 0 ;;
		*) log_warning_msg "failed" ; log_end_msg 1 ; exit 1 ;;
	esac
	;;
  restart|force-reload)
	stop_resolvconf
	log_daemon_msg "Restarting $DESC" "$NAME"
	stop
	case "$?" in
		0|1)
			start
			case "$?" in
				0)
					log_end_msg 0
					start_resolvconf
					exit 0
					;;
				1)
					log_warning_msg "failed -- old process is still running"
					log_end_msg 1
					exit 1
					;;
				*)
					log_warning_msg "failed to start"
					log_end_msg 1
					exit 1
					;;
			esac
			;;
		*)
			log_warning_msg "failed to stop"
			log_end_msg 1
			exit 1
			;;
	esac
	;;
  status)
	log_daemon_msg "Checking $DESC" "$NAME"
	status
	case "$?" in
		0) log_warning_msg "running" ; log_end_msg 0; exit 0 ;;
		1) log_warning_msg "dead, pid file exists" ; log_end_msg 1; exit 1 ;;
		3) log_warning_msg "not running" ; log_end_msg 3; exit 3 ;;
		*) log_warning_msg "unknown" ; log_end_msg 4; exit 4 ;;
	esac
	;;
  *)
	echo "Usage: /etc/init.d/$NAME {start|stop|restart|force-reload|status}" >&2
	exit 3
	;;
esac

exit 0

