diff options
author | ume <ume@FreeBSD.org> | 2011-03-18 12:09:27 +0000 |
---|---|---|
committer | ume <ume@FreeBSD.org> | 2011-03-18 12:09:27 +0000 |
commit | c23159e1a271c4648f80d76340aab96cb4ca502b (patch) | |
tree | 25f1b23c14ad5d0ecadb8559af0362e7d023accb /contrib/openresolv/dnsmasq.in | |
parent | a2373388c1e92e5062c73b45da5d56b328a13549 (diff) | |
parent | e1520c69ccc9c503f85e049de8117e9e7fdb97c4 (diff) | |
download | FreeBSD-src-c23159e1a271c4648f80d76340aab96cb4ca502b.zip FreeBSD-src-c23159e1a271c4648f80d76340aab96cb4ca502b.tar.gz |
Import openresolv from vendor branch, actually.
Helped by: jhb
Diffstat (limited to 'contrib/openresolv/dnsmasq.in')
-rw-r--r-- | contrib/openresolv/dnsmasq.in | 125 |
1 files changed, 125 insertions, 0 deletions
diff --git a/contrib/openresolv/dnsmasq.in b/contrib/openresolv/dnsmasq.in new file mode 100644 index 0000000..1678866 --- /dev/null +++ b/contrib/openresolv/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 |