1
0
mirror of https://git.FreeBSD.org/src.git synced 2024-12-24 11:29:10 +00:00

Import openresolv 3.7.0.

PR:		199854
Obtained from:	http://roy.marples.name/projects/openresolv
Sponsored by:	The FreeBSD Foundation
This commit is contained in:
Glen Barber 2015-05-04 20:51:27 +00:00
parent 093c93c350
commit e995a96df6
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/vendor/openresolv/dist/; revision=282431
svn path=/vendor/openresolv/3.7.0/; revision=282432; tag=vendor/openresolv/3.7.0
13 changed files with 1046 additions and 256 deletions

4
GNUmakefile Normal file
View File

@ -0,0 +1,4 @@
# Nasty hack so that make clean works without configure being run
CONFIG_MK?=$(shell test -e config.mk && echo config.mk || echo config-null.mk)
include Makefile

View File

@ -1,8 +1,19 @@
include config.mk PKG= openresolv
VERSION= 3.7.0
NAME= openresolv # Nasty hack so that make clean works without configure being run
VERSION= 3.4.4 _CONFIG_MK!= test -e config.mk && echo config.mk || echo config-null.mk
PKG= ${NAME}-${VERSION} CONFIG_MK?= ${_CONFIG_MK}
include ${CONFIG_MK}
SBINDIR?= /sbin
SYSCONFDIR?= /etc
LIBEXECDIR?= /libexec/resolvconf
VARDIR?= /var/run/resolvconf
RCDIR?= /etc/rc.d
RESTARTCMD?= if ${RCDIR}/\1 status >/dev/null 2>\&1; then \
${RCDIR}/\1 restart; \
fi
INSTALL?= install INSTALL?= install
SED?= sed SED?= sed
@ -17,31 +28,36 @@ TARGET= ${RESOLVCONF} ${SUBSCRIBERS}
SRCS= ${TARGET:C,$,.in,} # pmake SRCS= ${TARGET:C,$,.in,} # pmake
SRCS:= ${TARGET:=.in} # gmake SRCS:= ${TARGET:=.in} # gmake
SED_PREFIX= -e 's:@PREFIX@:${PREFIX}:g' SED_SBINDIR= -e 's:@SBINDIR@:${SBINDIR}:g'
SED_SYSCONFDIR= -e 's:@SYSCONFDIR@:${SYSCONFDIR}:g' SED_SYSCONFDIR= -e 's:@SYSCONFDIR@:${SYSCONFDIR}:g'
SED_LIBEXECDIR= -e 's:@LIBEXECDIR@:${LIBEXECDIR}:g' SED_LIBEXECDIR= -e 's:@LIBEXECDIR@:${LIBEXECDIR}:g'
SED_VARDIR= -e 's:@VARDIR@:${VARDIR}:g' SED_VARDIR= -e 's:@VARDIR@:${VARDIR}:g'
SED_RCDIR= -e 's:@RCDIR@:${RCDIR}:g' SED_RCDIR= -e 's:@RCDIR@:${RCDIR}:g'
SED_RESTARTCMD= -e 's:@RESTARTCMD \(.*\)@:${RESTARTCMD}:g' SED_RESTARTCMD= -e 's:@RESTARTCMD \(.*\)@:${RESTARTCMD}:g'
DISTPREFIX?= ${PKG}-${VERSION}
DISTFILEGZ?= ${DISTPREFIX}.tar.gz
DISTFILE?= ${DISTPREFIX}.tar.bz2
FOSSILID?= current
.SUFFIXES: .in .SUFFIXES: .in
all: ${TARGET} all: ${TARGET}
.in: .in:
${SED} ${SED_PREFIX} ${SED_SYSCONFDIR} ${SED_LIBEXECDIR} \ ${SED} ${SED_SBINDIR} ${SED_SYSCONFDIR} ${SED_LIBEXECDIR} \
${SED_VARDIR} ${SED_RCDIR} ${SED_RESTARTCMD} \ ${SED_VARDIR} ${SED_RCDIR} ${SED_RESTARTCMD} \
$< > $@ $< > $@
clean: clean:
rm -f ${TARGET} openresolv-${VERSION}.tar.bz2 rm -f ${TARGET}
distclean: clean distclean: clean
rm -f config.mk rm -f config.mk ${DISTFILE}
installdirs: installdirs:
install: ${TARGET} proginstall: ${TARGET}
${INSTALL} -d ${DESTDIR}${SBINDIR} ${INSTALL} -d ${DESTDIR}${SBINDIR}
${INSTALL} -m ${BINMODE} resolvconf ${DESTDIR}${SBINDIR} ${INSTALL} -m ${BINMODE} resolvconf ${DESTDIR}${SBINDIR}
${INSTALL} -d ${DESTDIR}${SYSCONFDIR} ${INSTALL} -d ${DESTDIR}${SYSCONFDIR}
@ -49,18 +65,21 @@ install: ${TARGET}
${INSTALL} -m ${DOCMODE} resolvconf.conf ${DESTDIR}${SYSCONFDIR} ${INSTALL} -m ${DOCMODE} resolvconf.conf ${DESTDIR}${SYSCONFDIR}
${INSTALL} -d ${DESTDIR}${LIBEXECDIR} ${INSTALL} -d ${DESTDIR}${LIBEXECDIR}
${INSTALL} -m ${DOCMODE} ${SUBSCRIBERS} ${DESTDIR}${LIBEXECDIR} ${INSTALL} -m ${DOCMODE} ${SUBSCRIBERS} ${DESTDIR}${LIBEXECDIR}
maninstall:
${INSTALL} -d ${DESTDIR}${MANDIR}/man8 ${INSTALL} -d ${DESTDIR}${MANDIR}/man8
${INSTALL} -m ${MANMODE} resolvconf.8 ${DESTDIR}${MANDIR}/man8 ${INSTALL} -m ${MANMODE} resolvconf.8 ${DESTDIR}${MANDIR}/man8
${INSTALL} -d ${DESTDIR}${MANDIR}/man5 ${INSTALL} -d ${DESTDIR}${MANDIR}/man5
${INSTALL} -m ${MANMODE} resolvconf.conf.5 ${DESTDIR}${MANDIR}/man5 ${INSTALL} -m ${MANMODE} resolvconf.conf.5 ${DESTDIR}${MANDIR}/man5
import: install: proginstall maninstall
rm -rf /tmp/${PKG}
${INSTALL} -d /tmp/${PKG}
cp README ${SRCS} /tmp/${PKG}
dist: import import:
cp configure Makefile resolvconf.conf /tmp/${PKG} rm -rf /tmp/${DISTPREFIX}
tar cvjpf ${PKG}.tar.bz2 -C /tmp ${PKG} ${INSTALL} -d /tmp/${DISTPREFIX}
rm -rf /tmp/${PKG} cp README ${SRCS} /tmp/${DISPREFIX}
ls -l ${PKG}.tar.bz2
dist:
fossil tarball --name ${DISTPREFIX} ${FOSSILID} ${DISTFILEGZ}
gunzip -c ${DISTFILEGZ} | bzip2 >${DISTFILE}
rm ${DISTFILEGZ}

1
config-null.mk Normal file
View File

@ -0,0 +1 @@
# This space left intentionally blank

127
configure vendored
View File

@ -18,7 +18,7 @@ for x do
--debug) DEBUG=$var;; --debug) DEBUG=$var;;
--disable-debug) DEBUG=no;; --disable-debug) DEBUG=no;;
--enable-debug) DEBUG=yes;; --enable-debug) DEBUG=yes;;
--prefix) prefix=$var;; --prefix) PREFIX=$var;;
--sysconfdir) SYSCONFDIR=$var;; --sysconfdir) SYSCONFDIR=$var;;
--bindir|--sbindir) SBINDIR=$var;; --bindir|--sbindir) SBINDIR=$var;;
--libexecdir) LIBEXECDIR=$var;; --libexecdir) LIBEXECDIR=$var;;
@ -41,68 +41,76 @@ for x do
esac esac
done done
if [ -z "$LIBEXECDIR" ]; then
printf "Checking for directory /libexec ... "
if [ -d /libexec ]; then
echo "yes"
LIBEXECDIR=$PREFIX/libexec/resolvconf
else
echo "no"
LIBEXECDIR=$PREFIX/lib/resolvconf
fi
fi
if [ -z "$RUNDIR" ]; then
printf "Checking for directory /run ... "
if [ -d /run ]; then
echo "yes"
RUNDIR=/run
else
echo "no"
RUNDIR=/var/run
fi
fi
: ${SED:=sed} : ${SED:=sed}
: ${PREFIX:=$prefix}
: ${SYSCONFDIR:=$PREFIX/etc} : ${SYSCONFDIR:=$PREFIX/etc}
: ${SBINDIR:=$PREFIX/sbin} : ${SBINDIR:=$PREFIX/sbin}
: ${LIBEXECDIR:=$PREFIX/libexec} : ${LIBEXECDIR:=$PREFIX/libexec/resolvconf}
: ${STATEDIR:=/var} : ${STATEDIR:=/var}
: ${RUNDIR:=$STATEDIR/run} : ${RUNDIR:=$STATEDIR/run}
: ${MANDIR:=${PREFIX:-/usr}/share/man} : ${MANDIR:=${PREFIX:-/usr}/share/man}
eval SYSCONFDIR="$SYSCONFDIR" eval SYSCONFDIR="$SYSCONFDIR"
eval SBINDIR="$SBINDIR" eval SBINDIR="$SBINDIR"
eval LIBEXECDIR="$LIBEXECDIR/resolvconf" eval LIBEXECDIR="$LIBEXECDIR"
eval VARDIR="$RUNDIR/resolvconf" eval VARDIR="$RUNDIR/resolvconf"
eval MANDIR="$MANDIR" eval MANDIR="$MANDIR"
CONFIG_MK=config.mk CONFIG_MK=config.mk
if [ -z "$BUILD" ]; then if [ -z "$BUILD" ]; then
BUILD=`uname -m`-`uname -s | tr '[:upper:]' '[:lower:]'` # autoconf target triplet: cpu-vendor-os
fi BUILD=$(uname -m)-unknown-$(uname -s | tr '[:upper:]' '[:lower:]')
if [ -z "$HOST" ]; then
[ -z "$TARGET" ] && TARGET=$BUILD
HOST=$TARGET
fi
if [ -z "$TARGET" ]; then
[ -z "$HOST" ] && HOST=$BUILD
TARGET=$HOST
fi
# Debian and Slackware have linux in different places when dealing with
# autoconf, so we deal with that here.
if [ -z "$OS" ]; then
case "$TARGET" in
*-linux-*|linux-*|*-linux|linux) OS=linux;;
esac
fi fi
: ${HOST:=$BUILD}
if [ -z "$OS" ]; then if [ -z "$OS" ]; then
# Derive OS from cpu-manufacturer-os-kernel echo "Deriving operating system from ... $HOST"
CPU=${TARGET%%-*} # Derive OS from cpu-vendor-[kernel-]os
REST=${TARGET#*-} CPU=${HOST%%-*}
REST=${HOST#*-}
if [ "$CPU" != "$REST" ]; then if [ "$CPU" != "$REST" ]; then
MANU=${REST%%-*} VENDOR=${REST%%-*}
REST=${REST#*-} REST=${REST#*-}
if [ "$MANU" != "$REST" ]; then if [ "$VENDOR" != "$REST" ]; then
# Use kernel if given, otherwise os
OS=${REST%%-*} OS=${REST%%-*}
REST=${REST#*-}
if [ "$OS" != "$REST" ]; then
KERNEL=${REST%%-*}
else
# 3 tupple
KERNEL=$OS
OS=$MANU
MANU=
fi
else else
# 2 tupple # 2 tupple
OS=$MANU OS=$VENDOR
MANU= VENDOR=
fi fi
fi fi
# Work with cpu-kernel-os, ie Debian
case "$VENDOR" in
linux*|kfreebsd*) OS=$VENDOR; VENDOR= ;;
esac
# Special case
case "$OS" in
gnu*) OS=hurd;; # No HURD support as yet
esac
fi fi
echo "Configuring openresolv for ... $OS" echo "Configuring openresolv for ... $OS"
@ -118,17 +126,36 @@ for x in SYSCONFDIR SBINDIR LIBEXECDIR VARDIR MANDIR; do
echo "$x=$t $v" >>$CONFIG_MK echo "$x=$t $v" >>$CONFIG_MK
done done
if [ -e /etc/arch-release -a -d /etc/rc.d ]; then if [ -z "$RESTARTCMD" ]; then
echo "Overriding service status check for Arch Linux" printf "Checking for systemd ... "
if [ -x /bin/systemctl ]; then
RESTARTCMD="/bin/systemctl try-restart \1"
echo "yes"
elif [ -x /usr/bin/systemctl ]; then
RESTARTCMD="/usr/bin/systemctl try-restart \1"
echo "yes"
else
echo "no"
fi
fi
# Arch upgraded to systemd, so this check has to be just after systemd
# but higher than the others
if [ -z "$RESTARTCMD" ]; then
printf "Checking for Arch ... "
if [ -e /etc/arch-release -a -d /etc/rc.d ]; then
RCDIR=/etc/rc.d RCDIR=/etc/rc.d
RESTARTCMD="[ -e /var/run/daemons/\1 ] \&\& /etc/rc.d/\1 restart" RESTARTCMD="[ -e /var/run/daemons/\1 ] \&\& /etc/rc.d/\1 restart"
echo "yes" echo "yes"
else
echo "no"
fi
fi fi
if [ -z "$RESTARTCMD" ]; then if [ -z "$RESTARTCMD" ]; then
printf "Checking for OpenRC ... " printf "Checking for OpenRC ... "
if [ -x /sbin/rc-service ]; then if [ -x /sbin/rc-service ]; then
RESTARTCMD="/sbin/rc-service -e \1 \&\& /sbin/rc-service \1 -- -Ds restart" RESTARTCMD="if /sbin/rc-service -e \1; then /sbin/rc-service \1 -- -Ds restart; fi"
echo "yes" echo "yes"
else else
echo "no" echo "no"
@ -138,7 +165,7 @@ if [ -z "$RESTARTCMD" ]; then
printf "Checking for invoke-rc.d ... " printf "Checking for invoke-rc.d ... "
if [ -x /usr/sbin/invoke-rc.d ]; then if [ -x /usr/sbin/invoke-rc.d ]; then
RCDIR=/etc/init.d RCDIR=/etc/init.d
RESTARTCMD="/usr/sbin/invoke-rc.d --quiet \1 status >/dev/null 2>\&1 \&\& /usr/sbin/invoke-rc.d \1 restart" RESTARTCMD="if /usr/sbin/invoke-rc.d --quiet \1 status >/dev/null 2>\&1; then /usr/sbin/invoke-rc.d \1 restart; fi"
echo "yes" echo "yes"
else else
echo "no" echo "no"
@ -148,7 +175,19 @@ if [ -z "$RESTARTCMD" ]; then
printf "Checking for service ... " printf "Checking for service ... "
if [ -x /sbin/service ]; then if [ -x /sbin/service ]; then
RCDIR=/etc/init.d RCDIR=/etc/init.d
RESTARTCMD="/sbin/service \1 \&\& /sbin/service \1 restart" RESTARTCMD="if /sbin/service \1; then /sbin/service \1 restart; fi"
echo "yes"
else
echo "no"
fi
fi
if [ -z "$RESTARTCMD" ]; then
printf "Checking for runit... "
if [ -x /bin/sv ]; then
RESTARTCMD="/bin/sv try-restart \1"
echo "yes"
elif [ -x /usr/bin/sv ]; then
RESTARTCMD="/usr/bin/sv try-restart \1"
echo "yes" echo "yes"
else else
echo "no" echo "no"
@ -159,7 +198,7 @@ if [ -z "$RESTARTCMD" ]; then
printf "Checking for $x ... " printf "Checking for $x ... "
if [ -d $x ]; then if [ -d $x ]; then
RCDIR=$x RCDIR=$x
RESTARTCMD="$x/\1 status >/dev/null 2>\&1 \&\& $x/\1 restart" RESTARTCMD="if $x/\1 status >/dev/null 2>\&1; then $x/\1 restart; fi"
echo "yes" echo "yes"
break break
else else
@ -169,7 +208,7 @@ if [ -z "$RESTARTCMD" ]; then
fi fi
if [ -z "$RESTARTCMD" ]; then if [ -z "$RESTARTCMD" ]; then
echo "WARNING! No means of interacting with system services detected!" echo "$0: WARNING: No means of interacting with system services detected!"
exit 1 exit 1
fi fi

View File

@ -1,5 +1,5 @@
#!/bin/sh #!/bin/sh
# Copyright (c) 2007-2011 Roy Marples # Copyright (c) 2007-2012 Roy Marples
# All rights reserved # All rights reserved
# dnsmasq subscriber for resolvconf # dnsmasq subscriber for resolvconf
@ -29,12 +29,13 @@
[ -f "@SYSCONFDIR@"/resolvconf.conf ] || exit 0 [ -f "@SYSCONFDIR@"/resolvconf.conf ] || exit 0
. "@SYSCONFDIR@/resolvconf.conf" || exit 1 . "@SYSCONFDIR@/resolvconf.conf" || exit 1
[ -z "$dnsmasq_conf" -a -z "$dnsmasq_resolv" ] && exit 0 [ -z "$dnsmasq_conf" -a -z "$dnsmasq_resolv" ] && exit 0
[ -z "$RESOLVCONF" ] && eval "$(@PREFIX@/sbin/resolvconf -v)" [ -z "$RESOLVCONF" ] && eval "$(@SBINDIR@/resolvconf -v)"
NL=" NL="
" "
: ${dnsmasq_pid:=/var/run/dnsmasq.pid} : ${dnsmasq_pid:=/var/run/dnsmasq.pid}
[ -s "$dnsmasq_pid" ] || dnsmasq_pid=/var/run/dnsmasq/dnsmasq.pid [ -s "$dnsmasq_pid" ] || dnsmasq_pid=/var/run/dnsmasq/dnsmasq.pid
[ -s "$dnsmasq_pid" ] || unset dnsmasq_pid
: ${dnsmasq_service:=dnsmasq} : ${dnsmasq_service:=dnsmasq}
: ${dnsmasq_restart:=@RESTARTCMD ${dnsmasq_service}@} : ${dnsmasq_restart:=@RESTARTCMD ${dnsmasq_service}@}
newconf="# Generated by resolvconf$NL" newconf="# Generated by resolvconf$NL"
@ -46,21 +47,18 @@ newresolv="$newconf"
# so we need to validate a few things first. # so we need to validate a few things first.
# Check for DBus support in the binary # Check for DBus support in the binary
dbus=false dbus=false
: ${dbus_pid:=/var/run/dbus/dbus.pid} dbus_ex=false
[ -s "$dbus_pid" ] || dbus_pid=/var/run/dbus.pid dbus_introspect=$(dbus-send --print-reply --system \
[ -s "$dbus_pid" ] || dbus_pid=/var/run/dbus/pid --dest=uk.org.thekelleys.dnsmasq \
if [ -s "$dbus_pid" -a -s "$dnsmasq_pid" ]; then /uk/org/thekelleys/dnsmasq \
if dnsmasq --version 2>/dev/null | \ org.freedesktop.DBus.Introspectable.Introspect \
grep -q "^Compile time options.*[[:space:]]DBus[[:space:]]" 2>/dev/null)
then if [ $? = 0 ]; 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 dbus=true
newconf="$newconf$NL# Domain specific servers will" if printf %s "$dbus_introspect" | \
newconf="$newconf be sent over dbus${NL}enable-dbus$NL" grep -q '<method name="SetDomainServers">'
fi then
dbus_ex=true
fi fi
fi fi
@ -69,35 +67,95 @@ for n in $NAMESERVERS; do
done done
dbusdest= dbusdest=
dbusdest_ex=
conf=
for d in $DOMAINS; do for d in $DOMAINS; do
dn="${d%%:*}" dn="${d%%:*}"
ns="${d#*:}" ns="${d#*:}"
while [ -n "$ns" ]; do while [ -n "$ns" ]; do
if $dbus; then n="${ns%%,*}"
if $dbus && ! $dbus_ex; then
case "$n" in
*.*.*.*)
SIFS=${IFS-y} OIFS=$IFS SIFS=${IFS-y} OIFS=$IFS
IFS=. IFS=.
set -- ${ns%%,*} set -- $n
num="0x$(printf %02x $1 $2 $3 $4)" num="0x$(printf %02x $1 $2 $3 $4)"
if [ "$SIFS" = yi ]; then if [ "$SIFS" = y ]; then
unset IFS unset IFS
else else
IFS=$OIFS IFS=$OIFS
fi fi
dbusdest="$dbusdest uint32:$(printf %u $num)" dbusdest="$dbusdest uint32:$(printf %u $num)"
dbusdest="$dbusdest string:$dn" dbusdest="$dbusdest string:$dn"
else ;;
newconf="${newconf}server=/$dn/${ns%%,*}$NL" *:*%*)
# This version of dnsmasq won't accept
# scoped IPv6 addresses
dbus=false
;;
*:*)
SIFS=${IFS-y} OIFS=$IFS bytes= front= back=
empty=false i=0
IFS=:
set -- $n
while [ -n "$1" -o -n "$2" ]; do
addr="$1"
shift
if [ -z "$addr" ]; then
empty=true
continue
fi fi
i=$(($i + 1))
while [ ${#addr} -lt 4 ]; do
addr="0${addr}"
done
byte1="$(printf %d 0x${addr%??})"
byte2="$(printf %d 0x${addr#??})"
if $empty; then
back="$back byte:$byte1 byte:$byte2"
else
front="$front byte:$byte1 byte:$byte2"
fi
done
while [ $i != 8 ]; do
i=$(($i + 1))
front="$front byte:0 byte:0"
done
front="${front}$back"
if [ "$SIFS" = y ]; then
unset IFS
else
IFS=$OIFS
fi
dbusdest="${dbusdest}$front string:$dn"
;;
*)
if ! $dbus_ex; then
dbus=false
fi
;;
esac
fi
dbusdest_ex="$dbusdest_ex${dbusdest_ex:+,}/$dn/$n"
conf="${conf}server=/$dn/$n$NL"
[ "$ns" = "${ns#*,}" ] && break [ "$ns" = "${ns#*,}" ] && break
ns="${ns#*,}" ns="${ns#*,}"
done done
done done
if $dbus; then
newconf="$newconf$NL# Domain specific servers will"
newconf="$newconf be sent over dbus${NL}"
else
newconf="$newconf$conf"
fi
# Try to ensure that config dirs exist # Try to ensure that config dirs exist
if type config_mkdirs >/dev/null 2>&1; then if type config_mkdirs >/dev/null 2>&1; then
config_mkdirs "$dnsmasq_conf" "$dnsmasq_resolv" config_mkdirs "$dnsmasq_conf" "$dnsmasq_resolv"
else else
@PREFIX@/sbin/resolvconf -D "$dnsmasq_conf" "$dnsmasq_resolv" @SBINDIR@/resolvconf -D "$dnsmasq_conf" "$dnsmasq_resolv"
fi fi
changed=false changed=false
@ -110,14 +168,13 @@ if [ -n "$dnsmasq_conf" ]; then
fi fi
fi fi
if [ -n "$dnsmasq_resolv" ]; then if [ -n "$dnsmasq_resolv" ]; then
# dnsmasq polls this file so no need to set changed=true
if [ -f "$dnsmasq_resolv" ]; then if [ -f "$dnsmasq_resolv" ]; then
if [ "$(cat "$dnsmasq_resolv")" != "$(printf %s "$newresolv")" ] if [ "$(cat "$dnsmasq_resolv")" != "$(printf %s "$newresolv")" ]
then then
changed=true
printf %s "$newresolv" >"$dnsmasq_resolv" printf %s "$newresolv" >"$dnsmasq_resolv"
fi fi
else else
# dnsmasq polls this file so no need to set changed=true
printf %s "$newresolv" >"$dnsmasq_resolv" printf %s "$newresolv" >"$dnsmasq_resolv"
fi fi
fi fi
@ -126,9 +183,20 @@ if $changed; then
eval $dnsmasq_restart eval $dnsmasq_restart
fi fi
if $dbus; then if $dbus; then
if [ -s "$dnsmasq_pid" ]; then
$changed || kill -HUP $(cat "$dnsmasq_pid") $changed || kill -HUP $(cat "$dnsmasq_pid")
fi
# Send even if empty so old servers are cleared # Send even if empty so old servers are cleared
if $dbus_ex; then
method=SetDomainServers
if [ -n "$dbusdest_ex" ]; then
dbusdest_ex="array:string:$dbusdest_ex"
fi
dbusdest="$dbusdest_ex"
else
method=SetServers
fi
dbus-send --system --dest=uk.org.thekelleys.dnsmasq \ dbus-send --system --dest=uk.org.thekelleys.dnsmasq \
/uk/org/thekelleys/dnsmasq uk.org.thekelleys.SetServers \ /uk/org/thekelleys/dnsmasq uk.org.thekelleys.$method \
$dbusdest $dbusdest
fi fi

126
libc.in
View File

@ -1,5 +1,5 @@
#!/bin/sh #!/bin/sh
# Copyright (c) 2007-2011 Roy Marples # Copyright (c) 2007-2014 Roy Marples
# All rights reserved # All rights reserved
# libc subscriber for resolvconf # libc subscriber for resolvconf
@ -36,18 +36,18 @@ NL="
# sed may not be available, and this is faster on small files # sed may not be available, and this is faster on small files
key_get_value() key_get_value()
{ {
local key="$1" value= x= line= local key="$1" x= line=
shift shift
if [ $# -eq 0 ]; then if [ $# -eq 0 ]; then
while read line; do while read -r line; do
case "$line" in case "$line" in
"$key"*) echo "${line##$key}";; "$key"*) echo "${line##$key}";;
esac esac
done done
else else
for x; do for x do
while read line; do while read -r line; do
case "$line" in case "$line" in
"$key"*) echo "${line##$key}";; "$key"*) echo "${line##$key}";;
esac esac
@ -56,6 +56,24 @@ key_get_value()
fi fi
} }
keys_remove()
{
local key x line found
while read -r line; do
found=false
for key do
case "$line" in
"$key"*|"#"*|" "*|" "*|"") found=true;;
esac
$found && break
done
$found || echo "$line"
done
}
local_nameservers="127.* 0.0.0.0 255.255.255.255 ::1"
# Support original resolvconf configuration layout # Support original resolvconf configuration layout
# as well as the openresolv config file # as well as the openresolv config file
if [ -f "$SYSCONFDIR"/resolvconf.conf ]; then if [ -f "$SYSCONFDIR"/resolvconf.conf ]; then
@ -64,12 +82,11 @@ elif [ -d "$SYSCONFDIR"/resolvconf ]; then
SYSCONFDIR="$SYSCONFDIR/resolvconf/resolv.conf.d" SYSCONFDIR="$SYSCONFDIR/resolvconf/resolv.conf.d"
base="$SYSCONFDIR/resolv.conf.d/base" base="$SYSCONFDIR/resolv.conf.d/base"
if [ -f "$base" ]; then if [ -f "$base" ]; then
name_servers="$(key_get_value "nameserver " "$base")" prepend_nameservers="$(key_get_value "nameserver " "$base")"
search_domains="$(key_get_value "search " "$base")" domain="$(key_get_value "domain " "$base")"
if [ -z "$search_domains" ]; then prepend_search="$(key_get_value "search " "$base")"
search_domains="$(key_get_value "domain " "$base")"
fi
resolv_conf_options="$(key_get_value "options " "$base")" resolv_conf_options="$(key_get_value "options " "$base")"
resolv_conf_sortlist="$(key_get_value "sortlist " "$base")"
fi fi
if [ -f "$SYSCONFDIR"/resolv.conf.d/head ]; then if [ -f "$SYSCONFDIR"/resolv.conf.d/head ]; then
resolv_conf_head="$(cat "${SYSCONFDIR}"/resolv.conf.d/head)" resolv_conf_head="$(cat "${SYSCONFDIR}"/resolv.conf.d/head)"
@ -81,7 +98,7 @@ fi
: ${resolv_conf:=/etc/resolv.conf} : ${resolv_conf:=/etc/resolv.conf}
: ${libc_service:=nscd} : ${libc_service:=nscd}
: ${libc_restart:=@RESTARTCMD ${libc_service}@} : ${libc_restart:=@RESTARTCMD ${libc_service}@}
: ${list_resolv:=@PREFIX@/sbin/resolvconf -l} : ${list_resolv:=@SBINDIR@/resolvconf -l}
if [ "${resolv_conf_head-x}" = x -a -f "$SYSCONFDIR"/resolv.conf.head ]; then if [ "${resolv_conf_head-x}" = x -a -f "$SYSCONFDIR"/resolv.conf.head ]; then
resolv_conf_head="$(cat "${SYSCONFDIR}"/resolv.conf.head)" resolv_conf_head="$(cat "${SYSCONFDIR}"/resolv.conf.head)"
fi fi
@ -89,6 +106,9 @@ if [ "${resolv_conf_tail-x}" = x -a -f "$SYSCONFDIR"/resolv.conf.tail ]; then
resolv_conf_tail="$(cat "$SYSCONFDIR"/resolv.conf.tail)" resolv_conf_tail="$(cat "$SYSCONFDIR"/resolv.conf.tail)"
fi fi
backup=true
signature="# Generated by resolvconf"
uniqify() uniqify()
{ {
local result= local result=
@ -104,6 +124,7 @@ uniqify()
case "${resolv_conf_passthrough:-NO}" in case "${resolv_conf_passthrough:-NO}" in
[Yy][Ee][Ss]|[Tt][Rr][Uu][Ee]|[Oo][Nn]|1) [Yy][Ee][Ss]|[Tt][Rr][Uu][Ee]|[Oo][Nn]|1)
backup=false
newest= newest=
for conf in "$IFACEDIR"/*; do for conf in "$IFACEDIR"/*; do
if [ -z "$newest" -o "$conf" -nt "$newest" ]; then if [ -z "$newest" -o "$conf" -nt "$newest" ]; then
@ -113,31 +134,70 @@ case "${resolv_conf_passthrough:-NO}" in
[ -z "$newest" ] && exit 0 [ -z "$newest" ] && exit 0
newconf="$(cat "$newest")$NL" newconf="$(cat "$newest")$NL"
;; ;;
/dev/null|[Nn][Uu][Ll][Ll])
: ${resolv_conf_local_only:=NO}
if [ "$local_nameservers" = "127.* 0.0.0.0 255.255.255.255 ::1" ]; then
local_nameservers=
fi
# Need to overwrite our variables.
eval "$(@SBINDIR@/resolvconf -V)"
;;
*) *)
[ -z "$RESOLVCONF" ] && eval "$(@PREFIX@/sbin/resolvconf -v)" [ -z "$RESOLVCONF" ] && eval "$(@SBINDIR@/resolvconf -v)"
newsearch="$(uniqify $search_domains $SEARCH $search_domains_append)" ;;
esac
case "${resolv_conf_passthrough:-NO}" in
[Yy][Ee][Ss]|[Tt][Rr][Uu][Ee]|[Oo][Nn]|1) ;;
*)
: ${domain:=$DOMAIN}
newsearch="$(uniqify $prepend_search $SEARCH $append_search)"
NS="$LOCALNAMESERVERS $NAMESERVERS" NS="$LOCALNAMESERVERS $NAMESERVERS"
newns="$(uniqify $name_servers $NS $name_servers_append)" newns=
gotlocal=false
for n in $(uniqify $prepend_nameservers $NS $append_nameservers); do
add=true
islocal=false
for l in $local_nameservers; do
case "$n" in
$l) islocal=true; gotlocal=true; break;;
esac
done
if ! $islocal; then
case "${resolv_conf_local_only:-YES}" in
[Yy][Ee][Ss]|[Tt][Rr][Uu][Ee]|[Oo][Nn]|1)
$gotlocal && add=false;;
esac
fi
$add && newns="$newns $n"
done
# Hold our new resolv.conf in a variable to save on temporary files # Hold our new resolv.conf in a variable to save on temporary files
newconf="# Generated by resolvconf$NL" newconf="$signature$NL"
if [ -n "$resolv_conf_head" ]; then if [ -n "$resolv_conf_head" ]; then
newconf="$newconf$resolv_conf_head$NL" newconf="$newconf$resolv_conf_head$NL"
fi fi
[ -n "$newsearch" ] && newconf="${newconf}search $newsearch$NL"
[ -n "$domain" ] && newconf="${newconf}domain $domain$NL"
if [ -n "$newsearch" -a "$newsearch" != "$domain" ]; then
newconf="${newconf}search $newsearch$NL"
fi
for n in $newns; do for n in $newns; do
newconf="${newconf}nameserver $n$NL" newconf="${newconf}nameserver $n$NL"
done done
# Now get any configured options # Now add anything we don't care about such as sortlist and options
opts="$resolv_conf_options${resolv_conf_options:+ }" stuff="$($list_resolv | keys_remove nameserver domain search)"
opts="$opts$($list_resolv | key_get_value "options ")" if [ -n "$stuff" ]; then
if [ -n "$opts" ]; then newconf="$newconf$stuff$NL"
newconf="${newconf}options" fi
for opt in $(uniqify $opts); do
newconf="${newconf} $opt" # Append any user defined ones
done if [ -n "$resolv_conf_options" ]; then
newconf="$newconf$NL" newconf="${newconf}options $resolv_conf_options$NL"
fi
if [ -n "$resolv_conf_sortlist" ]; then
newconf="${newconf}sortlist $resolv_conf_sortlist$NL"
fi fi
if [ -n "$resolv_conf_tail" ]; then if [ -n "$resolv_conf_tail" ]; then
@ -151,6 +211,22 @@ if [ -e "$resolv_conf" ]; then
[ "$(cat "$resolv_conf")" = "$(printf %s "$newconf")" ] && exit 0 [ "$(cat "$resolv_conf")" = "$(printf %s "$newconf")" ] && exit 0
fi fi
# Change is good.
# If the old file does not have our signature, back it up.
# If the new file just has our signature, restore the backup.
if $backup; then
if [ "$newconf" = "$signature$NL" ]; then
if [ -e "$resolv_conf.bak" ]; then
newconf="$(cat "$resolv_conf.bak")"
fi
elif [ -e "$resolv_conf" ]; then
read line <"$resolv_conf"
if [ "$line" != "$signature" ]; then
cp "$resolv_conf" "$resolv_conf.bak"
fi
fi
fi
# Create our resolv.conf now # Create our resolv.conf now
(umask 022; printf %s "$newconf" >"$resolv_conf") (umask 022; printf %s "$newconf" >"$resolv_conf")
eval $libc_restart eval $libc_restart

View File

@ -1,5 +1,5 @@
#!/bin/sh #!/bin/sh
# Copyright (c) 2007-2011 Roy Marples # Copyright (c) 2007-2012 Roy Marples
# All rights reserved # All rights reserved
# named subscriber for resolvconf # named subscriber for resolvconf
@ -29,7 +29,7 @@
[ -f "@SYSCONFDIR@"/resolvconf.conf ] || exit 0 [ -f "@SYSCONFDIR@"/resolvconf.conf ] || exit 0
. "@SYSCONFDIR@/resolvconf.conf" || exit 1 . "@SYSCONFDIR@/resolvconf.conf" || exit 1
[ -z "$named_zones" -a -z "$named_options" ] && exit 0 [ -z "$named_zones" -a -z "$named_options" ] && exit 0
[ -z "$RESOLVCONF" ] && eval "$(@PREFIX@/sbin/resolvconf -v)" [ -z "$RESOLVCONF" ] && eval "$(@SBINDIR@/resolvconf -v)"
NL=" NL="
" "
@ -40,6 +40,9 @@ then
if [ -x "@RCDIR@"/bind9 ]; then if [ -x "@RCDIR@"/bind9 ]; then
# Debian and derivatives # Debian and derivatives
named_service=bind9 named_service=bind9
elif [ -x "@RCDIR@"/rc.bind ]; then
# Slackware
named_service=rc.bind
fi fi
fi fi
: ${named_service:=named} : ${named_service:=named}
@ -75,7 +78,7 @@ done
if type config_mkdirs >/dev/null 2>&1; then if type config_mkdirs >/dev/null 2>&1; then
config_mkdirs "$named_options" "$named_zones" config_mkdirs "$named_options" "$named_zones"
else else
@PREFIX@/sbin/resolvconf -D "$named_options" "$named_zones" @SBINDIR@/resolvconf -D "$named_options" "$named_zones"
fi fi
# No point in changing files or reloading bind if the end result has not # No point in changing files or reloading bind if the end result has not

72
pdns_recursor.in Normal file
View File

@ -0,0 +1,72 @@
#!/bin/sh
# Copyright (c) 2009-2011 Roy Marples
# All rights reserved
# PowerDNS Recursor 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 "$pdns_zones" ] && exit 0
[ -z "$RESOLVCONF" ] && eval "$(@SBINDIR@/resolvconf -v)"
NL="
"
: ${pdns_service:=pdns_recursor}
: ${pdns_restart:=@RESTARTCMD ${pdns_service}@}
newzones=
# pds_recursor does not present support global forward servers, which
# does limit it's usefulness somewhat.
# If it did, the below code can be enabled, or something like it.
#for n in $NAMESERVERS; do
# newzones="$newzones${newzones:+,}$n"
#done
#[ -n "$newzones" ] && newzones=".=$newzones$NL"
for d in $DOMAINS; do
newns=
ns="${d#*:}"
while [ -n "$ns" ]; do
newns="$newns${newns:+,}${ns%%,*}"
[ "$ns" = "${ns#*,}" ] && break
ns="${ns#*,}"
done
[ -n "$newns" ] && newzones="$newzones${d%%:*}=$newns$NL"
done
# Try to ensure that config dirs exist
if type config_mkdirs >/dev/null 2>&1; then
config_mkdirs "$pdnsd_zones"
else
@SBINDIR@/resolvconf -D "$pdnsd_zones"
fi
if [ ! -f "$pdns_zones" ] || \
[ "$(cat "$pdns_zones")" != "$(printf %s "$newzones")" ]
then
printf %s "$newzones" >"$pdns_zones"
eval $pdns_restart
fi

View File

@ -1,5 +1,5 @@
#!/bin/sh #!/bin/sh
# Copyright (c) 2010-2011 Roy Marples # Copyright (c) 2010-2013 Roy Marples
# All rights reserved # All rights reserved
# pdnsd subscriber for resolvconf # pdnsd subscriber for resolvconf
@ -29,7 +29,7 @@
[ -f "@SYSCONFDIR@"/resolvconf.conf ] || exit 0 [ -f "@SYSCONFDIR@"/resolvconf.conf ] || exit 0
. "@SYSCONFDIR@/resolvconf.conf" || exit 1 . "@SYSCONFDIR@/resolvconf.conf" || exit 1
[ -z "$pdnsd_conf" -a -z "$pdnsd_resolv" ] && exit 0 [ -z "$pdnsd_conf" -a -z "$pdnsd_resolv" ] && exit 0
[ -z "$RESOLVCONF" ] && eval "$(@PREFIX@/sbin/resolvconf -v)" [ -z "$RESOLVCONF" ] && eval "$(@SBINDIR@/resolvconf -v)"
NL=" NL="
" "
@ -48,7 +48,7 @@ remove_markers()
sed "/^$m1/,/^$m2/d" $@ sed "/^$m1/,/^$m2/d" $@
else else
for x; do for x; do
while read line; do while read -r line; do
case "$line" in case "$line" in
"$m1"*) in_marker=1;; "$m1"*) in_marker=1;;
"$m2"*) in_marker=0;; "$m2"*) in_marker=0;;
@ -82,19 +82,19 @@ change_file()
return 0 return 0
} }
newresolv="# Generated by resolvconf\n" newresolv="# Generated by resolvconf$NL"
changed=false changed=false
# Try to ensure that config dirs exist # Try to ensure that config dirs exist
if type config_mkdirs >/dev/null 2>&1; then if type config_mkdirs >/dev/null 2>&1; then
config_mkdirs "$pdnsd_resolv" "$pdnsd_conf" config_mkdirs "$pdnsd_resolv" "$pdnsd_conf"
else else
@PREFIX@/sbin/resolvconf -D "$pdnsd_resolv" "$pdnsd_conf" @SBINDIR@/resolvconf -D "$pdnsd_resolv" "$pdnsd_conf"
fi fi
if [ -n "$pdnsd_resolv" ]; then if [ -n "$pdnsd_resolv" ]; then
for n in $NAMESERVERS; do for n in $NAMESERVERS; do
newresolv="${newresolv}nameserver $n\n" newresolv="${newresolv}nameserver $n$NL"
done done
fi fi

View File

@ -1,4 +1,4 @@
.\" Copyright (c) 2007-2011 Roy Marples .\" Copyright (c) 2007-2015 Roy Marples
.\" All rights reserved .\" All rights reserved
.\" .\"
.\" Redistribution and use in source and binary forms, with or without .\" Redistribution and use in source and binary forms, with or without
@ -22,8 +22,8 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE. .\" SUCH DAMAGE.
.\" .\"
.Dd May 13, 2011 .Dd April 27, 2014
.Dt RESOLVCONF 8 SMM .Dt RESOLVCONF 8
.Os .Os
.Sh NAME .Sh NAME
.Nm resolvconf .Nm resolvconf
@ -34,11 +34,14 @@
.Nm .Nm
.Op Fl m Ar metric .Op Fl m Ar metric
.Op Fl p .Op Fl p
.Fl a Ar interface No < Ns Pa file .Op Fl x
.Fl a Ar interface Ns Op Ar .protocol
.No < Ns Pa file
.Nm .Nm
.Op Fl f .Op Fl f
.Fl d Ar interface .Fl d Ar interface Ns Op Ar .protocol
.Nm .Nm
.Op Fl x
.Fl il Ar pattern .Fl il Ar pattern
.Nm .Nm
.Fl u .Fl u
@ -63,7 +66,7 @@ file to
via via
.Xr stdin 3 .Xr stdin 3
with the argument with the argument
.Fl a Ar interface .Fl a Ar interface Ns Op Ar .protocol
instead of the filesystem. instead of the filesystem.
.Nm .Nm
then updates then updates
@ -78,6 +81,20 @@ then
will supply files that the resolver should be configured to include. will supply files that the resolver should be configured to include.
.Pp .Pp
.Nm .Nm
assumes it has a job to do.
In some situations
.Nm
needs to act as a deterrent to writing to
.Pa /etc/resolv.conf .
Where this file cannot be made immutable or you just need to toggle this
behaviour,
.Nm
can be disabled by adding
.Sy resolvconf Ns = Ns NO
to
.Xr resolvconf.conf 5 .
.Pp
.Nm
can mark an interfaces can mark an interfaces
.Pa resolv.conf .Pa resolv.conf
as private. as private.
@ -91,13 +108,21 @@ for how to configure
.Nm .Nm
to use a local name server. to use a local name server.
.Pp .Pp
.Nm
can mark an interfaces
.Pa resolv.conf
as exclusive.
Only the latest exclusive interface is used for processing, otherwise all are.
.Pp
When an interface goes down, it should then call When an interface goes down, it should then call
.Nm .Nm
with with
.Fl d Ar interface .Fl d Ar interface.*
arguments to delete the arguments to delete the
.Pa resolv.conf .Pa resolv.conf
file for the file(s) for all the
.Ar protocols
on the
.Ar interface . .Ar interface .
.Pp .Pp
Here are some more options that Here are some more options that
@ -119,7 +144,7 @@ is used to add interfaces.
Ignore non existant interfaces. Ignore non existant interfaces.
Only really useful for deleting interfaces. Only really useful for deleting interfaces.
.It Fl i Ar pattern .It Fl i Ar pattern
List the interfaces, optionally matching List the interfaces and protocols, optionally matching
.Ar pattern , .Ar pattern ,
we have we have
.Pa resolv.conf .Pa resolv.conf
@ -130,7 +155,8 @@ List the
files we have. files we have.
If If
.Ar pattern .Ar pattern
is specified then we list the files for the interfaces that match it. is specified then we list the files for the interfaces and protocols
that match it.
.It Fl m Ar metric .It Fl m Ar metric
Set the metric of the interface when adding it, default of 0. Set the metric of the interface when adding it, default of 0.
Lower metrics take precedence. Lower metrics take precedence.
@ -142,18 +168,28 @@ as private.
.It Fl u .It Fl u
Force Force
.Nm .Nm
to update all it's subscribers. to update all its subscribers.
.Nm .Nm
does not update the subscribers when adding a resolv.conf that matches does not update the subscribers when adding a resolv.conf that matches
what it already has for that interface. what it already has for that interface.
.It Fl x
Mark the interface
.Pa resolv.conf
as exclusive when adding, otherwise only use the latest exclusive interface.
.El .El
.Pp .Pp
.Nm .Nm
also has some options designed to be used by it's subscribers:- also has some options designed to be used by its subscribers:-
.Bl -tag -width indent .Bl -tag -width indent
.It Fl v .It Fl v
Echo variables DOMAINS, SEARCH and NAMESERVERS so that the subscriber can Echo variables DOMAINS, SEARCH and NAMESERVERS so that the subscriber can
configure the resolver easily. configure the resolver easily.
.It Fl V
Same as
.Fl v
except that only the information configured in
.Xr resolvconf.conf 5
is set.
.El .El
.Sh INTERFACE ORDERING .Sh INTERFACE ORDERING
For For
@ -170,6 +206,29 @@ the operating systems lexical order.
See See
.Xr resolvconf.conf 5 .Xr resolvconf.conf 5
for details on these lists. for details on these lists.
.Sh PROTOCOLS
Here are some suggested protocol tags to use for each
.Pa resolv.conf
file registered on an
.Ar interface Ns No :-
.Bl -tag -width indent
.It dhcp
Dynamic Host Configuration Protocol.
Initial versions of
.Nm
did not recommend a
.Ar protocol
tag be appended to the
.Ar interface
name.
When the protocol is absent, it is assumed to be the DHCP protocol.
.It ppp
Point-to-Point Protocol.
.It ra
IPv6 Router Advertisement.
.It dhcp6
Dynamic Host Configuration Protocol, version 6.
.El
.Sh IMPLEMENTATION NOTES .Sh IMPLEMENTATION NOTES
If a subscriber has the executable bit then it is executed otherwise it is If a subscriber has the executable bit then it is executed otherwise it is
assumed to be a shell script and sourced into the current environment in a assumed to be a shell script and sourced into the current environment in a
@ -197,9 +256,15 @@ for the metric.
Marks the interface Marks the interface
.Pa resolv.conf .Pa resolv.conf
as private. as private.
.It Va IF_EXCLUSIVE
Marks the interface
.Pa resolv.conf
as exclusive.
.El .El
.Sh FILES .Sh FILES
.Bl -ohang .Bl -ohang
.It Pa /etc/resolv.conf.bak
Backup file of the original resolv.conf.
.It Pa @SYSCONFDIR@/resolvconf.conf .It Pa @SYSCONFDIR@/resolvconf.conf
Configuration file for Configuration file for
.Nm . .Nm .
@ -224,9 +289,10 @@ resolvconf, as written by Thomas Hood.
.Xr resolver 3 , .Xr resolver 3 ,
.Xr stdin 3 .Xr stdin 3
.Sh AUTHORS .Sh AUTHORS
.An Roy Marples Aq roy@marples.name .An Roy Marples Aq Mt roy@marples.name
.Sh BUGS .Sh BUGS
Please report them to http://roy.marples.name/projects/openresolv Please report them to
.Lk http://roy.marples.name/projects/openresolv
.Pp .Pp
.Nm .Nm
does not validate any of the files given to it. does not validate any of the files given to it.

View File

@ -1,4 +1,4 @@
.\" Copyright (c) 2009-2011 Roy Marples .\" Copyright (c) 2009-2015 Roy Marples
.\" All rights reserved .\" All rights reserved
.\" .\"
.\" Redistribution and use in source and binary forms, with or without .\" Redistribution and use in source and binary forms, with or without
@ -22,8 +22,8 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE. .\" SUCH DAMAGE.
.\" .\"
.Dd April 21, 2011 .Dd March 20, 2015
.Dt RESOLVCONF.CONF 5 SMM .Dt RESOLVCONF.CONF 5
.Os .Os
.Sh NAME .Sh NAME
.Nm resolvconf.conf .Nm resolvconf.conf
@ -42,12 +42,22 @@ must contain valid shell commands.
Listed below are the standard Listed below are the standard
.Nm .Nm
variables that may be set. variables that may be set.
If the values contain white space for special shell characters,
ensure they are quoted and escaped correctly.
.Pp .Pp
After updating this file, you may wish to run After updating this file, you may wish to run
.Nm resolvconf -u .Nm resolvconf -u
to apply the new configuration. to apply the new configuration.
.Pp
When a dynamically generated list is appended or prepended to, the whole
is made unique where left-most wins.
.Sh RESOLVCONF OPTIONS .Sh RESOLVCONF OPTIONS
.Bl -tag -width indent .Bl -tag -width indent
.It Sy resolvconf
Set to NO to disable
.Nm resolvconf
from running any subscribers.
Defaults to YES.
.It Sy interface_order .It Sy interface_order
These interfaces will always be processed first. These interfaces will always be processed first.
If unset, defaults to the following:- If unset, defaults to the following:-
@ -56,16 +66,27 @@ If unset, defaults to the following:-
These interfaces will be processed next, unless they have a metric. These interfaces will be processed next, unless they have a metric.
If unset, defaults to the following:- If unset, defaults to the following:-
.D1 tap[0-9]* tun[0-9]* vpn vpn[0-9]* ppp[0-9]* ippp[0-9]* .D1 tap[0-9]* tun[0-9]* vpn vpn[0-9]* ppp[0-9]* ippp[0-9]*
.It Sy local_nameservers
If unset, defaults to the following:-
.D1 127.* 0.0.0.0 255.255.255.255 ::1
.It Sy search_domains .It Sy search_domains
Prepend search domains to the dynamically generated list. Prepend search domains to the dynamically generated list.
.It Sy search_domains_append .It Sy search_domains_append
Append search domains to the dynamically generated list. Append search domains to the dynamically generated list.
.It Sy domain_blacklist
A list of domains to be removed from consideration.
To remove a domain, you can use foo.*
To remove a sub domain, you can use *.bar
.It Sy name_servers .It Sy name_servers
Prepend name servers to the dynamically generated list. Prepend name servers to the dynamically generated list.
You should set this to 127.0.0.1 if you use a local name server other than You should set this to 127.0.0.1 if you use a local name server other than
libc. libc.
.It Sy name_servers_append .It Sy name_servers_append
Append name servers to the dynamically generated list. Append name servers to the dynamically generated list.
.It Sy name_server_blacklist
A list of name servers to be removed from consideration.
The default is 0.0.0.0 as some faulty routers send it via DHCP.
To remove a block, you can use 192.168.*
.It Sy private_interfaces .It Sy private_interfaces
These interfaces name servers will only be queried for the domains listed These interfaces name servers will only be queried for the domains listed
in their resolv.conf. in their resolv.conf.
@ -73,6 +94,34 @@ Useful for VPN domains.
This is equivalent to the This is equivalent to the
.Nm resolvconf -p .Nm resolvconf -p
option. option.
.It Sy replace
Is a space separated list of replacement keywords. The syntax is this:
.Va $keyword Ns / Ns Va $match Ns / Ns Va $replacement
.Pp
Example, given this resolv.conf:
.D1 domain foo.org
.D1 search foo.org dead.beef
.D1 nameserver 1.2.3.4
.D1 nameserver 2.3.4.5
and this configuaration:
.D1 replace="search/foo*/bar.com nameserver/1.2.3.4/5.6.7.8 nameserver/2.3.4.5/"
you would get this resolv.conf instead:
.D1 domain foo.org
.D1 search bar.com
.D1 nameserver 5.6.7.8
.It Sy replace_sub
Works the same way as
.Sy replace
except it works on each space separated value rather than the whole line,
so it's useful for the replacing a single domain within the search directive.
Using the same example resolv.conf and changing
.Sy replace
to
.Sy replace_sub ,
you would get this resolv.conf instead:
.D1 domain foo.org
.D1 search bar.com dead.beef
.D1 nameserver 5.6.7.8
.It Sy state_dir .It Sy state_dir
Override the default state directory of Override the default state directory of
.Pa @VARDIR@ . .Pa @VARDIR@ .
@ -96,6 +145,32 @@ A list of libc resolver options, as specified in
When set to YES the latest resolv.conf is written to When set to YES the latest resolv.conf is written to
.Sy resolv_conf .Sy resolv_conf
without any alteration. without any alteration.
When set to /dev/null or NULL,
.Sy resolv_conf_local_only
is defaulted to NO,
.Sy local_nameservers
is unset unless overriden and only the information set in
.Nm
is written to
.Sy resolv_conf .
.It Sy resolv_conf_sortlist
A libc resolver sortlist, as specified in
.Xr resolv.conf 5 .
.It Sy resolv_conf_local_only
If a local name server is configured then the default is just to specify that
and ignore all other entries as they will be configured for the local
name server.
Set this to NO to also list non-local nameservers.
This will give you working DNS even if the local nameserver stops functioning
at the expense of duplicated server queries.
.It Sy append_nameservers
Append name servers to the dynamically generated list.
.It Sy prepend_nameservers
Prepend name servers to the dynamically generated list.
.It Sy append_search
Append search domains to the dynamically generated list.
.It Sy prepend_search
Prepend search domains to the dynamically generated list.
.El .El
.Sh SUBSCRIBER OPTIONS .Sh SUBSCRIBER OPTIONS
openresolv ships with subscribers for the name servers openresolv ships with subscribers for the name servers
@ -106,30 +181,37 @@ and
.Xr unbound 8 . .Xr unbound 8 .
Each subscriber can create configuration files which should be included in Each subscriber can create configuration files which should be included in
in the subscribers main configuration file. in the subscribers main configuration file.
.Pp
To disable a subscriber, simply set it's name to NO.
For example, to disable the libc subscriber you would set:
.D1 libc=NO
.Bl -tag -width indent .Bl -tag -width indent
.It Sy dnsmasq_conf .It Sy dnsmasq_conf
This file tells dnsmasq which nameservers to use for specific domains. This file tells dnsmasq which name servers to use for specific domains.
.It Sy dnsmasq_resolv .It Sy dnsmasq_resolv
This file tells dnsmasq which nameservers to use for global lookups. This file tells dnsmasq which name servers to use for global lookups.
.Pp .Pp
Example resolvconf.conf for dnsmasq: Example resolvconf.conf for dnsmasq:
.D1 nameservers=127.0.0.1 .D1 name_servers=127.0.0.1
.D1 dnsmasq_conf=/etc/dnsmasq-conf.conf .D1 dnsmasq_conf=/etc/dnsmasq-conf.conf
.D1 dnsmasq_resolv=/etc/dnsmasq-resolv.conf .D1 dnsmasq_resolv=/etc/dnsmasq-resolv.conf
.Pp .Pp
Example dnsmasq.conf: Example dnsmasq.conf:
.D1 listen-address=127.0.0.1 .D1 listen-address=127.0.0.1
.D1 # If dnsmasq is compiled for DBus then we can take
.D1 # advantage of not having to restart dnsmasq.
.D1 enable-dbus
.D1 conf-file=/etc/dnsmasq-conf.conf .D1 conf-file=/etc/dnsmasq-conf.conf
.D1 resolv-file=/etc/dnsmasq-resolv.conf .D1 resolv-file=/etc/dnsmasq-resolv.conf
.It Sy named_options .It Sy named_options
Include this file in the named options block. Include this file in the named options block.
This file tells named which nameservers to use for global lookups. This file tells named which name servers to use for global lookups.
.It Sy named_zones .It Sy named_zones
Include this file in the named global scope, after the options block. Include this file in the named global scope, after the options block.
This file tells named which nameservers to use for specific domains. This file tells named which name servers to use for specific domains.
.Pp .Pp
Example resolvconf.conf for named: Example resolvconf.conf for named:
.D1 nameservers=127.0.0.1 .D1 name_servers=127.0.0.1
.D1 named_options=/etc/named-options.conf .D1 named_options=/etc/named-options.conf
.D1 named_zones=/etc/named-zones.conf .D1 named_zones=/etc/named-zones.conf
.Pp .Pp
@ -147,12 +229,12 @@ setup to read
.Pa pdnsd_resolv .Pa pdnsd_resolv
as documented below. as documented below.
.It Sy pdnsd_resolv .It Sy pdnsd_resolv
This file tells pdnsd about global nameservers. This file tells pdnsd about global name servers.
If this variable is not set then it's written to If this variable is not set then it's written to
.Pa pdnsd_conf . .Pa pdnsd_conf .
.Pp .Pp
Example resolvconf.conf for pdnsd: Example resolvconf.conf for pdnsd:
.D1 nameservers=127.0.0.1 .D1 name_servers=127.0.0.1
.D1 pdnsd_conf=/etc/pdnsd.conf .D1 pdnsd_conf=/etc/pdnsd.conf
.D1 # pdnsd_resolv=/etc/pdnsd-resolv.conf .D1 # pdnsd_resolv=/etc/pdnsd-resolv.conf
.Pp .Pp
@ -168,20 +250,64 @@ Example pdnsd.conf:
.D1 # file="/etc/pdnsd-resolv.conf"; .D1 # file="/etc/pdnsd-resolv.conf";
.D1 } .D1 }
.It Sy unbound_conf .It Sy unbound_conf
This file tells unbound about specific and global nameservers. This file tells unbound about specific and global name servers.
.It Sy unbound_insecure
When set to YES, unbound marks the domains as insecure, thus ignoring DNSSEC.
.Pp .Pp
Example resolvconf.conf for unbound: Example resolvconf.conf for unbound:
.D1 nameservers=127.0.0.1 .D1 name_servers=127.0.0.1
.D1 unbound_conf=/etc/unbound-resolvconf.conf .D1 unbound_conf=/etc/unbound-resolvconf.conf
.Pp .Pp
Example unbound.conf: Example unbound.conf:
.D1 include: /etc/unbound-resolvconf.conf .D1 include: /etc/unbound-resolvconf.conf
.El .El
.Sh SUBSCRIBER INTEGRATION
Not all distributions store the files the subscribers need in the same
locations.
For example, named service scripts have been called named, bind and rc.bind
and they could be located in a directory called /etc/rc.d, /etc/init.d or
similar.
Each subscriber attempts to automatically configure itself, but not every
distribution has been catered for.
Also, users could equally want to use a different version from the one
installed by default, such as bind8 and bind9.
To accomodate this, the subscribers have these files in configurable
variables, documented below.
.Pp
.Bl -tag -width indent
.It Sy dnsmasq_service
Location of the dnsmasq service.
.It Sy dnsmasq_restart
Command to restart the dnsmasq service.
.It Sy dnsmasq_pid
Location of the dnsmasq pidfile.
.It Sy libc_service
Location of the libc service.
.It Sy libc_restart
Command to restart the libc service.
.It Sy named_service
Location of the named service.
.It Sy named_restart
Command to restart the named service.
.It Sy pdnsd_restart
Command to restart the pdnsd service.
.It Sy unbound_service
Location of the unbound service.
.It Sy unbound_restart
Command to restart the unbound service.
.It Sy unbound_pid
Location of the unbound pidfile.
.El
.Sh SEE ALSO .Sh SEE ALSO
.Xr resolv.conf 5 .Xr resolv.conf 5 ,
.Xr resolvconf 8
and and
.Xr resolvconf 8 . .Xr sh 1 .
.Sh AUTHORS .Sh AUTHORS
.An Roy Marples Aq roy@marples.name .An Roy Marples Aq Mt roy@marples.name
.Sh BUGS .Sh BUGS
Please report them to http://roy.marples.name/projects/openresolv Each distribution is a special snowflake and likes to name the same thing
differently, namely the named service script.
.Pp
Please report them to
.Lk http://roy.marples.name/projects/openresolv

View File

@ -1,5 +1,5 @@
#!/bin/sh #!/bin/sh
# Copyright (c) 2007-2011 Roy Marples # Copyright (c) 2007-2015 Roy Marples
# All rights reserved # All rights reserved
# Redistribution and use in source and binary forms, with or without # Redistribution and use in source and binary forms, with or without
@ -28,6 +28,17 @@ RESOLVCONF="$0"
SYSCONFDIR=@SYSCONFDIR@ SYSCONFDIR=@SYSCONFDIR@
LIBEXECDIR=@LIBEXECDIR@ LIBEXECDIR=@LIBEXECDIR@
VARDIR=@VARDIR@ VARDIR=@VARDIR@
# Disregard dhcpcd setting
unset interface_order state_dir
# If you change this, change the test in VFLAG and libc.in as well
local_nameservers="127.* 0.0.0.0 255.255.255.255 ::1"
dynamic_order="tap[0-9]* tun[0-9]* vpn vpn[0-9]* ppp[0-9]* ippp[0-9]*"
interface_order="lo lo[0-9]*"
name_server_blacklist="0.0.0.0"
# Support original resolvconf configuration layout # Support original resolvconf configuration layout
# as well as the openresolv config file # as well as the openresolv config file
if [ -f "$SYSCONFDIR"/resolvconf.conf ]; then if [ -f "$SYSCONFDIR"/resolvconf.conf ]; then
@ -39,12 +50,17 @@ elif [ -d "$SYSCONFDIR/resolvconf" ]; then
interface_order="$(cat "$SYSCONFDIR"/interface-order)" interface_order="$(cat "$SYSCONFDIR"/interface-order)"
fi fi
fi fi
TMPDIR="$VARDIR/tmp"
IFACEDIR="$VARDIR/interfaces" IFACEDIR="$VARDIR/interfaces"
METRICDIR="$VARDIR/metrics" METRICDIR="$VARDIR/metrics"
PRIVATEDIR="$VARDIR/private" PRIVATEDIR="$VARDIR/private"
EXCLUSIVEDIR="$VARDIR/exclusive"
LOCKDIR="$VARDIR/lock"
: ${dynamic_order:=tap[0-9]* tun[0-9]* vpn vpn[0-9]* ppp[0-9]* ippp[0-9]*} warn()
: ${interface_order:=lo lo[0-9]*} {
echo "$*" >&2
}
error_exit() error_exit()
{ {
@ -64,6 +80,7 @@ usage()
(DNS supplied via stdin in resolv.conf format) (DNS supplied via stdin in resolv.conf format)
-m metric Give the added DNS information a metric -m metric Give the added DNS information a metric
-p Mark the interface as private -p Mark the interface as private
-x Mark the interface as exclusive
-d \$INTERFACE Delete DNS information from the specified interface -d \$INTERFACE Delete DNS information from the specified interface
-f Ignore non existant interfaces -f Ignore non existant interfaces
-I Init the state dir -I Init the state dir
@ -84,16 +101,23 @@ usage()
echo_resolv() echo_resolv()
{ {
local line= local line= OIFS="$IFS"
[ -n "$1" -a -e "$IFACEDIR/$1" ] || return 1
[ -n "$1" -a -f "$IFACEDIR/$1" ] || return 1
echo "# resolv.conf from $1" echo "# resolv.conf from $1"
# Our variable maker works of the fact each resolv.conf per interface # Our variable maker works of the fact each resolv.conf per interface
# is separated by blank lines. # is separated by blank lines.
# So we remove them when echoing them. # So we remove them when echoing them.
while read line; do while read -r line; do
[ -n "$line" ] && echo "$line" IFS="$OIFS"
if [ -n "$line" ]; then
# We need to set IFS here to preserve any whitespace
IFS=''
printf "%s\n" "$line"
fi
done < "$IFACEDIR/$1" done < "$IFACEDIR/$1"
echo echo
IFS="$OIFS"
} }
# Parse resolv.conf's and make variables # Parse resolv.conf's and make variables
@ -101,22 +125,11 @@ echo_resolv()
parse_resolv() parse_resolv()
{ {
local line= ns= ds= search= d= n= newns= local line= ns= ds= search= d= n= newns=
local new=true iface= private=false p= local new=true iface= private=false p= domain= l= islocal=
echo "DOMAINS="
echo "SEARCH=\"$search_domains\""
# let our subscribers know about global nameservers
for n in $name_servers; do
case "$n" in
127.*|0.0.0.0|255.255.255.255|::1) :;;
*) newns="$newns${newns:+ }$n";;
esac
done
echo "NAMESERVERS=\"$newns\""
echo "LOCALNAMESERVERS="
newns= newns=
while read line; do while read -r line; do
case "$line" in case "$line" in
"# resolv.conf from "*) "# resolv.conf from "*)
if ${new}; then if ${new}; then
@ -129,24 +142,34 @@ parse_resolv()
cd "$IFACEDIR" cd "$IFACEDIR"
private=false private=false
for p in $private_interfaces; do for p in $private_interfaces; do
if [ "$p" = "$iface" ]; then case "$iface" in
private=true "$p"|"$p":*) private=true; break;;
break esac
fi
done done
fi fi
fi fi
;; ;;
"nameserver "*) "nameserver "*)
islocal=false
for l in $local_nameservers; do
case "${line#* }" in case "${line#* }" in
127.*|0.0.0.0|255.255.255.255|::1) $l)
islocal=true
echo "LOCALNAMESERVERS=\"\$LOCALNAMESERVERS ${line#* }\"" echo "LOCALNAMESERVERS=\"\$LOCALNAMESERVERS ${line#* }\""
continue break
;; ;;
esac esac
ns="$ns${line#* } " done
$islocal || ns="$ns${line#* } "
;; ;;
"domain "*|"search "*) "domain "*)
if [ -z "$domain" ]; then
domain="${line#* }"
echo "DOMAIN=\"$domain\""
fi
search="${line#* }"
;;
"search "*)
search="${line#* }" search="${line#* }"
;; ;;
*) *)
@ -226,40 +249,67 @@ list_resolv()
{ {
[ -d "$IFACEDIR" ] || return 0 [ -d "$IFACEDIR" ] || return 0
local report=false list= retval=0 cmd="$1" local report=false list= retval=0 cmd="$1" excl=
shift shift
case "$IF_EXCLUSIVE" in
[Yy][Ee][Ss]|[Tt][Rr][Uu][Ee]|[Oo][Nn]|1)
if [ -d "$EXCLUSIVEDIR" ]; then
cd "$EXCLUSIVEDIR"
for i in *; do
if [ -f "$i" ]; then
list="${i#* }"
break
fi
done
fi
excl=true
;;
*)
excl=false
;;
esac
# If we have an interface ordering list, then use that. # If we have an interface ordering list, then use that.
# It works by just using pathname expansion in the interface directory. # It works by just using pathname expansion in the interface directory.
if [ -n "$1" ]; then if [ -n "$1" ]; then
list="$*" list="$*"
$force || report=true $force || report=true
else elif ! $excl; then
cd "$IFACEDIR" cd "$IFACEDIR"
for i in $interface_order; do for i in $interface_order; do
[ -e "$i" ] && list="$list $i" [ -f "$i" ] && list="$list $i"
for ii in "$i":* "$i".*; do
[ -f "$ii" ] && list="$list $ii"
done
done done
for i in $dynamic_order; do for i in $dynamic_order; do
if [ -e "$i" -a ! -e "$METRICDIR/"*" $i" ]; then if [ -e "$i" -a ! -e "$METRICDIR/"*" $i" ]; then
list="$list $i" list="$list $i"
fi fi
for ii in "$i":* "$i".*; do
if [ -f "$ii" -a ! -e "$METRICDIR/"*" $ii" ]; then
list="$list $ii"
fi
done
done done
if [ -d "$METRICDIR" ]; then if [ -d "$METRICDIR" ]; then
cd "$METRICDIR" cd "$METRICDIR"
for i in *; do for i in *; do
list="$list ${i#* }" [ -f "$i" ] && list="$list ${i#* }"
done done
fi fi
list="$list *" list="$list *"
fi fi
cd "$IFACEDIR" cd "$IFACEDIR"
retval=1
for i in $(uniqify $list); do for i in $(uniqify $list); do
# Only list interfaces which we really have # Only list interfaces which we really have
if ! [ -e "$i" ]; then if ! [ -f "$i" ]; then
if $report; then if $report; then
echo "No resolv.conf for interface $i" >&2 echo "No resolv.conf for interface $i" >&2
retval=$(($retval + 1)) retval=2
fi fi
continue continue
fi fi
@ -269,23 +319,134 @@ list_resolv()
else else
echo_resolv "$i" echo_resolv "$i"
fi fi
[ $? = 0 -a "$retval" = 1 ] && retval=0
done done
[ "$cmd" = i -o "$cmd" = "-i" ] && echo [ "$cmd" = i -o "$cmd" = "-i" ] && echo
return $retval return $retval
} }
list_remove() {
local list= e= l= result= found= retval=0
[ -z "$2" ] && return 0
eval list=\"\$$1\"
shift
set -f
for e; do
found=false
for l in $list; do
case "$e" in
$l) found=true;;
esac
$found && break
done
if $found; then
retval=$(($retval + 1))
else
result="$result $e"
fi
done
set +f
echo "${result# *}"
return $retval
}
echo_prepend()
{
echo "# Generated by resolvconf"
if [ -n "$search_domains" ]; then
echo "search $search_domains"
fi
for n in $name_servers; do
echo "nameserver $n"
done
echo
}
echo_append()
{
echo "# Generated by resolvconf"
if [ -n "$search_domains_append" ]; then
echo "search $search_domains_append"
fi
for n in $name_servers_append; do
echo "nameserver $n"
done
echo
}
replace()
{
local r= k= f= v= val= sub=
while read -r keyword value; do
for r in $replace; do
k="${r%%/*}"
r="${r#*/}"
f="${r%%/*}"
r="${r#*/}"
v="${r%%/*}"
case "$keyword" in
$k)
case "$value" in
$f) value="$v";;
esac
;;
esac
done
val=
for sub in $value; do
for r in $replace_sub; do
k="${r%%/*}"
r="${r#*/}"
f="${r%%/*}"
r="${r#*/}"
v="${r%%/*}"
case "$keyword" in
$k)
case "$sub" in
$f) sub="$v";;
esac
;;
esac
done
val="$val${val:+ }$sub"
done
printf "%s %s\n" "$keyword" "$val"
done
}
make_vars() make_vars()
{ {
eval "$(list_resolv -l "$@" | parse_resolv)" local newdomains= d= dn= newns= ns=
# Clear variables
DOMAIN=
DOMAINS=
SEARCH=
NAMESERVERS=
LOCALNAMESERVERS=
if [ -n "$name_servers" -o -n "$search_domains" ]; then
eval "$(echo_prepend | parse_resolv)"
fi
if [ -z "$VFLAG" ]; then
IF_EXCLUSIVE=1
list_resolv -i "$@" >/dev/null || IF_EXCLUSIVE=0
eval "$(list_resolv -l "$@" | replace | parse_resolv)"
fi
if [ -n "$name_servers_append" -o -n "$search_domains_append" ]; then
eval "$(echo_append | parse_resolv)"
fi
# Ensure that we only list each domain once # Ensure that we only list each domain once
newdomains=
for d in $DOMAINS; do for d in $DOMAINS; do
dn="${d%%:*}" dn="${d%%:*}"
list_remove domain_blacklist "$dn" >/dev/null || continue
case " $newdomains" in case " $newdomains" in
*" ${dn}:"*) continue;; *" ${dn}:"*) continue;;
esac esac
newdomains="$newdomains${newdomains:+ }$dn:"
newns= newns=
for nd in $DOMAINS; do for nd in $DOMAINS; do
if [ "$dn" = "${nd%%:*}" ]; then if [ "$dn" = "${nd%%:*}" ]; then
@ -293,28 +454,50 @@ make_vars()
while [ -n "$ns" ]; do while [ -n "$ns" ]; do
case ",$newns," in case ",$newns," in
*,${ns%%,*},*) ;; *,${ns%%,*},*) ;;
*) newns="$newns${newns:+,}${ns%%,*}";; *) list_remove name_server_blacklist \
"${ns%%,*}" >/dev/null \
&& newns="$newns${newns:+,}${ns%%,*}";;
esac esac
[ "$ns" = "${ns#*,}" ] && break [ "$ns" = "${ns#*,}" ] && break
ns="${ns#*,}" ns="${ns#*,}"
done done
fi fi
done done
newdomains="$newdomains$newns" if [ -n "$newns" ]; then
newdomains="$newdomains${newdomains:+ }$dn:$newns"
fi
done done
DOMAIN="$(list_remove domain_blacklist $DOMAIN)"
SEARCH="$(uniqify $SEARCH)"
SEARCH="$(list_remove domain_blacklist $SEARCH)"
NAMESERVERS="$(uniqify $NAMESERVERS)"
NAMESERVERS="$(list_remove name_server_blacklist $NAMESERVERS)"
LOCALNAMESERVERS="$(uniqify $LOCALNAMESERVERS)"
LOCALNAMESERVERS="$(list_remove name_server_blacklist $LOCALNAMESERVERS)"
echo "DOMAIN='$DOMAIN'"
echo "SEARCH='$SEARCH'"
echo "NAMESERVERS='$NAMESERVERS'"
echo "LOCALNAMESERVERS='$LOCALNAMESERVERS'"
echo "DOMAINS='$newdomains'" echo "DOMAINS='$newdomains'"
echo "SEARCH='$(uniqify $SEARCH)'"
echo "NAMESERVERS='$(uniqify $NAMESERVERS)'"
echo "LOCALNAMESERVERS='$(uniqify $LOCALNAMESERVERS)'"
} }
force=false force=false
while getopts a:Dd:fhIilm:puv OPT; do VFLAG=
while getopts a:Dd:fhIilm:puvVx OPT; do
case "$OPT" in case "$OPT" in
f) force=true;; f) force=true;;
h) usage;; h) usage;;
m) IF_METRIC="$OPTARG";; m) IF_METRIC="$OPTARG";;
p) IF_PRIVATE=1;; p) IF_PRIVATE=1;;
V)
VFLAG=1
if [ "$local_nameservers" = \
"127.* 0.0.0.0 255.255.255.255 ::1" ]
then
local_nameservers=
fi
;;
x) IF_EXCLUSIVE=1;;
'?') ;; '?') ;;
*) cmd="$OPT"; iface="$OPTARG";; *) cmd="$OPT"; iface="$OPTARG";;
esac esac
@ -343,7 +526,7 @@ if [ "$cmd" = l -o "$cmd" = i ]; then
fi fi
# Not normally needed, but subscribers should be able to run independently # Not normally needed, but subscribers should be able to run independently
if [ "$cmd" = v ]; then if [ "$cmd" = v -o -n "$VFLAG" ]; then
make_vars "$iface" make_vars "$iface"
exit $? exit $?
fi fi
@ -357,6 +540,7 @@ elif [ "$cmd" != u ]; then
[ -n "$cmd" -a "$cmd" != h ] && usage "Unknown option $cmd" [ -n "$cmd" -a "$cmd" != h ] && usage "Unknown option $cmd"
usage usage
fi fi
if [ "$cmd" = a ]; then if [ "$cmd" = a ]; then
for x in '/' \\ ' ' '*'; do for x in '/' \\ ' ' '*'; do
case "$iface" in case "$iface" in
@ -372,8 +556,7 @@ if [ "$cmd" = a ]; then
[ "$cmd" = a -a -t 0 ] && error_exit "No file given via stdin" [ "$cmd" = a -a -t 0 ] && error_exit "No file given via stdin"
fi fi
if [ ! -d "$IFACEDIR" ]; then if [ ! -d "$VARDIR" ]; then
if [ ! -d "$VARDIR" ]; then
if [ -L "$VARDIR" ]; then if [ -L "$VARDIR" ]; then
dir="$(readlink "$VARDIR")" dir="$(readlink "$VARDIR")"
# link maybe relative # link maybe relative
@ -388,62 +571,183 @@ if [ ! -d "$IFACEDIR" ]; then
"directory $VARDIR" "directory $VARDIR"
fi fi
fi fi
fi fi
if [ ! -d "$IFACEDIR" ]; then
mkdir -m 0755 -p "$IFACEDIR" || \ mkdir -m 0755 -p "$IFACEDIR" || \
error_exit "Failed to create needed directory $IFACEDIR" error_exit "Failed to create needed directory $IFACEDIR"
else
# Delete any existing information about the interface
if [ "$cmd" = d ]; then if [ "$cmd" = d ]; then
# Provide the same error messages as below
if ! ${force}; then
cd "$IFACEDIR" cd "$IFACEDIR"
for i in $args; do for i in $args; do
if [ "$cmd" = d -a ! -e "$i" ]; then warn "No resolv.conf for interface $i"
$force && continue
error_exit "No resolv.conf for" \
"interface $i"
fi
rm -f "$i" "$METRICDIR/"*" $i" \
"$PRIVATEDIR/$i" || exit $?
done done
fi fi
${force}
exit $?
fi
fi fi
if [ "$cmd" = a ]; then # An interface was added, changed, deleted or a general update was called.
# Due to exclusivity we need to ensure that this is an atomic operation.
# Our subscribers *may* need this as well if the init system is sub par.
# As such we spinlock at this point as best we can.
# We don't use flock(1) because it's not widely available and normally resides
# in /usr which we do our very best to operate without.
[ -w "$VARDIR" ] || error_exit "Cannot write to $LOCKDIR"
: ${lock_timeout:=10}
while true; do
if mkdir "$LOCKDIR" 2>/dev/null; then
trap 'rm -rf "$LOCKDIR";' EXIT
trap 'rm -rf "$LOCKDIR"; exit 1' INT QUIT ABRT SEGV ALRM TERM
echo $$ >"$LOCKDIR/pid"
break
fi
pid=$(cat "$LOCKDIR/pid")
if ! kill -0 "$pid"; then
warn "clearing stale lock pid $pid"
rm -rf "$LOCKDIR"
continue
fi
lock_timeout=$(($lock_timeout - 1))
if [ "$lock_timeout" -le 0 ]; then
error_exit "timed out waiting for lock from pid $pid"
fi
sleep 1
done
case "$cmd" in
a)
# Read resolv.conf from stdin # Read resolv.conf from stdin
resolv="$(cat)" resolv="$(cat)"
changed=false
changedfile=false
# If what we are given matches what we have, then do nothing # If what we are given matches what we have, then do nothing
if [ -e "$IFACEDIR/$iface" ]; then if [ -e "$IFACEDIR/$iface" ]; then
if [ "$(echo "$resolv")" = \ if [ "$(echo "$resolv")" != \
"$(cat "$IFACEDIR/$iface")" ] "$(cat "$IFACEDIR/$iface")" ]
then then
exit 0 changed=true
changedfile=true
fi fi
rm "$IFACEDIR/$iface" else
changed=true
changedfile=true
fi fi
echo "$resolv" >"$IFACEDIR/$iface" || exit $?
# Set metric and private before creating the interface resolv.conf file
# to ensure that it will have the correct flags
[ ! -d "$METRICDIR" ] && mkdir "$METRICDIR" [ ! -d "$METRICDIR" ] && mkdir "$METRICDIR"
rm -f "$METRICDIR/"*" $iface" oldmetric="$METRICDIR/"*" $iface"
newmetric=
if [ -n "$IF_METRIC" ]; then if [ -n "$IF_METRIC" ]; then
# Pad metric to 6 characters, so 5 is less than 10 # Pad metric to 6 characters, so 5 is less than 10
while [ ${#IF_METRIC} -le 6 ]; do while [ ${#IF_METRIC} -le 6 ]; do
IF_METRIC="0$IF_METRIC" IF_METRIC="0$IF_METRIC"
done done
echo " " >"$METRICDIR/$IF_METRIC $iface" newmetric="$METRICDIR/$IF_METRIC $iface"
fi fi
rm -f "$METRICDIR/"*" $iface"
[ "$oldmetric" != "$newmetric" -a \
"$oldmetric" != "$METRICDIR/* $iface" ] &&
changed=true
[ -n "$newmetric" ] && echo " " >"$newmetric"
case "$IF_PRIVATE" in case "$IF_PRIVATE" in
[Yy][Ee][Ss]|[Tt][Rr][Uu][Ee]|[Oo][Nn]|1) [Yy][Ee][Ss]|[Tt][Rr][Uu][Ee]|[Oo][Nn]|1)
if [ ! -d "$PRIVATEDIR" ]; then if [ ! -d "$PRIVATEDIR" ]; then
[ -e "$PRIVATEDIR" ] && rm "$PRIVATEDIR" [ -e "$PRIVATEDIR" ] && rm "$PRIVATEDIR"
mkdir "$PRIVATEDIR" mkdir "$PRIVATEDIR"
fi fi
[ -e "$PRIVATEDIR/$iface" ] || changed=true
[ -d "$PRIVATEDIR" ] && echo " " >"$PRIVATEDIR/$iface" [ -d "$PRIVATEDIR" ] && echo " " >"$PRIVATEDIR/$iface"
;; ;;
*) *)
if [ -e "$PRIVATEDIR/$iface" ]; then if [ -e "$PRIVATEDIR/$iface" ]; then
rm -f "$PRIVATEDIR/$iface" rm -f "$PRIVATEDIR/$iface"
changed=true
fi fi
;; ;;
esac esac
fi
oldexcl=
for x in "$EXCLUSIVEDIR/"*" $iface"; do
if [ -f "$x" ]; then
oldexcl="$x"
break
fi
done
case "$IF_EXCLUSIVE" in
[Yy][Ee][Ss]|[Tt][Rr][Uu][Ee]|[Oo][Nn]|1)
if [ ! -d "$EXCLUSIVEDIR" ]; then
[ -e "$EXCLUSIVEDIR" ] && rm "$EXCLUSIVEDIR"
mkdir "$EXCLUSIVEDIR"
fi
cd "$EXCLUSIVEDIR"
for x in *; do
[ -f "$x" ] && break
done
if [ "${x#* }" != "$iface" ]; then
if [ "$x" = "${x% *}" ]; then
x=10000000
else
x="${x% *}"
fi
if [ "$x" = "0000000" ]; then
warn "exclusive underflow"
else
x=$(($x - 1))
fi
if [ -d "$EXCLUSIVEDIR" ]; then
echo " " >"$EXCLUSIVEDIR/$x $iface"
fi
changed=true
fi
;;
*)
if [ -f "$oldexcl" ]; then
rm -f "$oldexcl"
changed=true
fi
;;
esac
if $changedfile; then
printf "%s\n" "$resolv" >"$IFACEDIR/$iface" || exit $?
elif ! $changed; then
exit 0
fi
unset changed changedfile oldmetric newmetric x oldexcl
;;
d)
# Delete any existing information about the interface
cd "$IFACEDIR"
changed=false
for i in $args; do
if [ -e "$i" ]; then
changed=true
elif ! ${force}; then
warn "No resolv.conf for interface $i"
fi
rm -f "$i" "$METRICDIR/"*" $i" \
"$PRIVATEDIR/$i" \
"$EXCLUSIVEDIR/"*" $i" || exit $?
done
if ! ${changed}; then
# Set the return code based on the forced flag
${force}
exit $?
fi
unset changed i
;;
esac
case "${resolvconf:-YES}" in
[Yy][Ee][Ss]|[Tt][Rr][Uu][Ee]|[Oo][Nn]|1) ;;
*) exit 0;;
esac
eval "$(make_vars)" eval "$(make_vars)"
export RESOLVCONF DOMAINS SEARCH NAMESERVERS LOCALNAMESERVERS export RESOLVCONF DOMAINS SEARCH NAMESERVERS LOCALNAMESERVERS
@ -451,6 +755,11 @@ export RESOLVCONF DOMAINS SEARCH NAMESERVERS LOCALNAMESERVERS
retval=0 retval=0
for script in "$LIBEXECDIR"/*; do for script in "$LIBEXECDIR"/*; do
if [ -f "$script" ]; then if [ -f "$script" ]; then
eval script_enabled="\$${script##*/}"
case "${script_enabled:-YES}" in
[Yy][Ee][Ss]|[Tt][Rr][Uu][Ee]|[Oo][Nn]|1) ;;
*) continue;;
esac
if [ -x "$script" ]; then if [ -x "$script" ]; then
"$script" "$cmd" "$iface" "$script" "$cmd" "$iface"
else else

View File

@ -1,5 +1,5 @@
#!/bin/sh #!/bin/sh
# Copyright (c) 2009-2011 Roy Marples # Copyright (c) 2009-2014 Roy Marples
# All rights reserved # All rights reserved
# unbound subscriber for resolvconf # unbound subscriber for resolvconf
@ -26,10 +26,12 @@
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
unbound_insecure=
[ -f "@SYSCONFDIR@"/resolvconf.conf ] || exit 0 [ -f "@SYSCONFDIR@"/resolvconf.conf ] || exit 0
. "@SYSCONFDIR@/resolvconf.conf" || exit 1 . "@SYSCONFDIR@/resolvconf.conf" || exit 1
[ -z "$unbound_conf" ] && exit 0 [ -z "$unbound_conf" ] && exit 0
[ -z "$RESOLVCONF" ] && eval "$(@PREFIX@/sbin/resolvconf -v)" [ -z "$RESOLVCONF" ] && eval "$(@SBINDIR@/resolvconf -v)"
NL=" NL="
" "
@ -41,6 +43,11 @@ newconf="# Generated by resolvconf$NL"
for d in $DOMAINS; do for d in $DOMAINS; do
dn="${d%%:*}" dn="${d%%:*}"
ns="${d#*:}" ns="${d#*:}"
case "$unbound_insecure" in
[Yy][Ee][Ss]|[Tt][Rr][Uu][Ee]|[Oo][Nn]|1)
newconf="$newconf${NL}domain-insecure: \"$dn\""
;;
esac
newconf="$newconf${NL}forward-zone:$NL name: \"$dn\"$NL" newconf="$newconf${NL}forward-zone:$NL name: \"$dn\"$NL"
while [ -n "$ns" ]; do while [ -n "$ns" ]; do
newconf="$newconf forward-addr: ${ns%%,*}$NL" newconf="$newconf forward-addr: ${ns%%,*}$NL"
@ -60,7 +67,7 @@ fi
if type config_mkdirs >/dev/null 2>&1; then if type config_mkdirs >/dev/null 2>&1; then
config_mkdirs "$unbound_conf" config_mkdirs "$unbound_conf"
else else
@PREFIX@/sbin/resolvconf -D "$unbound_conf" @SBINDIR@/resolvconf -D "$unbound_conf"
fi fi
if [ ! -f "$unbound_conf" ] || \ if [ ! -f "$unbound_conf" ] || \