pdnsd.in revision 225524
1207753Smm#!/bin/sh
2207753Smm# Copyright (c) 2010 Roy Marples
3207753Smm# All rights reserved
4207753Smm
5207753Smm# pdnsd subscriber for resolvconf
6207753Smm
7207753Smm# Redistribution and use in source and binary forms, with or without
8207753Smm# modification, are permitted provided that the following conditions
9207753Smm# are met:
10207753Smm#     * Redistributions of source code must retain the above copyright
11207753Smm#       notice, this list of conditions and the following disclaimer.
12207753Smm#     * Redistributions in binary form must reproduce the above
13207753Smm#       copyright notice, this list of conditions and the following
14207753Smm#       disclaimer in the documentation and/or other materials provided
15207753Smm#       with the distribution.
16207753Smm#
17207753Smm# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18312517Sdelphij# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19207753Smm# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20207753Smm# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21207753Smm# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22207753Smm# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23207753Smm# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24207753Smm# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25207753Smm# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26207753Smm# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27207753Smm# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28207753Smm
29207753Smm[ -f "@SYSCONFDIR@"/resolvconf.conf ] || exit 0
30207753Smm. "@SYSCONFDIR@/resolvconf.conf" || exit 1
31207753Smm[ -z "$pdnsd_conf" -a -z "$pdnsd_resolv" ] && exit 0
32207753Smm[ -z "$RESOLVCONF" ] && eval "$(@PREFIX@/sbin/resolvconf -v)"
33207753Smm
34207753Smm: ${pdnsd_restart:=pdnsd-ctl config $pdnsd_conf}
35207753Smmsignature="# Generated by resolvconf"
36207753Smmsignature_end="# End of resolvconf"
37207753Smm
38207753Smm# We normally use sed to remove markers from a configuration file
39207753Smm# but sed may not always be available at the time.
40207753Smmremove_markers()
41207753Smm{
42207753Smm	local m1="$1" m2="$2" x= line= in_marker=0
43207753Smm
44207753Smm	shift; shift
45207753Smm	if type sed >/dev/null 2>&1; then
46207753Smm		sed "/^$m1/,/^$m2/d" $@
47207753Smm	else
48278433Srpaulo		for x; do
49278433Srpaulo			while read line; do
50278433Srpaulo				case "$line" in
51312517Sdelphij				"$m1"*) in_marker=1;;
52207753Smm				"$m2"*) in_marker=0;;
53207753Smm				*) [ $in_marker = 0 ] && echo "$line";;
54207753Smm				esac
55207753Smm			done < "$x"
56207753Smm		done
57207753Smm	fi
58207753Smm}
59207753Smm
60207753Smm# Compare two files
61207753Smm# If different, replace first with second otherwise remove second
62207753Smmchange_file()
63207753Smm{
64207753Smm	if [ -e "$1" ]; then
65207753Smm		if type cmp >/dev/null 2>&1; then
66207753Smm			cmp -s "$1" "$2"
67207753Smm		elif type diff >/dev/null 2>&1; then
68207753Smm			diff -q "$1" "$2" >/dev/null
69207753Smm		else
70207753Smm			# Hopefully we're only working on small text files ...
71207753Smm			[ "$(cat "$1")" = "$(cat "$2")" ]
72207753Smm		fi
73207753Smm		if [ $? -eq 0 ]; then
74207753Smm			rm -f "$2"
75207753Smm			return 1
76207753Smm		fi
77312517Sdelphij	fi
78207753Smm	cat "$2" > "$1"
79207753Smm	rm -f "$2"
80207753Smm	return 0
81207753Smm}
82312517Sdelphij
83312517Sdelphijnewresolv="# Generated by resolvconf\n"
84207753Smmchanged=false
85207753Smm
86207753Smmif [ -n "$pdnsd_resolv" ]; then
87207753Smm	for n in $NAMESERVERS; do
88207753Smm		newresolv="${newresolv}nameserver $n\n"
89207753Smm	done
90207753Smmfi
91207753Smm
92207753Smmif [ -n "$pdnsd_conf" ]; then
93207753Smm	cf="$pdnsd_conf.new"
94207753Smm	newconf=
95207753Smm
96207753Smm	if [ -z "$pdnsd_resolv" ]; then
97207753Smm		newconf="${newconf}server {\n"
98207753Smm		newconf="${newconf}\tlabel=resolvconf;\n"
99207753Smm		if [ -n "$NAMESERVERS" ]; then
100207753Smm			newconf="${newconf}\tip="
101207753Smm			first=true
102207753Smm			for n in $NAMESERVERS; do
103207753Smm				if $first; then
104207753Smm					first=false
105278433Srpaulo				else
106278433Srpaulo					newconf="${newconf},"
107278433Srpaulo				fi
108207753Smm				newconf="$newconf$n"
109207753Smm			done
110207753Smm			newconf="${newconf};\n"
111207753Smm		fi
112207753Smm		newconf="${newconf}}\n"
113207753Smm	fi
114207753Smm
115207753Smm	for d in $DOMAINS; do
116207753Smm		newconf="${newconf}server {\n"
117207753Smm		newconf="${newconf}\tinclude=.${d%%:*}.;\n"
118207753Smm		newconf="${newconf}\tpolicy=excluded;\n"
119207753Smm		newconf="${newconf}\tip="
120207753Smm		ns="${d#*:}"
121207753Smm		while [ -n "$ns" ]; do
122207753Smm			newconf="${newconf}${ns%%,*}"
123207753Smm			[ "$ns" = "${ns#*,}" ] && break
124207753Smm			ns="${ns#*,}"
125207753Smm			newconf="${newconf},"
126207753Smm		done
127207753Smm		newconf="${newconf};\n}\n"
128207753Smm	done
129207753Smm
130207753Smm	rm -f "$cf"
131207753Smm	remove_markers "$signature" "$signature_end" "$pdnsd_conf" > "$cf"
132207753Smm	if [ -n "$newconf" ]; then
133207753Smm		echo "$signature" >> "$cf"
134207753Smm		printf %s "$newconf" >> "$cf"
135207753Smm		echo "$signature_end" >> "$cf"
136207753Smm	fi
137207753Smm	if change_file "$pdnsd_conf" "$cf"; then
138207753Smm		changed=true
139207753Smm	fi	
140207753Smmfi
141207753Smm
142207753Smmif [ -n "$pdnsd_resolv" ]; then
143207753Smm	if [ ! -f "$pdnsd_resolv" ] || \
144207753Smm		[ "$(cat "$pdnsd_resolv")" != "$(printf %s "$newresolv")" ]
145207753Smm	then
146207753Smm		changed=true
147207753Smm		printf %s "$newresolv" >"$pdnsd_resolv"
148207753Smm	fi
149278433Srpaulofi
150278433Srpaulo
151278433Srpauloif $changed; then
152207753Smm	eval $pdnsd_restart
153207753Smmfi
154207753Smm