We need to process dynamic interfaces without metrics before ones
[openresolv] / dnsmasq.in
old mode 100755 (executable)
new mode 100644 (file)
index ccb5e3f..bac90e1
@@ -1,6 +1,5 @@
 #!/bin/sh
-# Copyright 2006 Gentoo Foundation
-# Copyright 2007 Roy Marples
+# Copyright 2007-2009 Roy Marples
 # All rights reserved
 
 # dnsmasq subscriber for resolvconf
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-# This is very important!
-# We assume that we are a local dns cache - after all, why would a server
-# use resolvconf?
-# Now that we have assumed this, we also assume that generic DHCP clients
-# will enter their domains and search domains ONLY in the "search" field
-# in their resolv.confs and VPN clients will put the domain they are for
-# into the domain field only.
-# This allows dnsmasq to forward domains for a specific VPN domain to the
-# VPN nameserver and everything else to the standard name servers.
+[ -f "@SYSCONFDIR@"/resolvconf.conf ] || exit 0
+. "@SYSCONFDIR@/resolvconf.conf" || exit 1
+[ -z "${dnsmasq_conf}" -o -z "${dnsmasq_resolv}" ] && exit 0
+eval "$(${RESOLVCONF:-resolvconf} -v)"
 
-# A sample dnsmasq config that works as above is like so
-#domain-needed
-#interface=lo
-#resolv-file=/etc/dnsmasq-resolv.conf
-#conf-file=/etc/dnsmasq-resolvconf.conf
-
-# The last step is to configure dns configuration for /etc/resolv.conf
-# for the lo interface. In Gentoo we set it up like so in /etc/conf.d/net
-#dns_servers_lo="127.0.0.1"
-
-# Load our variables from resolvconf
-VARS="$(resolvconf -v)"
-eval "${VARS}"
-
-PREFIX=
-DNSMASQRESOLV="${PREFIX}/etc/dnsmasq-resolv.conf"
-DNSMASQCONF="${PREFIX}/etc/dnsmasq-resolvconf.conf"
+PREFIX=@PREFIX@
+DNSMASQPID="${dnsmasq_pid:-/var/run/dnsmasq.pid}"
 
 NEWCONF="# Generated by resolvconf\n"
 NEWRESOLV="${NEWCONF}"
@@ -63,101 +42,83 @@ NEWRESOLV="${NEWCONF}"
 # 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=no
-dbuspid=/var/run/dbus/dbus.pid
-[ -s "${dbuspid}" ] || dbuspid=/var/run/dbus.pid
-if [ -s "${dbuspid}" -a -s /var/run/dnsmasq.pid ]; then
+DBUSPID="${dbus_pid:-/var/run/dbus/dbus.pid}"
+[ -s "${DBUSPID}" ] || DBUSPID=/var/run/dbus.pid
+[ -s "${DBUSPID}" ] || DBUSPID=/var/run/dbus/pid
+if [ -s "${DBUSPID}" -a -s ${DNSMASQPID} ]; then
        if dnsmasq --version 2>/dev/null | \
-               grep -q "^Compile time options.*[[:space:]]DBus[[:space:]]" \
-               ; then
+               grep -q "^Compile time options.*[[:space:]]DBus[[:space:]]"
+       then
                # Sanity - check that dnsmasq and dbus are running
-               if kill -0 $(cat "${dbuspid}") \
-                       && kill -0 $(cat /var/run/dnsmasq.pid); then
+               if kill -0 $(cat "${DBUSPID}") 2>/dev/null && \
+                       kill -0 $(cat ${DNSMASQPID}) 2>/dev/null
+               then
                        DBUS=yes
-                       NEWCONF="${NEWCONF}\n# Domain specific servers will be sent over dbus\nenable-dbus\n"
+                       NEWCONF="${NEWCONF}\n# Domain specific servers will"
+                       NEWCONF="${NEWCONF} be sent over dbus\nenable-dbus\n"
                fi
        fi
 fi
 
-uniqify() {
-    local result=
-    while [ -n "$1" ]; do
-               case " ${result} " in
-                       *" $1 "*);;
-                       *) result="${result} $1";;
-               esac
-               shift
-       done
-    echo "${result# *}"
-}
-
-# If we only have domain information then put it in search too
-[ -z "${NEWSEARCH}" -a -z "${NEWNS}" ] && NEWSEARCH="${NEWDOMAIN}"
-
-for N in ${NEWSEARCH}; do
-       case " ${NEWSL} " in
-               *" ${N%,*} "*);;
-               *) NEWSL="${NEWSL} ${N%,*}";;
-       esac
-       case "\n${NEWRESOLV}\n" in
-               *"\nnameserver ${N#*,}\n"*);;
-               *) NEWRESOLV="${NEWRESOLV}nameserver ${N#*,}\n";;
-       esac
-done
-for N in ${NEWNS}; do
+for N in ${NAMESERVERS}; do
        case "\n${NEWRESOLV}\n" in
-               *"\nnameserver ${N}\n");;
-               *) NEWRESOLV="${NEWRESOLV}nameserver ${N}\n";;
+       *"\nnameserver ${N}\n");;
+       *) NEWRESOLV="${NEWRESOLV}nameserver ${N}\n";;
        esac
 done
-[ -n "${NEWSL}" ] && NEWRESOLV="${NEWRESOLV}search${NEWSL}\n"
 
 DBUSDEST=
-for DN in $(uniqify ${NEWDOMAIN}); do
-       if [ "${DBUS}" = "yes" ]; then
-               IP=${DN#*,}
-               SIFS=${IFS-y} OIFS=$IFS
-               IFS=.
-               set -- ${IP}
-               NUM="0x$(printf "%02x" $1 $2 $3 $4)"
-               if [ "${SIFS}" = "y" ]; then
-                       IFS=$OIFS
+for D in ${DOMAINS}; do
+       DN="${D%%:*}"
+       NS="${D#*:}"
+       while [ -n "${NS}" ]; do
+               if [ "${DBUS}" = "yes" ]; then
+                       SIFS=${IFS-y} OIFS=$IFS
+                       IFS=.
+                       set -- ${NS%%,*}
+                       NUM="0x$(printf "%02x" $1 $2 $3 $4)"
+                       if [ "${SIFS}" = "y" ]; then
+                               unset IFS
+                       else
+                               IFS=$OIFS
+                       fi
+                       DBUSDEST="${DBUSDEST} uint32:$(printf "%u" ${NUM})"
+                       DBUSDEST="${DBUSDEST} string:${DN}"
                else
-                       unset IFS
+                       NEWCONF="${NEWCONF}server=/${DN}/${NS%%,*}\n"
                fi
-               DBUSDEST="${DBUSDEST} uint32:$(printf "%d" ${NUM}) string:${DN%,*}"
-       else
-               NEWCONF="${NEWCONF}server=/${DN%,*}/${DN#*,}\n"
-       fi
+               [ "${NS}" = "${NS#*,}" ] && break
+               NS="${NS#*,}"
+       done
 done
 
 RELOAD="no"
-if [ -e "${DNSMASQCONF}" ]; then
-       if [ "$(cat "${DNSMASQCONF}")" != "$(printf "${NEWCONF}")" ]; then
+if [ -f "${dnsmasq_conf}" ]; then
+       if [ "$(cat "${dnsmasq_conf}")" != "$(printf "${NEWCONF}")" ]; then
                RELOAD="yes"
-               printf "${NEWCONF}" > "${DNSMASQCONF}"
+               printf "${NEWCONF}" > "${dnsmasq_conf}"
        fi
 else
        RELOAD="yes"
-       printf "${NEWCONF}" > "${DNSMASQCONF}"
+       printf "${NEWCONF}" > "${dnsmasq_conf}"
 fi
-if [ -e "${DNSMASQRESOLV}" ]; then
-       if [ "$(cat "${DNSMASQRESOLV}")" != "$(printf "${NEWRESOLV}")" ]; then
+if [ -f "${dnsmasq_resolv}" ]; then
+       if [ "$(cat "${dnsmasq_resolv}")" != "$(printf "${NEWRESOLV}")" ]; then
                RELOAD="yes"
-               printf "${NEWRESOLV}" > "${DNSMASQRESOLV}"
+               printf "${NEWRESOLV}" > "${dnsmasq_resolv}"
        fi
 else
        # dnsmasq polls this file so no need to set RELOAD="yes"
-       printf "${NEWRESOLV}" > "${DNSMASQRESOLV}"
+       printf "${NEWRESOLV}" > "${dnsmasq_resolv}"
 fi
 
 [ "${RELOAD}" = "yes" ] && resolvconf -s dnsmasq restart
 if [ "${DBUS}" = "yes" ]; then
-       [ "${RELOAD}" != "yes" ] && resolvconf -s dnsmasq reload
-       # Send even if emtpy so old servers are cleared
+       [ "${RELOAD}" != "yes" ] && kill -HUP $(cat ${DNSMASQPID})
+       # 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
-
-# vim: ts=4 :