pdnsd.in revision 219732
1252190Srpaulo#!/bin/sh
2252190Srpaulo# Copyright (c) 2010 Roy Marples
3252190Srpaulo# All rights reserved
4252190Srpaulo
5252190Srpaulo# pdnsd subscriber for resolvconf
6252190Srpaulo
7252190Srpaulo# Redistribution and use in source and binary forms, with or without
8252190Srpaulo# modification, are permitted provided that the following conditions
9252190Srpaulo# are met:
10252190Srpaulo#     * Redistributions of source code must retain the above copyright
11252190Srpaulo#       notice, this list of conditions and the following disclaimer.
12252190Srpaulo#     * Redistributions in binary form must reproduce the above
13252190Srpaulo#       copyright notice, this list of conditions and the following
14252190Srpaulo#       disclaimer in the documentation and/or other materials provided
15252190Srpaulo#       with the distribution.
16252190Srpaulo#
17252190Srpaulo# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18252190Srpaulo# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19252190Srpaulo# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20252190Srpaulo# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21252190Srpaulo# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22252190Srpaulo# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23252190Srpaulo# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24252190Srpaulo# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25252190Srpaulo# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26252190Srpaulo# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27252190Srpaulo# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28252190Srpaulo
29252190Srpaulo[ -f "@SYSCONFDIR@"/resolvconf.conf ] || exit 0
30252190Srpaulo. "@SYSCONFDIR@/resolvconf.conf" || exit 1
31252190Srpaulo[ -z "$pdnsd_conf" -a -z "$pdnsd_resolv" ] && exit 0
32252190Srpaulo[ -z "$RESOLVCONF" ] && eval "$(@PREFIX@/sbin/resolvconf -v)"
33252190Srpaulo
34252190Srpaulo: ${pdnsd_restart:=pdnsd-ctl config $pdnsd_conf}
35252190Srpaulosignature="# Generated by resolvconf"
36252190Srpaulosignature_end="# End of resolvconf"
37252190Srpaulo
38252190Srpaulo# We normally use sed to remove markers from a configuration file
39252190Srpaulo# but sed may not always be available at the time.
40252190Srpauloremove_markers()
41252190Srpaulo{
42252190Srpaulo	local m1="$1" m2="$2" x= line= in_marker=0
43252190Srpaulo
44252190Srpaulo	shift; shift
45252190Srpaulo	if type sed >/dev/null 2>&1; then
46252190Srpaulo		sed "/^$m1/,/^$m2/d" $@
47252190Srpaulo	else
48252190Srpaulo		for x; do
49252190Srpaulo			while read line; do
50252190Srpaulo				case "$line" in
51252190Srpaulo				"$m1"*) in_marker=1;;
52252190Srpaulo				"$m2"*) in_marker=0;;
53252190Srpaulo				*) [ $in_marker = 0 ] && echo "$line";;
54252190Srpaulo				esac
55252190Srpaulo			done < "$x"
56252190Srpaulo		done
57252190Srpaulo	fi
58252190Srpaulo}
59252190Srpaulo
60252190Srpaulo# Compare two files
61252190Srpaulo# If different, replace first with second otherwise remove second
62252190Srpaulochange_file()
63252190Srpaulo{
64252190Srpaulo	if [ -e "$1" ]; then
65252190Srpaulo		if type cmp >/dev/null 2>&1; then
66252190Srpaulo			cmp -s "$1" "$2"
67252190Srpaulo		elif type diff >/dev/null 2>&1; then
68252190Srpaulo			diff -q "$1" "$2" >/dev/null
69252190Srpaulo		else
70252190Srpaulo			# Hopefully we're only working on small text files ...
71252190Srpaulo			[ "$(cat "$1")" = "$(cat "$2")" ]
72252190Srpaulo		fi
73252190Srpaulo		if [ $? -eq 0 ]; then
74252190Srpaulo			rm -f "$2"
75252190Srpaulo			return 1
76252190Srpaulo		fi
77252190Srpaulo	fi
78252190Srpaulo	cat "$2" > "$1"
79252190Srpaulo	rm -f "$2"
80252190Srpaulo	return 0
81252190Srpaulo}
82252190Srpaulo
83252190Srpaulonewresolv="# Generated by resolvconf\n"
84252190Srpaulochanged=false
85252190Srpaulo
86252190Srpauloif [ -n "$pdnsd_resolv" ]; then
87252190Srpaulo	for n in $NAMESERVERS; do
88252190Srpaulo		newresolv="${newresolv}nameserver $n\n"
89252190Srpaulo	done
90252190Srpaulofi
91252190Srpaulo
92252190Srpauloif [ -n "$pdnsd_conf" ]; then
93252190Srpaulo	cf="$pdnsd_conf.new"
94252190Srpaulo	newconf=
95252190Srpaulo
96252190Srpaulo	if [ -z "$pdnsd_resolv" ]; then
97252190Srpaulo		newconf="${newconf}server {\n"
98252190Srpaulo		newconf="${newconf}\tlabel=resolvconf;\n"
99252190Srpaulo		if [ -n "$NAMESERVERS" ]; then
100252190Srpaulo			newconf="${newconf}\tip="
101252190Srpaulo			first=true
102252190Srpaulo			for n in $NAMESERVERS; do
103252190Srpaulo				if $first; then
104252190Srpaulo					first=false
105252190Srpaulo				else
106252190Srpaulo					newconf="${newconf},"
107252190Srpaulo				fi
108252190Srpaulo				newconf="$newconf$n"
109252190Srpaulo			done
110252190Srpaulo			newconf="${newconf};\n"
111252190Srpaulo		fi
112252190Srpaulo		newconf="${newconf}}\n"
113252190Srpaulo	fi
114252190Srpaulo
115252190Srpaulo	for d in $DOMAINS; do
116252190Srpaulo		newconf="${newconf}server {\n"
117252190Srpaulo		newconf="${newconf}\tinclude=.${d%%:*}.;\n"
118252190Srpaulo		newconf="${newconf}\tpolicy=excluded;\n"
119252190Srpaulo		newconf="${newconf}\tip="
120252190Srpaulo		ns="${d#*:}"
121252190Srpaulo		while [ -n "$ns" ]; do
122252190Srpaulo			newconf="${newconf}${ns%%,*}"
123252190Srpaulo			[ "$ns" = "${ns#*,}" ] && break
124252190Srpaulo			ns="${ns#*,}"
125252190Srpaulo			newconf="${newconf},"
126252190Srpaulo		done
127252190Srpaulo		newconf="${newconf};\n}\n"
128252190Srpaulo	done
129252190Srpaulo
130252190Srpaulo	rm -f "$cf"
131252190Srpaulo	remove_markers "$signature" "$signature_end" "$pdnsd_conf" > "$cf"
132252190Srpaulo	if [ -n "$newconf" ]; then
133252190Srpaulo		echo "$signature" >> "$cf"
134252190Srpaulo		printf "$newconf" >> "$cf"
135252190Srpaulo		echo "$signature_end" >> "$cf"
136252190Srpaulo	fi
137252190Srpaulo	if change_file "$pdnsd_conf" "$cf"; then
138252190Srpaulo		changed=true
139252190Srpaulo	fi	
140252190Srpaulofi
141252190Srpaulo
142252190Srpauloif [ -n "$pdnsd_resolv" ]; then
143252190Srpaulo	if [ ! -f "$pdnsd_resolv" ] || \
144252190Srpaulo		[ "$(cat "$pdnsd_resolv")" != "$(printf "$newresolv")" ]
145252190Srpaulo	then
146252190Srpaulo		changed=true
147252190Srpaulo		printf "$newresolv" >"$pdnsd_resolv"
148252190Srpaulo	fi
149252190Srpaulofi
150252190Srpaulo
151252190Srpauloif $changed; then
152252190Srpaulo	eval $pdnsd_restart
153252190Srpaulofi
154252190Srpaulo