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