resolv_conf_passthrough makes the latest interface resolv.conf the real resolv.conf
[openresolv] / dnsmasq.in
1 #!/bin/sh
2 # Copyright 2007-2009 Roy Marples
3 # All rights reserved
4
5 # dnsmasq subscriber for resolvconf
6
7 # Redistribution and use in source and binary forms, with or without
8 # modification, are permitted provided that the following conditions
9 # are met:
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.
16 #
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.
28
29 [ -f "@SYSCONFDIR@"/resolvconf.conf ] || exit 0
30 . "@SYSCONFDIR@/resolvconf.conf" || exit 1
31 [ -z "${dnsmasq_conf}" -o -z "${dnsmasq_resolv}" ] && exit 0
32 eval "$(${RESOLVCONF:-resolvconf} -v)"
33
34 PREFIX=@PREFIX@
35 dnsmasqpid="${dnsmasq_pid:-/var/run/dnsmasq.pid}"
36
37 newconf="# Generated by resolvconf\n"
38 newresolv="${newconf}"
39
40 # Using dbus means that we never have to restart the daemon
41 # This is important as it means we should not drop DNS queries
42 # whilst changing DNS options around. However, dbus support is optional
43 # so we need to validate a few things first.
44 # Check for DBus support in the binary
45
46 dbus=false
47 dbuspid="${dbus_pid:-/var/run/dbus/dbus.pid}"
48 [ -s "${dbuspid}" ] || dbuspid=/var/run/dbus.pid
49 [ -s "${dbuspid}" ] || dbuspid=/var/run/dbus/pid
50 if [ -s "${dbuspid}" -a -s ${dnsmasqpid} ]; then
51         if dnsmasq --version 2>/dev/null | \
52                 grep -q "^Compile time options.*[[:space:]]DBus[[:space:]]"
53         then
54                 # Sanity - check that dnsmasq and dbus are running
55                 if kill -0 $(cat "${dbuspid}") 2>/dev/null && \
56                         kill -0 $(cat ${dnsmasqpid}) 2>/dev/null
57                 then
58                         dbus=true
59                         newconf="${newconf}\n# Domain specific servers will"
60                         newconf="${newconf} be sent over dbus\nenable-dbus\n"
61                 fi
62         fi
63 fi
64
65 for n in ${NAMESERVERS}; do
66         case "\n${newresolv}\n" in
67         *"\nnameserver ${n}\n");;
68         *) newresolv="${newresolv}nameserver ${n}\n";;
69         esac
70 done
71
72 dbusdest=
73 for d in ${DOMAINS}; do
74         dn="${d%%:*}"
75         ns="${d#*:}"
76         while [ -n "${ns}" ]; do
77                 if ${dbus}; then
78                         SIFS=${IFS-y} OIFS=$IFS
79                         IFS=.
80                         set -- ${ns%%,*}
81                         num="0x$(printf "%02x" $1 $2 $3 $4)"
82                         if [ "${SIFS}" = "y" ]; then
83                                 unset IFS
84                         else
85                                 IFS=$OIFS
86                         fi
87                         dbusdest="${dbusdest} uint32:$(printf "%u" ${num})"
88                         dbusdest="${dbusdest} string:${dn}"
89                 else
90                         newconf="${newconf}server=/${db}/${ns%%,*}\n"
91                 fi
92                 [ "${ns}" = "${ns#*,}" ] && break
93                 ns="${ns#*,}"
94         done
95 done
96
97 changed=false
98 if [ ! -f "${dnsmasq_conf}" ] || \
99         [ "$(cat "${dnsmasq_conf}")" != "$(printf "${newconf}")" ]
100 then
101         changed=true
102         printf "${newconf}" > "${dnsmasq_conf}"
103 fi
104 if [ -f "${dnsmasq_resolv}" ]; then
105         if [ "$(cat "${dnsmasq_resolv}")" != "$(printf "${newresolv}")" ]; then
106                 changed=true
107                 printf "${newresolv}" > "${dnsmasq_resolv}"
108         fi
109 else
110         # dnsmasq polls this file so no need to set changed=true
111         printf "${newresolv}" > "${dnsmasq_resolv}"
112 fi
113
114 ${changed} && resolvconf -s dnsmasq restart
115 if ${dbus}; then
116         ${restart} || kill -HUP $(cat ${dnsmasqpid})
117         # Send even if empty so old servers are cleared
118         dbus-send --system --dest=uk.org.thekelleys.dnsmasq \
119                 /uk/org/thekelleys/dnsmasq uk.org.thekelleys.SetServers \
120                 ${dbusdest}
121 fi