Home | History | Annotate | Line # | Download | only in catz
tests.sh revision 1.1.1.3
      1 #!/bin/sh -x
      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 
     12 set -e
     13 
     14 # shellcheck source=conf.sh
     15 SYSTEMTESTTOP=..
     16 . "$SYSTEMTESTTOP/conf.sh"
     17 
     18 dig_with_opts() {
     19 	"$DIG" -p "${PORT}" "$@"
     20 }
     21 
     22 rndccmd() (
     23 	"$RNDC" -c "$SYSTEMTESTTOP/common/rndc.conf" -p "${CONTROLPORT}" -s "$@"
     24 )
     25 
     26 _wait_for_message() (
     27 	nextpartpeek "$1" > wait_for_message.$n
     28 	grep -F "$2" wait_for_message.$n >/dev/null
     29 )
     30 
     31 wait_for_message() (
     32 	retry_quiet 20 _wait_for_message "$@"
     33 )
     34 
     35 _wait_for_rcode() (
     36 	rcode="$1"
     37 	qtype="$2"
     38 	ns="$3"
     39 	qname="$4"
     40 	file="$5"
     41 	shift 5
     42 	dig_with_opts "$ns" "$qtype" "$qname" "$@" >"$file" || return 1
     43 	grep "status: $rcode" "$file" >/dev/null
     44 )
     45 
     46 wait_for_rcode() (
     47 	retry_quiet 10 _wait_for_rcode "$@"
     48 )
     49 
     50 wait_for_soa() (
     51 	wait_for_rcode NOERROR SOA "$@"
     52 )
     53 
     54 wait_for_a() (
     55 	wait_for_rcode NOERROR A "$@"
     56 )
     57 
     58 wait_for_no_soa() {
     59 	wait_for_rcode REFUSED SOA "$@"
     60 }
     61 
     62 _wait_for_zonefile() (
     63 	# shellcheck disable=SC2234
     64 	[ -f "$1" ]
     65 )
     66 
     67 wait_for_zonefile() (
     68 	retry_quiet 10 _wait_for_zonefile "$@"
     69 )
     70 
     71 _wait_for_no_zonefile() (
     72 	# shellcheck disable=SC2234
     73 	[ ! -f "$1" ]
     74 )
     75 
     76 wait_for_no_zonefile() (
     77 	retry_quiet 10 _wait_for_no_zonefile "$@"
     78 )
     79 
     80 status=0
     81 n=0
     82 ##########################################################################
     83 echo_i "Testing adding/removing of domain in catalog zone"
     84 n=$((n+1))
     85 echo_i "checking that dom1.example. is not served by master ($n)"
     86 ret=0
     87 wait_for_no_soa @10.53.0.1 dom1.example. dig.out.test$n || ret=1
     88 if [ $ret -ne 0 ]; then echo_i "failed"; fi
     89 status=$((status+ret))
     90 
     91 n=$((n+1))
     92 echo_i "Adding a domain dom1.example. to master via RNDC ($n)"
     93 ret=0
     94 echo "@ 3600 IN SOA . . 1 3600 3600 3600 3600" > ns1/dom1.example.db
     95 echo "@ IN NS invalid." >> ns1/dom1.example.db
     96 rndccmd 10.53.0.1 addzone dom1.example. '{type master; file "dom1.example.db";};' || ret=1
     97 if [ $ret -ne 0 ]; then echo_i "failed"; fi
     98 status=$((status+ret))
     99 
    100 n=$((n+1))
    101 echo_i "checking that dom1.example. is now served by master ($n)"
    102 ret=0
    103 wait_for_soa @10.53.0.1 dom1.example. dig.out.test$n || ret=1
    104 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    105 status=$((status+ret))
    106 
    107 nextpart ns2/named.run >/dev/null
    108 
    109 n=$((n+1))
    110 echo_i "Adding domain dom1.example. to catalog1 zone ($n)"
    111 ret=0
    112 $NSUPDATE -d <<END >> nsupdate.out.test$n 2>&1 || ret=1
    113     server 10.53.0.1 ${PORT}
    114     update add e721433b6160b450260d4f54b3ec8bab30cb3b83.zones.catalog1.example. 3600 IN PTR dom1.example.
    115     send
    116 END
    117 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    118 status=$((status+ret))
    119 
    120 n=$((n+1))
    121 echo_i "waiting for slave to sync up ($n)"
    122 ret=0
    123 wait_for_message ns2/named.run "catz: adding zone 'dom1.example' from catalog 'catalog1.example'" &&
    124 wait_for_message ns2/named.run "transfer of 'dom1.example/IN' from 10.53.0.1#${PORT}: Transfer status: success" || ret=1
    125 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    126 status=$((status+ret))
    127 
    128 n=$((n+1))
    129 echo_i "checking that dom1.example. is served by slave ($n)"
    130 ret=0
    131 wait_for_soa @10.53.0.2 dom1.example. dig.out.test$n || ret=1
    132 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    133 status=$((status+ret))
    134 
    135 n=$((n+1))
    136 echo_i "checking that zone-directory is populated ($n)"
    137 ret=0
    138 wait_for_zonefile "ns2/zonedir/__catz___default_catalog1.example_dom1.example.db" || ret=1
    139 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    140 status=$((status+ret))
    141 
    142 n=$((n+1))
    143 echo_i "removing domain dom1.example. from catalog1 zone ($n)"
    144 ret=0
    145 $NSUPDATE -d <<END >> nsupdate.out.test$n 2>&1 || ret=1
    146    server 10.53.0.1 ${PORT}
    147    update delete e721433b6160b450260d4f54b3ec8bab30cb3b83.zones.catalog1.example
    148    send
    149 END
    150 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    151 status=$((status+ret))
    152 
    153 n=$((n+1))
    154 echo_i "waiting for slave to sync up ($n)"
    155 ret=0
    156 wait_for_message ns2/named.run "zone_shutdown: zone dom1.example/IN: shutting down" || ret=1
    157 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    158 status=$((status+ret))
    159 
    160 n=$((n+1))
    161 echo_i "checking that dom1.example. is not served by slave ($n)"
    162 ret=0
    163 wait_for_no_soa @10.53.0.2 dom1.example. dig.out.test$n || ret=1
    164 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    165 status=$((status+ret))
    166 
    167 n=$((n+1))
    168 echo_i "checking that zone-directory is emptied ($n)"
    169 ret=0
    170 wait_for_no_zonefile "ns2/zonedir/__catz___default_catalog1.example_dom1.example.db" || ret=1
    171 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    172 status=$((status+ret))
    173 
    174 ##########################################################################
    175 echo_i "Testing various simple operations on domains, including using multiple catalog zones and garbage in zone"
    176 n=$((n+1))
    177 echo_i "adding domain dom2.example. to master via RNDC ($n)"
    178 ret=0
    179 echo "@ 3600 IN SOA . . 1 3600 3600 3600 3600" > ns1/dom2.example.db
    180 echo "@ IN NS invalid." >> ns1/dom2.example.db
    181 rndccmd 10.53.0.1 addzone dom2.example. '{type master; file "dom2.example.db";};' || ret=1
    182 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    183 status=$((status+ret))
    184 
    185 n=$((n+1))
    186 echo_i "adding domain dom4.example. to master via RNDC ($n)"
    187 ret=0
    188 echo "@ 3600 IN SOA . . 1 3600 3600 3600 3600" > ns1/dom4.example.db
    189 echo "@ IN NS invalid." >> ns1/dom4.example.db
    190 rndccmd 10.53.0.1 addzone dom4.example. '{type master; file "dom4.example.db";};' || ret=1
    191 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    192 status=$((status+ret))
    193 
    194 n=$((n+1))
    195 echo_i "adding domains dom2.example, dom3.example. and some garbage to catalog1 zone ($n)"
    196 ret=0
    197 $NSUPDATE -d <<END >> nsupdate.out.test$n 2>&1 || ret=1
    198     server 10.53.0.1 ${PORT}
    199     update add 636722929740e507aaf27c502812fc395d30fb17.zones.catalog1.example. 3600 IN PTR dom2.example.
    200     update add b901f492f3ebf6c1e5b597e51766f02f0479eb03.zones.catalog1.example. 3600 IN PTR dom3.example.
    201     update add e721433b6160b450260d4f54b3ec8bab30cb3b83.zones.catalog1.example. 3600 IN NS foo.bar.
    202     update add trash.catalog1.example. 3600 IN A 1.2.3.4
    203     update add trash2.foo.catalog1.example. 3600 IN A 1.2.3.4
    204     update add trash3.zones.catalog1.example. 3600 IN NS a.dom2.example.
    205     update add foobarbaz.b901f492f3ebf6c1e5b597e51766f02f0479eb03.zones.catalog1.example. 3600 IN PTR dom3.example.
    206     update add blahblah.636722929740e507aaf27c502812fc395d30fb17.zones.catalog1.example. 3600 IN PTR dom2.example.
    207     update add foobarbaz.b901f492f3ebf6c1e5b597e51766f02f0479eb03.zones.catalog1.example. 3600 IN APL 1:1.2.3.4/30
    208     update add blahblah.636722929740e507aaf27c502812fc395d30fb17.zones.catalog1.example. 3600 IN TXT "blah blah"
    209     update add version.catalog1.example. 3600 IN A 1.2.3.4
    210     send
    211 
    212 END
    213 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    214 status=$((status+ret))
    215 
    216 n=$((n+1))
    217 echo_i "adding domain dom4.example. to catalog2 zone ($n)"
    218 ret=0
    219 $NSUPDATE -d <<END >> nsupdate.out.test$n 2>&1 || ret=1
    220     server 10.53.0.3 ${PORT}
    221     update add de26b88d855397a03f77ff1162fd055d8b419584.zones.catalog2.example. 3600 IN PTR dom4.example.
    222     send
    223 END
    224 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    225 status=$((status+ret))
    226 
    227 
    228 n=$((n+1))
    229 echo_i "waiting for slave to sync up ($n)"
    230 ret=0
    231 wait_for_message ns2/named.run "catz: adding zone 'dom4.example' from catalog 'catalog2.example'" &&
    232 wait_for_message ns2/named.run "transfer of 'dom4.example/IN' from 10.53.0.1#${EXTRAPORT1}: Transfer status: success" || ret=1
    233 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    234 status=$((status+ret))
    235 
    236 n=$((n+1))
    237 echo_i "checking that dom4.example. is served by slave ($n)"
    238 ret=0
    239 wait_for_soa @10.53.0.2 dom4.example. dig.out.test$n || ret=1
    240 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    241 status=$((status+ret))
    242 
    243 
    244 n=$((n+1))
    245 echo_i "checking that dom3.example. is not served by master ($n)"
    246 ret=0
    247 wait_for_no_soa @10.53.0.1 dom3.example. dig.out.test$n || ret=1
    248 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    249 status=$((status+ret))
    250 
    251 n=$((n+1))
    252 echo_i "adding a domain dom3.example. to master via RNDC ($n)"
    253 ret=0
    254 echo "@ 3600 IN SOA . . 1 3600 3600 3600 3600" > ns1/dom3.example.db
    255 echo "@ IN NS invalid." >> ns1/dom3.example.db
    256 rndccmd 10.53.0.1 addzone dom3.example. '{type master; file "dom3.example.db"; also-notify { 10.53.0.2; }; notify explicit; };' || ret=1
    257 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    258 status=$((status+ret))
    259 
    260 n=$((n+1))
    261 echo_i "checking that dom3.example. is served by master ($n)"
    262 ret=0
    263 wait_for_soa  @10.53.0.1 dom3.example. dig.out.test$n || ret=1
    264 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    265 status=$((status+ret))
    266 
    267 n=$((n+1))
    268 echo_i "waiting for slave to sync up ($n)"
    269 ret=0
    270 wait_for_message ns2/named.run "catz: adding zone 'dom2.example' from catalog 'catalog1.example'" &&
    271 wait_for_message ns2/named.run "catz: adding zone 'dom3.example' from catalog 'catalog1.example'" &&
    272 wait_for_message ns2/named.run  "transfer of 'dom2.example/IN' from 10.53.0.1#${PORT}: Transfer status: success" &&
    273 wait_for_message ns2/named.run  "transfer of 'dom3.example/IN' from 10.53.0.1#${PORT}: Transfer status: success" || ret=1
    274 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    275 status=$((status+ret))
    276 
    277 n=$((n+1))
    278 echo_i "checking that dom3.example. is served by slave ($n)"
    279 ret=0
    280 wait_for_soa @10.53.0.2 dom3.example. dig.out.test$n || ret=1
    281 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    282 status=$((status+ret))
    283 
    284 n=$((n+1))
    285 echo_i "removing all records from catalog1 zone ($n)"
    286 ret=0
    287 $NSUPDATE -d <<END >> nsupdate.out.test$n 2>&1 || ret=1
    288     server 10.53.0.1 ${PORT}
    289     update delete 636722929740e507aaf27c502812fc395d30fb17.zones.catalog1.example. 3600 IN PTR dom2.example.
    290     update delete b901f492f3ebf6c1e5b597e51766f02f0479eb03.zones.catalog1.example. 3600 IN PTR dom3.example.
    291     update delete e721433b6160b450260d4f54b3ec8bab30cb3b83.zones.catalog1.example. 3600 IN NS foo.bar.
    292     update delete trash.catalog1.example. 3600 IN A 1.2.3.4
    293     update delete trash2.foo.catalog1.example. 3600 IN A 1.2.3.4
    294     update delete trash3.zones.catalog1.example. 3600 IN NS a.dom2.example.
    295     update delete foobarbaz.b901f492f3ebf6c1e5b597e51766f02f0479eb03.zones.catalog1.example. 3600 IN PTR dom3.example.
    296     update delete blahblah.636722929740e507aaf27c502812fc395d30fb17.zones.catalog1.example. 3600 IN PTR dom2.example.
    297     update delete foobarbaz.b901f492f3ebf6c1e5b597e51766f02f0479eb03.zones.catalog1.example. 3600 IN APL 1:1.2.3.4/30
    298     update delete blahblah.636722929740e507aaf27c502812fc395d30fb17.zones.catalog1.example. 3600 IN TXT "blah blah"
    299     update delete version.catalog1.example. 3600 IN A 1.2.3.4
    300     send
    301 
    302 END
    303 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    304 status=$((status+ret))
    305 
    306 n=$((n+1))
    307 echo_i "removing all records from catalog2 zone ($n)"
    308 ret=0
    309 $NSUPDATE -d <<END >> nsupdate.out.test$n 2>&1 || ret=1
    310     server 10.53.0.3 ${PORT}
    311     update delete de26b88d855397a03f77ff1162fd055d8b419584.zones.catalog2.example. 3600 IN PTR dom4.example.
    312     send
    313 END
    314 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    315 status=$((status+ret))
    316 
    317 ##########################################################################
    318 echo_i "Testing masters suboption and random labels"
    319 n=$((n+1))
    320 echo_i "adding dom5.example. with a valid masters suboption (IP without TSIG) and a random label ($n)"
    321 ret=0
    322 $NSUPDATE -d <<END >> nsupdate.out.test$n 2>&1 || ret=1
    323     server 10.53.0.1 ${PORT}
    324     update add somerandomlabel.zones.catalog1.example. 3600 IN PTR dom5.example.
    325     update add masters.somerandomlabel.zones.catalog1.example. 3600 IN A 10.53.0.3
    326     send
    327 END
    328 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    329 status=$((status+ret))
    330 
    331 n=$((n+1))
    332 echo_i "waiting for slave to sync up ($n)"
    333 ret=0
    334 wait_for_message ns2/named.run  "catz: adding zone 'dom5.example' from catalog 'catalog1.example'" &&
    335 wait_for_message ns2/named.run  "transfer of 'dom5.example/IN' from 10.53.0.3#${PORT}: Transfer status: success" || ret=1
    336 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    337 status=$((status+ret))
    338 
    339 n=$((n+1))
    340 echo_i "checking that dom5.example. is served by slave ($n)"
    341 ret=0
    342 wait_for_soa @10.53.0.2 dom5.example. dig.out.test$n || ret=1
    343 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    344 status=$((status+ret))
    345 
    346 n=$((n+1))
    347 echo_i "removing dom5.example. ($n)"
    348 ret=0
    349 $NSUPDATE -d <<END >> nsupdate.out.test$n 2>&1 || ret=1
    350     server 10.53.0.1 ${PORT}
    351     update delete somerandomlabel.zones.catalog1.example. 3600 IN PTR dom5.example.
    352     update delete masters.somerandomlabel.zones.catalog1.example. 3600 IN A 10.53.0.3
    353     send
    354 END
    355 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    356 status=$((status+ret))
    357 
    358 n=$((n+1))
    359 echo_i "waiting for slave to sync up ($n)"
    360 ret=0
    361 wait_for_message ns2/named.run  "zone_shutdown: zone dom5.example/IN: shutting down" || ret=1
    362 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    363 status=$((status+ret))
    364 
    365 n=$((n+1))
    366 echo_i "checking that dom5.example. is no longer served by slave ($n)"
    367 ret=0
    368 wait_for_no_soa @10.53.0.2 dom5.example. dig.out.test$n || ret=1
    369 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    370 status=$((status+ret))
    371 
    372 
    373 ##########################################################################
    374 echo_i "Testing masters global option"
    375 n=$((n+1))
    376 echo_i "adding dom6.example. and a valid global masters option (IP without TSIG) ($n)"
    377 ret=0
    378 $NSUPDATE -d <<END >> nsupdate.out.test$n 2>&1 || ret=1
    379     server 10.53.0.1 ${PORT}
    380     update add masters.catalog1.example. 3600 IN A 10.53.0.3
    381     update add masters.catalog1.example. 3600 IN AAAA fd92:7065:b8e:ffff::3
    382     update add 4346f565b4d63ddb99e5d2497ff22d04e878e8f8.zones.catalog1.example. 3600 IN PTR dom6.example.
    383     send
    384 END
    385 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    386 status=$((status+ret))
    387 
    388 n=$((n+1))
    389 echo_i "waiting for slave to sync up ($n)"
    390 ret=0
    391 wait_for_message ns2/named.run  "catz: adding zone 'dom6.example' from catalog 'catalog1.example'" &&
    392 wait_for_message ns2/named.run  "transfer of 'dom6.example/IN' from " > /dev/null || ret=1
    393 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    394 status=$((status+ret))
    395 
    396 n=$((n+1))
    397 echo_i "checking that dom6.example. is served by slave ($n)"
    398 ret=0
    399 wait_for_soa @10.53.0.2 dom6.example. dig.out.test$n || ret=1
    400 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    401 status=$((status+ret))
    402 
    403 n=$((n+1))
    404 echo_i "removing dom6.example. ($n)"
    405 ret=0
    406 $NSUPDATE -d <<END >> nsupdate.out.test$n 2>&1 || ret=1
    407     server 10.53.0.1 ${PORT}
    408     update delete masters.catalog1.example. 3600 IN A 10.53.0.3
    409     update delete masters.catalog1.example. 3600 IN AAAA  fd92:7065:b8e:ffff::3
    410     update delete 4346f565b4d63ddb99e5d2497ff22d04e878e8f8.zones.catalog1.example. 3600 IN PTR dom6.example.
    411     send
    412 END
    413 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    414 status=$((status+ret))
    415 
    416 n=$((n+1))
    417 echo_i "waiting for slave to sync up ($n)"
    418 ret=0
    419 wait_for_message ns2/named.run  "zone_shutdown: zone dom6.example/IN: shutting down" || ret=1
    420 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    421 status=$((status+ret))
    422 
    423 n=$((n+1))
    424 echo_i "checking that dom6.example. is no longer served by slave ($n)"
    425 ret=0
    426 wait_for_no_soa @10.53.0.2 dom6.example. dig.out.test$n || ret=1
    427 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    428 status=$((status+ret))
    429 
    430 nextpart ns2/named.run >/dev/null
    431 
    432 n=$((n+1))
    433 echo_i "adding dom6.example. and an invalid global masters option (TSIG without IP) ($n)"
    434 ret=0
    435 $NSUPDATE -d <<END >> nsupdate.out.test$n 2>&1 || ret=1
    436     server 10.53.0.1 ${PORT}
    437     update add label1.masters.catalog1.example. 3600 IN TXT "tsig_key"
    438     update add 4346f565b4d63ddb99e5d2497ff22d04e878e8f8.zones.catalog1.example. 3600 IN PTR dom6.example.
    439     send
    440 END
    441 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    442 status=$((status+ret))
    443 
    444 n=$((n+1))
    445 echo_i "waiting for slave to sync up ($n)"
    446 ret=0
    447 wait_for_message ns2/named.run  "catz: adding zone 'dom6.example' from catalog 'catalog1.example'" &&
    448 wait_for_message ns2/named.run  "error \"failure\" while trying to generate config for zone \"dom6.example\"" || ret=1
    449 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    450 status=$((status+ret))
    451 
    452 n=$((n+1))
    453 echo_i "removing dom6.example. ($n)"
    454 ret=0
    455 $NSUPDATE -d <<END >> nsupdate.out.test$n 2>&1 || ret=1
    456     server 10.53.0.1 ${PORT}
    457     update delete label1.masters.catalog1.example. 3600 IN TXT "tsig_key"
    458     update delete 4346f565b4d63ddb99e5d2497ff22d04e878e8f8.zones.catalog1.example. 3600 IN PTR dom6.example.
    459     send
    460 END
    461 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    462 status=$((status+ret))
    463 
    464 n=$((n+1))
    465 echo_i "waiting for slave to sync up ($n)"
    466 ret=0
    467 wait_for_message ns2/named.run  "catz: deleting zone 'dom6.example' from catalog 'catalog1.example' - success" > /dev/null || ret=1
    468 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    469 status=$((status+ret))
    470 
    471 ##########################################################################
    472 n=$((n+1))
    473 echo_i "Checking that a missing zone directory forces in-memory ($n)"
    474 ret=0
    475 grep "'nonexistent' not found; zone files will not be saved" ns2/named.run > /dev/null || ret=1
    476 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    477 status=$((status+ret))
    478 
    479 ##########################################################################
    480 echo_i "Testing allow-query and allow-transfer ACLs"
    481 n=$((n+1))
    482 echo_i "adding domains dom7.example. and dom8.example. to master via RNDC ($n)"
    483 ret=0
    484 echo "@ 3600 IN SOA . . 1 3600 3600 3600 3600" > ns1/dom7.example.db
    485 echo "@ IN NS invalid." >> ns1/dom7.example.db
    486 rndccmd 10.53.0.1 addzone dom7.example. '{type master; file "dom7.example.db";};' || ret=1
    487 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    488 status=$((status+ret))
    489 echo "@ 3600 IN SOA . . 1 3600 3600 3600 3600" > ns1/dom8.example.db
    490 echo "@ IN NS invalid." >> ns1/dom8.example.db
    491 rndccmd 10.53.0.1 addzone dom8.example. '{type master; file "dom8.example.db";};' || ret=1
    492 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    493 status=$((status+ret))
    494 
    495 n=$((n+1))
    496 echo_i "checking that dom7.example. is now served by master ($n)"
    497 ret=0
    498 wait_for_soa @10.53.0.1 dom7.example. dig.out.test$n || ret=1
    499 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    500 status=$((status+ret))
    501 
    502 nextpart ns2/named.run >/dev/null
    503 
    504 n=$((n+1))
    505 echo_i "adding domain dom7.example. to catalog1 zone with an allow-query statement ($n)"
    506 ret=0
    507 $NSUPDATE -d <<END >> nsupdate.out.test$n 2>&1 || ret=1
    508     server 10.53.0.1 ${PORT}
    509     update add 78833ec3c0059fd4540fee81c7eaddce088e7cd7.zones.catalog1.example. 3600 IN PTR dom7.example.
    510     update add allow-query.78833ec3c0059fd4540fee81c7eaddce088e7cd7.zones.catalog1.example. 3600 IN APL 1:10.53.0.1/32 !1:10.53.0.0/30 1:0.0.0.0/0
    511     send
    512 END
    513 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    514 status=$((status+ret))
    515 
    516 n=$((n+1))
    517 echo_i "waiting for slave to sync up ($n)"
    518 ret=0
    519 wait_for_message ns2/named.run  "catz: adding zone 'dom7.example' from catalog 'catalog1.example'" > /dev/null &&
    520 wait_for_message ns2/named.run  "transfer of 'dom7.example/IN' from 10.53.0.1#${PORT}: Transfer status: success" || ret=1
    521 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    522 status=$((status+ret))
    523 
    524 n=$((n+1))
    525 echo_i "checking that dom7.example. is accessible from 10.53.0.1 ($n)"
    526 ret=0
    527 wait_for_soa @10.53.0.2 dom7.example. dig.out.test$n -b 10.53.0.1 || ret=1
    528 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    529 status=$((status+ret))
    530 
    531 n=$((n+1))
    532 echo_i "checking that dom7.example. is not accessible from 10.53.0.2 ($n)"
    533 ret=0
    534 wait_for_no_soa @10.53.0.2 dom7.example. dig.out.test$n -b 10.53.0.2 || ret=1
    535 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    536 status=$((status+ret))
    537 
    538 n=$((n+1))
    539 echo_i "checking that dom7.example. is accessible from 10.53.0.5 ($n)"
    540 ret=0
    541 wait_for_soa @10.53.0.2 dom7.example. dig.out.test$n -b 10.53.0.5 || ret=1
    542 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    543 status=$((status+ret))
    544 
    545 nextpart ns2/named.run >/dev/null
    546 n=$((n+1))
    547 echo_i "adding dom8.example. domain and global allow-query and allow-transfer ACLs ($n)"
    548 ret=0
    549 $NSUPDATE -d <<END >> nsupdate.out.test$n 2>&1 || ret=1
    550     server 10.53.0.1 ${PORT}
    551     update add cba95222e308baba42417be6021026fdf20827b6.zones.catalog1.example. 3600 IN PTR dom8.example
    552     update add allow-query.catalog1.example. 3600 IN APL 1:10.53.0.1/32
    553     update add allow-transfer.catalog1.example. 3600 IN APL 1:10.53.0.2/32
    554     send
    555 END
    556 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    557 status=$((status+ret))
    558 
    559 n=$((n+1))
    560 echo_i "waiting for slave to sync up ($n)"
    561 ret=0
    562 wait_for_message ns2/named.run  "catz: update_from_db: new zone merged" &&
    563 wait_for_message ns2/named.run  "transfer of 'dom8.example/IN' from 10.53.0.1#${PORT}: Transfer status: success" || ret=1
    564 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    565 status=$((status+ret))
    566 
    567 n=$((n+1))
    568 echo_i "checking that dom8.example. is accessible from 10.53.0.1 ($n)"
    569 ret=0
    570 wait_for_soa @10.53.0.2 dom8.example. dig.out.test$n -b 10.53.0.1 || ret=1
    571 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    572 status=$((status+ret))
    573 
    574 n=$((n+1))
    575 echo_i "checking that dom8.example. is not accessible from 10.53.0.2 ($n)"
    576 ret=0
    577 wait_for_no_soa @10.53.0.2 dom8.example. dig.out.test$n -b 10.53.0.2 || ret=1
    578 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    579 status=$((status+ret))
    580 
    581 n=$((n+1))
    582 echo_i "checking that dom8.example. is not AXFR accessible from 10.53.0.1 ($n)"
    583 ret=0
    584 dig_with_opts @10.53.0.2 axfr dom8.example. -b 10.53.0.1 > dig.out.test$n
    585 grep "Transfer failed." dig.out.test$n > /dev/null || ret=1
    586 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    587 status=$((status+ret))
    588 
    589 n=$((n+1))
    590 echo_i "checking that dom8.example. is AXFR accessible from 10.53.0.2 ($n)"
    591 ret=0
    592 dig_with_opts @10.53.0.2 axfr dom8.example. -b 10.53.0.2 > dig.out.test$n
    593 grep -v "Transfer failed." dig.out.test$n > /dev/null || ret=1
    594 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    595 status=$((status+ret))
    596 
    597 nextpart ns2/named.run >/dev/null
    598 n=$((n+1))
    599 echo_i "deleting global allow-query and allow-domain ACLs ($n)"
    600 ret=0
    601 $NSUPDATE -d <<END >> nsupdate.out.test$n 2>&1 || ret=1
    602     server 10.53.0.1 ${PORT}
    603     update delete allow-query.catalog1.example. 3600 IN APL 1:10.53.0.1/32
    604     update delete allow-transfer.catalog1.example. 3600 IN APL 1:10.53.0.2/32
    605     send
    606 END
    607 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    608 status=$((status+ret))
    609 ret=0
    610 wait_for_message ns2/named.run  "catz: update_from_db: new zone merged" || ret=1
    611 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    612 status=$((status+ret))
    613 
    614 n=$((n+1))
    615 echo_i "checking that dom8.example. is accessible from 10.53.0.1 ($n)"
    616 ret=0
    617 wait_for_soa @10.53.0.2 dom8.example. dig.out.test$n -b 10.53.0.1 || ret=1
    618 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    619 status=$((status+ret))
    620 
    621 n=$((n+1))
    622 echo_i "checking that dom8.example. is accessible from 10.53.0.2 ($n)"
    623 ret=0
    624 wait_for_soa @10.53.0.2 dom8.example. dig.out.test$n -b 10.53.0.2 || ret=1
    625 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    626 status=$((status+ret))
    627 
    628 n=$((n+1))
    629 echo_i "checking that dom8.example. is AXFR accessible from 10.53.0.1 ($n)"
    630 ret=0
    631 dig_with_opts @10.53.0.2 axfr dom8.example. -b 10.53.0.1 > dig.out.test$n
    632 grep -v "Transfer failed." dig.out.test$n > /dev/null || ret=1
    633 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    634 status=$((status+ret))
    635 
    636 n=$((n+1))
    637 echo_i "checking that dom8.example. is AXFR accessible from 10.53.0.2 ($n)"
    638 ret=0
    639 dig_with_opts @10.53.0.2 axfr dom8.example. -b 10.53.0.2 > dig.out.test$n
    640 grep -v "Transfer failed." dig.out.test$n > /dev/null || ret=1
    641 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    642 status=$((status+ret))
    643 
    644 
    645 ##########################################################################
    646 echo_i "Testing TSIG keys for masters set per-domain"
    647 n=$((n+1))
    648 echo_i "adding a domain dom9.example. to master via RNDC, with transfers allowed only with TSIG key ($n)"
    649 ret=0
    650 echo "@ 3600 IN SOA . . 1 3600 3600 3600 3600" > ns1/dom9.example.db
    651 echo "@ IN NS invalid." >> ns1/dom9.example.db
    652 rndccmd 10.53.0.1 addzone dom9.example. '{type master; file "dom9.example.db"; allow-transfer { key tsig_key; }; };' || ret=1
    653 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    654 status=$((status+ret))
    655 
    656 n=$((n+1))
    657 echo_i "checking that dom9.example. is now served by master ($n)"
    658 ret=0
    659 wait_for_soa @10.53.0.1 dom9.example. dig.out.test$n || ret=1
    660 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    661 status=$((status+ret))
    662 
    663 nextpart ns2/named.run >/dev/null
    664 
    665 n=$((n+1))
    666 echo_i "adding domain dom9.example. to catalog1 zone with a valid masters suboption (IP with TSIG) ($n)"
    667 ret=0
    668 $NSUPDATE -d <<END >> nsupdate.out.test$n 2>&1 || ret=1
    669     server 10.53.0.1 ${PORT}
    670     update add f0f989bc71c5c8ca3a1eb9c9ab5246521907e3af.zones.catalog1.example. 3600 IN PTR dom9.example.
    671     update add label1.masters.f0f989bc71c5c8ca3a1eb9c9ab5246521907e3af.zones.catalog1.example. 3600 IN A 10.53.0.1
    672     update add label1.masters.f0f989bc71c5c8ca3a1eb9c9ab5246521907e3af.zones.catalog1.example. 3600 IN TXT "tsig_key"
    673     send
    674 END
    675 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    676 status=$((status+ret))
    677 
    678 n=$((n+1))
    679 echo_i "waiting for slave to sync up ($n)"
    680 ret=0
    681 wait_for_message ns2/named.run  "catz: adding zone 'dom9.example' from catalog 'catalog1.example'" &&
    682 wait_for_message ns2/named.run  "transfer of 'dom9.example/IN' from 10.53.0.1#${PORT}: Transfer status: success" || ret=1
    683 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    684 status=$((status+ret))
    685 
    686 n=$((n+1))
    687 echo_i "checking that dom9.example. is accessible on slave ($n)"
    688 ret=0
    689 wait_for_soa @10.53.0.2 dom9.example. dig.out.test$n || ret=1
    690 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    691 status=$((status+ret))
    692 
    693 n=$((n+1))
    694 echo_i "deleting domain dom9.example. from catalog1 zone ($n)"
    695 ret=0
    696 $NSUPDATE -d <<END >> nsupdate.out.test$n 2>&1 || ret=1
    697     server 10.53.0.1 ${PORT}
    698     update delete f0f989bc71c5c8ca3a1eb9c9ab5246521907e3af.zones.catalog1.example. 3600 IN PTR dom9.example.
    699     update delete label1.masters.f0f989bc71c5c8ca3a1eb9c9ab5246521907e3af.zones.catalog1.example. 3600 IN A 10.53.0.1
    700     update delete label1.masters.f0f989bc71c5c8ca3a1eb9c9ab5246521907e3af.zones.catalog1.example. 3600 IN TXT "tsig_key"
    701     send
    702 END
    703 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    704 status=$((status+ret))
    705 
    706 n=$((n+1))
    707 echo_i "waiting for slave to sync up ($n)"
    708 ret=0
    709 wait_for_message ns2/named.run  "catz: deleting zone 'dom9.example' from catalog 'catalog1.example' - success" || ret=1
    710 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    711 status=$((status+ret))
    712 
    713 n=$((n+1))
    714 echo_i "checking that dom9.example. is no longer accessible on slave ($n)"
    715 ret=0
    716 wait_for_no_soa @10.53.0.2 dom9.example. dig.out.test$n || ret=1
    717 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    718 status=$((status+ret))
    719 
    720 nextpart ns2/named.run >/dev/null
    721 
    722 n=$((n+1))
    723 echo_i "adding domain dom9.example. to catalog1 zone with an invalid masters suboption (TSIG without IP) ($n)"
    724 ret=0
    725 $NSUPDATE -d <<END >> nsupdate.out.test$n 2>&1 || ret=1
    726     server 10.53.0.1 ${PORT}
    727     update add f0f989bc71c5c8ca3a1eb9c9ab5246521907e3af.zones.catalog1.example. 3600 IN PTR dom9.example.
    728     update add label1.masters.f0f989bc71c5c8ca3a1eb9c9ab5246521907e3af.zones.catalog1.example. 3600 IN TXT "tsig_key"
    729     send
    730 END
    731 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    732 status=$((status+ret))
    733 
    734 n=$((n+1))
    735 echo_i "waiting for slave to sync up ($n)"
    736 ret=0
    737 wait_for_message ns2/named.run  "catz: adding zone 'dom9.example' from catalog 'catalog1.example'" &&
    738 wait_for_message ns2/named.run  "error \"failure\" while trying to generate config for zone \"dom9.example\"" || ret=1
    739 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    740 status=$((status+ret))
    741 
    742 n=$((n+1))
    743 echo_i "deleting domain dom9.example. from catalog1 zone ($n)"
    744 ret=0
    745 $NSUPDATE -d <<END >> nsupdate.out.test$n 2>&1 || ret=1
    746     server 10.53.0.1 ${PORT}
    747     update delete f0f989bc71c5c8ca3a1eb9c9ab5246521907e3af.zones.catalog1.example. 3600 IN PTR dom9.example.
    748     update delete label1.masters.f0f989bc71c5c8ca3a1eb9c9ab5246521907e3af.zones.catalog1.example. 3600 IN TXT "tsig_key"
    749     send
    750 END
    751 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    752 status=$((status+ret))
    753 
    754 n=$((n+1))
    755 echo_i "waiting for slave to sync up ($n)"
    756 ret=0
    757 wait_for_message ns2/named.run  "catz: deleting zone 'dom9.example' from catalog 'catalog1.example'" || ret=1
    758 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    759 status=$((status+ret))
    760 
    761 ##########################################################################
    762 echo_i "Testing catalog entries that can't be represented as filenames"
    763 # note: we need 4 backslashes in the shell to get 2 backslashes in DNS
    764 # presentation format, which is 1 backslash on the wire.
    765 for special in \
    766        this.is.a.very.very.long.long.long.domain.that.will.cause.catalog.zones.to.generate.hash.instead.of.using.regular.filename.dom10.example \
    767        this.zone/domain.has.a.slash.dom10.example \
    768        this.zone\\\\domain.has.backslash.dom10.example \
    769        this.zone:domain.has.a.colon.dom.10.example
    770 do
    771     # hashes below are generated by:
    772     # python ${TOP}/contrib/scripts/catzhash.py "${special}"
    773 
    774     case "$special" in
    775     this.is.a.very.very.long.long.long.domain.that.will.cause.catalog.zones.to.generate.hash.instead.of.using.regular.filename.dom10.example)
    776         hash=825f48b1ce1b4cf5a041d20255a0c8e98d114858
    777         db=__catz__4d70696f2335687069467f11f5d5378c480383f97782e553fb2d04a7bb2a23ed.db
    778         ;;
    779     this.zone/domain.has.a.slash.dom10.example)
    780         hash=e64cc64c99bf52d0a77fb16dd7ed57cf925a36aa
    781         db=__catz__46ba3e1b28d5955e5313d5fee61bedc78c71d08035aa7ea2f7bf0b8228ab3acc.db
    782         ;;
    783     this.zone\\\\domain.has.backslash.dom10.example)
    784         hash=91e27e02153d38cf656a9b376d7747fbcd19f985
    785         db=__catz__b667f7ff802c0895e0506699951cff9a1cab68c5ef8546aa0d07425f244ed870.db
    786         ;;
    787     this.zone:domain.has.a.colon.dom.10.example)
    788         hash=8b7238bf4c34045834c573ba4116557ebb24d33c
    789         db=__catz__5c721f7872913a4e7fa8ad42589cce5dd6e551a4c9e6ab3f86e77c0bbc7c2ca6.db
    790         ;;
    791     esac
    792 
    793     n=$((n+1))
    794     echo_i "checking that ${special}. is not served by master ($n)"
    795     ret=0
    796     wait_for_no_soa @10.53.0.1 "${special}" dig.out.test$n || ret=1
    797     if [ $ret -ne 0 ]; then echo_i "failed"; fi
    798     status=$((status+ret))
    799 
    800     n=$((n+1))
    801     echo_i "Adding a domain ${special}. to master via RNDC ($n)"
    802     ret=0
    803     echo "@ 3600 IN SOA . . 1 3600 3600 3600 3600" > ns1/dom10.example.db
    804     echo "@ IN NS invalid." >> ns1/dom10.example.db
    805     rndccmd 10.53.0.1 addzone '"'"${special}"'"' '{type master; file "dom10.example.db";};' || ret=1
    806     if [ $ret -ne 0 ]; then echo_i "failed"; fi
    807     status=$((status+ret))
    808 
    809     n=$((n+1))
    810     echo_i "checking that ${special}. is now served by master ($n)"
    811     ret=0
    812     wait_for_soa @10.53.0.1 "${special}." dig.out.test$n || ret=1
    813     if [ $ret -ne 0 ]; then echo_i "failed"; fi
    814     status=$((status+ret))
    815 
    816     nextpart ns2/named.run >/dev/null
    817 
    818     n=$((n+1))
    819     echo_i "Adding domain ${special}. to catalog1 zone ($n)"
    820     ret=0
    821     $NSUPDATE -d <<END >> nsupdate.out.test$n 2>&1 || ret=1
    822       server 10.53.0.1 ${PORT}
    823       update add ${hash}.zones.catalog1.example 3600 IN PTR ${special}.
    824       send
    825 END
    826     if [ $ret -ne 0 ]; then echo_i "failed"; fi
    827     status=$((status+ret))
    828 
    829     n=$((n+1))
    830     echo_i "waiting for slave to sync up ($n)"
    831     ret=0
    832     wait_for_message ns2/named.run  "catz: adding zone '$special' from catalog 'catalog1.example'" &&
    833     wait_for_message ns2/named.run  "transfer of '$special/IN' from 10.53.0.1#${PORT}: Transfer status: success" || ret=1
    834     if [ $ret -ne 0 ]; then echo_i "failed"; fi
    835     status=$((status+ret))
    836 
    837     n=$((n+1))
    838     echo_i "checking that ${special}. is served by slave ($n)"
    839     ret=0
    840     wait_for_soa @10.53.0.2 "${special}." dig.out.test$n || ret=1
    841     if [ $ret -ne 0 ]; then echo_i "failed"; fi
    842     status=$((status+ret))
    843 
    844     n=$((n+1))
    845     echo_i "checking that zone-directory is populated with a hashed filename ($n)"
    846     ret=0
    847     wait_for_zonefile "ns2/zonedir/$db" || ret=1
    848     if [ $ret -ne 0 ]; then echo_i "failed"; fi
    849     status=$((status+ret))
    850 
    851     n=$((n+1))
    852     echo_i "removing domain ${special}. from catalog1 zone ($n)"
    853     ret=0
    854     $NSUPDATE -d <<END >> nsupdate.out.test$n 2>&1 || ret=1
    855       server 10.53.0.1 ${PORT}
    856       update delete ${hash}.zones.catalog1.example
    857       send
    858 END
    859     if [ $ret -ne 0 ]; then echo_i "failed"; fi
    860     status=$((status+ret))
    861 
    862     n=$((n+1))
    863     echo_i "waiting for slave to sync up ($n)"
    864     ret=0
    865     wait_for_message ns2/named.run  "zone_shutdown: zone ${special}/IN: shutting down" || ret=1
    866     if [ $ret -ne 0 ]; then echo_i "failed"; fi
    867     status=$((status+ret))
    868 
    869     n=$((n+1))
    870     echo_i "checking that ${special}. is not served by slave ($n)"
    871     ret=0
    872     wait_for_no_soa @10.53.0.2 "${special}." dig.out.test$n || ret=1
    873     if [ $ret -ne 0 ]; then echo_i "failed"; fi
    874     status=$((status+ret))
    875 
    876     n=$((n+1))
    877     echo_i "checking that zone-directory is emptied ($n)"
    878     ret=0
    879     wait_for_no_zonefile "ns2/zonedir/$db" || ret=1
    880     if [ $ret -ne 0 ]; then echo_i "failed"; fi
    881     status=$((status+ret))
    882 done
    883 
    884 ##########################################################################
    885 echo_i "Testing adding a domain and a subdomain of it"
    886 n=$((n+1))
    887 echo_i "checking that dom11.example. is not served by master ($n)"
    888 ret=0
    889 wait_for_no_soa @10.53.0.1 dom11.example. dig.out.test$n || ret=1
    890 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    891 status=$((status+ret))
    892 
    893 n=$((n+1))
    894 echo_i "Adding a domain dom11.example. to master via RNDC ($n)"
    895 ret=0
    896 echo "@ 3600 IN SOA . . 1 3600 3600 3600 3600" > ns1/dom11.example.db
    897 echo "@ IN NS invalid." >> ns1/dom11.example.db
    898 rndccmd 10.53.0.1 addzone dom11.example. '{type master; file "dom11.example.db";};' || ret=1
    899 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    900 status=$((status+ret))
    901 
    902 n=$((n+1))
    903 echo_i "checking that dom11.example. is now served by master ($n)"
    904 ret=0
    905 wait_for_soa @10.53.0.1 dom11.example. dig.out.test$n || ret=1
    906 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    907 status=$((status+ret))
    908 
    909 nextpart ns2/named.run >/dev/null
    910 
    911 n=$((n+1))
    912 echo_i "Adding domain dom11.example. to catalog1 zone ($n)"
    913 ret=0
    914 $NSUPDATE -d <<END >> nsupdate.out.test$n 2>&1 || ret=1
    915     server 10.53.0.1 ${PORT}
    916     update add 0580d70e769c86c8b951a488d8b776627f427d7a.zones.catalog1.example. 3600 IN PTR dom11.example.
    917     send
    918 END
    919 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    920 status=$((status+ret))
    921 
    922 n=$((n+1))
    923 echo_i "waiting for slave to sync up ($n)"
    924 ret=0
    925 wait_for_message ns2/named.run  "catz: adding zone 'dom11.example' from catalog 'catalog1.example'" &&
    926 wait_for_message ns2/named.run  "transfer of 'dom11.example/IN' from 10.53.0.1#${PORT}: Transfer status: success" || ret=1
    927 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    928 status=$((status+ret))
    929 
    930 n=$((n+1))
    931 echo_i "checking that dom11.example. is served by slave ($n)"
    932 ret=0
    933 wait_for_soa @10.53.0.2 dom11.example. dig.out.test$n || ret=1
    934 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    935 status=$((status+ret))
    936 
    937 n=$((n+1))
    938 echo_i "checking that subdomain.of.dom11.example. is not served by master ($n)"
    939 ret=0
    940 wait_for_rcode NXDOMAIN SOA @10.53.0.1 subdomain.of.dom11.example. dig.out.test$n || ret=1
    941 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    942 status=$((status+ret))
    943 
    944 n=$((n+1))
    945 echo_i "Adding a domain subdomain.of.dom11.example. to master via RNDC ($n)"
    946 ret=0
    947 echo "@ 3600 IN SOA . . 1 3600 3600 3600 3600" > ns1/subdomain.of.dom11.example.db
    948 echo "@ IN NS invalid." >> ns1/subdomain.of.dom11.example.db
    949 rndccmd 10.53.0.1 addzone subdomain.of.dom11.example. '{type master; file "subdomain.of.dom11.example.db";};' || ret=1
    950 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    951 status=$((status+ret))
    952 
    953 n=$((n+1))
    954 echo_i "checking that subdomain.of.dom11.example. is now served by master ($n)"
    955 ret=0
    956 wait_for_soa @10.53.0.1 subdomain.of.dom11.example. dig.out.test$n || ret=1
    957 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    958 status=$((status+ret))
    959 
    960 nextpart ns2/named.run >/dev/null
    961 
    962 n=$((n+1))
    963 echo_i "Adding domain subdomain.of.dom11.example. to catalog1 zone ($n)"
    964 ret=0
    965 $NSUPDATE -d <<END >> nsupdate.out.test$n 2>&1 || ret=1
    966     server 10.53.0.1 ${PORT}
    967     update add 25557e0bdd10cb3710199bb421b776df160f241e.zones.catalog1.example. 3600 IN PTR subdomain.of.dom11.example.
    968     send
    969 END
    970 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    971 status=$((status+ret))
    972 
    973 n=$((n+1))
    974 echo_i "waiting for slave to sync up ($n)"
    975 ret=0
    976 wait_for_message ns2/named.run  "catz: adding zone 'subdomain.of.dom11.example' from catalog 'catalog1.example'" &&
    977 wait_for_message ns2/named.run  "transfer of 'subdomain.of.dom11.example/IN' from 10.53.0.1#${PORT}: Transfer status: success" || ret=1
    978 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    979 status=$((status+ret))
    980 
    981 n=$((n+1))
    982 echo_i "checking that subdomain.of.dom11.example. is served by slave ($n)"
    983 ret=0
    984 wait_for_soa @10.53.0.2 subdomain.of.dom11.example. dig.out.test$n || ret=1
    985 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    986 status=$((status+ret))
    987 
    988 n=$((n+1))
    989 echo_i "removing domain dom11.example. from catalog1 zone ($n)"
    990 ret=0
    991 $NSUPDATE -d <<END >> nsupdate.out.test$n 2>&1 || ret=1
    992    server 10.53.0.1 ${PORT}
    993    update delete 0580d70e769c86c8b951a488d8b776627f427d7a.zones.catalog1.example
    994    send
    995 END
    996 if [ $ret -ne 0 ]; then echo_i "failed"; fi
    997 status=$((status+ret))
    998 
    999 n=$((n+1))
   1000 echo_i "waiting for slave to sync up ($n)"
   1001 ret=0
   1002 wait_for_message ns2/named.run  "zone_shutdown: zone dom11.example/IN: shutting down" || ret=1
   1003 if [ $ret -ne 0 ]; then echo_i "failed"; fi
   1004 status=$((status+ret))
   1005 
   1006 n=$((n+1))
   1007 echo_i "checking that dom11.example. is not served by slave ($n)"
   1008 ret=0
   1009 wait_for_no_soa @10.53.0.2 dom11.example. dig.out.test$n || ret=1
   1010 if [ $ret -ne 0 ]; then echo_i "failed"; fi
   1011 status=$((status+ret))
   1012 
   1013 n=$((n+1))
   1014 echo_i "checking that subdomain.of.dom11.example. is still served by slave ($n)"
   1015 ret=0
   1016 wait_for_soa @10.53.0.2 subdomain.of.dom11.example. dig.out.test$n || ret=1
   1017 if [ $ret -ne 0 ]; then echo_i "failed"; fi
   1018 status=$((status+ret))
   1019 
   1020 n=$((n+1))
   1021 echo_i "removing domain subdomain.of.dom11.example. from catalog1 zone ($n)"
   1022 ret=0
   1023 $NSUPDATE -d <<END >> nsupdate.out.test$n 2>&1 || ret=1
   1024    server 10.53.0.1 ${PORT}
   1025    update delete 25557e0bdd10cb3710199bb421b776df160f241e.zones.catalog1.example
   1026    send
   1027 END
   1028 if [ $ret -ne 0 ]; then echo_i "failed"; fi
   1029 status=$((status+ret))
   1030 
   1031 n=$((n+1))
   1032 echo_i "waiting for slave to sync up ($n)"
   1033 ret=0
   1034 wait_for_message ns2/named.run  "zone_shutdown: zone subdomain.of.dom11.example/IN: shutting down" || ret=1
   1035 if [ $ret -ne 0 ]; then echo_i "failed"; fi
   1036 status=$((status+ret))
   1037 
   1038 n=$((n+1))
   1039 echo_i "checking that subdomain.of.dom11.example. is not served by slave ($n)"
   1040 ret=0
   1041 wait_for_no_soa @10.53.0.2 subdomain.of.d11.example. dig.out.test$n || ret=1
   1042 if [ $ret -ne 0 ]; then echo_i "failed"; fi
   1043 status=$((status+ret))
   1044 
   1045 ##########################################################################
   1046 echo_i "Testing adding a catalog zone at runtime with rndc reconfig"
   1047 n=$((n+1))
   1048 echo_i "checking that dom12.example. is not served by master ($n)"
   1049 ret=0
   1050 wait_for_no_soa @10.53.0.1 dom12.example. dig.out.test$n || ret=1
   1051 if [ $ret -ne 0 ]; then echo_i "failed"; fi
   1052 status=$((status+ret))
   1053 
   1054 n=$((n+1))
   1055 echo_i "Adding a domain dom12.example. to master via RNDC ($n)"
   1056 ret=0
   1057 echo "@ 3600 IN SOA . . 1 3600 3600 3600 3600" > ns1/dom12.example.db
   1058 echo "@ IN NS invalid." >> ns1/dom12.example.db
   1059 rndccmd 10.53.0.1 addzone dom12.example. '{type master; file "dom12.example.db";};' || ret=1
   1060 if [ $ret -ne 0 ]; then echo_i "failed"; fi
   1061 status=$((status+ret))
   1062 
   1063 n=$((n+1))
   1064 echo_i "checking that dom12.example. is now served by master ($n)"
   1065 ret=0
   1066 wait_for_soa @10.53.0.1 dom12.example. dig.out.test$n || ret=1
   1067 if [ $ret -ne 0 ]; then echo_i "failed"; fi
   1068 status=$((status+ret))
   1069 
   1070 nextpart ns2/named.run >/dev/null
   1071 
   1072 n=$((n+1))
   1073 echo_i "Adding domain dom12.example. to catalog4 zone ($n)"
   1074 ret=0
   1075 $NSUPDATE -d <<END >> nsupdate.out.test$n 2>&1 || ret=1
   1076     server 10.53.0.1 ${PORT}
   1077     update add 871d51e5433543c0f6fb263c40f359fbc152c8ae.zones.catalog4.example. 3600 IN PTR dom12.example.
   1078     send
   1079 END
   1080 if [ $ret -ne 0 ]; then echo_i "failed"; fi
   1081 status=$((status+ret))
   1082 
   1083 n=$((n+1))
   1084 echo_i "checking that dom12.example. is not served by slave ($n)"
   1085 ret=0
   1086 wait_for_no_soa @10.53.0.2 dom12.example. dig.out.test$n || ret=1
   1087 if [ $ret -ne 0 ]; then echo_i "failed"; fi
   1088 status=$((status+ret))
   1089 
   1090 
   1091 n=$((n+1))
   1092 echo_i "reconfiguring slave - adding catalog4 catalog zone ($n)"
   1093 ret=0
   1094 sed -e "s/^#T1//g" <  ns2/named.conf.in > ns2/named.conf.tmp
   1095 copy_setports ns2/named.conf.tmp ns2/named.conf
   1096 rndccmd 10.53.0.2 reconfig || ret=1
   1097 if [ $ret -ne 0 ]; then echo_i "failed"; fi
   1098 status=$((status+ret))
   1099 
   1100 n=$((n+1))
   1101 echo_i "waiting for slave to sync up ($n)"
   1102 ret=0
   1103 wait_for_message ns2/named.run  "catz: adding zone 'dom12.example' from catalog 'catalog4.example'" &&
   1104 wait_for_message ns2/named.run  "transfer of 'dom12.example/IN' from 10.53.0.1#${PORT}: Transfer status: success" || ret=1
   1105 if [ $ret -ne 0 ]; then echo_i "failed"; fi
   1106 status=$((status+ret))
   1107 
   1108 n=$((n+1))
   1109 echo_i "checking that dom7.example. is still served by slave after reconfiguration ($n)"
   1110 ret=0
   1111 wait_for_soa @10.53.0.2 dom7.example. dig.out.test$n -b 10.53.0.1 || ret=1
   1112 if [ $ret -ne 0 ]; then echo_i "failed"; fi
   1113 status=$((status+ret))
   1114 n=$((n+1))
   1115 
   1116 echo_i "checking that dom12.example. is served by slave ($n)"
   1117 ret=0
   1118 wait_for_soa @10.53.0.2 dom12.example. dig.out.test$n || ret=1
   1119 if [ $ret -ne 0 ]; then echo_i "failed"; fi
   1120 status=$((status+ret))
   1121 
   1122 n=$((n+1))
   1123 echo_i "reconfiguring slave - removing catalog4 catalog zone, adding non-existent catalog5 catalog zone ($n)"
   1124 ret=0
   1125 sed -e "s/^#T2//" < ns2/named.conf.in > ns2/named.conf.tmp
   1126 copy_setports ns2/named.conf.tmp ns2/named.conf
   1127 $RNDC -c ../common/rndc.conf -s 10.53.0.2 -p 9953 reconfig > /dev/null 2>&1 && ret=1
   1128 if [ $ret -ne 0 ]; then echo_i "failed"; fi
   1129 status=$((status+ret))
   1130 
   1131 n=$((n+1))
   1132 echo_i "reconfiguring slave - removing non-existent catalog5 catalog zone ($n)"
   1133 ret=0
   1134 copy_setports ns2/named.conf.in ns2/named.conf
   1135 rndccmd 10.53.0.2 reconfig || ret=1
   1136 if [ $ret -ne 0 ]; then echo_i "failed"; fi
   1137 status=$((status+ret))
   1138 
   1139 n=$((n+1))
   1140 echo_i "checking that dom12.example. is not served by slave ($n)"
   1141 ret=0
   1142 wait_for_no_soa @10.53.0.2 dom12.example. dig.out.test$n || ret=1
   1143 if [ $ret -ne 0 ]; then echo_i "failed"; fi
   1144 status=$((status+ret))
   1145 
   1146 n=$((n+1))
   1147 echo_i "removing domain dom12.example. from catalog4 zone ($n)"
   1148 ret=0
   1149 $NSUPDATE -d <<END >> nsupdate.out.test$n 2>&1 || ret=1
   1150     server 10.53.0.1 ${PORT}
   1151     update delete 871d51e5433543c0f6fb263c40f359fbc152c8ae.zones.catalog4.example. 3600 IN PTR dom12.example.
   1152     send
   1153 END
   1154 if [ $ret -ne 0 ]; then echo_i "failed"; fi
   1155 status=$((status+ret))
   1156 
   1157 ##########################################################################
   1158 echo_i "Testing having a zone in two different catalogs"
   1159 n=$((n+1))
   1160 echo_i "checking that dom13.example. is not served by master ($n)"
   1161 ret=0
   1162 wait_for_no_soa @10.53.0.1 dom13.example. dig.out.test$n || ret=1
   1163 if [ $ret -ne 0 ]; then echo_i "failed"; fi
   1164 status=$((status+ret))
   1165 
   1166 n=$((n+1))
   1167 echo_i "Adding a domain dom13.example. to master ns1 via RNDC ($n)"
   1168 ret=0
   1169 echo "@ 3600 IN SOA . . 1 3600 3600 3600 3600" > ns1/dom13.example.db
   1170 echo "@ IN NS invalid." >> ns1/dom13.example.db
   1171 echo "@ IN A 192.0.2.1" >> ns1/dom13.example.db
   1172 rndccmd 10.53.0.1 addzone dom13.example. '{type master; file "dom13.example.db";};' || ret=1
   1173 if [ $ret -ne 0 ]; then echo_i "failed"; fi
   1174 status=$((status+ret))
   1175 
   1176 n=$((n+1))
   1177 echo_i "checking that dom13.example. is now served by master ns1 ($n)"
   1178 ret=0
   1179 wait_for_soa @10.53.0.1 dom13.example. dig.out.test$n || ret=1
   1180 if [ $ret -ne 0 ]; then echo_i "failed"; fi
   1181 status=$((status+ret))
   1182 
   1183 n=$((n+1))
   1184 echo_i "Adding a domain dom13.example. to master ns3 via RNDC ($n)"
   1185 ret=0
   1186 echo "@ 3600 IN SOA . . 1 3600 3600 3600 3600" > ns3/dom13.example.db
   1187 echo "@ IN NS invalid." >> ns3/dom13.example.db
   1188 echo "@ IN A 192.0.2.2" >> ns3/dom13.example.db
   1189 rndccmd 10.53.0.3 addzone dom13.example. '{type master; file "dom13.example.db";};' || ret=1
   1190 if [ $ret -ne 0 ]; then echo_i "failed"; fi
   1191 status=$((status+ret))
   1192 
   1193 n=$((n+1))
   1194 echo_i "checking that dom13.example. is now served by master ns3 ($n)"
   1195 ret=0
   1196 wait_for_soa @10.53.0.3 dom13.example. dig.out.test$n || ret=1
   1197 if [ $ret -ne 0 ]; then echo_i "failed"; fi
   1198 status=$((status+ret))
   1199 
   1200 
   1201 nextpart ns2/named.run >/dev/null
   1202 
   1203 n=$((n+1))
   1204 echo_i "Adding domain dom13.example. to catalog1 zone with ns1 as master ($n)"
   1205 ret=0
   1206 $NSUPDATE -d <<END >> nsupdate.out.test$n 2>&1 || ret=1
   1207     server 10.53.0.1 ${PORT}
   1208     update add 8d7989c746b3f92b3bba2479e72afd977198363f.zones.catalog1.example. 3600 IN PTR dom13.example.
   1209     update add masters.8d7989c746b3f92b3bba2479e72afd977198363f.zones.catalog1.example. 3600 IN A 10.53.0.1
   1210     send
   1211 END
   1212 if [ $ret -ne 0 ]; then echo_i "failed"; fi
   1213 status=$((status+ret))
   1214 
   1215 n=$((n+1))
   1216 echo_i "waiting for slave to sync up ($n)"
   1217 ret=0
   1218 wait_for_message ns2/named.run  "catz: adding zone 'dom13.example' from catalog 'catalog1.example'" &&
   1219 wait_for_message ns2/named.run  "transfer of 'dom13.example/IN' from 10.53.0.1#${PORT}: Transfer status: success" || ret=1
   1220 if [ $ret -ne 0 ]; then echo_i "failed"; fi
   1221 status=$((status+ret))
   1222 
   1223 nextpart ns2/named.run >/dev/null
   1224 
   1225 n=$((n+1))
   1226 echo_i "checking that dom13.example. is served by slave and that it's the one from ns1 ($n)"
   1227 ret=0
   1228 wait_for_a @10.53.0.2 dom13.example. dig.out.test$n || ret=1
   1229 grep "192.0.2.1" dig.out.test$n > /dev/null || ret=1
   1230 if [ $ret -ne 0 ]; then echo_i "failed"; fi
   1231 status=$((status+ret))
   1232 
   1233 n=$((n+1))
   1234 echo_i "Adding domain dom13.example. to catalog2 zone with ns3 as master ($n)"
   1235 ret=0
   1236 $NSUPDATE -d <<END >> nsupdate.out.test$n 2>&1 || ret=1
   1237     server 10.53.0.3 ${PORT}
   1238     update add 8d7989c746b3f92b3bba2479e72afd977198363f.zones.catalog2.example. 3600 IN PTR dom13.example.
   1239     update add masters.8d7989c746b3f92b3bba2479e72afd977198363f.zones.catalog2.example. 3600 IN A 10.53.0.3
   1240     send
   1241 END
   1242 if [ $ret -ne 0 ]; then echo_i "failed"; fi
   1243 status=$((status+ret))
   1244 
   1245 n=$((n+1))
   1246 echo_i "waiting for slave to sync up ($n)"
   1247 ret=0
   1248 wait_for_message ns2/named.run  "catz: update_from_db: new zone merged" || ret=1
   1249 if [ $ret -ne 0 ]; then echo_i "failed"; fi
   1250 status=$((status+ret))
   1251 
   1252 n=$((n+1))
   1253 echo_i "checking that dom13.example. is served by slave and that it's still the one from ns1 ($n)"
   1254 ret=0
   1255 wait_for_a @10.53.0.2 dom13.example. dig.out.test$n || ret=1
   1256 grep "192.0.2.1" dig.out.test$n > /dev/null || ret=1
   1257 if [ $ret -ne 0 ]; then echo_i "failed"; fi
   1258 status=$((status+ret))
   1259 
   1260 nextpart ns2/named.run >/dev/null
   1261 
   1262 n=$((n+1))
   1263 echo_i "Deleting domain dom13.example. from catalog2 ($n)"
   1264 ret=0
   1265 $NSUPDATE -d <<END >> nsupdate.out.test$n 2>&1 || ret=1
   1266     server 10.53.0.3 ${PORT}
   1267     update delete 8d7989c746b3f92b3bba2479e72afd977198363f.zones.catalog2.example. 3600 IN PTR dom13.example.
   1268     update delete masters.8d7989c746b3f92b3bba2479e72afd977198363f.zones.catalog2.example. 3600 IN A 10.53.0.3
   1269     send
   1270 END
   1271 if [ $ret -ne 0 ]; then echo_i "failed"; fi
   1272 status=$((status+ret))
   1273 
   1274 n=$((n+1))
   1275 echo_i "waiting for slave to sync up ($n)"
   1276 ret=0
   1277 wait_for_message ns2/named.run  "catz: update_from_db: new zone merged" || ret=1
   1278 if [ $ret -ne 0 ]; then echo_i "failed"; fi
   1279 status=$((status+ret))
   1280 
   1281 n=$((n+1))
   1282 echo_i "checking that dom13.example. is served by slave and that it's still the one from ns1 ($n)"
   1283 ret=0
   1284 wait_for_a @10.53.0.2 dom13.example. dig.out.test$n || ret=1
   1285 grep "192.0.2.1" dig.out.test$n > /dev/null || ret=1
   1286 if [ $ret -ne 0 ]; then echo_i "failed"; fi
   1287 status=$((status+ret))
   1288 
   1289 n=$((n+1))
   1290 echo_i "Deleting domain dom13.example. from catalog1 ($n)"
   1291 ret=0
   1292 $NSUPDATE -d <<END >> nsupdate.out.test$n 2>&1 || ret=1
   1293     server 10.53.0.1 ${PORT}
   1294     update delete 8d7989c746b3f92b3bba2479e72afd977198363f.zones.catalog1.example. 3600 IN PTR dom13.example.
   1295     update delete masters.8d7989c746b3f92b3bba2479e72afd977198363f.zones.catalog1.example. 3600 IN A 10.53.0.2
   1296     send
   1297 END
   1298 if [ $ret -ne 0 ]; then echo_i "failed"; fi
   1299 status=$((status+ret))
   1300 
   1301 n=$((n+1))
   1302 echo_i "waiting for slave to sync up ($n)"
   1303 ret=0
   1304 wait_for_message ns2/named.run  "catz: update_from_db: new zone merged" || ret=1
   1305 if [ $ret -ne 0 ]; then echo_i "failed"; fi
   1306 status=$((status+ret))
   1307 
   1308 n=$((n+1))
   1309 echo_i "checking that dom13.example. is no longer served by slave ($n)"
   1310 ret=0
   1311 wait_for_no_soa @10.53.0.2 dom13.example. dig.out.test$n || ret=1
   1312 if [ $ret -ne 0 ]; then echo_i "failed"; fi
   1313 status=$((status+ret))
   1314 
   1315 ##########################################################################
   1316 echo_i "Testing having a regular zone and a zone in catalog zone of the same name"
   1317 n=$((n+1))
   1318 echo_i "checking that dom14.example. is not served by master ($n)"
   1319 ret=0
   1320 wait_for_no_soa @10.53.0.1 dom14.example. dig.out.test$n || ret=1
   1321 if [ $ret -ne 0 ]; then echo_i "failed"; fi
   1322 status=$((status+ret))
   1323 
   1324 n=$((n+1))
   1325 echo_i "Adding a domain dom14.example. to master ns1 via RNDC ($n)"
   1326 ret=0
   1327 echo "@ 3600 IN SOA . . 1 3600 3600 3600 3600" > ns1/dom14.example.db
   1328 echo "@ IN NS invalid." >> ns1/dom14.example.db
   1329 echo "@ IN A 192.0.2.1" >> ns1/dom14.example.db
   1330 rndccmd 10.53.0.1 addzone dom14.example. '{type master; file "dom14.example.db";};' || ret=1
   1331 if [ $ret -ne 0 ]; then echo_i "failed"; fi
   1332 status=$((status+ret))
   1333 
   1334 n=$((n+1))
   1335 echo_i "checking that dom14.example. is now served by master ns1 ($n)"
   1336 ret=0
   1337 wait_for_soa @10.53.0.1 dom14.example. dig.out.test$n || ret=1
   1338 if [ $ret -ne 0 ]; then echo_i "failed"; fi
   1339 status=$((status+ret))
   1340 
   1341 n=$((n+1))
   1342 echo_i "Adding a domain dom14.example. to master ns3 via RNDC ($n)"
   1343 ret=0
   1344 echo "@ 3600 IN SOA . . 1 3600 3600 3600 3600" > ns3/dom14.example.db
   1345 echo "@ IN NS invalid." >> ns3/dom14.example.db
   1346 echo "@ IN A 192.0.2.2" >> ns3/dom14.example.db
   1347 rndccmd 10.53.0.3 addzone dom14.example. '{type master; file "dom14.example.db";};' || ret=1
   1348 if [ $ret -ne 0 ]; then echo_i "failed"; fi
   1349 status=$((status+ret))
   1350 
   1351 n=$((n+1))
   1352 echo_i "checking that dom14.example. is now served by master ns3 ($n)"
   1353 ret=0
   1354 wait_for_soa @10.53.0.3 dom14.example. dig.out.test$n || ret=1
   1355 if [ $ret -ne 0 ]; then echo_i "failed"; fi
   1356 status=$((status+ret))
   1357 
   1358 nextpart ns2/named.run >/dev/null
   1359 
   1360 n=$((n+1))
   1361 echo_i "Adding domain dom14.example. with rndc with ns1 as master ($n)"
   1362 ret=0
   1363 rndccmd 10.53.0.2 addzone dom14.example. '{type slave; masters {10.53.0.1;};};' || ret=1
   1364 if [ $ret -ne 0 ]; then echo_i "failed"; fi
   1365 status=$((status+ret))
   1366 
   1367 n=$((n+1))
   1368 echo_i "waiting for slave to sync up ($n)"
   1369 ret=0
   1370 wait_for_message ns2/named.run  "transfer of 'dom14.example/IN' from 10.53.0.1#${PORT}: Transfer status: success" || ret=1
   1371 if [ $ret -ne 0 ]; then echo_i "failed"; fi
   1372 status=$((status+ret))
   1373 
   1374 nextpart ns2/named.run >/dev/null
   1375 
   1376 n=$((n+1))
   1377 echo_i "checking that dom14.example. is served by slave and that it's the one from ns1 ($n)"
   1378 ret=0
   1379 wait_for_a @10.53.0.2 dom14.example. dig.out.test$n || ret=1
   1380 grep "192.0.2.1" dig.out.test$n > /dev/null || ret=1
   1381 if [ $ret -ne 0 ]; then echo_i "failed"; fi
   1382 status=$((status+ret))
   1383 
   1384 n=$((n+1))
   1385 echo_i "Adding domain dom14.example. to catalog2 zone with ns3 as master ($n)"
   1386 ret=0
   1387 $NSUPDATE -d <<END >> nsupdate.out.test$n 2>&1 || ret=1
   1388     server 10.53.0.3 ${PORT}
   1389     update add 45e3d45ea5f7bd01c395ccbde6ae2e750a3ee8ab.zones.catalog2.example. 3600 IN PTR dom14.example.
   1390     update add masters.45e3d45ea5f7bd01c395ccbde6ae2e750a3ee8ab.zones.catalog2.example. 3600 IN A 10.53.0.3
   1391     send
   1392 END
   1393 if [ $ret -ne 0 ]; then echo_i "failed"; fi
   1394 status=$((status+ret))
   1395 
   1396 n=$((n+1))
   1397 echo_i "waiting for slave to sync up ($n)"
   1398 ret=0
   1399 wait_for_message ns2/named.run  "catz: update_from_db: new zone merged" || ret=1
   1400 if [ $ret -ne 0 ]; then echo_i "failed"; fi
   1401 status=$((status+ret))
   1402 
   1403 n=$((n+1))
   1404 echo_i "checking that dom14.example. is served by slave and that it's still the one from ns1 ($n)"
   1405 ret=0
   1406 wait_for_a @10.53.0.2 dom14.example. dig.out.test$n || ret=1
   1407 grep "192.0.2.1" dig.out.test$n > /dev/null || ret=1
   1408 if [ $ret -ne 0 ]; then echo_i "failed"; fi
   1409 status=$((status+ret))
   1410 
   1411 nextpart ns2/named.run >/dev/null
   1412 
   1413 n=$((n+1))
   1414 echo_i "Deleting domain dom14.example. from catalog2 ($n)"
   1415 ret=0
   1416 $NSUPDATE -d <<END >> nsupdate.out.test$n 2>&1 || ret=1
   1417     server 10.53.0.3 ${PORT}
   1418     update delete 45e3d45ea5f7bd01c395ccbde6ae2e750a3ee8ab.zones.catalog2.example. 3600 IN PTR dom14.example.
   1419     update delete masters.45e3d45ea5f7bd01c395ccbde6ae2e750a3ee8ab.zones.catalog2.example. 3600 IN A 10.53.0.3
   1420     send
   1421 END
   1422 if [ $ret -ne 0 ]; then echo_i "failed"; fi
   1423 status=$((status+ret))
   1424 
   1425 n=$((n+1))
   1426 echo_i "waiting for slave to sync up ($n)"
   1427 ret=0
   1428 wait_for_message ns2/named.run  "catz: update_from_db: new zone merged" || ret=1
   1429 if [ $ret -ne 0 ]; then echo_i "failed"; fi
   1430 status=$((status+ret))
   1431 
   1432 n=$((n+1))
   1433 echo_i "checking that dom14.example. is served by slave and that it's still the one from ns1 ($n)"
   1434 ret=0
   1435 wait_for_a @10.53.0.2 dom14.example. dig.out.test$n || ret=1
   1436 grep "192.0.2.1" dig.out.test$n > /dev/null || ret=1
   1437 if [ $ret -ne 0 ]; then echo_i "failed"; fi
   1438 status=$((status+ret))
   1439 
   1440 ##########################################################################
   1441 echo_i "Testing changing label for a member zone"
   1442 n=$((n+1))
   1443 echo_i "checking that dom15.example. is not served by master ($n)"
   1444 ret=0
   1445 wait_for_no_soa @10.53.0.1 dom15.example. dig.out.test$n || ret=1
   1446 if [ $ret -ne 0 ]; then echo_i "failed"; fi
   1447 status=$((status+ret))
   1448 
   1449 n=$((n+1))
   1450 echo_i "Adding a domain dom15.example. to master ns1 via RNDC ($n)"
   1451 ret=0
   1452 echo "@ 3600 IN SOA . . 1 3600 3600 3600 3600" > ns1/dom15.example.db
   1453 echo "@ IN NS invalid." >> ns1/dom15.example.db
   1454 rndccmd 10.53.0.1 addzone dom15.example. '{type master; file "dom15.example.db";};' || ret=1
   1455 if [ $ret -ne 0 ]; then echo_i "failed"; fi
   1456 status=$((status+ret))
   1457 
   1458 n=$((n+1))
   1459 echo_i "checking that dom15.example. is now served by master ns1 ($n)"
   1460 ret=0
   1461 wait_for_soa @10.53.0.1 dom15.example. dig.out.test$n || ret=1
   1462 if [ $ret -ne 0 ]; then echo_i "failed"; fi
   1463 status=$((status+ret))
   1464 
   1465 nextpart ns2/named.run >/dev/null
   1466 
   1467 echo_i "Adding domain dom15.example. to catalog1 zone with 'dom15label1' label ($n)"
   1468 ret=0
   1469 $NSUPDATE -d <<END >> nsupdate.out.test$n 2>&1 || ret=1
   1470     server 10.53.0.1 ${PORT}
   1471     update add dom15label1.zones.catalog1.example. 3600 IN PTR dom15.example.
   1472     send
   1473 END
   1474 if [ $ret -ne 0 ]; then echo_i "failed"; fi
   1475 status=$((status+ret))
   1476 
   1477 n=$((n+1))
   1478 echo_i "waiting for slave to sync up ($n)"
   1479 ret=0
   1480 wait_for_message ns2/named.run  "catz: update_from_db: new zone merged" || ret=1
   1481 if [ $ret -ne 0 ]; then echo_i "failed"; fi
   1482 status=$((status+ret))
   1483 
   1484 sleep 3
   1485 
   1486 n=$((n+1))
   1487 echo_i "checking that dom15.example. is served by slave ($n)"
   1488 ret=0
   1489 wait_for_soa @10.53.0.2 dom15.example. dig.out.test$n || ret=1
   1490 if [ $ret -ne 0 ]; then echo_i "failed"; fi
   1491 status=$((status+ret))
   1492 
   1493 nextpart ns2/named.run >/dev/null
   1494 
   1495 n=$((n+1))
   1496 echo_i "Changing label of domain dom15.example. from 'dom15label1' to 'dom15label2' ($n)"
   1497 ret=0
   1498 $NSUPDATE -d <<END >> nsupdate.out.test$n 2>&1 || ret=1
   1499     server 10.53.0.1 ${PORT}
   1500     update delete dom15label1.zones.catalog1.example. 3600 IN PTR dom15.example.
   1501     update add dom15label2.zones.catalog1.example. 3600 IN PTR dom15.example.
   1502     send
   1503 END
   1504 if [ $ret -ne 0 ]; then echo_i "failed"; fi
   1505 status=$((status+ret))
   1506 
   1507 n=$((n+1))
   1508 echo_i "waiting for slave to sync up ($n)"
   1509 ret=0
   1510 wait_for_message ns2/named.run  "catz: update_from_db: new zone merged" || ret=1
   1511 if [ $ret -ne 0 ]; then echo_i "failed"; fi
   1512 status=$((status+ret))
   1513 
   1514 n=$((n+1))
   1515 echo_i "checking that dom15.example. is served by slave ($n)"
   1516 ret=0
   1517 wait_for_soa @10.53.0.2 dom15.example. dig.out.test$n || ret=1
   1518 if [ $ret -ne 0 ]; then echo_i "failed"; fi
   1519 status=$((status+ret))
   1520 
   1521 echo_i "exit status: $status"
   1522 [ $status -eq 0 ] || exit 1
   1523