1#!/bin/bash
2#
3# Copyright (C) 2013  Internet Systems Consortium, Inc. ("ISC")
4#
5# Permission to use, copy, modify, and/or distribute this software for any
6# purpose with or without fee is hereby granted, provided that the above
7# copyright notice and this permission notice appear in all copies.
8#
9# THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
10# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
11# AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
12# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
13# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
14# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
15# PERFORMANCE OF THIS SOFTWARE.
16
17SYSTEMTESTTOP=..
18. ../conf.sh
19
20addr=127.127.0.0
21ttl=300
22named=${NAMED}
23keygen=${KEYGEN}
24dsfromkey=${DSFROMKEY}
25
26nextaddr() {
27	OLDIF="$IFS"
28	IFS="${IFS}."
29	set $1
30	IFS="$OLDIFS"
31	_a=$1 _b=$2 _c=$3 _d=$4
32	_d=$(($_d + 1))
33	case $_d in
34	256) _c=$(($_c + 1)); _d=0;;
35	esac
36	case $_c in
37	256) _b=$(($_b + 1)); _c=0;;
38	esac
39	echo $_a.$_b.$_c.$_d
40}
41
42parent() {
43	OLDIF="$IFS"
44	IFS="${IFS}."
45	set $1
46	IFS="$OLDIFS"
47	shift
48	while [ $# -ne 0 ]
49	do
50		printf %s ${1}
51		shift
52		printf %s ${1:+.}
53
54	done
55}
56
57blackhole() {
58	echo 'options {'
59	echo '	port 5300;'
60	echo "	listen-on { $1; };"
61	echo "	query-source $1;"
62	echo "	notify-source $1;"
63	echo "	transfer-source $1;"
64	echo '	key-directory "keys";'
65	echo "	recursion ${2:-no};"
66	echo '	pid-file "pids/'"${addr}"'.pid";'
67	echo '	blackhole { 127.127.0.0; };'
68	echo '};'
69}
70
71refuse() {
72	echo 'options {'
73	echo '	port 5300;'
74	echo "	listen-on { $1; };"
75	echo "	query-source $1;"
76	echo "	notify-source $1;"
77	echo "	transfer-source $1;"
78	echo '	key-directory "keys";'
79	echo "	recursion ${2:-no};"
80	echo '	pid-file "pids/'"${addr}"'.pid";'
81	echo '	allow-query { !127.127.0.0; any; };'
82	echo '};'
83}
84
85options() {
86	echo 'options {'
87	echo '	port 5300;'
88	echo "	listen-on { $1; };"
89	echo "	query-source $1;"
90	echo "	notify-source $1;"
91	echo "	transfer-source $1;"
92	echo '	key-directory "keys";'
93	echo "	recursion ${2:-no};"
94	echo '	pid-file "pids/'"${addr}"'.pid";'
95	echo '};'
96}
97
98controls() {
99       echo 'include "rndc.key";'
100       echo "controls { inet $addr port 9953 allow { any; } keys { "rndc-key"; }; };"
101}
102
103delay() {
104	_s=$1
105	OLDIF="$IFS"
106	IFS="${IFS}/"
107	set ${2:-.}
108	IFS="$OLDIFS"
109
110	case $1 in
111	.) _d=;;
112	*) _d=$1;;
113	esac
114	case $_s in
115	1) echo -T delay=${_d:-100};;
116	2) echo -T delay=${2:-50};;
117	3) echo -T delay=${3:-150};;
118	4) echo -T delay=${4:-250};;
119	5) echo -T delay=${5:-125};;
120	6) echo -T delay=${6:-25};;
121	7) echo -T delay=${7:-75};;
122	8) echo -T delay=${8:-125};;
123	9) echo -T delay=${9:-10};;
124	10) echo -T delay=${10:-40};;
125	11) echo -T delay=${11:-80};;
126	12) echo -T delay=${12:-90};;
127	*) echo -T delay=50;;
128	esac
129}
130
131trusted-keys () {
132	awk '$3 == "DNSKEY" {
133	        b = ""; for (i=7; i <= NF; i++) { b = b $i; };
134		print "trusted-keys { \""$1"\"",$4,$5,$6,"\""b"\"; };" };'
135}
136
137signed-zone () {
138	echo "zone "'"'"${1:-.}"'"'" {"
139	echo "	type master;"
140	echo "	file "'"'"master/${2}.db"'"'";"
141	echo "	auto-dnssec maintain;"
142	echo "	allow-update { any; };"
143	echo "};"
144}
145
146unsigned-zone () {
147	echo "zone "'"'"${1:-.}"'"'" {"
148	echo "	type master;"
149	echo "	file "'"'"master/${2}.db"'"'";"
150	echo "};"
151}
152
153slave-zone () {
154	echo "zone "'"'"${zone:-.}"'"'" {"
155	echo "	type slave;"
156	echo "	masters { ${master}; };"
157	echo "};"
158}
159
160rm -rf servers master keys setup teardown run
161mkdir -p servers
162mkdir -p master
163mkdir -p keys
164
165echo "ifconfig lo0 $addr netmask 0xffffffff alias" >> setup
166echo "ifconfig lo0 $addr -alias" >> teardown
167controls $addr > named.conf
168options $addr yes >> named.conf
169echo 'zone "." { type hint; file "master/hint.db"; };' >> named.conf
170
171while read zone servers nsfmt signed delay blackhole refuse flags
172do
173	i=1
174	case "${zone}" in
175	.) file=root zone=;;
176	*) file="$zone";;
177	esac
178	if [ "${zone}" != "" ] ; then
179		p=$(parent $zone)
180		case "${p}" in
181		"") p=root;;
182		esac
183	else
184		p=hint
185	fi
186	#echo "zone='${zone}' parent='${p}'"
187	addr=$(nextaddr $addr)
188	ns=$(printf "$nsfmt" ${i} "${zone}")
189	d=$(delay $i ${delay:-.})
190
191	echo "${zone}. ${ttl} soa ${ns}. hostmaster.${zone}${zone:+.} 1 3600 1200 604800 1200" >> master/${file}.db
192	echo "${zone}. ${ttl} ns ${ns}." >> master/${file}.db
193	echo "${ns}. ${ttl} a ${addr}" >> master/${file}.db
194	echo "${zone}. ${ttl} ns ${ns}." >> master/${p}.db
195	echo "${ns}. ${ttl} a ${addr}" >> master/${p}.db
196	if [ $signed = "S" ]; then
197		kskkey=`${keygen} -K keys -f KSK ${zone:-.}`
198		zskkey=`${keygen} -K keys ${zone:-.}`
199		if [ "${zone}" != "" ] ; then
200			${dsfromkey} -T ${ttl} keys/${kskkey}.key >> master/${p}.db
201		else
202			trusted-keys <  keys/${kskkey}.key >> named.conf
203		fi
204	fi
205	echo "ifconfig lo0 $addr netmask 0xffffffff alias" >> setup
206	echo "ifconfig lo0 $addr -alias" >> teardown
207	echo "${named} -D bigtest -c servers/${addr}.conf $d $flags" >> run
208	options ${addr} > servers/${addr}.conf
209	case ${signed} in
210	S) signed-zone ${zone:-.} ${file} >> servers/${addr}.conf;;
211	P) unsigned-zone ${zone:-.} ${file} >> servers/${addr}.conf;;
212	*) echo ${signed}; exit 1;;
213	esac
214
215	# slave servers
216	while [ $i -lt $servers ]
217	do
218		master=$addr
219		i=$(($i + 1))
220		ns=$(printf "$nsfmt" ${i} "${zone}")
221		d=$(delay $i ${delay:-.})
222		addr=$(nextaddr $addr)
223		echo "${zone}. ${ttl} ns ${ns}." >> master/${file}.db
224		echo "${ns}. ${ttl} a ${addr}" >> master/${file}.db
225		echo "${zone}. ${ttl} ns ${ns}." >> master/${p}.db
226		echo "${ns}. ${ttl} a ${addr}" >> master/${p}.db
227		echo "ifconfig lo0 $addr netmask 0xffffffff alias" >> setup
228		echo "ifconfig lo0 $addr -alias" >> teardown
229		echo "${named} -D bigtest -c servers/${addr}.conf $d $flags" >> run
230		if [ $i = ${refuse:-.} ]
231		then
232			refuse $addr > servers/${addr}.conf
233		elif [ $i = ${blackhole:-.} ]
234		then
235			blackhole $addr > servers/${addr}.conf
236		else
237			options $addr > servers/${addr}.conf
238		fi
239		slave-zone ${zone:-.} ${master} >> servers/${addr}.conf
240	done
241	if [ "${zone}" != "" ] ; then
242		echo "www.${zone}. ${ttl} a 127.0.0.1" >> master/${file}.db
243		echo "www.${zone}. ${ttl} aaaa ::1" >> master/${file}.db
244		echo "${zone}. ${ttl} mx 10 mail.${zone}." >> master/${file}.db
245		echo "mail.${zone}. ${ttl} a 127.0.0.1" >> master/${file}.db
246		echo "mail.${zone}. ${ttl} aaaa ::1" >> master/${file}.db
247		echo "*.big.${zone}. ${ttl} txt (" >> master/${file}.db
248		i=0
249		while [ $i -lt 150 ]
250		do
251			echo "1234567890" >> master/${file}.db
252			i=$(($i + 1))
253		done
254		echo ")" >> master/${file}.db
255		echo "*.medium.${zone}. ${ttl} txt (" >> master/${file}.db
256		i=0
257		while [ $i -lt 120 ]
258		do
259			echo "1234567890" >> master/${file}.db
260			i=$(($i + 1))
261		done
262		echo ")" >> master/${file}.db
263		echo "*.medium.${zone}. ${ttl} txt (" >> master/${file}.db
264		i=0
265		while [ $i -lt 120 ]
266		do
267			echo "1234567890" >> master/${file}.db
268			i=$(($i + 1))
269		done
270		echo ")" >> master/${file}.db
271	fi
272done
273