2 # Copyright 2007-2008 Roy Marples
5 # dnsmasq subscriber for resolvconf
7 # Redistribution and use in source and binary forms, with or without
8 # modification, are permitted provided that the following conditions
10 # * Redistributions of source code must retain the above copyright
11 # notice, this list of conditions and the following disclaimer.
12 # * Redistributions in binary form must reproduce the above
13 # copyright notice, this list of conditions and the following
14 # disclaimer in the documentation and/or other materials provided
15 # with the distribution.
17 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20 # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21 # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 # This is very important!
30 # We assume that we are a local dns cache - after all, why would a server
32 # Now that we have assumed this, we also assume that generic DHCP clients
33 # will enter their domains and search domains ONLY in the "search" field
34 # in their resolv.confs and VPN clients will put the domain they are for
35 # into the domain field only.
36 # This allows dnsmasq to forward domains for a specific VPN domain to the
37 # VPN nameserver and everything else to the standard name servers.
39 # A sample dnsmasq config that works as above is like so.
40 # NOTE: The loopback interface on some systems maybe lo0.
43 #resolv-file=@PREFIX@/etc/dnsmasq-resolv.conf
44 #conf-file=@PREFIX@/etc/dnsmasq-resolvconf.conf
46 # The last step is to configure dns configuration for /etc/resolv.conf
47 # for the lo interface. You can do this in resolvconf as well by adding
49 # to resolv.conf.d/base
51 # Load our variables from resolvconf
52 eval "$(resolvconf -v)"
55 DNSMASQRESOLV="${PREFIX}/etc/dnsmasq-resolv.conf"
56 DNSMASQCONF="${PREFIX}/etc/dnsmasq-resolvconf.conf"
57 DNSMASQPID=/var/run/dnsmasq.pid
59 NEWCONF="# Generated by resolvconf\n"
60 NEWRESOLV="${NEWCONF}"
62 # Using DBUS means that we never have to restart the daemon
63 # This is important as it means we should not drop DNS queries
64 # whilst changing DNS options around. However, DBUS support is optional
65 # so we need to validate a few things first.
66 # Check for DBus support in the binary
69 DBUSPID=/var/run/dbus/dbus.pid
70 [ -s "${DBUSPID}" ] || DBUSPID=/var/run/dbus.pid
71 [ -s "${DBUSPID}" ] || DBUSPID=/var/run/dbus/pid
72 if [ -s "${DBUSPID}" -a -s ${DNSMASQPID} ]; then
73 if dnsmasq --version 2>/dev/null | \
74 grep -q "^Compile time options.*[[:space:]]DBus[[:space:]]" \
76 # Sanity - check that dnsmasq and dbus are running
77 if kill -0 $(cat "${DBUSPID}") 2>/dev/null \
78 && kill -0 $(cat ${DNSMASQPID}) 2>/dev/null; then
80 NEWCONF="${NEWCONF}\n# Domain specific servers will be sent over dbus\nenable-dbus\n"
85 for N in ${NAMESERVERS}; do
86 case "\n${NEWRESOLV}\n" in
87 *"\nnameserver ${N}\n");;
88 *) NEWRESOLV="${NEWRESOLV}nameserver ${N}\n";;
93 for D in ${DOMAINS}; do
96 while [ -n "${NS}" ]; do
97 if [ "${DBUS}" = "yes" ]; then
98 SIFS=${IFS-y} OIFS=$IFS
101 NUM="0x$(printf "%02x" $1 $2 $3 $4)"
102 if [ "${SIFS}" = "y" ]; then
107 DBUSDEST="${DBUSDEST} uint32:$(printf "%u" ${NUM}) string:${DN}"
109 NEWCONF="${NEWCONF}server=/${DN}/${NS%%,*}\n"
111 [ "${NS}" = "${NS#*,}" ] && break
117 if [ -e "${DNSMASQCONF}" ]; then
118 if [ "$(cat "${DNSMASQCONF}")" != "$(printf "${NEWCONF}")" ]; then
120 printf "${NEWCONF}" > "${DNSMASQCONF}"
124 printf "${NEWCONF}" > "${DNSMASQCONF}"
126 if [ -e "${DNSMASQRESOLV}" ]; then
127 if [ "$(cat "${DNSMASQRESOLV}")" != "$(printf "${NEWRESOLV}")" ]; then
129 printf "${NEWRESOLV}" > "${DNSMASQRESOLV}"
132 # dnsmasq polls this file so no need to set RELOAD="yes"
133 printf "${NEWRESOLV}" > "${DNSMASQRESOLV}"
136 [ "${RELOAD}" = "yes" ] && resolvconf -s dnsmasq restart
137 if [ "${DBUS}" = "yes" ]; then
138 [ "${RELOAD}" != "yes" ] && kill -HUP $(cat ${DNSMASQPID})
139 # Send even if empty so old servers are cleared
140 dbus-send --system --dest=uk.org.thekelleys.dnsmasq \
141 /uk/org/thekelleys/dnsmasq uk.org.thekelleys.SetServers \