mirror of
https://github.com/pi-hole/dnsmasq.git
synced 2025-12-19 10:18:25 +00:00
71 lines
2.0 KiB
Bash
71 lines
2.0 KiB
Bash
#!/bin/bash
|
|
#
|
|
# Script to update the resolver list for dnsmasq
|
|
#
|
|
# N.B. Resolvconf may run us even if dnsmasq is not running.
|
|
# If dnsmasq is installed then we go ahead and update
|
|
# the resolver list in case dnsmasq is started later.
|
|
#
|
|
# Assumption: On entry, PWD contains the resolv.conf-type files
|
|
#
|
|
# Requires bash because it uses a non-POSIX printf extension.
|
|
#
|
|
# Licensed under the GNU GPL. See /usr/share/common-licenses/GPL.
|
|
#
|
|
|
|
set -e
|
|
|
|
RUN_DIR="/var/run/dnsmasq"
|
|
RSLVRLIST_FILE="${RUN_DIR}/resolv.conf"
|
|
TMP_FILE="${RSLVRLIST_FILE}_new.$$"
|
|
|
|
[ -x /usr/sbin/dnsmasq ] || exit 0
|
|
[ -x /lib/resolvconf/list-records ] || exit 1
|
|
|
|
PATH=/bin:/sbin
|
|
|
|
report_err() { echo "$0: Error: $*" >&2 ; }
|
|
|
|
# Stores arguments (minus duplicates) in RSLT, separated by spaces
|
|
# Doesn't work properly if an argument itself contain whitespace
|
|
uniquify()
|
|
{
|
|
RSLT=""
|
|
while [ "$1" ] ; do
|
|
for E in $RSLT ; do
|
|
[ "$1" = "$E" ] && { shift ; continue 2 ; }
|
|
done
|
|
RSLT="${RSLT:+$RSLT }$1"
|
|
shift
|
|
done
|
|
}
|
|
|
|
if [ ! -d "$RUN_DIR" ] && ! mkdir --parents --mode=0755 "$RUN_DIR" ; then
|
|
report_err "Failed trying to create directory $RUN_DIR"
|
|
exit 1
|
|
fi
|
|
|
|
RSLVCNFFILES="$(/lib/resolvconf/list-records | sed -e '/^lo.dnsmasq$/d')"
|
|
|
|
NMSRVRS=""
|
|
if [ "$RSLVCNFFILES" ] ; then
|
|
uniquify $(sed -n -e 's/^[[:space:]]*nameserver[[:space:]]\+//p' $RSLVCNFFILES)
|
|
NMSRVRS="$RSLT"
|
|
fi
|
|
|
|
# Dnsmasq uses the mtime of $RSLVRLIST_FILE, with a resolution of one second,
|
|
# to detect changes in the file. This means that if a resolvconf update occurs
|
|
# within one second of the previous one then dnsmasq may fail to notice the
|
|
# more recent change. To work around this problem we sleep here to ensure
|
|
# that the new mtime is different.
|
|
if [ -f "$RSLVRLIST_FILE" ] && [ "$(ls -go --time-style='+%s' "$RSLVRLIST_FILE" | { read p h s t n ; echo "$t" ; })" = "$(date +%s)" ] ; then
|
|
sleep 1
|
|
fi
|
|
|
|
clean_up() { rm -f "$TMP_FILE" ; }
|
|
trap clean_up EXIT
|
|
: >| "$TMP_FILE"
|
|
for N in $NMSRVRS ; do echo "nameserver $N" >> "$TMP_FILE" ; done
|
|
mv -f "$TMP_FILE" "$RSLVRLIST_FILE"
|
|
|