Home | History | Annotate | Line # | Download | only in rndc
      1 #!/bin/sh
      2 
      3 # Copyright (C) Internet Systems Consortium, Inc. ("ISC")
      4 #
      5 # SPDX-License-Identifier: MPL-2.0
      6 #
      7 # This Source Code Form is subject to the terms of the Mozilla Public
      8 # License, v. 2.0.  If a copy of the MPL was not distributed with this
      9 # file, you can obtain one at https://mozilla.org/MPL/2.0/.
     10 #
     11 # See the COPYRIGHT file distributed with this work for additional
     12 # information regarding copyright ownership.
     13 
     14 set -e
     15 
     16 . ../conf.sh
     17 
     18 DIGOPTS="+tcp +noadd +nosea +nostat +noquest +nocomm +nocmd"
     19 DIGOPTS=""
     20 DIGCMD="$DIG $DIGOPTS -p ${PORT}"
     21 RNDCCMD="$RNDC -p ${CONTROLPORT} -c ../_common/rndc.conf -s"
     22 
     23 status=0
     24 n=0
     25 
     26 n=$((n + 1))
     27 echo_i "preparing ($n)"
     28 ret=0
     29 $NSUPDATE -p ${PORT} -k ns2/session.key >/dev/null 2>&1 <<END || ret=1
     30 server 10.53.0.2
     31 zone nil.
     32 update add text1.nil. 600 IN TXT "addition 1"
     33 send
     34 zone other.
     35 update add text1.other. 600 IN TXT "addition 1"
     36 send
     37 END
     38 [ -s ns2/nil.db.jnl ] || {
     39   echo_i "'test -s ns2/nil.db.jnl' failed when it shouldn't have"
     40   ret=1
     41 }
     42 [ -s ns2/other.db.jnl ] || {
     43   echo_i "'test -s ns2/other.db.jnl' failed when it shouldn't have"
     44   ret=1
     45 }
     46 if [ $ret != 0 ]; then echo_i "failed"; fi
     47 status=$((status + ret))
     48 
     49 echo_i "rndc freeze"
     50 $RNDCCMD 10.53.0.2 freeze | sed 's/^/ns2 /' | cat_i
     51 
     52 n=$((n + 1))
     53 echo_i "checking zone was dumped ($n)"
     54 ret=0
     55 for i in 1 2 3 4 5 6 7 8 9 10; do
     56   grep "addition 1" ns2/nil.db >/dev/null && break
     57   sleep 1
     58 done
     59 grep "addition 1" ns2/nil.db >/dev/null 2>&1 || ret=1
     60 if [ $ret != 0 ]; then echo_i "failed"; fi
     61 status=$((status + ret))
     62 
     63 n=$((n + 1))
     64 echo_i "checking journal file is still present ($n)"
     65 ret=0
     66 [ -s ns2/nil.db.jnl ] || {
     67   echo_i "'test -s ns2/nil.db.jnl' failed when it shouldn't have"
     68   ret=1
     69 }
     70 if [ $ret != 0 ]; then echo_i "failed"; fi
     71 status=$((status + ret))
     72 
     73 n=$((n + 1))
     74 echo_i "checking zone not writable ($n)"
     75 ret=0
     76 $NSUPDATE -p ${PORT} -k ns2/session.key >/dev/null 2>&1 <<END && ret=1
     77 server 10.53.0.2
     78 zone nil.
     79 update add text2.nil. 600 IN TXT "addition 2"
     80 send
     81 END
     82 
     83 $DIGCMD @10.53.0.2 text2.nil. TXT >dig.out.1.test$n || ret=1
     84 grep 'addition 2' dig.out.1.test$n >/dev/null && ret=1
     85 if [ $ret != 0 ]; then echo_i "failed"; fi
     86 status=$((status + ret))
     87 
     88 echo_i "rndc thaw"
     89 $RNDCCMD 10.53.0.2 thaw | sed 's/^/ns2 /' | cat_i
     90 
     91 wait_for_log 3 "zone_postload: zone nil/IN: done" ns2/named.run
     92 
     93 n=$((n + 1))
     94 echo_i "checking zone now writable ($n)"
     95 ret=0
     96 $NSUPDATE -p ${PORT} -k ns2/session.key >nsupdate.out.1.test$n 2>&1 <<END || ret=1
     97 server 10.53.0.2
     98 zone nil.
     99 update add text3.nil. 600 IN TXT "addition 3"
    100 send
    101 END
    102 $DIGCMD @10.53.0.2 text3.nil. TXT >dig.out.1.test$n || ret=1
    103 grep 'addition 3' dig.out.1.test$n >/dev/null || ret=1
    104 if [ $ret != 0 ]; then echo_i "failed"; fi
    105 status=$((status + ret))
    106 
    107 echo_i "rndc sync"
    108 ret=0
    109 $RNDCCMD 10.53.0.2 sync nil | sed 's/^/ns2 /' | cat_i
    110 
    111 n=$((n + 1))
    112 echo_i "checking zone was dumped ($n)"
    113 ret=0
    114 for i in 1 2 3 4 5 6 7 8 9 10; do
    115   grep "addition 3" ns2/nil.db >/dev/null && break
    116   sleep 1
    117 done
    118 grep "addition 3" ns2/nil.db >/dev/null 2>&1 || ret=1
    119 if [ $ret != 0 ]; then echo_i "failed"; fi
    120 status=$((status + ret))
    121 
    122 n=$((n + 1))
    123 echo_i "checking journal file is still present ($n)"
    124 ret=0
    125 [ -s ns2/nil.db.jnl ] || {
    126   echo_i "'test -s ns2/nil.db.jnl' failed when it shouldn't have"
    127   ret=1
    128 }
    129 if [ $ret != 0 ]; then echo_i "failed"; fi
    130 status=$((status + ret))
    131 
    132 n=$((n + 1))
    133 echo_i "checking zone is still writable ($n)"
    134 ret=0
    135 $NSUPDATE -p ${PORT} -k ns2/session.key >nsupdate.out.1.test$n 2>&1 <<END || ret=1
    136 server 10.53.0.2
    137 zone nil.
    138 update add text4.nil. 600 IN TXT "addition 4"
    139 send
    140 END
    141 
    142 $DIGCMD @10.53.0.2 text4.nil. TXT >dig.out.1.test$n || ret=1
    143 grep 'addition 4' dig.out.1.test$n >/dev/null || ret=1
    144 if [ $ret != 0 ]; then echo_i "failed"; fi
    145 status=$((status + ret))
    146 
    147 echo_i "rndc sync -clean"
    148 ret=0
    149 $RNDCCMD 10.53.0.2 sync -clean nil | sed 's/^/ns2 /' | cat_i
    150 
    151 n=$((n + 1))
    152 echo_i "checking zone was dumped ($n)"
    153 ret=0
    154 for i in 1 2 3 4 5 6 7 8 9 10; do
    155   grep "addition 4" ns2/nil.db >/dev/null && break
    156   sleep 1
    157 done
    158 grep "addition 4" ns2/nil.db >/dev/null 2>&1 || ret=1
    159 if [ $ret != 0 ]; then echo_i "failed"; fi
    160 status=$((status + ret))
    161 
    162 n=$((n + 1))
    163 echo_i "checking journal file is deleted ($n)"
    164 ret=0
    165 [ -s ns2/nil.db.jnl ] && {
    166   echo_i "'test -s ns2/nil.db.jnl' failed when it shouldn't have"
    167   ret=1
    168 }
    169 if [ $ret != 0 ]; then echo_i "failed"; fi
    170 status=$((status + ret))
    171 
    172 n=$((n + 1))
    173 echo_i "checking zone is still writable ($n)"
    174 ret=0
    175 $NSUPDATE -p ${PORT} -k ns2/session.key >/dev/null 2>&1 <<END || ret=1
    176 server 10.53.0.2
    177 zone nil.
    178 update add text5.nil. 600 IN TXT "addition 5"
    179 send
    180 END
    181 
    182 $DIGCMD @10.53.0.2 text4.nil. TXT >dig.out.1.test$n || ret=1
    183 grep 'addition 4' dig.out.1.test$n >/dev/null || ret=1
    184 if [ $ret != 0 ]; then echo_i "failed"; fi
    185 status=$((status + ret))
    186 
    187 n=$((n + 1))
    188 echo_i "checking other journal files not removed ($n)"
    189 ret=0
    190 [ -s ns2/other.db.jnl ] || {
    191   echo_i "'test -s ns2/other.db.jnl' failed when it shouldn't have"
    192   ret=1
    193 }
    194 if [ $ret != 0 ]; then echo_i "failed"; fi
    195 status=$((status + ret))
    196 
    197 echo_i "cleaning all zones ($n)"
    198 $RNDCCMD 10.53.0.2 sync -clean | sed 's/^/ns2 /' | cat_i
    199 
    200 n=$((n + 1))
    201 echo_i "checking all journals removed ($n)"
    202 ret=0
    203 [ -s ns2/nil.db.jnl ] && {
    204   echo_i "'test -s ns2/nil.db.jnl' succeeded when it shouldn't have"
    205   ret=1
    206 }
    207 [ -s ns2/other.db.jnl ] && {
    208   echo_i "'test -s ns2/other.db.jnl' succeeded when it shouldn't have"
    209   ret=1
    210 }
    211 if [ $ret != 0 ]; then echo_i "failed"; fi
    212 status=$((status + ret))
    213 
    214 n=$((n + 1))
    215 echo_i "checking that freezing static zones is not allowed ($n)"
    216 ret=0
    217 $RNDCCMD 10.53.0.2 freeze static >rndc.out.1.test$n 2>&1 && ret=1
    218 grep 'not dynamic' rndc.out.1.test$n >/dev/null || ret=1
    219 if [ $ret != 0 ]; then echo_i "failed"; fi
    220 status=$((status + ret))
    221 
    222 n=$((n + 1))
    223 echo_i "checking that journal is removed when serial is changed before thaw ($n)"
    224 ret=0
    225 sleep 1
    226 $NSUPDATE -p ${PORT} -k ns2/session.key >nsupdate.out.1.test$n 2>&1 <<END || ret=1
    227 server 10.53.0.2
    228 zone other.
    229 update add text6.other. 600 IN TXT "addition 6"
    230 send
    231 END
    232 [ -s ns2/other.db.jnl ] || {
    233   echo_i "'test -s ns2/other.db.jnl' failed when it shouldn't have"
    234   ret=1
    235 }
    236 $RNDCCMD 10.53.0.2 freeze other 2>&1 | sed 's/^/ns2 /' | cat_i
    237 for i in 1 2 3 4 5 6 7 8 9 10; do
    238   grep "addition 6" ns2/other.db >/dev/null && break
    239   sleep 1
    240 done
    241 serial=$(awk '$3 ~ /serial/ {print $1}' ns2/other.db)
    242 newserial=$((serial + 1))
    243 sed s/$serial/$newserial/ ns2/other.db >ns2/other.db.new
    244 echo 'frozen TXT "frozen addition"' >>ns2/other.db.new
    245 mv -f ns2/other.db.new ns2/other.db
    246 $RNDCCMD 10.53.0.2 thaw 2>&1 | sed 's/^/ns2 /' | cat_i
    247 sleep 1
    248 [ -f ns2/other.db.jnl ] && {
    249   echo_i "'test -f ns2/other.db.jnl' succeeded when it shouldn't have"
    250   ret=1
    251 }
    252 $NSUPDATE -p ${PORT} -k ns2/session.key >nsupdate.out.2.test$n 2>&1 <<END || ret=1
    253 server 10.53.0.2
    254 zone other.
    255 update add text7.other. 600 IN TXT "addition 7"
    256 send
    257 END
    258 $DIGCMD @10.53.0.2 text6.other. TXT >dig.out.1.test$n || ret=1
    259 grep 'addition 6' dig.out.1.test$n >/dev/null || ret=1
    260 $DIGCMD @10.53.0.2 text7.other. TXT >dig.out.2.test$n || ret=1
    261 grep 'addition 7' dig.out.2.test$n >/dev/null || ret=1
    262 $DIGCMD @10.53.0.2 frozen.other. TXT >dig.out.3.test$n || ret=1
    263 grep 'frozen addition' dig.out.3.test$n >/dev/null || ret=1
    264 if [ $ret != 0 ]; then echo_i "failed"; fi
    265 status=$((status + ret))
    266 
    267 n=$((n + 1))
    268 echo_i "checking that journal is kept when ixfr-from-differences is in use ($n)"
    269 ret=0
    270 $NSUPDATE -p ${PORT} -k ns2/session.key >nsupdate.out.1.test$n 2>&1 <<END || ret=1
    271 server 10.53.0.2
    272 zone nil.
    273 update add text6.nil. 600 IN TXT "addition 6"
    274 send
    275 END
    276 [ -s ns2/nil.db.jnl ] || {
    277   echo_i "'test -s ns2/nil.db.jnl' failed when it shouldn't have"
    278   ret=1
    279 }
    280 $RNDCCMD 10.53.0.2 freeze nil 2>&1 | sed 's/^/ns2 /' | cat_i
    281 for i in 1 2 3 4 5 6 7 8 9 10; do
    282   grep "addition 6" ns2/nil.db >/dev/null && break
    283   sleep 1
    284 done
    285 serial=$(awk '$3 ~ /serial/ {print $1}' ns2/nil.db)
    286 newserial=$((serial + 1))
    287 sed s/$serial/$newserial/ ns2/nil.db >ns2/nil.db.new
    288 echo 'frozen TXT "frozen addition"' >>ns2/nil.db.new
    289 mv -f ns2/nil.db.new ns2/nil.db
    290 $RNDCCMD 10.53.0.2 thaw 2>&1 | sed 's/^/ns2 /' | cat_i
    291 sleep 1
    292 [ -s ns2/nil.db.jnl ] || {
    293   echo_i "'test -s ns2/nil.db.jnl' failed when it shouldn't have"
    294   ret=1
    295 }
    296 $NSUPDATE -p ${PORT} -k ns2/session.key >nsupdate.out.2.test$n 2>&1 <<END || ret=1
    297 server 10.53.0.2
    298 zone nil.
    299 update add text7.nil. 600 IN TXT "addition 7"
    300 send
    301 END
    302 $DIGCMD @10.53.0.2 text6.nil. TXT >dig.out.1.test$n || ret=1
    303 grep 'addition 6' dig.out.1.test$n >/dev/null || ret=1
    304 $DIGCMD @10.53.0.2 text7.nil. TXT >dig.out.2.test$n || ret=1
    305 grep 'addition 7' dig.out.2.test$n >/dev/null || ret=1
    306 $DIGCMD @10.53.0.2 frozen.nil. TXT >dig.out.3.test$n || ret=1
    307 grep 'frozen addition' dig.out.3.test$n >/dev/null || ret=1
    308 if [ $ret != 0 ]; then echo_i "failed"; fi
    309 status=$((status + ret))
    310 
    311 # temp test
    312 echo_i "dumping stats ($n)"
    313 $RNDCCMD 10.53.0.2 stats
    314 n=$((n + 1))
    315 echo_i "verifying adb records in named.stats ($n)"
    316 grep "ADB stats" ns2/named.stats >/dev/null || ret=1
    317 if [ $ret != 0 ]; then echo_i "failed"; fi
    318 status=$((status + ret))
    319 
    320 n=$((n + 1))
    321 echo_i "test using second key ($n)"
    322 ret=0
    323 $RNDC -s 10.53.0.2 -p ${CONTROLPORT} -c ns2/secondkey.conf status >/dev/null || ret=1
    324 if [ $ret != 0 ]; then echo_i "failed"; fi
    325 status=$((status + ret))
    326 
    327 n=$((n + 1))
    328 echo_i "test 'rndc dumpdb' with an unwritable dump-file ($n)"
    329 ret=0
    330 touch ns2/named_dump.db
    331 chmod -w ns2/named_dump.db
    332 rndc_dumpdb ns2 2>/dev/null && ret=1
    333 grep -F "failed: permission denied" "rndc.out.test$n" >/dev/null || ret=1
    334 if [ $ret != 0 ]; then echo_i "failed"; fi
    335 status=$((status + ret))
    336 
    337 n=$((n + 1))
    338 echo_i "test 'rndc dumpdb' on a empty cache ($n)"
    339 ret=0
    340 rndc_dumpdb ns3 || ret=1
    341 if [ $ret != 0 ]; then echo_i "failed"; fi
    342 status=$((status + ret))
    343 
    344 n=$((n + 1))
    345 echo_i "test 'rndc reload' on a zone with include files ($n)"
    346 ret=0
    347 grep "incl/IN: skipping load" ns2/named.run >/dev/null && ret=1
    348 loads=$(grep "incl/IN: starting load" ns2/named.run | wc -l)
    349 [ "$loads" -eq 1 ] || ret=1
    350 $RNDCCMD 10.53.0.2 reload >/dev/null || ret=1
    351 for i in 1 2 3 4 5 6 7 8 9; do
    352   tmp=0
    353   grep "incl/IN: skipping load" ns2/named.run >/dev/null || tmp=1
    354   [ $tmp -eq 0 ] && break
    355   sleep 1
    356 done
    357 [ $tmp -eq 1 ] && ret=1
    358 touch ns2/static.db
    359 $RNDCCMD 10.53.0.2 reload >/dev/null || ret=1
    360 for i in 1 2 3 4 5 6 7 8 9; do
    361   tmp=0
    362   loads=$(grep "incl/IN: starting load" ns2/named.run | wc -l)
    363   [ "$loads" -eq 2 ] || tmp=1
    364   [ $tmp -eq 0 ] && break
    365   sleep 1
    366 done
    367 [ $tmp -eq 1 ] && ret=1
    368 if [ $ret != 0 ]; then echo_i "failed"; fi
    369 status=$((status + ret))
    370 
    371 n=$((n + 1))
    372 if $FEATURETEST --md5; then
    373   echo_i "testing rndc with hmac-md5 ($n)"
    374   ret=0
    375   $RNDC -s 10.53.0.4 -p ${EXTRAPORT1} -c ns4/key1.conf status >/dev/null 2>&1 || ret=1
    376   for i in 2 3 4 5 6; do
    377     $RNDC -s 10.53.0.4 -p ${EXTRAPORT1} -c ns4/key${i}.conf status >/dev/null 2>&1 && ret=1
    378   done
    379   if [ $ret != 0 ]; then echo_i "failed"; fi
    380   status=$((status + ret))
    381 else
    382   echo_i "skipping rndc with hmac-md5 ($n)"
    383 fi
    384 
    385 n=$((n + 1))
    386 echo_i "testing rndc with hmac-sha1 ($n)"
    387 ret=0
    388 $RNDC -s 10.53.0.4 -p ${EXTRAPORT2} -c ns4/key2.conf status >/dev/null 2>&1 || ret=1
    389 for i in 1 3 4 5 6; do
    390   $RNDC -s 10.53.0.4 -p ${EXTRAPORT2} -c ns4/key${i}.conf status >/dev/null 2>&1 && ret=1
    391 done
    392 if [ $ret != 0 ]; then echo_i "failed"; fi
    393 status=$((status + ret))
    394 
    395 n=$((n + 1))
    396 echo_i "testing rndc with hmac-sha224 ($n)"
    397 ret=0
    398 $RNDC -s 10.53.0.4 -p ${EXTRAPORT3} -c ns4/key3.conf status >/dev/null 2>&1 || ret=1
    399 for i in 1 2 4 5 6; do
    400   $RNDC -s 10.53.0.4 -p ${EXTRAPORT3} -c ns4/key${i}.conf status >/dev/null 2>&1 && ret=1
    401 done
    402 if [ $ret != 0 ]; then echo_i "failed"; fi
    403 status=$((status + ret))
    404 
    405 n=$((n + 1))
    406 echo_i "testing rndc with hmac-sha256 ($n)"
    407 ret=0
    408 $RNDC -s 10.53.0.4 -p ${EXTRAPORT4} -c ns4/key4.conf status >/dev/null 2>&1 || ret=1
    409 for i in 1 2 3 5 6; do
    410   $RNDC -s 10.53.0.4 -p ${EXTRAPORT4} -c ns4/key${i}.conf status >/dev/null 2>&1 && ret=1
    411 done
    412 if [ $ret != 0 ]; then echo_i "failed"; fi
    413 status=$((status + ret))
    414 
    415 n=$((n + 1))
    416 echo_i "testing rndc with hmac-sha384 ($n)"
    417 ret=0
    418 $RNDC -s 10.53.0.4 -p ${EXTRAPORT5} -c ns4/key5.conf status >/dev/null 2>&1 || ret=1
    419 for i in 1 2 3 4 6; do
    420   $RNDC -s 10.53.0.4 -p ${EXTRAPORT5} -c ns4/key${i}.conf status >/dev/null 2>&1 && ret=1
    421 done
    422 if [ $ret != 0 ]; then echo_i "failed"; fi
    423 status=$((status + ret))
    424 
    425 n=$((n + 1))
    426 echo_i "testing rndc with hmac-sha512 ($n)"
    427 ret=0
    428 $RNDC -s 10.53.0.4 -p ${EXTRAPORT6} -c ns4/key6.conf status >/dev/null 2>&1 || ret=1
    429 for i in 1 2 3 4 5; do
    430   $RNDC -s 10.53.0.4 -p ${EXTRAPORT6} -c ns4/key${i}.conf status >/dev/null 2>&1 2>&1 && ret=1
    431 done
    432 if [ $ret != 0 ]; then echo_i "failed"; fi
    433 status=$((status + ret))
    434 
    435 n=$((n + 1))
    436 echo_i "testing single control channel with multiple algorithms ($n)"
    437 ret=0
    438 for i in 1 2 3 4 5 6; do
    439   test $i = 1 && $FEATURETEST --have-fips-mode && continue
    440   $RNDC -s 10.53.0.4 -p ${EXTRAPORT7} -c ns4/key${i}.conf status >/dev/null 2>&1 || ret=1
    441 done
    442 if [ $ret != 0 ]; then echo_i "failed"; fi
    443 status=$((status + ret))
    444 
    445 n=$((n + 1))
    446 echo_i "testing automatic zones are reported ($n)"
    447 ret=0
    448 $RNDC -s 10.53.0.4 -p ${EXTRAPORT6} -c ns4/key6.conf status >rndc.out.1.test$n || ret=1
    449 grep "number of zones: 201 (200 automatic)" rndc.out.1.test$n >/dev/null || ret=1
    450 if [ $ret != 0 ]; then echo_i "failed"; fi
    451 status=$((status + ret))
    452 
    453 n=$((n + 1))
    454 echo_i "testing rndc with null command ($n)"
    455 ret=0
    456 $RNDC -s 10.53.0.4 -p ${EXTRAPORT6} -c ns4/key6.conf null || ret=1
    457 if [ $ret != 0 ]; then echo_i "failed"; fi
    458 status=$((status + ret))
    459 
    460 n=$((n + 1))
    461 echo_i "testing rndc with unknown control channel command ($n)"
    462 ret=0
    463 $RNDC -s 10.53.0.4 -p ${EXTRAPORT6} -c ns4/key6.conf obviouslynotacommand >/dev/null 2>&1 && ret=1
    464 # rndc: 'obviouslynotacommand' failed: unknown command
    465 if [ $ret != 0 ]; then echo_i "failed"; fi
    466 status=$((status + ret))
    467 
    468 n=$((n + 1))
    469 echo_i "testing rndc with querylog command ($n)"
    470 ret=0
    471 # first enable it with querylog on option
    472 $RNDC -s 10.53.0.4 -p ${EXTRAPORT6} -c ns4/key6.conf querylog on >/dev/null 2>&1 || ret=1
    473 grep "query logging is now on" ns4/named.run >/dev/null || ret=1
    474 # query for builtin and check if query was logged (without +subnet)
    475 $DIG @10.53.0.4 -p ${PORT} -c ch -t txt foo12345.bind +qr >dig.out.1.test$n 2>&1 || ret=1
    476 grep "query: foo12345.bind CH TXT.*(.*)$" ns4/named.run >/dev/null || ret=1
    477 # query for another builtin zone and check if query was logged (with +subnet=127.0.0.1)
    478 $DIG +subnet=127.0.0.1 @10.53.0.4 -p ${PORT} -c ch -t txt foo12346.bind +qr >dig.out.2.test$n 2>&1 || ret=1
    479 grep "query: foo12346.bind CH TXT.*\[ECS 127\.0\.0\.1/32/0]" ns4/named.run >/dev/null || ret=1
    480 # query for another builtin zone and check if query was logged (with +subnet=127.0.0.1/24)
    481 $DIG +subnet=127.0.0.1/24 @10.53.0.4 -p ${PORT} -c ch -t txt foo12347.bind +qr >dig.out.3.test$n 2>&1 || ret=1
    482 grep "query: foo12347.bind CH TXT.*\[ECS 127\.0\.0\.0/24/0]" ns4/named.run >/dev/null || ret=1
    483 # query for another builtin zone and check if query was logged (with +subnet=::1)
    484 $DIG +subnet=::1 @10.53.0.4 -p ${PORT} -c ch -t txt foo12348.bind +qr >dig.out.4.test$n 2>&1 || ret=1
    485 grep "query: foo12348.bind CH TXT.*\[ECS ::1/128/0]" ns4/named.run >/dev/null || ret=1
    486 # toggle query logging and check again
    487 $RNDC -s 10.53.0.4 -p ${EXTRAPORT6} -c ns4/key6.conf querylog >/dev/null 2>&1 || ret=1
    488 grep "query logging is now off" ns4/named.run >/dev/null || ret=1
    489 # query for another builtin zone and check if query was logged (without +subnet)
    490 $DIG @10.53.0.4 -p ${PORT} -c ch -t txt foo9876.bind +qr >dig.out.5.test$n 2>&1 || ret=1
    491 grep "query: foo9876.bind CH TXT.*(.*)$" ns4/named.run >/dev/null && ret=1
    492 if [ $ret != 0 ]; then echo_i "failed"; fi
    493 status=$((status + ret))
    494 
    495 RNDCCMD4="$RNDC -s 10.53.0.4 -p ${EXTRAPORT6} -c ns4/key6.conf"
    496 n=$((n + 1))
    497 echo_i "testing rndc nta time limits ($n)"
    498 ret=0
    499 $RNDCCMD4 nta -l 2h nta1.example >rndc.out.1.test$n 2>&1
    500 grep "Negative trust anchor added" rndc.out.1.test$n >/dev/null || ret=1
    501 $RNDCCMD4 nta -l 1d nta2.example >rndc.out.2.test$n 2>&1
    502 grep "Negative trust anchor added" rndc.out.2.test$n >/dev/null || ret=1
    503 $RNDCCMD4 nta -l 1w nta3.example >rndc.out.3.test$n 2>&1
    504 grep "Negative trust anchor added" rndc.out.3.test$n >/dev/null || ret=1
    505 $RNDCCMD4 nta -l 8d nta4.example >rndc.out.4.test$n 2>&1 && ret=1
    506 grep "NTA lifetime cannot exceed one week" rndc.out.4.test$n >/dev/null || ret=1
    507 if [ $ret != 0 ]; then echo_i "failed"; fi
    508 status=$((status + ret))
    509 
    510 n=$((n + 1))
    511 echo_i "testing rndc nta -class option ($n)"
    512 ret=0
    513 nextpart ns4/named.run >/dev/null
    514 $RNDCCMD4 nta -c in nta1.example >rndc.out.1.test$n 2>&1
    515 nextpart ns4/named.run | grep "added NTA 'nta1.example'" >/dev/null || ret=1
    516 $RNDCCMD4 nta -c any nta1.example >rndc.out.2.test$n 2>&1
    517 nextpart ns4/named.run | grep "added NTA 'nta1.example'" >/dev/null || ret=1
    518 $RNDCCMD4 nta -c ch nta1.example >rndc.out.3.test$n 2>&1
    519 nextpart ns4/named.run | grep "added NTA 'nta1.example'" >/dev/null && ret=1
    520 $RNDCCMD4 nta -c fake nta1.example >rndc.out.4.test$n 2>&1 && ret=1
    521 nextpart ns4/named.run | grep "added NTA 'nta1.example'" >/dev/null && ret=1
    522 grep 'unknown class' rndc.out.4.test$n >/dev/null || ret=1
    523 if [ $ret != 0 ]; then echo_i "failed"; fi
    524 status=$((status + ret))
    525 
    526 for i in 512 1024 2048 4096 8192 16384 32768 65536 131072 262144 524288; do
    527   n=$((n + 1))
    528   echo_i "testing rndc buffer size limits (size=${i}) ($n)"
    529   ret=0
    530   $RNDC -s 10.53.0.4 -p ${EXTRAPORT6} -c ns4/key6.conf testgen ${i} 2>&1 >rndc.out.$i.test$n || ret=1
    531   {
    532     actual_size=$($GENCHECK rndc.out.$i.test$n)
    533     rc=$?
    534   } || true
    535   if [ "$rc" = "0" ]; then
    536     expected_size=$((i + 1))
    537     if [ $actual_size != $expected_size ]; then ret=1; fi
    538   else
    539     ret=1
    540   fi
    541 
    542   if [ $ret != 0 ]; then echo_i "failed"; fi
    543   status=$((status + ret))
    544 done
    545 
    546 n=$((n + 1))
    547 echo_i "testing rndc -r (show result) ($n)"
    548 ret=0
    549 $RNDC -s 10.53.0.4 -p ${EXTRAPORT6} -c ns4/key6.conf -r testgen 0 2>&1 >rndc.out.1.test$n || ret=1
    550 grep "ISC_R_SUCCESS 0" rndc.out.1.test$n >/dev/null || ret=1
    551 if [ $ret != 0 ]; then echo_i "failed"; fi
    552 status=$((status + ret))
    553 
    554 n=$((n + 1))
    555 echo_i "testing rndc with a token containing a space ($n)"
    556 ret=0
    557 $RNDC -s 10.53.0.4 -p ${EXTRAPORT6} -c ns4/key6.conf -r flush '"view with a space"' 2>&1 >rndc.out.1.test$n || ret=1
    558 grep "not found" rndc.out.1.test$n >/dev/null && ret=1
    559 if [ $ret != 0 ]; then echo_i "failed"; fi
    560 status=$((status + ret))
    561 
    562 n=$((n + 1))
    563 echo_i "test 'rndc reconfig' with a broken config ($n)"
    564 ret=0
    565 nextpart ns4/named.run >/dev/null
    566 $RNDC -s 10.53.0.4 -p ${EXTRAPORT6} -c ns4/key6.conf reconfig >/dev/null || ret=1
    567 wait_for_log 3 "running" ns4/named.run
    568 mv ns4/named.conf ns4/named.conf.save
    569 echo "error error error" >>ns4/named.conf
    570 $RNDC -s 10.53.0.4 -p ${EXTRAPORT6} -c ns4/key6.conf reconfig >rndc.out.1.test$n 2>&1 && ret=1
    571 grep "rndc: 'reconfig' failed: unexpected token" rndc.out.1.test$n >/dev/null || ret=1
    572 if [ $ret != 0 ]; then echo_i "failed"; fi
    573 status=$((status + ret))
    574 
    575 n=$((n + 1))
    576 echo_i "check rndc status reports failure ($n)"
    577 ret=0
    578 $RNDC -s 10.53.0.4 -p ${EXTRAPORT6} -c ns4/key6.conf status >rndc.out.1.test$n 2>&1 || ret=1
    579 grep "reload/reconfig failed" rndc.out.1.test$n >/dev/null || ret=1
    580 if [ $ret != 0 ]; then echo_i "failed"; fi
    581 status=$((status + ret))
    582 
    583 n=$((n + 1))
    584 echo_i "restore working config ($n)"
    585 ret=0
    586 nextpart ns4/named.run >/dev/null
    587 mv ns4/named.conf.save ns4/named.conf
    588 sleep 1
    589 $RNDC -s 10.53.0.4 -p ${EXTRAPORT6} -c ns4/key6.conf reconfig >/dev/null || ret=1
    590 wait_for_log 3 "running" ns4/named.run
    591 if [ $ret != 0 ]; then echo_i "failed"; fi
    592 status=$((status + ret))
    593 
    594 n=$((n + 1))
    595 echo_i "check 'rndc status' 'reload/reconfig failure' is cleared after successful reload/reconfig ($n)"
    596 ret=0
    597 $RNDC -s 10.53.0.4 -p ${EXTRAPORT6} -c ns4/key6.conf status >rndc.out.1.test$n 2>&1 || ret=1
    598 grep "reload/reconfig failed" rndc.out.1.test$n >/dev/null && ret=1
    599 if [ $ret != 0 ]; then echo_i "failed"; fi
    600 status=$((status + ret))
    601 
    602 n=$((n + 1))
    603 echo_i "test read-only control channel access ($n)"
    604 ret=0
    605 $RNDCCMD 10.53.0.5 status >rndc.out.1.test$n 2>&1 || ret=1
    606 $RNDCCMD 10.53.0.5 nta -dump >rndc.out.2.test$n 2>&1 || ret=1
    607 $RNDCCMD 10.53.0.5 reconfig >rndc.out.3.test$n 2>&1 && ret=1
    608 if [ $ret != 0 ]; then echo_i "failed"; fi
    609 status=$((status + ret))
    610 
    611 n=$((n + 1))
    612 echo_i "test rndc status shows running on ($n)"
    613 ret=0
    614 $RNDCCMD 10.53.0.5 status >rndc.out.1.test$n 2>&1 || ret=1
    615 grep "^running on " rndc.out.1.test$n >/dev/null || ret=1
    616 if [ $ret != 0 ]; then echo_i "failed"; fi
    617 status=$((status + ret))
    618 
    619 n=$((n + 1))
    620 echo_i "test 'rndc reconfig' with loading of a large zone ($n)"
    621 ret=0
    622 nextpart ns6/named.run >/dev/null
    623 cp ns6/named.conf ns6/named.conf.save
    624 echo "zone \"huge.zone\" { type primary; file \"huge.zone.db\"; };" >>ns6/named.conf
    625 echo_i "reloading config"
    626 $RNDCCMD 10.53.0.6 reconfig >rndc.out.1.test$n 2>&1 || ret=1
    627 if [ $ret != 0 ]; then echo_i "failed"; fi
    628 status=$((status + ret))
    629 sleep 1
    630 
    631 n=$((n + 1))
    632 echo_i "check if zone load was scheduled ($n)"
    633 wait_for_log_peek 20 "scheduled loading new zones" ns6/named.run || ret=1
    634 if [ $ret != 0 ]; then echo_i "failed"; fi
    635 status=$((status + ret))
    636 
    637 n=$((n + 1))
    638 echo_i "check if query for the zone returns SERVFAIL ($n)"
    639 $DIG @10.53.0.6 -p ${PORT} -t soa huge.zone >dig.out.1.test$n || ret=1
    640 grep "SERVFAIL" dig.out.1.test$n >/dev/null || ret=1
    641 if [ $ret != 0 ]; then
    642   echo_i "failed (ignored)"
    643   ret=0
    644 fi
    645 status=$((status + ret))
    646 
    647 n=$((n + 1))
    648 echo_i "wait for the zones to be loaded ($n)"
    649 wait_for_log_peek 60 "huge.zone/IN: loaded serial" ns6/named.run || ret=1
    650 if [ $ret != 0 ]; then echo_i "failed"; fi
    651 status=$((status + ret))
    652 
    653 n=$((n + 1))
    654 echo_i "check if query for the zone returns NOERROR ($n)"
    655 $DIG @10.53.0.6 -p ${PORT} -t soa huge.zone >dig.out.1.test$n || ret=1
    656 grep "NOERROR" dig.out.1.test$n >/dev/null || ret=1
    657 if [ $ret != 0 ]; then echo_i "failed"; fi
    658 status=$((status + ret))
    659 
    660 n=$((n + 1))
    661 echo_i "verify that the full command is logged ($n)"
    662 ret=0
    663 $RNDCCMD 10.53.0.2 null with extra arguments >/dev/null 2>&1
    664 grep "received control channel command 'null with extra arguments'" ns2/named.run >/dev/null || ret=1
    665 if [ $ret != 0 ]; then echo_i "failed"; fi
    666 status=$((status + ret))
    667 
    668 mv ns6/named.conf.save ns6/named.conf
    669 sleep 1
    670 $RNDCCMD 10.53.0.6 reconfig >/dev/null || ret=1
    671 sleep 1
    672 if [ $ret != 0 ]; then echo_i "failed"; fi
    673 status=$((status + ret))
    674 
    675 n=$((n + 1))
    676 echo_i "check 'rndc \"\"' is handled ($n)"
    677 ret=0
    678 $RNDCCMD 10.53.0.2 "" >rndc.out.1.test$n 2>&1 && ret=1
    679 grep "rndc: '' failed: failure" rndc.out.1.test$n >/dev/null
    680 if [ $ret != 0 ]; then echo_i "failed"; fi
    681 status=$((status + ret))
    682 
    683 n=$((n + 1))
    684 echo_i "check rndc -4 -6 ($n)"
    685 ret=0
    686 $RNDCCMD 10.53.0.2 -4 -6 status >rndc.out.1.test$n 2>&1 && ret=1
    687 grep "only one of -4 and -6 allowed" rndc.out.1.test$n >/dev/null || ret=1
    688 if [ $ret != 0 ]; then echo_i "failed"; fi
    689 status=$((status + ret))
    690 
    691 n=$((n + 1))
    692 echo_i "check rndc -4 with an IPv6 server address ($n)"
    693 ret=0
    694 $RNDCCMD fd92:7065:b8e:ffff::2 -4 status >rndc.out.1.test$n 2>&1 && ret=1
    695 grep "address family not supported" rndc.out.1.test$n >/dev/null || ret=1
    696 if [ $ret != 0 ]; then echo_i "failed"; fi
    697 status=$((status + ret))
    698 
    699 n=$((n + 1))
    700 echo_i "check rndc nta reports adding to multiple views ($n)"
    701 ret=0
    702 $RNDCCMD 10.53.0.3 nta test.com >rndc.out.test$n 2>&1 || ret=1
    703 lines=$(cat rndc.out.test$n | wc -l)
    704 [ ${lines:-0} -eq 2 ] || ret=1
    705 if [ $ret != 0 ]; then echo_i "failed"; fi
    706 status=$((status + ret))
    707 
    708 n=$((n + 1))
    709 echo_i "check 'rndc retransfer' of primary error message ($n)"
    710 ret=0
    711 $RNDCCMD 10.53.0.2 retransfer nil >rndc.out.test$n 2>&1 && ret=1
    712 grep "rndc: 'retransfer' failed: failure" rndc.out.test$n >/dev/null || ret=1
    713 grep "retransfer: inappropriate zone type: primary" rndc.out.test$n >/dev/null || ret=1
    714 lines=$(cat rndc.out.test$n | wc -l)
    715 [ ${lines:-0} -eq 2 ] || ret=1
    716 if [ $ret != 0 ]; then echo_i "failed"; fi
    717 status=$((status + ret))
    718 
    719 n=$((n + 1))
    720 echo_i "check 'rndc freeze' with in-view zones works ($n)"
    721 ret=0
    722 $RNDC -s 10.53.0.4 -p ${EXTRAPORT6} -c ns4/key6.conf freeze >rndc.out.test$n 2>&1 || ret=1
    723 test -s rndc.out.test$n && sed 's/^/ns2 /' rndc.out.test$n | cat_i
    724 if [ $ret != 0 ]; then echo_i "failed"; fi
    725 status=$((status + ret))
    726 
    727 n=$((n + 1))
    728 echo_i "checking non in-view zone instance is not writable ($n)"
    729 ret=0
    730 $NSUPDATE -p ${PORT} >/dev/null 2>&1 <<END && ret=1
    731 server 10.53.0.4
    732 zone example.
    733 update add text2.example. 600 IN TXT "addition 3"
    734 send
    735 END
    736 $DIGCMD @10.53.0.4 -p ${PORT} text2.example. TXT >dig.out.1.test$n || ret=1
    737 grep 'addition 3' dig.out.1.test$n >/dev/null && ret=1
    738 if [ $ret != 0 ]; then echo_i "failed"; fi
    739 status=$((status + ret))
    740 
    741 n=$((n + 1))
    742 echo_i "check 'rndc thaw' with in-view zones works ($n)"
    743 ret=0
    744 $RNDC -s 10.53.0.4 -p ${EXTRAPORT6} -c ns4/key6.conf thaw >rndc.out.test$n 2>&1 || ret=1
    745 test -s rndc.out.test$n && sed 's/^/ns2 /' rndc.out.test$n | cat_i
    746 if [ $ret != 0 ]; then echo_i "failed"; fi
    747 status=$((status + ret))
    748 
    749 n=$((n + 1))
    750 echo_i "checking non in-view zone instance is now writable ($n)"
    751 ret=0
    752 $NSUPDATE -p ${PORT} >nsupdate.out.test$n 2>&1 <<END || ret=1
    753 server 10.53.0.4
    754 zone example.
    755 update add text2.example. 600 IN TXT "addition 3"
    756 send
    757 END
    758 $DIGCMD @10.53.0.4 -p ${PORT} text2.example. TXT >dig.out.1.test$n || ret=1
    759 grep 'addition 3' dig.out.1.test$n >/dev/null || ret=1
    760 if [ $ret != 0 ]; then echo_i "failed"; fi
    761 status=$((status + ret))
    762 
    763 n=$((n + 1))
    764 echo_i "checking initial in-view zone file is loaded ($n)"
    765 ret=0
    766 TSIG="$DEFAULT_HMAC:int:FrSt77yPTFx6hTs4i2tKLB9LmE0="
    767 $DIGCMD @10.53.0.7 -y "$TSIG" text1.test. TXT >dig.out.1.test$n || ret=1
    768 grep 'include 1' dig.out.1.test$n >/dev/null || ret=1
    769 TSIG="$DEFAULT_HMAC:ext:FrSt77yPTFx6hTs4i2tKLB9LmE0="
    770 $DIGCMD @10.53.0.7 -y "$TSIG" text1.test. TXT >dig.out.2.test$n || ret=1
    771 grep 'include 1' dig.out.2.test$n >/dev/null || ret=1
    772 if [ $ret != 0 ]; then echo_i "failed"; fi
    773 status=$((status + ret))
    774 
    775 echo_i "update in-view zone ($n)"
    776 ret=0
    777 TSIG="$DEFAULT_HMAC:int:FrSt77yPTFx6hTs4i2tKLB9LmE0="
    778 $NSUPDATE -p ${PORT} -y "$TSIG" >/dev/null 2>&1 <<END || ret=1
    779 server 10.53.0.7
    780 zone test.
    781 update add text2.test. 600 IN TXT "addition 1"
    782 send
    783 END
    784 [ -s ns7/test.db.jnl ] || {
    785   echo_i "'test -s ns7/test.db.jnl' failed when it shouldn't have"
    786   ret=1
    787 }
    788 if [ $ret != 0 ]; then echo_i "failed"; fi
    789 status=$((status + ret))
    790 
    791 echo_i "checking update ($n)"
    792 ret=0
    793 TSIG="$DEFAULT_HMAC:int:FrSt77yPTFx6hTs4i2tKLB9LmE0="
    794 $DIGCMD @10.53.0.7 -y "$TSIG" text2.test. TXT >dig.out.1.test$n || ret=1
    795 grep 'addition 1' dig.out.1.test$n >/dev/null || ret=1
    796 if [ $ret != 0 ]; then echo_i "failed"; fi
    797 status=$((status + ret))
    798 
    799 nextpart ns7/named.run >/dev/null
    800 
    801 echo_i "rndc freeze"
    802 $RNDCCMD 10.53.0.7 freeze | sed 's/^/ns7 /' | cat_i | cat_i
    803 
    804 wait_for_log 3 "dump_done: zone test/IN/internal: enter" ns7/named.run
    805 
    806 echo_i "edit zone files"
    807 cp ns7/test.db.in ns7/test.db
    808 cp ns7/include2.db.in ns7/include.db
    809 
    810 echo_i "rndc thaw"
    811 $RNDCCMD 10.53.0.7 thaw | sed 's/^/ns7 /' | cat_i
    812 
    813 wait_for_log 3 "zone_postload: zone test/IN/internal: done" ns7/named.run
    814 
    815 echo_i "rndc reload"
    816 $RNDCCMD 10.53.0.7 reload | sed 's/^/ns7 /' | cat_i
    817 
    818 wait_for_log 3 "all zones loaded" ns7/named.run
    819 
    820 n=$((n + 1))
    821 echo_i "checking zone file edits are loaded ($n)"
    822 ret=0
    823 TSIG="$DEFAULT_HMAC:int:FrSt77yPTFx6hTs4i2tKLB9LmE0="
    824 $DIGCMD @10.53.0.7 -y "$TSIG" text1.test. TXT >dig.out.1.test$n || ret=1
    825 grep 'include 2' dig.out.1.test$n >/dev/null || ret=1
    826 TSIG="$DEFAULT_HMAC:ext:FrSt77yPTFx6hTs4i2tKLB9LmE0="
    827 $DIGCMD @10.53.0.7 -y "$TSIG" text1.test. TXT >dig.out.2.test$n || ret=1
    828 grep 'include 2' dig.out.2.test$n >/dev/null || ret=1
    829 if [ $ret != 0 ]; then echo_i "failed"; fi
    830 status=$((status + ret))
    831 
    832 n=$((n + 1))
    833 echo_i "check rndc nta -dump reports NTAs in multiple views ($n)"
    834 ret=0
    835 $RNDCCMD 10.53.0.3 nta -dump >rndc.out.test$n 2>&1 || ret=1
    836 lines=$(cat rndc.out.test$n | wc -l)
    837 [ ${lines:-0} -eq 2 ] || ret=1
    838 if [ $ret != 0 ]; then echo_i "failed"; fi
    839 status=$((status + ret))
    840 
    841 echo_i "exit status: $status"
    842 [ $status -eq 0 ] || exit 1
    843