tests.sh revision 1.1.1.1
1#!/bin/sh
2#
3# Copyright (C) Internet Systems Consortium, Inc. ("ISC")
4#
5# This Source Code Form is subject to the terms of the Mozilla Public
6# License, v. 2.0. If a copy of the MPL was not distributed with this
7# file, You can obtain one at http://mozilla.org/MPL/2.0/.
8#
9# See the COPYRIGHT file distributed with this work for additional
10# information regarding copyright ownership.
11
12SYSTEMTESTTOP=..
13. $SYSTEMTESTTOP/conf.sh
14
15DIGOPTS="+tcp +nosea +nostat +nocmd +norec +noques +noauth +noadd +nostats +dnssec -p ${PORT}"
16RNDCCMD="$RNDC -c $SYSTEMTESTTOP/common/rndc.conf -p ${CONTROLPORT} -s"
17
18status=0
19n=0
20
21echo_i "checking normally loaded zone ($n)"
22ret=0
23$DIG $DIGOPTS @10.53.0.2 a.normal.example a > dig.out.ns2.$n || ret=1
24grep 'status: NOERROR' dig.out.ns2.$n > /dev/null || ret=1
25grep '^a.normal.example' dig.out.ns2.$n > /dev/null || ret=1
26n=`expr $n + 1`
27if [ $ret != 0 ]; then echo_i "failed"; fi
28status=`expr $status + $ret`
29
30# When LMDB support is compiled in, this tests that migration from
31# NZF to NZD occurs during named startup
32echo_i "checking previously added zone ($n)"
33ret=0
34$DIG $DIGOPTS @10.53.0.2 a.previous.example a > dig.out.ns2.$n || ret=1
35grep 'status: NOERROR' dig.out.ns2.$n > /dev/null || ret=1
36grep '^a.previous.example' dig.out.ns2.$n > /dev/null || ret=1
37n=`expr $n + 1`
38if [ $ret != 0 ]; then echo_i "failed"; fi
39status=`expr $status + $ret`
40
41if [ -n "$NZD" ]; then
42    echo_i "checking that existing NZF file was renamed after migration ($n)"
43    [ -e ns2/3bf305731dd26307.nzf~ ] || ret=1
44    n=`expr $n + 1`
45    if [ $ret != 0 ]; then echo_i "failed"; fi
46    status=`expr $status + $ret`
47fi
48
49echo_i "adding new zone ($n)"
50ret=0
51$RNDCCMD 10.53.0.2 addzone 'added.example { type master; file "added.db"; };' 2>&1 | sed 's/^/I:ns2 /'
52$DIG $DIGOPTS @10.53.0.2 a.added.example a > dig.out.ns2.$n || ret=1
53grep 'status: NOERROR' dig.out.ns2.$n > /dev/null || ret=1
54grep '^a.added.example' dig.out.ns2.$n > /dev/null || ret=1
55n=`expr $n + 1`
56if [ $ret != 0 ]; then echo_i "failed"; fi
57status=`expr $status + $ret`
58
59echo_i "checking addzone errors are logged correctly"
60ret=0
61$RNDCCMD 10.53.0.2 addzone bad.example '{ type mister; };' 2>&1 | grep 'unexpected token' > /dev/null 2>&1 || ret=1
62grep "addzone: 'mister' unexpected" ns2/named.run >/dev/null 2>&1 || ret=1
63n=`expr $n + 1`
64if [ $ret != 0 ]; then echo_i "failed"; fi
65status=`expr $status + $ret`
66
67echo_i "checking modzone errors are logged correctly"
68ret=0
69$RNDCCMD 10.53.0.2 modzone added.example '{ type mister; };' 2>&1 | grep 'unexpected token' > /dev/null 2>&1 || ret=1
70grep "modzone: 'mister' unexpected" ns2/named.run >/dev/null 2>&1 || ret=1
71n=`expr $n + 1`
72if [ $ret != 0 ]; then echo_i "failed"; fi
73status=`expr $status + $ret`
74
75echo_i "adding a zone that requires quotes ($n)"
76ret=0
77$RNDCCMD 10.53.0.2 addzone '"32/1.0.0.127-in-addr.added.example" { check-names ignore; type master; file "added.db"; };' 2>&1 | sed 's/^/I:ns2 /'
78$DIG $DIGOPTS @10.53.0.2 "a.32/1.0.0.127-in-addr.added.example" a > dig.out.ns2.$n || ret=1
79grep 'status: NOERROR' dig.out.ns2.$n > /dev/null || ret=1
80grep '^a.32/1.0.0.127-in-addr.added.example' dig.out.ns2.$n > /dev/null || ret=1
81n=`expr $n + 1`
82if [ $ret != 0 ]; then echo_i "failed"; fi
83status=`expr $status + $ret`
84
85echo_i "adding a zone with a quote in the name ($n)"
86ret=0
87$RNDCCMD 10.53.0.2 addzone '"foo\"bar.example" { check-names ignore; type master; file "added.db"; };' 2>&1 | sed 's/^/I:ns2 /'
88$DIG $DIGOPTS @10.53.0.2 "a.foo\"bar.example" a > dig.out.ns2.$n || ret=1
89grep 'status: NOERROR' dig.out.ns2.$n > /dev/null || ret=1
90grep '^a.foo\\"bar.example' dig.out.ns2.$n > /dev/null || ret=1
91n=`expr $n + 1`
92if [ $ret != 0 ]; then echo_i "failed"; fi
93status=`expr $status + $ret`
94
95echo_i "adding new zone with missing master file ($n)"
96ret=0
97$DIG $DIGOPTS +all @10.53.0.2 a.missing.example a > dig.out.ns2.pre.$n || ret=1
98grep "status: REFUSED" dig.out.ns2.pre.$n > /dev/null || ret=1
99$RNDCCMD 10.53.0.2 addzone 'missing.example { type master; file "missing.db"; };' 2> rndc.out.ns2.$n
100grep "file not found" rndc.out.ns2.$n > /dev/null || ret=1
101$DIG $DIGOPTS +all @10.53.0.2 a.missing.example a > dig.out.ns2.post.$n || ret=1
102grep "status: REFUSED" dig.out.ns2.post.$n > /dev/null || ret=1
103digcomp dig.out.ns2.pre.$n dig.out.ns2.post.$n || ret=1
104n=`expr $n + 1`
105if [ $ret != 0 ]; then echo_i "failed"; fi
106status=`expr $status + $ret`
107
108if [ -z "$NZD" ]; then
109    echo_i "verifying no comments in NZF file ($n)"
110    ret=0
111    hcount=`grep "^# New zone file for view: _default" ns2/3bf305731dd26307.nzf | wc -l`
112    [ $hcount -eq 0 ] || ret=1
113    n=`expr $n + 1`
114    if [ $ret != 0 ]; then echo_i "failed"; fi
115    status=`expr $status + $ret`
116fi
117
118echo_i "checking rndc showzone with previously added zone ($n)"
119ret=0
120$RNDCCMD 10.53.0.2 showzone previous.example > rndc.out.ns2.$n
121expected='zone "previous.example" { type master; file "previous.db"; };'
122[ "`cat rndc.out.ns2.$n`" = "$expected" ] || ret=1
123n=`expr $n + 1`
124if [ $ret != 0 ]; then echo_i "failed"; fi
125status=`expr $status + $ret`
126
127if [ -n "$NZD" ]; then
128    echo_i "checking zone is present in NZD ($n)"
129    ret=0
130    $NZD2NZF ns2/_default.nzd | grep previous.example > /dev/null || ret=1
131    if [ $ret != 0 ]; then echo_i "failed"; fi
132    status=`expr $status + $ret`
133fi
134
135echo_i "deleting previously added zone ($n)"
136ret=0
137$RNDCCMD 10.53.0.2 delzone previous.example 2>&1 | sed 's/^/I:ns2 /'
138$DIG $DIGOPTS @10.53.0.2 a.previous.example a > dig.out.ns2.$n
139grep 'status: REFUSED' dig.out.ns2.$n > /dev/null || ret=1
140grep '^a.previous.example' dig.out.ns2.$n > /dev/null && ret=1
141n=`expr $n + 1`
142if [ $ret != 0 ]; then echo_i "failed"; fi
143status=`expr $status + $ret`
144
145if [ -n "$NZD" ]; then
146    echo_i "checking zone was deleted from NZD ($n)"
147    for i in 0 1 2 3 4 5 6 7 8 9; do
148        ret=0
149        $NZD2NZF ns2/_default.nzd | grep previous.example > /dev/null && ret=1
150        [ $ret = 0 ] && break
151        sleep 1
152    done
153    if [ $ret != 0 ]; then echo_i "failed"; fi
154    status=`expr $status + $ret`
155fi
156
157if [ -z "$NZD" ]; then
158    echo_i "checking NZF file now has comment ($n)"
159    ret=0
160    hcount=`grep "^# New zone file for view: _default" ns2/3bf305731dd26307.nzf | wc -l`
161    [ $hcount -eq 1 ] || ret=1
162    n=`expr $n + 1`
163    if [ $ret != 0 ]; then echo_i "failed"; fi
164    status=`expr $status + $ret`
165fi
166
167echo_i "deleting newly added zone added.example ($n)"
168ret=0
169$RNDCCMD 10.53.0.2 delzone added.example 2>&1 | sed 's/^/I:ns2 /'
170$DIG $DIGOPTS @10.53.0.2 a.added.example a > dig.out.ns2.$n
171grep 'status: REFUSED' dig.out.ns2.$n > /dev/null || ret=1
172grep '^a.added.example' dig.out.ns2.$n > /dev/null && ret=1
173n=`expr $n + 1`
174if [ $ret != 0 ]; then echo_i "failed"; fi
175status=`expr $status + $ret`
176
177echo_i "deleting newly added zone with escaped quote ($n)"
178ret=0
179$RNDCCMD 10.53.0.2 delzone "foo\\\"bar.example" 2>&1 | sed 's/^/I:ns2 /'
180$DIG $DIGOPTS @10.53.0.2 "a.foo\"bar.example" a > dig.out.ns2.$n
181grep 'status: REFUSED' dig.out.ns2.$n > /dev/null || ret=1
182grep "^a.foo\"bar.example" dig.out.ns2.$n > /dev/null && ret=1
183n=`expr $n + 1`
184if [ $ret != 0 ]; then echo_i "failed"; fi
185status=`expr $status + $ret`
186
187echo_i "checking rndc showzone with a normally-loaded zone ($n)"
188ret=0
189$RNDCCMD 10.53.0.2 showzone normal.example > rndc.out.ns2.$n
190expected='zone "normal.example" { type master; file "normal.db"; };'
191[ "`cat rndc.out.ns2.$n`" = "$expected" ] || ret=1
192n=`expr $n + 1`
193if [ $ret != 0 ]; then echo_i "failed"; fi
194status=`expr $status + $ret`
195
196echo_i "checking rndc showzone with a normally-loaded zone with trailing dot ($n)"
197ret=0
198$RNDCCMD 10.53.0.2 showzone finaldot.example > rndc.out.ns2.$n
199expected='zone "finaldot.example." { type master; file "normal.db"; };'
200[ "`cat rndc.out.ns2.$n`" = "$expected" ] || ret=1
201n=`expr $n + 1`
202if [ $ret != 0 ]; then echo_i "failed"; fi
203status=`expr $status + $ret`
204
205echo_i "checking rndc showzone with a normally-loaded redirect zone ($n)"
206ret=0
207$RNDCCMD 10.53.0.1 showzone -redirect > rndc.out.ns1.$n
208expected='zone "." { type redirect; file "redirect.db"; };'
209[ "`cat rndc.out.ns1.$n`" = "$expected" ] || ret=1
210n=`expr $n + 1`
211if [ $ret != 0 ]; then echo_i "failed"; fi
212status=`expr $status + $ret`
213
214echo_i "checking rndc zonestatus with a normally-loaded redirect zone ($n)"
215ret=0
216$RNDCCMD 10.53.0.1 zonestatus -redirect > rndc.out.ns1.$n
217grep "type: redirect" rndc.out.ns1.$n > /dev/null || ret=1
218grep "serial: 0" rndc.out.ns1.$n > /dev/null || ret=1
219n=`expr $n + 1`
220if [ $ret != 0 ]; then echo_i "failed"; fi
221status=`expr $status + $ret`
222
223echo_i "checking rndc reload with a normally-loaded redirect zone ($n)"
224ret=0
225sleep 1
226cp -f ns1/redirect.db.2 ns1/redirect.db
227$RNDCCMD 10.53.0.1 reload -redirect > rndc.out.ns1.$n
228$RNDCCMD 10.53.0.1 zonestatus -redirect > zonestatus.out.ns1.$n
229grep "type: redirect" zonestatus.out.ns1.$n > /dev/null || ret=1
230grep "serial: 1" zonestatus.out.ns1.$n > /dev/null || ret=1
231n=`expr $n + 1`
232if [ $ret != 0 ]; then echo_i "failed"; fi
233status=`expr $status + $ret`
234
235echo_i "delete a normally-loaded zone ($n)"
236ret=0
237$RNDCCMD 10.53.0.2 delzone normal.example > rndc.out.ns2.$n 2>&1
238$DIG $DIGOPTS @10.53.0.2 a.normal.example a > dig.out.ns2.$n
239grep "is no longer active and will be deleted" rndc.out.ns2.$n > /dev/null || ret=1
240grep "To keep it from returning when the server is restarted" rndc.out.ns2.$n > /dev/null || ret=1
241grep "must also be removed from named.conf." rndc.out.ns2.$n > /dev/null || ret=1
242
243grep 'status: REFUSED' dig.out.ns2.$n > /dev/null || ret=1
244n=`expr $n + 1`
245if [ $ret != 0 ]; then echo_i "failed"; fi
246status=`expr $status + $ret`
247
248echo_i "attempting to add master zone with inline signing ($n)"
249$RNDCCMD 10.53.0.2 addzone 'inline.example { type master; file "inline.db"; inline-signing yes; };' 2>&1 | sed 's/^/I:ns2 /'
250for i in 1 2 3 4 5
251do
252ret=0
253$DIG $DIGOPTS @10.53.0.2 a.inline.example a > dig.out.ns2.$n || ret=1
254grep 'status: NOERROR' dig.out.ns2.$n > /dev/null || ret=1
255grep '^a.inline.example' dig.out.ns2.$n > /dev/null || ret=1
256[ $ret = 0 ] && break
257sleep 1
258done
259n=`expr $n + 1`
260if [ $ret != 0 ]; then echo_i "failed"; fi
261status=`expr $status + $ret`
262
263echo_i "attempting to add master zone with inline signing and missing master ($n)"
264ret=0
265$RNDCCMD 10.53.0.2 addzone 'inlinemissing.example { type master; file "missing.db"; inline-signing yes; };' 2> rndc.out.ns2.$n
266grep "file not found" rndc.out.ns2.$n > /dev/null || ret=1
267n=`expr $n + 1`
268if [ $ret != 0 ]; then echo_i "failed"; fi
269status=`expr $status + $ret`
270
271echo_i "attempting to add slave zone with inline signing ($n)"
272$RNDCCMD 10.53.0.2 addzone 'inlineslave.example { type slave; masters { 10.53.0.1; }; file "inlineslave.bk"; inline-signing yes; };' 2>&1 | sed 's/^/I:ns2 /'
273for i in 1 2 3 4 5
274do
275ret=0
276$DIG $DIGOPTS @10.53.0.2 a.inlineslave.example a > dig.out.ns2.$n || ret=1
277grep 'status: NOERROR' dig.out.ns2.$n > /dev/null || ret=1
278grep '^a.inlineslave.example' dig.out.ns2.$n > /dev/null || ret=1
279[ $ret = 0 ] && break
280sleep 1
281done
282n=`expr $n + 1`
283if [ $ret != 0 ]; then echo_i "failed"; fi
284status=`expr $status + $ret`
285
286echo_i "attempting to delete slave zone with inline signing ($n)"
287ret=0
288for i in 0 1 2 3 4 5 6 7 8 9
289do
290	test -f ns2/inlineslave.bk.signed -a -f ns2/inlineslave.bk && break
291	sleep 1
292done
293$RNDCCMD 10.53.0.2 delzone inlineslave.example 2>&1 > rndc.out2.test$n
294test -f inlineslave.bk ||
295grep '^inlineslave.bk$' rndc.out2.test$n > /dev/null || {
296	echo_i "failed to report inlineslave.bk"; ret=1;
297}
298test ! -f inlineslave.bk.signed ||
299grep '^inlineslave.bk.signed$' rndc.out2.test$n > /dev/null || {
300	echo_i "failed to report inlineslave.bk.signed"; ret=1;
301}
302n=`expr $n + 1`
303status=`expr $status + $ret`
304
305echo_i "restoring slave zone with inline signing ($n)"
306$RNDCCMD 10.53.0.2 addzone 'inlineslave.example { type slave; masters { 10.53.0.1; }; file "inlineslave.bk"; inline-signing yes; };' 2>&1 | sed 's/^/I:ns2 /'
307for i in 1 2 3 4 5
308do
309ret=0
310$DIG $DIGOPTS @10.53.0.2 a.inlineslave.example a > dig.out.ns2.$n || ret=1
311grep 'status: NOERROR' dig.out.ns2.$n > /dev/null || ret=1
312grep '^a.inlineslave.example' dig.out.ns2.$n > /dev/null || ret=1
313[ $ret = 0 ] && break
314sleep 1
315done
316n=`expr $n + 1`
317if [ $ret != 0 ]; then echo_i "failed"; fi
318status=`expr $status + $ret`
319
320echo_i "deleting slave zone with automatic zone file removal ($n)"
321ret=0
322for i in 0 1 2 3 4 5 6 7 8 9
323do
324	test -f ns2/inlineslave.bk.signed -a -f ns2/inlineslave.bk && break
325	sleep 1
326done
327$RNDCCMD 10.53.0.2 delzone -clean inlineslave.example 2>&1 > /dev/null
328for i in 0 1 2 3 4 5 6 7 8 9
329do
330        ret=0
331	test -f ns2/inlineslave.bk.signed -a -f ns2/inlineslave.bk && ret=1
332        [ $ret = 0 ] && break
333	sleep 1
334done
335n=`expr $n + 1`
336status=`expr $status + $ret`
337
338echo_i "modifying zone configuration ($n)"
339ret=0
340$RNDCCMD 10.53.0.2 addzone 'mod.example { type master; file "added.db"; };' 2>&1 | sed 's/^/I:ns2 /'
341$DIG +norec $DIGOPTS @10.53.0.2 mod.example ns > dig.out.ns2.1.$n || ret=1
342grep 'status: NOERROR' dig.out.ns2.1.$n > /dev/null || ret=1
343$RNDCCMD 10.53.0.2 modzone 'mod.example { type master; file "added.db"; allow-query { none; }; };' 2>&1 | sed 's/^/I:ns2 /'
344$DIG +norec $DIGOPTS @10.53.0.2 mod.example ns > dig.out.ns2.2.$n || ret=1
345$RNDCCMD 10.53.0.2 showzone mod.example | grep 'allow-query { "none"; };' > /dev/null 2>&1 || ret=1
346n=`expr $n + 1`
347if [ $ret != 0 ]; then echo_i "failed"; fi
348status=`expr $status + $ret`
349
350echo_i "check that adding a 'stub' zone works ($n)"
351ret=0
352$RNDCCMD 10.53.0.2 addzone 'stub.example { type stub; masters { 1.2.3.4; }; file "stub.example.bk"; };' > rndc.out.ns2.$n 2>&1 || ret=1
353n=`expr $n + 1`
354if [ $ret != 0 ]; then echo_i "failed"; fi
355status=`expr $status + $ret`
356
357echo_i "check that adding a 'static-stub' zone works ($n)"
358ret=0
359$RNDCCMD 10.53.0.2 addzone 'static-stub.example { type static-stub; server-addresses { 1.2.3.4; }; };' > rndc.out.ns2.$n 2>&1 || ret=1
360n=`expr $n + 1`
361if [ $ret != 0 ]; then echo_i "failed"; fi
362status=`expr $status + $ret`
363
364echo_i "check that adding a 'master redirect' zone works ($n)"
365ret=0
366$RNDCCMD 10.53.0.2 addzone '"." { type redirect; file "redirect.db"; };' > rndc.out.ns2.$n 2>&1 || ret=1
367$RNDCCMD 10.53.0.2 showzone -redirect > showzone.out.ns2.$n 2>&1 || ret=1
368grep "type redirect;" showzone.out.ns2.$n > /dev/null || ret=1
369$RNDCCMD 10.53.0.2 zonestatus -redirect > zonestatus.out.ns2.$n 2>&1 || ret=1
370grep "type: redirect" zonestatus.out.ns2.$n > /dev/null || ret=1
371grep "serial: 0" zonestatus.out.ns2.$n > /dev/null || ret=1
372n=`expr $n + 1`
373if [ $ret != 0 ]; then echo_i "failed"; fi
374
375echo_i "check that reloading a added 'master redirect' zone works ($n)"
376ret=0
377sleep 1
378cp -f ns2/redirect.db.2 ns2/redirect.db
379$RNDCCMD 10.53.0.2 reload -redirect > rndc.out.ns2.$n
380$RNDCCMD 10.53.0.2 zonestatus -redirect > zonestatus.out.ns2.$n 2>&1 || ret=1
381grep "type: redirect" zonestatus.out.ns2.$n > /dev/null || ret=1
382grep "serial: 1" zonestatus.out.ns2.$n > /dev/null || ret=1
383n=`expr $n + 1`
384if [ $ret != 0 ]; then echo_i "failed"; fi
385
386echo_i "check that retransfer of a added 'master redirect' zone fails ($n)"
387ret=0
388$RNDCCMD 10.53.0.2 retransfer -redirect > rndc.out.ns2.$n 2>&1 && ret=1
389n=`expr $n + 1`
390if [ $ret != 0 ]; then echo_i "failed"; fi
391
392echo_i "check that deleting a 'master redirect' zone works ($n)"
393ret=0
394$RNDCCMD 10.53.0.2 delzone -redirect > rndc.out.ns2.$n 2>&1 || ret=1
395$RNDCCMD 10.53.0.2 showzone -redirect > showzone.out.ns2.$n 2>&1
396grep 'not found' showzone.out.ns2.$n > /dev/null || ret=1
397n=`expr $n + 1`
398if [ $ret != 0 ]; then echo_i "failed"; fi
399status=`expr $status + $ret`
400
401echo_i "check that adding a 'slave redirect' zone works ($n)"
402ret=0
403$RNDCCMD 10.53.0.2 addzone '"." { type redirect; masters { 10.53.0.3;}; file "redirect.bk"; };' > rndc.out.ns2.$n 2>&1 || ret=1
404$RNDCCMD 10.53.0.2 showzone -redirect > showzone.out.ns2.$n 2>&1 || ret=1
405grep "type redirect;" showzone.out.ns2.$n > /dev/null || ret=1
406sleep 1
407$RNDCCMD 10.53.0.2 zonestatus -redirect > zonestatus.out.ns2.$n 2>&1 || ret=1
408grep "type: redirect" zonestatus.out.ns2.$n > /dev/null || ret=1
409grep "serial: 0" zonestatus.out.ns2.$n > /dev/null || ret=1
410n=`expr $n + 1`
411if [ $ret != 0 ]; then echo_i "failed"; fi
412status=`expr $status + $ret`
413
414echo_i "check that retransfering a added 'slave redirect' zone works ($n)"
415ret=0
416cp -f ns3/redirect.db.2 ns3/redirect.db
417$RNDCCMD 10.53.0.3 reload . > showzone.out.ns3.$n 2>&1 || ret=1
418sleep 1
419$RNDCCMD 10.53.0.2 retransfer -redirect > rndc.out.ns2.$n 2>&1 || ret=1
420sleep 1
421$RNDCCMD 10.53.0.2 zonestatus -redirect > zonestatus.out.ns2.$n 2>&1 || ret=1
422grep "type: redirect" zonestatus.out.ns2.$n > /dev/null || ret=1
423grep "serial: 1" zonestatus.out.ns2.$n > /dev/null || ret=1
424n=`expr $n + 1`
425if [ $ret != 0 ]; then echo_i "failed"; fi
426status=`expr $status + $ret`
427
428echo_i "check that deleting a 'slave redirect' zone works ($n)"
429ret=0
430$RNDCCMD 10.53.0.2 delzone -redirect > rndc.out.ns2.$n 2>&1 || ret=1
431$RNDCCMD 10.53.0.2 showzone -redirect > showzone.out.ns2.$n 2>&1
432grep 'not found' showzone.out.ns2.$n > /dev/null || ret=1
433n=`expr $n + 1`
434if [ $ret != 0 ]; then echo_i "failed"; fi
435status=`expr $status + $ret`
436
437echo_i "check that zone type 'hint' is properly rejected ($n)"
438ret=0
439$RNDCCMD 10.53.0.2 addzone '"." { type hint; file "hints.db"; };' > rndc.out.ns2.$n 2>&1 && ret=1
440grep "zones not supported by addzone" rndc.out.ns2.$n > /dev/null || ret=1
441n=`expr $n + 1`
442if [ $ret != 0 ]; then echo_i "failed"; fi
443status=`expr $status + $ret`
444
445echo_i "check that zone type 'forward' is properly rejected ($n)"
446ret=0
447$RNDCCMD 10.53.0.2 addzone 'forward.example { type forward; forwarders { 1.2.3.4; }; forward only; };' > rndc.out.ns2.$n 2>&1 && ret=1
448grep "zones not supported by addzone" rndc.out.ns2.$n > /dev/null || ret=1
449n=`expr $n + 1`
450if [ $ret != 0 ]; then echo_i "failed"; fi
451status=`expr $status + $ret`
452
453echo_i "check that zone type 'delegation-only' is properly rejected ($n)"
454ret=0
455$RNDCCMD 10.53.0.2 addzone 'delegation-only.example { type delegation-only; };' > rndc.out.ns2.$n 2>&1 && ret=1
456grep "zones not supported by addzone" rndc.out.ns2.$n > /dev/null || ret=1
457n=`expr $n + 1`
458if [ $ret != 0 ]; then echo_i "failed"; fi
459status=`expr $status + $ret`
460
461echo_i "check that 'in-view' zones are properly rejected ($n)"
462ret=0
463$RNDCCMD 10.53.0.2 addzone 'in-view.example { in-view "_default"; };' > rndc.out.ns2.$n 2>&1 && ret=1
464grep "zones not supported by addzone" rndc.out.ns2.$n > /dev/null || ret=1
465n=`expr $n + 1`
466if [ $ret != 0 ]; then echo_i "failed"; fi
467status=`expr $status + $ret`
468
469echo_i "reconfiguring server with multiple views"
470rm -f ns2/named.conf 
471copy_setports ns2/named2.conf.in ns2/named.conf
472$RNDCCMD 10.53.0.2 reconfig 2>&1 | sed 's/^/I:ns2 /'
473sleep 5
474
475echo_i "adding new zone to external view ($n)"
476# NOTE: The internal view has "recursion yes" set, and so queries for
477# nonexistent zones should return NOERROR.  The external view is
478# "recursion no", so queries for nonexistent zones should return
479# REFUSED.  This behavior should be the same regardless of whether
480# the zone does not exist because a) it has not yet been loaded, b)
481# it failed to load, or c) it has been deleted.
482ret=0
483$DIG +norec $DIGOPTS @10.53.0.2 -b 10.53.0.2 a.added.example a > dig.out.ns2.intpre.$n || ret=1
484grep 'status: NOERROR' dig.out.ns2.intpre.$n > /dev/null || ret=1
485$DIG +norec $DIGOPTS @10.53.0.4 -b 10.53.0.4 a.added.example a > dig.out.ns2.extpre.$n || ret=1
486grep 'status: REFUSED' dig.out.ns2.extpre.$n > /dev/null || ret=1
487$RNDCCMD 10.53.0.2 addzone 'added.example in external { type master; file "added.db"; };' 2>&1 | sed 's/^/I:ns2 /'
488$DIG +norec $DIGOPTS @10.53.0.2 -b 10.53.0.2 a.added.example a > dig.out.ns2.int.$n || ret=1
489grep 'status: NOERROR' dig.out.ns2.int.$n > /dev/null || ret=1
490$DIG +norec $DIGOPTS @10.53.0.4 -b 10.53.0.4 a.added.example a > dig.out.ns2.ext.$n || ret=1
491grep 'status: NOERROR' dig.out.ns2.ext.$n > /dev/null || ret=1
492grep '^a.added.example' dig.out.ns2.ext.$n > /dev/null || ret=1
493n=`expr $n + 1`
494if [ $ret != 0 ]; then echo_i "failed"; fi
495status=`expr $status + $ret`
496
497if [ -z "$NZD" ]; then
498    echo_i "checking new NZF file has comment ($n)"
499    ret=0
500    hcount=`grep "^# New zone file for view: external" ns2/external.nzf | wc -l`
501    [ $hcount -eq 1 ] || ret=1
502    n=`expr $n + 1`
503    if [ $ret != 0 ]; then echo_i "failed"; fi
504    status=`expr $status + $ret`
505fi
506
507if [ -n "$NZD" ]; then
508    echo_i "verifying added.example in external view created an external.nzd DB ($n)"
509    ret=0
510    [ -e ns2/external.nzd ] || ret=1
511    n=`expr $n + 1`
512    if [ $ret != 0 ]; then echo_i "failed"; fi
513    status=`expr $status + $ret`
514fi
515
516echo_i "checking rndc reload causes named to reload the external view's new zone config ($n)"
517ret=0
518$RNDCCMD 10.53.0.2 reload 2>&1 | sed 's/^/I:ns2 /'
519$DIG +norec $DIGOPTS @10.53.0.2 -b 10.53.0.2 a.added.example a > dig.out.ns2.int.$n || ret=1
520grep 'status: NOERROR' dig.out.ns2.int.$n > /dev/null || ret=1
521$DIG +norec $DIGOPTS @10.53.0.4 -b 10.53.0.4 a.added.example a > dig.out.ns2.ext.$n || ret=1
522grep 'status: NOERROR' dig.out.ns2.ext.$n > /dev/null || ret=1
523grep '^a.added.example' dig.out.ns2.ext.$n > /dev/null || ret=1
524n=`expr $n + 1`
525if [ $ret != 0 ]; then echo_i "failed"; fi
526status=`expr $status + $ret`
527
528echo_i "checking rndc showzone with newly added zone ($n)"
529# loop because showzone may complain if zones are still being
530# loaded from the NZDB at this point.
531for try in 0 1 2 3 4 5; do
532    ret=0
533$RNDCCMD 10.53.0.2 showzone added.example in external > rndc.out.ns2.$n 2>/dev/null
534    if [ -z "$NZD" ]; then
535      expected='zone "added.example" in external { type master; file "added.db"; };'
536    else
537      expected='zone "added.example" { type master; file "added.db"; };'
538    fi
539    [ "`cat rndc.out.ns2.$n`" = "$expected" ] || ret=1
540    [ $ret -eq 0 ] && break
541    sleep 1
542done
543n=`expr $n + 1`
544if [ $ret != 0 ]; then echo_i "failed"; fi
545status=`expr $status + $ret`
546
547echo_i "deleting newly added zone ($n)"
548ret=0
549$RNDCCMD 10.53.0.2 delzone 'added.example in external' 2>&1 | sed 's/^/I:ns2 /'
550$DIG $DIGOPTS @10.53.0.4 -b 10.53.0.4 a.added.example a > dig.out.ns2.$n || ret=1
551grep 'status: REFUSED' dig.out.ns2.$n > /dev/null || ret=1
552grep '^a.added.example' dig.out.ns2.$n > /dev/null && ret=1
553n=`expr $n + 1`
554if [ $ret != 0 ]; then echo_i "failed"; fi
555status=`expr $status + $ret`
556
557echo_i "attempting to add zone to internal view ($n)"
558ret=0
559$DIG +norec $DIGOPTS @10.53.0.2 -b 10.53.0.2 a.added.example a > dig.out.ns2.pre.$n || ret=1
560grep 'status: NOERROR' dig.out.ns2.pre.$n > /dev/null || ret=1
561$RNDCCMD 10.53.0.2 addzone 'added.example in internal { type master; file "added.db"; };' 2> rndc.out.ns2.$n
562grep "permission denied" rndc.out.ns2.$n > /dev/null || ret=1
563$DIG $DIGOPTS @10.53.0.2 -b 10.53.0.2 a.added.example a > dig.out.ns2.int.$n || ret=1
564grep 'status: NOERROR' dig.out.ns2.int.$n > /dev/null || ret=1
565$DIG $DIGOPTS @10.53.0.4 -b 10.53.0.4 a.added.example a > dig.out.ns2.ext.$n || ret=1
566grep 'status: REFUSED' dig.out.ns2.ext.$n > /dev/null || ret=1
567n=`expr $n + 1`
568if [ $ret != 0 ]; then echo_i "failed"; fi
569status=`expr $status + $ret`
570
571echo_i "attempting to delete a policy zone ($n)"
572ret=0
573$RNDCCMD 10.53.0.2 delzone 'policy in internal' 2> rndc.out.ns2.$n >&1
574grep 'cannot be deleted' rndc.out.ns2.$n > /dev/null || ret=1
575n=`expr $n + 1`
576if [ $ret != 0 ]; then echo_i "failed"; fi
577status=`expr $status + $ret`
578
579echo_i "adding new zone again to external view ($n)"
580ret=0
581$RNDCCMD 10.53.0.2 addzone 'added.example in external { type master; file "added.db"; };' 2>&1 | sed 's/^/I:ns2 /'
582$DIG +norec $DIGOPTS @10.53.0.2 -b 10.53.0.2 a.added.example a > dig.out.ns2.int.$n || ret=1
583grep 'status: NOERROR' dig.out.ns2.int.$n > /dev/null || ret=1
584$DIG +norec $DIGOPTS @10.53.0.4 -b 10.53.0.4 a.added.example a > dig.out.ns2.ext.$n || ret=1
585grep 'status: NOERROR' dig.out.ns2.ext.$n > /dev/null || ret=1
586grep '^a.added.example' dig.out.ns2.ext.$n > /dev/null || ret=1
587n=`expr $n + 1`
588if [ $ret != 0 ]; then echo_i "failed"; fi
589status=`expr $status + $ret`
590
591echo_i "reconfiguring server with multiple views and new-zones-directory"
592rm -f ns2/named.conf
593copy_setports ns2/named3.conf.in ns2/named.conf
594$RNDCCMD 10.53.0.2 reconfig 2>&1 | sed 's/^/I:ns2 /'
595sleep 5
596
597echo_i "checking new zone is still loaded after dir change ($n)"
598ret=0
599$DIG +norec $DIGOPTS @10.53.0.4 -b 10.53.0.4 a.added.example a > dig.out.ns2.ext.$n || ret=1
600grep 'status: NOERROR' dig.out.ns2.ext.$n > /dev/null || ret=1
601grep '^a.added.example' dig.out.ns2.ext.$n > /dev/null || ret=1
602n=`expr $n + 1`
603if [ $ret != 0 ]; then echo_i "failed"; fi
604status=`expr $status + $ret`
605
606echo_i "deleting newly added zone from external ($n)"
607ret=0
608$RNDCCMD 10.53.0.2 delzone 'added.example in external' 2>&1 | sed 's/^/I:ns2 /'
609$DIG $DIGOPTS @10.53.0.4 -b 10.53.0.4 a.added.example a > dig.out.ns2.$n || ret=1
610grep 'status: REFUSED' dig.out.ns2.$n > /dev/null || ret=1
611grep '^a.added.example' dig.out.ns2.$n > /dev/null && ret=1
612n=`expr $n + 1`
613if [ $ret != 0 ]; then echo_i "failed"; fi
614status=`expr $status + $ret`
615
616echo_i "adding new zone to directory view ($n)"
617ret=0
618$DIG +norec $DIGOPTS @10.53.0.2 -b 10.53.0.2 a.added.example a > dig.out.ns2.intpre.$n || ret=1
619grep 'status: NOERROR' dig.out.ns2.intpre.$n > /dev/null || ret=1
620$DIG +norec $DIGOPTS @10.53.0.4 -b 10.53.0.4 a.added.example a > dig.out.ns2.extpre.$n || ret=1
621grep 'status: REFUSED' dig.out.ns2.extpre.$n > /dev/null || ret=1
622$DIG +norec $DIGOPTS @10.53.0.5 -b 10.53.0.5 a.added.example a > dig.out.ns2.dirpre.$n || ret=1
623grep 'status: REFUSED' dig.out.ns2.dirpre.$n > /dev/null || ret=1
624$RNDCCMD 10.53.0.2 addzone 'added.example in directory { type master; file "added.db"; };' 2>&1 | sed 's/^/I:ns2 /'
625$DIG +norec $DIGOPTS @10.53.0.2 -b 10.53.0.2 a.added.example a > dig.out.ns2.int.$n || ret=1
626grep 'status: NOERROR' dig.out.ns2.int.$n > /dev/null || ret=1
627$DIG +norec $DIGOPTS @10.53.0.4 -b 10.53.0.4 a.added.example a > dig.out.ns2.ext.$n || ret=1
628grep 'status: REFUSED' dig.out.ns2.ext.$n > /dev/null || ret=1
629$DIG +norec $DIGOPTS @10.53.0.5 -b 10.53.0.5 a.added.example a > dig.out.ns2.dir.$n || ret=1
630grep 'status: NOERROR' dig.out.ns2.dir.$n > /dev/null || ret=1
631grep '^a.added.example' dig.out.ns2.dir.$n > /dev/null || ret=1
632n=`expr $n + 1`
633if [ $ret != 0 ]; then echo_i "failed"; fi
634status=`expr $status + $ret`
635
636if [ -n "$NZD" ]; then
637    echo_i "checking NZD file was created in new-zones-directory ($n)"
638    expect=ns2/new-zones/directory.nzd
639else
640    echo_i "checking NZF file was created in new-zones-directory ($n)"
641    expect=ns2/new-zones/directory.nzf
642fi
643$RNDCCMD 10.53.0.2 sync 'added.example IN directory' 2>&1 | sed 's/^/I:ns2 /'
644sleep 2
645[ -e "$expect" ] || ret=1
646n=`expr $n + 1`
647if [ $ret != 0 ]; then echo_i "failed"; fi
648status=`expr $status + $ret`
649
650echo_i "deleting newly added zone from directory ($n)"
651ret=0
652$RNDCCMD 10.53.0.2 delzone 'added.example in directory' 2>&1 | sed 's/^/I:ns2 /'
653$DIG $DIGOPTS @10.53.0.5 -b 10.53.0.5 a.added.example a > dig.out.ns2.$n || ret=1
654grep 'status: REFUSED' dig.out.ns2.$n > /dev/null || ret=1
655grep '^a.added.example' dig.out.ns2.$n > /dev/null && ret=1
656n=`expr $n + 1`
657if [ $ret != 0 ]; then echo_i "failed"; fi
658status=`expr $status + $ret`
659
660echo_i "ensure the configuration context is cleaned up correctly ($n)"
661ret=0
662$RNDCCMD 10.53.0.2 reconfig > /dev/null 2>&1 || ret=1
663sleep 5
664$RNDCCMD 10.53.0.2 status > /dev/null 2>&1 || ret=1
665n=`expr $n + 1`
666if [ $ret != 0 ]; then echo_i "failed"; fi
667status=`expr $status + $ret`
668
669echo_i "check delzone after reconfig failure ($n)"
670ret=0
671$RNDCCMD 10.53.0.3 addzone 'inlineslave.example. IN { type slave; file "inlineslave.db"; masterfile-format text; masters { testmaster; }; };' > /dev/null 2>&1 || ret=1
672copy_setports ns3/named2.conf.in ns3/named.conf
673$RNDCCMD 10.53.0.3 reconfig > /dev/null 2>&1 && ret=1
674sleep 5
675$RNDCCMD 10.53.0.3 delzone inlineslave.example > /dev/null 2>&1 || ret=1
676n=`expr $n + 1`
677if [ $ret != 0 ]; then echo_i "failed"; fi
678status=`expr $status + $ret`
679
680if ! $FEATURETEST --with-lmdb
681then
682    echo_i "check that addzone is fully reversed on failure (--with-lmdb=no) ($n)"
683    ret=0
684    $RNDCCMD 10.53.0.3 addzone "test1.baz" '{ type master; file "e.db"; };' > /dev/null 2>&1 || ret=1
685    $RNDCCMD 10.53.0.3 addzone "test2.baz" '{ type master; file "dne.db"; };' > /dev/null 2>&1 && ret=1
686    $RNDCCMD 10.53.0.3 addzone "test3.baz" '{ type master; file "e.db"; };' > /dev/null 2>&1 || ret=1
687    $RNDCCMD 10.53.0.3 delzone "test3.baz" > /dev/null 2>&1 || ret=1
688    grep test2.baz ns3/_default.nzf > /dev/null && ret=1
689    n=`expr $n + 1`
690    if [ $ret != 0 ]; then echo_i "failed"; fi
691    status=`expr $status + $ret`
692fi
693
694echo_i "check that named restarts with multiple added zones ($n)"
695ret=0
696$RNDCCMD 10.53.0.3 addzone "test4.baz" '{ type master; file "e.db"; };' > /dev/null 2>&1 || ret=1
697$RNDCCMD 10.53.0.3 addzone "test5.baz" '{ type master; file "e.db"; };' > /dev/null 2>&1 || ret=1
698$PERL $SYSTEMTESTTOP/stop.pl . ns3
699$PERL $SYSTEMTESTTOP/start.pl --noclean --restart --port ${PORT} . ns3 || ret=1
700$DIG $DIGOPTS @10.53.0.3 version.bind txt ch > dig.out.test$n || ret=1
701grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
702n=`expr $n + 1`
703if [ $ret != 0 ]; then echo_i "failed"; fi
704status=`expr $status + $ret`
705
706echo_i "exit status: $status"
707[ $status -eq 0 ] || exit 1
708