1#!/bin/sh
2#
3# Portions Copyright (C) 2004, 2006, 2007, 2012, 2014  Internet Systems Consortium, Inc. ("ISC")
4# Portions Copyright (C) 1999-2001  Internet Software Consortium.
5#
6# Permission to use, copy, modify, and/or distribute this software for any
7# purpose with or without fee is hereby granted, provided that the above
8# copyright notice and this permission notice appear in all copies.
9#
10# THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
11# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
12# AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
13# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
14# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
15# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
16# PERFORMANCE OF THIS SOFTWARE.
17
18# Id: named-bootconf.sh,v 1.12 2007/06/19 23:47:07 tbox Exp
19
20# NetBSD: named-bootconf.sh,v 1.5 1998/12/15 01:00:53 tron Exp
21#
22# Copyright (c) 1995, 1998 The NetBSD Foundation, Inc.
23# All rights reserved.
24#
25# This code is derived from software contributed to The NetBSD Foundation
26# by Matthias Scheler.
27#
28# Redistribution and use in source and binary forms, with or without
29# modification, are permitted provided that the following conditions
30# are met:
31# 1. Redistributions of source code must retain the above copyright
32#    notice, this list of conditions and the following disclaimer.
33# 2. Redistributions in binary form must reproduce the above copyright
34#    notice, this list of conditions and the following disclaimer in the
35#    documentation and/or other materials provided with the distribution.
36#
37# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
38# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
39# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
40# PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
41# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
42# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
43# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
44# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
45# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
46# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
47# POSSIBILITY OF SUCH DAMAGE.
48
49if [ ${OPTIONFILE-X} = X ]; then
50	WORKDIR=/tmp/`date +%s`.$$
51	( umask 077 ; mkdir $WORKDIR ) || {
52		echo "unable to create work directory '$WORKDIR'" >&2
53		exit 1
54	}
55	OPTIONFILE=$WORKDIR/options
56	ZONEFILE=$WORKDIR/zones
57	COMMENTFILE=$WORKDIR/comments
58	export OPTIONFILE ZONEFILE COMMENTFILE
59	touch $OPTIONFILE $ZONEFILE $COMMENTFILE
60	DUMP=1
61else
62	DUMP=0
63fi
64
65while read CMD ARGS; do
66	class=
67	CMD=`echo "${CMD}" | tr '[A-Z]' '[a-z]'`
68	case $CMD in
69	\; )
70		echo \# $ARGS >>$COMMENTFILE
71		;;
72	cache )
73		set - X $ARGS
74		shift
75		if [ $# -eq 2 ]; then
76			(echo ""
77			cat $COMMENTFILE
78			echo "zone \"$1\" {"
79			echo "	type hint;"
80			echo "	file \"$2\";"
81			echo "};") >>$ZONEFILE
82			rm -f $COMMENTFILE
83			touch $COMMENTFILE
84		fi
85		;;
86	directory )
87		set - X $ARGS
88		shift
89		if [ $# -eq 1 ]; then
90			(cat $COMMENTFILE
91			echo "	directory \"$1\";") >>$OPTIONFILE
92			rm -f $COMMENTFILE
93			touch $COMMENTFILE
94
95			DIRECTORY=$1
96			export DIRECTORY
97		fi
98		;;
99	forwarders )
100		(cat $COMMENTFILE
101		echo "	forwarders {"
102		for ARG in $ARGS; do
103			echo "		$ARG;"
104		done
105		echo "	};") >>$OPTIONFILE
106		rm -f $COMMENTFILE
107		touch $COMMENTFILE
108		;;
109	include )
110		if [ "$ARGS" != "" ]; then
111			(cd ${DIRECTORY-.}; cat $ARGS) | $0
112		fi
113		;;
114	limit )
115		ARGS=`echo "${ARGS}" | tr '[A-Z]' '[a-z]'`
116		set - X $ARGS
117		shift
118		if [ $# -eq 2 ]; then
119			cat $COMMENTFILE >>$OPTIONFILE
120			case $1 in
121			datasize | files | transfers-in | transfers-per-ns )
122				echo "	$1 $2;" >>$OPTIONFILE
123				;;
124			esac
125			rm -f $COMMENTFILE
126			touch $COMMENTFILE
127		fi
128		;;
129	options )
130		ARGS=`echo "${ARGS}" | tr '[A-Z]' '[a-z]'`
131		cat $COMMENTFILE >>$OPTIONFILE
132		for ARG in $ARGS; do
133			case $ARG in
134			fake-iquery )
135				echo "	fake-iquery yes;" >>$OPTIONFILE
136				;;
137			forward-only )
138				echo "	forward only;" >>$OPTIONFILE
139				;;
140			no-fetch-glue )
141				echo "	fetch-glue no;" >>$OPTIONFILE
142				;;
143			no-recursion )
144				echo "	recursion no;" >>$OPTIONFILE
145				;;
146			esac
147		done
148		rm -f $COMMENTFILE
149		touch $COMMENTFILE
150		;;
151	primary|primary/* )
152		case $CMD in
153		primary/chaos )
154			class="chaos "
155			;;
156		primary/hs )
157			class="hesiod "
158			;;
159		esac
160		set - X $ARGS
161		shift
162		if [ $# -eq 2 ]; then
163			(echo ""
164			cat $COMMENTFILE
165			echo "zone \"$1\" ${class}{"
166			echo "	type master;"
167			echo "	file \"$2\";"
168			echo "};") >>$ZONEFILE
169			rm -f $COMMENTFILE
170			touch $COMMENTFILE
171		fi
172		;;
173	secondary|secondary/* )
174		case $CMD in
175		secondary/chaos )
176			class="chaos "
177			;;
178		secondary/hs )
179			class="hesiod "
180			;;
181		esac
182		set - X $ARGS
183		shift
184		if [ $# -gt 2 ]; then
185			ZONE=$1
186			shift
187			PRIMARIES=$1
188			while [ $# -gt 2 ]; do
189				shift
190				PRIMARIES="$PRIMARIES $1"
191			done
192			(echo ""
193			cat $COMMENTFILE
194			echo "zone \"$ZONE\" ${class}{"
195			echo "	type slave;"
196			echo "	file \"$2\";"
197			echo "	masters {"
198			for PRIMARY in $PRIMARIES; do
199				echo "		$PRIMARY;"
200			done
201			echo "	};"
202			echo "};") >>$ZONEFILE
203			rm -f $COMMENTFILE
204			touch $COMMENTFILE
205		fi
206		;;
207	stub|stub/* )
208		case $CMD in
209		stub/chaos )
210			class="chaos "
211			;;
212		stub/hs )
213			class="hesiod "
214			;;
215		esac
216		set - X $ARGS
217		shift
218		if [ $# -gt 2 ]; then
219			ZONE=$1
220			shift
221			PRIMARIES=$1
222			while [ $# -gt 2 ]; do
223				shift
224				PRIMARIES="$PRIMARIES $1"
225			done
226			(echo ""
227			cat $COMMENTFILE
228			echo "zone \"$ZONE\" ${class}{"
229			echo "	type stub;"
230			echo "	file \"$2\";"
231			echo "	masters {"
232			for PRIMARY in $PRIMARIES; do
233				echo "		$PRIMARY;"
234			done
235			echo "	};"
236			echo "};") >>$ZONEFILE
237			rm -f $COMMENTFILE
238			touch $COMMENTFILE
239		fi
240		;;
241	slave )
242		cat $COMMENTFILE >>$OPTIONFILE
243		echo "	forward only;" >>$OPTIONFILE
244		rm -f $COMMENTFILE
245		touch $COMMENTFILE
246		;;
247	sortlist )
248		(cat $COMMENTFILE
249		echo "	topology {"
250		for ARG in $ARGS; do
251			case $ARG in
252			*.0.0.0 )
253				echo "		$ARG/8;"
254				;;
255			*.0.0 )
256				echo "		$ARG/16;"
257				;;
258			*.0 )
259				echo "		$ARG/24;"
260				;;
261			* )
262				echo "		$ARG;"
263				;;
264			esac
265		done
266		echo "	};") >>$OPTIONFILE
267		rm -f $COMMENTFILE
268		touch $COMMENTFILE
269		;;
270	tcplist | xfrnets )
271		(cat $COMMENTFILE
272		echo "	allow-transfer {"
273		for ARG in $ARGS; do
274			case $ARG in
275			*.0.0.0 )
276				echo "		$ARG/8;"
277				;;
278			*.0.0 )
279				echo "		$ARG/16;"
280				;;
281			*.0 )
282				echo "		$ARG/24;"
283				;;
284			* )
285				echo "		$ARG;"
286				;;
287			esac
288		done
289		echo "	};") >>$OPTIONFILE
290		rm -f $COMMENTFILE
291		touch $COMMENTFILE
292		;;
293	esac
294done
295
296if [ $DUMP -eq 1 ]; then
297	echo ""
298	echo "options {"
299	cat $OPTIONFILE
300	echo "};"
301	cat $ZONEFILE $COMMENTFILE
302
303	rm -f $OPTIONFILE $ZONEFILE $COMMENTFILE
304	rmdir $WORKDIR
305fi
306
307exit 0
308