aboutsummaryrefslogtreecommitdiffstats
path: root/dnsmasq.in
diff options
context:
space:
mode:
Diffstat (limited to 'dnsmasq.in')
-rw-r--r--dnsmasq.in125
1 files changed, 125 insertions, 0 deletions
diff --git a/dnsmasq.in b/dnsmasq.in
new file mode 100644
index 000000000000..167886628303
--- /dev/null
+++ b/dnsmasq.in
@@ -0,0 +1,125 @@
+#!/bin/sh
+# Copyright (c) 2007-2009 Roy Marples
+# All rights reserved
+
+# dnsmasq subscriber for resolvconf
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following
+# disclaimer in the documentation and/or other materials provided
+# with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+[ -f "@SYSCONFDIR@"/resolvconf.conf ] || exit 0
+. "@SYSCONFDIR@/resolvconf.conf" || exit 1
+[ -z "$dnsmasq_conf" -a -z "$dnsmasq_resolv" ] && exit 0
+[ -z "$RESOLVCONF" ] && eval "$(@PREFIX@/sbin/resolvconf -v)"
+
+: ${dnsmasq_pid:=/var/run/dnsmasq.pid}
+[ -s "$dnsmasq_pid" ] || dnsmasq_pid=/var/run/dnsmasq/dnsmasq.pid
+: ${dnsmasq_service:=dnsmasq}
+: ${dnsmasq_restart:=@RESTARTCMD ${dnsmasq_service}@}
+newconf="# Generated by resolvconf\n"
+newresolv="$newconf"
+
+# Using dbus means that we never have to restart the daemon
+# This is important as it means we should not drop DNS queries
+# whilst changing DNS options around. However, dbus support is optional
+# so we need to validate a few things first.
+# Check for DBus support in the binary
+dbus=false
+: ${dbus_pid:=/var/run/dbus/dbus.pid}
+[ -s "$dbus_pid" ] || dbus_pid=/var/run/dbus.pid
+[ -s "$dbus_pid" ] || dbus_pid=/var/run/dbus/pid
+if [ -s "$dbus_pid" -a -s "$dnsmasq_pid" ]; then
+ if dnsmasq --version 2>/dev/null | \
+ grep -q "^Compile time options.*[[:space:]]DBus[[:space:]]"
+ then
+ # Sanity - check that dnsmasq and dbus are running
+ if kill -0 $(cat "$dbus_pid") 2>/dev/null && \
+ kill -0 $(cat "$dnsmasq_pid") 2>/dev/null
+ then
+ dbus=true
+ newconf="$newconf\n# Domain specific servers will"
+ newconf="$newconf be sent over dbus\nenable-dbus\n"
+ fi
+ fi
+fi
+
+for n in $NAMESERVERS; do
+ newresolv="${newresolv}nameserver $n\n"
+done
+
+dbusdest=
+for d in $DOMAINS; do
+ dn="${d%%:*}"
+ ns="${d#*:}"
+ while [ -n "$ns" ]; do
+ if $dbus; then
+ SIFS=${IFS-y} OIFS=$IFS
+ IFS=.
+ set -- ${ns%%,*}
+ num="0x$(printf "%02x" $1 $2 $3 $4)"
+ if [ "$SIFS" = yi ]; then
+ unset IFS
+ else
+ IFS=$OIFS
+ fi
+ dbusdest="$dbusdest uint32:$(printf "%u" $num)"
+ dbusdest="$dbusdest string:$dn"
+ else
+ newconf="${newconf}server=/$dn/${ns%%,*}\n"
+ fi
+ [ "$ns" = "${ns#*,}" ] && break
+ ns="${ns#*,}"
+ done
+done
+
+changed=false
+if [ -n "$dnsmasq_conf" ]; then
+ if [ ! -f "$dnsmasq_conf" ] || \
+ [ "$(cat "$dnsmasq_conf")" != "$(printf "$newconf")" ]
+ then
+ changed=true
+ printf "$newconf" >"$dnsmasq_conf"
+ fi
+fi
+if [ -n "$dnsmasq_resolv" ]; then
+ if [ -f "$dnsmasq_resolv" ]; then
+ if [ "$(cat "$dnsmasq_resolv")" != "$(printf "$newresolv")" ]
+ then
+ changed=true
+ printf "$newresolv" >"$dnsmasq_resolv"
+ fi
+ else
+ # dnsmasq polls this file so no need to set changed=true
+ printf "$newresolv" >"$dnsmasq_resolv"
+ fi
+fi
+
+if $changed; then
+ eval $dnsmasq_restart
+fi
+if $dbus; then
+ $changed || kill -HUP $(cat "$dnsmasq_pid")
+ # Send even if empty so old servers are cleared
+ dbus-send --system --dest=uk.org.thekelleys.dnsmasq \
+ /uk/org/thekelleys/dnsmasq uk.org.thekelleys.SetServers \
+ $dbusdest
+fi