1#!/bin/sh 2# 3# Copyright (C) Internet Systems Consortium, Inc. ("ISC") 4# 5# This Source Code Form is subject to the terms of the Mozilla Public 6# License, v. 2.0. If a copy of the MPL was not distributed with this 7# file, You can obtain one at http://mozilla.org/MPL/2.0/. 8# 9# See the COPYRIGHT file distributed with this work for additional 10# information regarding copyright ownership. 11 12SYSTEMTESTTOP=.. 13. $SYSTEMTESTTOP/conf.sh 14 15RNDCCMD="$RNDC -c $SYSTEMTESTTOP/common/rndc.conf -p ${CONTROLPORT} -s" 16 17# wait up to ten seconds to ensure that a file has been written 18waitfile () { 19 for try in 0 1 2 3 4 5 6 7 8 9; do 20 [ -s "$1" ] && break 21 sleep 1 22 done 23} 24 25status=0 26n=0 27 28# 29# First test server with serve-stale options set. 30# 31echo_i "test server with serve-stale options set" 32 33n=$((n+1)) 34echo_i "prime cache longttl.example ($n)" 35ret=0 36$DIG -p ${PORT} @10.53.0.1 longttl.example TXT > dig.out.test$n 37grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1 38grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1 39if [ $ret != 0 ]; then echo_i "failed"; fi 40status=$((status+ret)) 41 42n=$((n+1)) 43echo_i "prime cache data.example ($n)" 44ret=0 45$DIG -p ${PORT} @10.53.0.1 data.example TXT > dig.out.test$n 46grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1 47grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1 48if [ $ret != 0 ]; then echo_i "failed"; fi 49status=$((status+ret)) 50 51n=$((n+1)) 52echo_i "prime cache othertype.example ($n)" 53ret=0 54$DIG -p ${PORT} @10.53.0.1 othertype.example CAA > dig.out.test$n 55grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1 56grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1 57if [ $ret != 0 ]; then echo_i "failed"; fi 58status=$((status+ret)) 59 60n=$((n+1)) 61echo_i "prime cache nodata.example ($n)" 62ret=0 63$DIG -p ${PORT} @10.53.0.1 nodata.example TXT > dig.out.test$n 64grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1 65grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1 66if [ $ret != 0 ]; then echo_i "failed"; fi 67status=$((status+ret)) 68 69n=$((n+1)) 70echo_i "prime cache nxdomain.example ($n)" 71ret=0 72$DIG -p ${PORT} @10.53.0.1 nxdomain.example TXT > dig.out.test$n 73grep "status: NXDOMAIN" dig.out.test$n > /dev/null || ret=1 74grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1 75if [ $ret != 0 ]; then echo_i "failed"; fi 76status=$((status+ret)) 77 78n=$((n+1)) 79echo_i "verify prime cache statistics ($n)" 80ret=0 81rm -f ns1/named.stats 82$RNDCCMD 10.53.0.1 stats > /dev/null 2>&1 83[ -f ns1/named.stats ] || ret=1 84cp ns1/named.stats ns1/named.stats.$n 85# Check first 10 lines of Cache DB statistics. After prime queries, we expect 86# two active TXT one nxrrset TXT, and one NXDOMAIN. 87grep -A 10 "++ Cache DB RRsets ++" ns1/named.stats.$n > ns1/named.stats.$n.cachedb || ret=1 88grep "1 Others" ns1/named.stats.$n.cachedb > /dev/null || ret=1 89grep "2 TXT" ns1/named.stats.$n.cachedb > /dev/null || ret=1 90grep "1 !TXT" ns1/named.stats.$n.cachedb > /dev/null || ret=1 91grep "1 NXDOMAIN" ns1/named.stats.$n.cachedb > /dev/null || ret=1 92if [ $ret != 0 ]; then echo_i "failed"; fi 93status=$((status+ret)) 94 95n=$((n+1)) 96echo_i "disable responses from authoritative server ($n)" 97ret=0 98$DIG -p ${PORT} @10.53.0.2 txt disable > dig.out.test$n 99grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1 100grep "TXT.\"0\"" dig.out.test$n > /dev/null || ret=1 101if [ $ret != 0 ]; then echo_i "failed"; fi 102status=$((status+ret)) 103 104n=$((n+1)) 105echo_i "check 'rndc serve-stale status' ($n)" 106ret=0 107$RNDCCMD 10.53.0.1 serve-stale status > rndc.out.test$n 2>&1 || ret=1 108grep '_default: on (stale-answer-ttl=2 max-stale-ttl=3600)' rndc.out.test$n > /dev/null || ret=1 109if [ $ret != 0 ]; then echo_i "failed"; fi 110status=$((status+ret)) 111 112sleep 2 113 114echo_i "sending queries for tests $((n+1))-$((n+4))..." 115$DIG -p ${PORT} @10.53.0.1 data.example TXT > dig.out.test$((n+1)) & 116$DIG -p ${PORT} @10.53.0.1 othertype.example CAA > dig.out.test$((n+2)) & 117$DIG -p ${PORT} @10.53.0.1 nodata.example TXT > dig.out.test$((n+3)) & 118$DIG -p ${PORT} @10.53.0.1 nxdomain.example TXT > dig.out.test$((n+4)) 119 120# ensure all files have been written before proceeding 121waitfile dig.out.test$((n+1)) 122waitfile dig.out.test$((n+2)) 123waitfile dig.out.test$((n+3)) 124waitfile dig.out.test$((n+4)) 125 126n=$((n+1)) 127echo_i "check stale data.example ($n)" 128ret=0 129grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1 130grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1 131grep "data\.example\..*2.*IN.*TXT.*A text record with a 2 second ttl" dig.out.test$n > /dev/null || ret=1 132# Run rndc dumpdb, test whether the stale data has correct comment printed. 133# The max-stale-ttl is 3600 seconds, so the comment should say the data is 134# stale for somewhere between 3500-3599 seconds. 135rndc_dumpdb ns1 || ret=1 136awk '/; stale/ { x=$0; getline; print x, $0}' ns1/named_dump.db.test$n | 137 grep "; stale (will be retained for 35.. more seconds) data\.example.*A text record with a 2 second ttl" > /dev/null 2>&1 || ret=1 138# Also make sure the not expired data does not have a stale comment. 139awk '/; answer/ { x=$0; getline; print x, $0}' ns1/named_dump.db.test$n | 140 grep "; answer longttl\.example.*A text record with a 600 second ttl" > /dev/null 2>&1 || ret=1 141if [ $ret != 0 ]; then echo_i "failed"; fi 142status=$((status+ret)) 143 144n=$((n+1)) 145echo_i "check stale othertype.example ($n)" 146ret=0 147grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1 148grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1 149grep "othertype\.example\..*2.*IN.*CAA.*0.*issue" dig.out.test$n > /dev/null || ret=1 150if [ $ret != 0 ]; then echo_i "failed"; fi 151status=$((status+ret)) 152 153n=$((n+1)) 154echo_i "check stale nodata.example ($n)" 155ret=0 156grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1 157grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1 158grep "example\..*2.*IN.*SOA" dig.out.test$n > /dev/null || ret=1 159if [ $ret != 0 ]; then echo_i "failed"; fi 160status=$((status+ret)) 161 162n=$((n+1)) 163echo_i "check stale nxdomain.example ($n)" 164ret=0 165grep "status: NXDOMAIN" dig.out.test$n > /dev/null || ret=1 166grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1 167grep "example\..*2.*IN.*SOA" dig.out.test$n > /dev/null || ret=1 168if [ $ret != 0 ]; then echo_i "failed"; fi 169status=$((status+ret)) 170 171n=$((n+1)) 172echo_i "verify stale cache statistics ($n)" 173ret=0 174rm -f ns1/named.stats 175$RNDCCMD 10.53.0.1 stats > /dev/null 2>&1 176[ -f ns1/named.stats ] || ret=1 177cp ns1/named.stats ns1/named.stats.$n 178# Check first 10 lines of Cache DB statistics. After serve-stale queries, we 179# expect one active TXT RRset, one stale TXT, one stale nxrrset TXT, and one 180# stale NXDOMAIN. 181grep -A 10 "++ Cache DB RRsets ++" ns1/named.stats.$n > ns1/named.stats.$n.cachedb || ret=1 182grep "1 TXT" ns1/named.stats.$n.cachedb > /dev/null || ret=1 183grep "1 #Others" ns1/named.stats.$n.cachedb > /dev/null || ret=1 184grep "1 #TXT" ns1/named.stats.$n.cachedb > /dev/null || ret=1 185grep "1 #!TXT" ns1/named.stats.$n.cachedb > /dev/null || ret=1 186grep "1 #NXDOMAIN" ns1/named.stats.$n.cachedb > /dev/null || ret=1 187status=$((status+ret)) 188if [ $ret != 0 ]; then echo_i "failed"; fi 189 190n=$((n+1)) 191echo_i "running 'rndc serve-stale off' ($n)" 192ret=0 193$RNDCCMD 10.53.0.1 serve-stale off || ret=1 194if [ $ret != 0 ]; then echo_i "failed"; fi 195status=$((status+ret)) 196 197n=$((n+1)) 198echo_i "check 'rndc serve-stale status' ($n)" 199ret=0 200$RNDCCMD 10.53.0.1 serve-stale status > rndc.out.test$n 2>&1 || ret=1 201grep '_default: off (rndc) (stale-answer-ttl=2 max-stale-ttl=3600)' rndc.out.test$n > /dev/null || ret=1 202if [ $ret != 0 ]; then echo_i "failed"; fi 203status=$((status+ret)) 204 205echo_i "sending queries for tests $((n+1))-$((n+4))..." 206$DIG -p ${PORT} @10.53.0.1 data.example TXT > dig.out.test$((n+1)) & 207$DIG -p ${PORT} @10.53.0.1 othertype.example CAA > dig.out.test$((n+2)) & 208$DIG -p ${PORT} @10.53.0.1 nodata.example TXT > dig.out.test$((n+3)) & 209$DIG -p ${PORT} @10.53.0.1 nxdomain.example TXT > dig.out.test$((n+4)) 210 211# ensure all files have been written before proceeding 212waitfile dig.out.test$((n+1)) 213waitfile dig.out.test$((n+2)) 214waitfile dig.out.test$((n+3)) 215waitfile dig.out.test$((n+4)) 216 217n=$((n+1)) 218echo_i "check stale data.example (serve-stale off) ($n)" 219ret=0 220grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1 221if [ $ret != 0 ]; then echo_i "failed"; fi 222status=$((status+ret)) 223 224n=$((n+1)) 225echo_i "check stale othertype.example (serve-stale off) ($n)" 226ret=0 227grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1 228if [ $ret != 0 ]; then echo_i "failed"; fi 229status=$((status+ret)) 230 231n=$((n+1)) 232echo_i "check stale nodata.example (serve-stale off) ($n)" 233ret=0 234grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1 235if [ $ret != 0 ]; then echo_i "failed"; fi 236status=$((status+ret)) 237 238n=$((n+1)) 239echo_i "check stale nxdomain.example (serve-stale off) ($n)" 240ret=0 241grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1 242if [ $ret != 0 ]; then echo_i "failed"; fi 243status=$((status+ret)) 244 245n=$((n+1)) 246echo_i "running 'rndc serve-stale on' ($n)" 247ret=0 248$RNDCCMD 10.53.0.1 serve-stale on || ret=1 249if [ $ret != 0 ]; then echo_i "failed"; fi 250status=$((status+ret)) 251 252n=$((n+1)) 253echo_i "check 'rndc serve-stale status' ($n)" 254ret=0 255$RNDCCMD 10.53.0.1 serve-stale status > rndc.out.test$n 2>&1 || ret=1 256grep '_default: on (rndc) (stale-answer-ttl=2 max-stale-ttl=3600)' rndc.out.test$n > /dev/null || ret=1 257if [ $ret != 0 ]; then echo_i "failed"; fi 258status=$((status+ret)) 259 260echo_i "sending queries for tests $((n+1))-$((n+4))..." 261$DIG -p ${PORT} @10.53.0.1 data.example TXT > dig.out.test$((n+1)) & 262$DIG -p ${PORT} @10.53.0.1 othertype.example CAA > dig.out.test$((n+2)) & 263$DIG -p ${PORT} @10.53.0.1 nodata.example TXT > dig.out.test$((n+3)) & 264$DIG -p ${PORT} @10.53.0.1 nxdomain.example TXT > dig.out.test$((n+4)) 265 266# ensure all files have been written before proceeding 267waitfile dig.out.test$((n+1)) 268waitfile dig.out.test$((n+2)) 269waitfile dig.out.test$((n+3)) 270waitfile dig.out.test$((n+4)) 271 272n=$((n+1)) 273echo_i "check stale data.example (serve-stale on) ($n)" 274ret=0 275grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1 276grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1 277grep "data\.example\..*2.*IN.*TXT.*A text record with a 2 second ttl" dig.out.test$n > /dev/null || ret=1 278if [ $ret != 0 ]; then echo_i "failed"; fi 279status=$((status+ret)) 280 281n=$((n+1)) 282echo_i "check stale othertype.example (serve-stale on) ($n)" 283ret=0 284grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1 285grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1 286grep "othertype\.example\..*2.*IN.*CAA.*0.*issue" dig.out.test$n > /dev/null || ret=1 287if [ $ret != 0 ]; then echo_i "failed"; fi 288status=$((status+ret)) 289 290n=$((n+1)) 291echo_i "check stale nodata.example (serve-stale on) ($n)" 292ret=0 293grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1 294grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1 295grep "example\..*2.*IN.*SOA" dig.out.test$n > /dev/null || ret=1 296if [ $ret != 0 ]; then echo_i "failed"; fi 297status=$((status+ret)) 298 299n=$((n+1)) 300echo_i "check stale nxdomain.example (serve-stale on) ($n)" 301ret=0 302grep "status: NXDOMAIN" dig.out.test$n > /dev/null || ret=1 303grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1 304grep "example\..*2.*IN.*SOA" dig.out.test$n > /dev/null || ret=1 305if [ $ret != 0 ]; then echo_i "failed"; fi 306status=$((status+ret)) 307 308n=$((n+1)) 309echo_i "running 'rndc serve-stale off' ($n)" 310ret=0 311$RNDCCMD 10.53.0.1 serve-stale off || ret=1 312if [ $ret != 0 ]; then echo_i "failed"; fi 313status=$((status+ret)) 314 315n=$((n+1)) 316echo_i "running 'rndc serve-stale reset' ($n)" 317ret=0 318$RNDCCMD 10.53.0.1 serve-stale reset || ret=1 319if [ $ret != 0 ]; then echo_i "failed"; fi 320status=$((status+ret)) 321 322n=$((n+1)) 323echo_i "check 'rndc serve-stale status' ($n)" 324ret=0 325$RNDCCMD 10.53.0.1 serve-stale status > rndc.out.test$n 2>&1 || ret=1 326grep '_default: on (stale-answer-ttl=2 max-stale-ttl=3600)' rndc.out.test$n > /dev/null || ret=1 327if [ $ret != 0 ]; then echo_i "failed"; fi 328status=$((status+ret)) 329 330echo_i "sending queries for tests $((n+1))-$((n+4))..." 331$DIG -p ${PORT} @10.53.0.1 data.example TXT > dig.out.test$((n+1)) & 332$DIG -p ${PORT} @10.53.0.1 othertype.example CAA > dig.out.test$((n+2)) & 333$DIG -p ${PORT} @10.53.0.1 nodata.example TXT > dig.out.test$((n+3)) & 334$DIG -p ${PORT} @10.53.0.1 nxdomain.example TXT > dig.out.test$((n+4)) 335 336# ensure all files have been written before proceeding 337waitfile dig.out.test$((n+1)) 338waitfile dig.out.test$((n+2)) 339waitfile dig.out.test$((n+3)) 340waitfile dig.out.test$((n+4)) 341 342n=$((n+1)) 343echo_i "check stale data.example (serve-stale reset) ($n)" 344ret=0 345grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1 346grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1 347grep "data\.example\..*2.*IN.*TXT.*A text record with a 2 second ttl" dig.out.test$n > /dev/null || ret=1 348if [ $ret != 0 ]; then echo_i "failed"; fi 349status=$((status+ret)) 350 351n=$((n+1)) 352echo_i "check stale othertype.example (serve-stale reset) ($n)" 353ret=0 354grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1 355grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1 356grep "othertype.example\..*2.*IN.*CAA.*0.*issue" dig.out.test$n > /dev/null || ret=1 357if [ $ret != 0 ]; then echo_i "failed"; fi 358status=$((status+ret)) 359 360n=$((n+1)) 361echo_i "check stale nodata.example (serve-stale reset) ($n)" 362ret=0 363grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1 364grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1 365grep "example\..*2.*IN.*SOA" dig.out.test$n > /dev/null || ret=1 366if [ $ret != 0 ]; then echo_i "failed"; fi 367status=$((status+ret)) 368 369n=$((n+1)) 370echo_i "check stale nxdomain.example (serve-stale reset) ($n)" 371ret=0 372grep "status: NXDOMAIN" dig.out.test$n > /dev/null || ret=1 373grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1 374grep "example\..*2.*IN.*SOA" dig.out.test$n > /dev/null || ret=1 375if [ $ret != 0 ]; then echo_i "failed"; fi 376status=$((status+ret)) 377 378n=$((n+1)) 379echo_i "running 'rndc serve-stale off' ($n)" 380ret=0 381$RNDCCMD 10.53.0.1 serve-stale off || ret=1 382if [ $ret != 0 ]; then echo_i "failed"; fi 383status=$((status+ret)) 384 385n=$((n+1)) 386echo_i "check 'rndc serve-stale status' ($n)" 387ret=0 388$RNDCCMD 10.53.0.1 serve-stale status > rndc.out.test$n 2>&1 || ret=1 389grep '_default: off (rndc) (stale-answer-ttl=2 max-stale-ttl=3600)' rndc.out.test$n > /dev/null || ret=1 390if [ $ret != 0 ]; then echo_i "failed"; fi 391status=$((status+ret)) 392 393# 394# Update named.conf. 395# Test server with low max-stale-ttl. 396# 397echo_i "test server with serve-stale options set, low max-stale-ttl" 398 399n=$((n+1)) 400echo_i "updating ns1/named.conf ($n)" 401ret=0 402copy_setports ns1/named2.conf.in ns1/named.conf 403if [ $ret != 0 ]; then echo_i "failed"; fi 404status=$((status+ret)) 405 406n=$((n+1)) 407echo_i "running 'rndc reload' ($n)" 408ret=0 409rndc_reload ns1 10.53.0.1 410if [ $ret != 0 ]; then echo_i "failed"; fi 411status=$((status+ret)) 412 413n=$((n+1)) 414echo_i "check 'rndc serve-stale status' ($n)" 415ret=0 416$RNDCCMD 10.53.0.1 serve-stale status > rndc.out.test$n 2>&1 || ret=1 417grep '_default: off (rndc) (stale-answer-ttl=3 max-stale-ttl=20)' rndc.out.test$n > /dev/null || ret=1 418if [ $ret != 0 ]; then echo_i "failed"; fi 419status=$((status+ret)) 420 421n=$((n+1)) 422echo_i "flush cache, re-enable serve-stale and query again ($n)" 423ret=0 424$RNDCCMD 10.53.0.1 flushtree example > rndc.out.test$n.1 2>&1 || ret=1 425$RNDCCMD 10.53.0.1 serve-stale on > rndc.out.test$n.2 2>&1 || ret=1 426$DIG -p ${PORT} @10.53.0.1 data.example TXT > dig.out.test$n 427grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1 428grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1 429if [ $ret != 0 ]; then echo_i "failed"; fi 430status=$((status+ret)) 431 432n=$((n+1)) 433echo_i "check 'rndc serve-stale status' ($n)" 434ret=0 435$RNDCCMD 10.53.0.1 serve-stale status > rndc.out.test$n 2>&1 || ret=1 436grep '_default: on (rndc) (stale-answer-ttl=3 max-stale-ttl=20)' rndc.out.test$n > /dev/null || ret=1 437if [ $ret != 0 ]; then echo_i "failed"; fi 438status=$((status+ret)) 439 440n=$((n+1)) 441echo_i "enable responses from authoritative server ($n)" 442ret=0 443$DIG -p ${PORT} @10.53.0.2 txt enable > dig.out.test$n 444grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1 445grep "TXT.\"1\"" dig.out.test$n > /dev/null || ret=1 446if [ $ret != 0 ]; then echo_i "failed"; fi 447status=$((status+ret)) 448 449n=$((n+1)) 450echo_i "prime cache longttl.example (low max-stale-ttl) ($n)" 451ret=0 452$DIG -p ${PORT} @10.53.0.1 longttl.example TXT > dig.out.test$n 453grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1 454grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1 455if [ $ret != 0 ]; then echo_i "failed"; fi 456status=$((status+ret)) 457 458n=$((n+1)) 459echo_i "prime cache data.example (low max-stale-ttl) ($n)" 460ret=0 461$DIG -p ${PORT} @10.53.0.1 data.example TXT > dig.out.test$n 462grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1 463grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1 464if [ $ret != 0 ]; then echo_i "failed"; fi 465status=$((status+ret)) 466 467n=$((n+1)) 468echo_i "prime cache othertype.example (low max-stale-ttl) ($n)" 469ret=0 470$DIG -p ${PORT} @10.53.0.1 othertype.example CAA > dig.out.test$n 471grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1 472grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1 473if [ $ret != 0 ]; then echo_i "failed"; fi 474status=$((status+ret)) 475 476n=$((n+1)) 477echo_i "prime cache nodata.example (low max-stale-ttl) ($n)" 478ret=0 479$DIG -p ${PORT} @10.53.0.1 nodata.example TXT > dig.out.test$n 480grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1 481grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1 482if [ $ret != 0 ]; then echo_i "failed"; fi 483status=$((status+ret)) 484 485n=$((n+1)) 486echo_i "prime cache nxdomain.example (low max-stale-ttl) ($n)" 487ret=0 488$DIG -p ${PORT} @10.53.0.1 nxdomain.example TXT > dig.out.test$n 489grep "status: NXDOMAIN" dig.out.test$n > /dev/null || ret=1 490grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1 491if [ $ret != 0 ]; then echo_i "failed"; fi 492status=$((status+ret)) 493 494n=$((n+1)) 495echo_i "verify prime cache statistics (low max-stale-ttl) ($n)" 496ret=0 497rm -f ns1/named.stats 498$RNDCCMD 10.53.0.1 stats > /dev/null 2>&1 499[ -f ns1/named.stats ] || ret=1 500cp ns1/named.stats ns1/named.stats.$n 501# Check first 10 lines of Cache DB statistics. After prime queries, we expect 502# two active TXT RRsets, one nxrrset TXT, and one NXDOMAIN. 503grep -A 10 "++ Cache DB RRsets ++" ns1/named.stats.$n > ns1/named.stats.$n.cachedb || ret=1 504grep "2 TXT" ns1/named.stats.$n.cachedb > /dev/null || ret=1 505grep "1 Others" ns1/named.stats.$n.cachedb > /dev/null || ret=1 506grep "1 !TXT" ns1/named.stats.$n.cachedb > /dev/null || ret=1 507grep "1 NXDOMAIN" ns1/named.stats.$n.cachedb > /dev/null || ret=1 508status=$((status+ret)) 509if [ $ret != 0 ]; then echo_i "failed"; fi 510 511n=$((n+1)) 512echo_i "disable responses from authoritative server ($n)" 513ret=0 514$DIG -p ${PORT} @10.53.0.2 txt disable > dig.out.test$n 515grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1 516grep "TXT.\"0\"" dig.out.test$n > /dev/null || ret=1 517if [ $ret != 0 ]; then echo_i "failed"; fi 518status=$((status+ret)) 519 520sleep 2 521 522echo_i "sending queries for tests $((n+1))-$((n+4))..." 523$DIG -p ${PORT} @10.53.0.1 data.example TXT > dig.out.test$((n+1)) & 524$DIG -p ${PORT} @10.53.0.1 othertype.example CAA > dig.out.test$((n+2)) & 525$DIG -p ${PORT} @10.53.0.1 nodata.example TXT > dig.out.test$((n+3)) & 526$DIG -p ${PORT} @10.53.0.1 nxdomain.example TXT > dig.out.test$((n+4)) 527 528# ensure all files have been written before proceeding 529waitfile dig.out.test$((n+1)) 530waitfile dig.out.test$((n+2)) 531waitfile dig.out.test$((n+3)) 532waitfile dig.out.test$((n+4)) 533 534n=$((n+1)) 535echo_i "check stale data.example (low max-stale-ttl) ($n)" 536ret=0 537grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1 538grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1 539grep "data\.example\..*3.*IN.*TXT.*A text record with a 2 second ttl" dig.out.test$n > /dev/null || ret=1 540if [ $ret != 0 ]; then echo_i "failed"; fi 541status=$((status+ret)) 542 543n=$((n+1)) 544echo_i "check stale othertype.example (low max-stale-ttl) ($n)" 545ret=0 546grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1 547grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1 548grep "othertype\.example\..*3.*IN.*CAA.*0.*issue" dig.out.test$n > /dev/null || ret=1 549if [ $ret != 0 ]; then echo_i "failed"; fi 550status=$((status+ret)) 551 552n=$((n+1)) 553echo_i "check stale nodata.example (low max-stale-ttl) ($n)" 554ret=0 555grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1 556grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1 557grep "example\..*3.*IN.*SOA" dig.out.test$n > /dev/null || ret=1 558if [ $ret != 0 ]; then echo_i "failed"; fi 559status=$((status+ret)) 560 561n=$((n+1)) 562echo_i "check stale nxdomain.example (low max-stale-ttl) ($n)" 563ret=0 564grep "status: NXDOMAIN" dig.out.test$n > /dev/null || ret=1 565grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1 566grep "example\..*3.*IN.*SOA" dig.out.test$n > /dev/null || ret=1 567if [ $ret != 0 ]; then echo_i "failed"; fi 568status=$((status+ret)) 569 570n=$((n+1)) 571echo_i "verify stale cache statistics (low max-stale-ttl) ($n)" 572ret=0 573rm -f ns1/named.stats 574$RNDCCMD 10.53.0.1 stats > /dev/null 2>&1 575[ -f ns1/named.stats ] || ret=1 576cp ns1/named.stats ns1/named.stats.$n 577# Check first 10 lines of Cache DB statistics. After serve-stale queries, we 578# expect one active TXT RRset, one stale TXT, one stale nxrrset TXT, and one 579# stale NXDOMAIN. 580grep -A 10 "++ Cache DB RRsets ++" ns1/named.stats.$n > ns1/named.stats.$n.cachedb || ret=1 581grep "1 TXT" ns1/named.stats.$n.cachedb > /dev/null || ret=1 582grep "1 #TXT" ns1/named.stats.$n.cachedb > /dev/null || ret=1 583grep "1 #Others" ns1/named.stats.$n.cachedb > /dev/null || ret=1 584grep "1 #!TXT" ns1/named.stats.$n.cachedb > /dev/null || ret=1 585grep "1 #NXDOMAIN" ns1/named.stats.$n.cachedb > /dev/null || ret=1 586 587status=$((status+ret)) 588if [ $ret != 0 ]; then echo_i "failed"; fi 589 590echo_i "sending queries for tests $((n+1))-$((n+4))..." 591$DIG -p ${PORT} @10.53.0.1 data.example TXT > dig.out.test$((n+1)) & 592$DIG -p ${PORT} @10.53.0.1 othertype.example CAA > dig.out.test$((n+2)) & 593$DIG -p ${PORT} @10.53.0.1 nodata.example TXT > dig.out.test$((n+3)) & 594$DIG -p ${PORT} @10.53.0.1 nxdomain.example TXT > dig.out.test$((n+4)) 595 596# ensure all files have been written before proceeding 597waitfile dig.out.test$((n+1)) 598waitfile dig.out.test$((n+2)) 599waitfile dig.out.test$((n+3)) 600waitfile dig.out.test$((n+4)) 601 602n=$((n+1)) 603echo_i "check ancient data.example (low max-stale-ttl) ($n)" 604ret=0 605grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1 606grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1 607if [ $ret != 0 ]; then echo_i "failed"; fi 608status=$((status+ret)) 609 610n=$((n+1)) 611echo_i "check ancient othertype.example (low max-stale-ttl) ($n)" 612ret=0 613grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1 614grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1 615if [ $ret != 0 ]; then echo_i "failed"; fi 616status=$((status+ret)) 617 618n=$((n+1)) 619echo_i "check ancient nodata.example (low max-stale-ttl) ($n)" 620ret=0 621grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1 622grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1 623if [ $ret != 0 ]; then echo_i "failed"; fi 624status=$((status+ret)) 625 626n=$((n+1)) 627echo_i "check ancient nxdomain.example (low max-stale-ttl) ($n)" 628ret=0 629grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1 630grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1 631if [ $ret != 0 ]; then echo_i "failed"; fi 632status=$((status+ret)) 633 634# 635# Now test server with no serve-stale options set. 636# 637echo_i "test server with no serve-stale options set" 638 639n=$((n+1)) 640echo_i "enable responses from authoritative server ($n)" 641ret=0 642$DIG -p ${PORT} @10.53.0.2 txt enable > dig.out.test$n 643grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1 644grep "TXT.\"1\"" dig.out.test$n > /dev/null || ret=1 645if [ $ret != 0 ]; then echo_i "failed"; fi 646status=$((status+ret)) 647 648n=$((n+1)) 649echo_i "prime cache longttl.example (max-stale-ttl default) ($n)" 650ret=0 651$DIG -p ${PORT} @10.53.0.3 longttl.example TXT > dig.out.test$n 652grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1 653grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1 654if [ $ret != 0 ]; then echo_i "failed"; fi 655status=$((status+ret)) 656 657n=$((n+1)) 658echo_i "prime cache data.example (max-stale-ttl default) ($n)" 659ret=0 660$DIG -p ${PORT} @10.53.0.3 data.example TXT > dig.out.test$n 661grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1 662grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1 663grep "data\.example\..*2.*IN.*TXT.*A text record with a 2 second ttl" dig.out.test$n > /dev/null || ret=1 664if [ $ret != 0 ]; then echo_i "failed"; fi 665status=$((status+ret)) 666 667n=$((n+1)) 668echo_i "prime cache othertype.example (max-stale-ttl default) ($n)" 669ret=0 670$DIG -p ${PORT} @10.53.0.3 othertype.example CAA > dig.out.test$n 671grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1 672grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1 673grep "othertype\.example\..*2.*IN.*CAA.*0.*issue" dig.out.test$n > /dev/null || ret=1 674if [ $ret != 0 ]; then echo_i "failed"; fi 675status=$((status+ret)) 676 677n=$((n+1)) 678echo_i "prime cache nodata.example (max-stale-ttl default) ($n)" 679ret=0 680$DIG -p ${PORT} @10.53.0.3 nodata.example TXT > dig.out.test$n 681grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1 682grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1 683grep "example\..*2.*IN.*SOA" dig.out.test$n > /dev/null || ret=1 684if [ $ret != 0 ]; then echo_i "failed"; fi 685status=$((status+ret)) 686 687n=$((n+1)) 688echo_i "prime cache nxdomain.example (max-stale-ttl default) ($n)" 689ret=0 690$DIG -p ${PORT} @10.53.0.3 nxdomain.example TXT > dig.out.test$n 691grep "status: NXDOMAIN" dig.out.test$n > /dev/null || ret=1 692grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1 693grep "example\..*2.*IN.*SOA" dig.out.test$n > /dev/null || ret=1 694if [ $ret != 0 ]; then echo_i "failed"; fi 695status=$((status+ret)) 696 697n=$((n+1)) 698echo_i "verify prime cache statistics (max-stale-ttl default) ($n)" 699ret=0 700rm -f ns3/named.stats 701$RNDCCMD 10.53.0.3 stats > /dev/null 2>&1 702[ -f ns3/named.stats ] || ret=1 703cp ns3/named.stats ns3/named.stats.$n 704# Check first 10 lines of Cache DB statistics. After prime queries, we expect 705# two active TXT RRsets, one nxrrset TXT, and one NXDOMAIN. 706grep -A 10 "++ Cache DB RRsets ++" ns3/named.stats.$n > ns3/named.stats.$n.cachedb || ret=1 707grep "2 TXT" ns3/named.stats.$n.cachedb > /dev/null || ret=1 708grep "1 Others" ns3/named.stats.$n.cachedb > /dev/null || ret=1 709grep "1 !TXT" ns3/named.stats.$n.cachedb > /dev/null || ret=1 710grep "1 NXDOMAIN" ns3/named.stats.$n.cachedb > /dev/null || ret=1 711status=$((status+ret)) 712if [ $ret != 0 ]; then echo_i "failed"; fi 713 714n=$((n+1)) 715echo_i "disable responses from authoritative server ($n)" 716ret=0 717$DIG -p ${PORT} @10.53.0.2 txt disable > dig.out.test$n 718grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1 719grep "TXT.\"0\"" dig.out.test$n > /dev/null || ret=1 720if [ $ret != 0 ]; then echo_i "failed"; fi 721status=$((status+ret)) 722 723n=$((n+1)) 724echo_i "check 'rndc serve-stale status' ($n)" 725ret=0 726$RNDCCMD 10.53.0.3 serve-stale status > rndc.out.test$n 2>&1 || ret=1 727grep '_default: off (stale-answer-ttl=1 max-stale-ttl=604800)' rndc.out.test$n > /dev/null || ret=1 728if [ $ret != 0 ]; then echo_i "failed"; fi 729status=$((status+ret)) 730 731sleep 2 732 733echo_i "sending queries for tests $((n+1))-$((n+4))..." 734$DIG -p ${PORT} @10.53.0.3 data.example TXT > dig.out.test$((n+1)) & 735$DIG -p ${PORT} @10.53.0.3 othertype.example CAA > dig.out.test$((n+2)) & 736$DIG -p ${PORT} @10.53.0.3 nodata.example TXT > dig.out.test$((n+3)) & 737$DIG -p ${PORT} @10.53.0.3 nxdomain.example TXT > dig.out.test$((n+4)) 738 739# ensure all files have been written before proceeding 740waitfile dig.out.test$((n+1)) 741waitfile dig.out.test$((n+2)) 742waitfile dig.out.test$((n+3)) 743waitfile dig.out.test$((n+4)) 744 745n=$((n+1)) 746echo_i "check fail of data.example (max-stale-ttl default) ($n)" 747ret=0 748grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1 749grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1 750if [ $ret != 0 ]; then echo_i "failed"; fi 751status=$((status+ret)) 752 753n=$((n+1)) 754echo_i "check fail of othertype.example (max-stale-ttl default) ($n)" 755ret=0 756grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1 757grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1 758if [ $ret != 0 ]; then echo_i "failed"; fi 759status=$((status+ret)) 760 761n=$((n+1)) 762echo_i "check fail of nodata.example (max-stale-ttl default) ($n)" 763ret=0 764grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1 765grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1 766if [ $ret != 0 ]; then echo_i "failed"; fi 767status=$((status+ret)) 768 769n=$((n+1)) 770echo_i "check fail of nxdomain.example (max-stale-ttl default) ($n)" 771ret=0 772grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1 773grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1 774if [ $ret != 0 ]; then echo_i "failed"; fi 775status=$((status+ret)) 776 777n=$((n+1)) 778echo_i "verify stale cache statistics (max-stale-ttl default) ($n)" 779ret=0 780rm -f ns3/named.stats 781$RNDCCMD 10.53.0.3 stats > /dev/null 2>&1 782[ -f ns3/named.stats ] || ret=1 783cp ns3/named.stats ns3/named.stats.$n 784# Check first 10 lines of Cache DB statistics. After last queries, we expect 785# one active TXT RRset, one stale TXT, one stale nxrrset TXT, and one 786# stale NXDOMAIN. 787grep -A 10 "++ Cache DB RRsets ++" ns3/named.stats.$n > ns3/named.stats.$n.cachedb || ret=1 788grep "1 TXT" ns3/named.stats.$n.cachedb > /dev/null || ret=1 789grep "1 #TXT" ns3/named.stats.$n.cachedb > /dev/null || ret=1 790grep "1 #Others" ns3/named.stats.$n.cachedb > /dev/null || ret=1 791grep "1 #!TXT" ns3/named.stats.$n.cachedb > /dev/null || ret=1 792grep "1 #NXDOMAIN" ns3/named.stats.$n.cachedb > /dev/null || ret=1 793 794status=$((status+ret)) 795if [ $ret != 0 ]; then echo_i "failed"; fi 796 797n=$((n+1)) 798echo_i "check 'rndc serve-stale on' ($n)" 799ret=0 800$RNDCCMD 10.53.0.3 serve-stale on > rndc.out.test$n 2>&1 || ret=1 801if [ $ret != 0 ]; then echo_i "failed"; fi 802status=$((status+ret)) 803 804n=$((n+1)) 805echo_i "check 'rndc serve-stale status' ($n)" 806ret=0 807$RNDCCMD 10.53.0.3 serve-stale status > rndc.out.test$n 2>&1 || ret=1 808grep '_default: on (rndc) (stale-answer-ttl=1 max-stale-ttl=604800)' rndc.out.test$n > /dev/null || ret=1 809if [ $ret != 0 ]; then echo_i "failed"; fi 810status=$((status+ret)) 811 812sleep 2 813 814echo_i "sending queries for tests $((n+1))-$((n+4))..." 815$DIG -p ${PORT} @10.53.0.3 data.example TXT > dig.out.test$((n+1)) & 816$DIG -p ${PORT} @10.53.0.3 othertype.example CAA > dig.out.test$((n+2)) & 817$DIG -p ${PORT} @10.53.0.3 nodata.example TXT > dig.out.test$((n+3)) & 818$DIG -p ${PORT} @10.53.0.3 nxdomain.example TXT > dig.out.test$((n+4)) 819 820# ensure all files have been written before proceeding 821waitfile dig.out.test$((n+1)) 822waitfile dig.out.test$((n+2)) 823waitfile dig.out.test$((n+3)) 824waitfile dig.out.test$((n+4)) 825 826n=$((n+1)) 827echo_i "check data.example (max-stale-ttl default) ($n)" 828ret=0 829grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1 830grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1 831grep "data\.example\..*1.*IN.*TXT.*A text record with a 2 second ttl" dig.out.test$n > /dev/null || ret=1 832if [ $ret != 0 ]; then echo_i "failed"; fi 833status=$((status+ret)) 834 835n=$((n+1)) 836echo_i "check othertype.example (max-stale-ttl default) ($n)" 837ret=0 838grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1 839grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1 840grep "example\..*1.*IN.*CAA.*0.*issue" dig.out.test$n > /dev/null || ret=1 841if [ $ret != 0 ]; then echo_i "failed"; fi 842status=$((status+ret)) 843 844n=$((n+1)) 845echo_i "check nodata.example (max-stale-ttl default) ($n)" 846ret=0 847grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1 848grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1 849grep "example\..*1.*IN.*SOA" dig.out.test$n > /dev/null || ret=1 850if [ $ret != 0 ]; then echo_i "failed"; fi 851status=$((status+ret)) 852 853n=$((n+1)) 854echo_i "check nxdomain.example (max-stale-ttl default) ($n)" 855ret=0 856grep "status: NXDOMAIN" dig.out.test$n > /dev/null || ret=1 857grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1 858grep "example\..*1.*IN.*SOA" dig.out.test$n > /dev/null || ret=1 859if [ $ret != 0 ]; then echo_i "failed"; fi 860status=$((status+ret)) 861 862# 863# Now test server with serve-stale disabled. 864# 865echo_i "test server with serve-stale disabled" 866 867n=$((n+1)) 868echo_i "enable responses from authoritative server ($n)" 869ret=0 870$DIG -p ${PORT} @10.53.0.2 txt enable > dig.out.test$n 871grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1 872grep "TXT.\"1\"" dig.out.test$n > /dev/null || ret=1 873if [ $ret != 0 ]; then echo_i "failed"; fi 874status=$((status+ret)) 875 876n=$((n+1)) 877echo_i "prime cache longttl.example (serve-stale disabled) ($n)" 878ret=0 879$DIG -p ${PORT} @10.53.0.4 longttl.example TXT > dig.out.test$n 880grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1 881grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1 882if [ $ret != 0 ]; then echo_i "failed"; fi 883status=$((status+ret)) 884 885n=$((n+1)) 886echo_i "prime cache data.example (serve-stale disabled) ($n)" 887ret=0 888$DIG -p ${PORT} @10.53.0.4 data.example TXT > dig.out.test$n 889grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1 890grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1 891grep "data\.example\..*2.*IN.*TXT.*A text record with a 2 second ttl" dig.out.test$n > /dev/null || ret=1 892if [ $ret != 0 ]; then echo_i "failed"; fi 893status=$((status+ret)) 894 895n=$((n+1)) 896echo_i "prime cache othertype.example (serve-stale disabled) ($n)" 897ret=0 898$DIG -p ${PORT} @10.53.0.4 othertype.example CAA > dig.out.test$n 899grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1 900grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1 901grep "othertype\.example\..*2.*IN.*CAA.*0.*issue" dig.out.test$n > /dev/null || ret=1 902if [ $ret != 0 ]; then echo_i "failed"; fi 903status=$((status+ret)) 904 905n=$((n+1)) 906echo_i "prime cache nodata.example (serve-stale disabled) ($n)" 907ret=0 908$DIG -p ${PORT} @10.53.0.4 nodata.example TXT > dig.out.test$n 909grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1 910grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1 911grep "example\..*2.*IN.*SOA" dig.out.test$n > /dev/null || ret=1 912if [ $ret != 0 ]; then echo_i "failed"; fi 913status=$((status+ret)) 914 915n=$((n+1)) 916echo_i "prime cache nxdomain.example (serve-stale disabled) ($n)" 917ret=0 918$DIG -p ${PORT} @10.53.0.4 nxdomain.example TXT > dig.out.test$n 919grep "status: NXDOMAIN" dig.out.test$n > /dev/null || ret=1 920grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1 921grep "example\..*2.*IN.*SOA" dig.out.test$n > /dev/null || ret=1 922if [ $ret != 0 ]; then echo_i "failed"; fi 923status=$((status+ret)) 924 925n=$((n+1)) 926echo_i "verify prime cache statistics (serve-stale disabled) ($n)" 927ret=0 928rm -f ns4/named.stats 929$RNDCCMD 10.53.0.4 stats > /dev/null 2>&1 930[ -f ns4/named.stats ] || ret=1 931cp ns4/named.stats ns4/named.stats.$n 932# Check first 10 lines of Cache DB statistics. After prime queries, we expect 933# two active TXT RRsets, one nxrrset TXT, and one NXDOMAIN. 934grep -A 10 "++ Cache DB RRsets ++" ns4/named.stats.$n > ns4/named.stats.$n.cachedb || ret=1 935grep "2 TXT" ns4/named.stats.$n.cachedb > /dev/null || ret=1 936grep "1 Others" ns4/named.stats.$n.cachedb > /dev/null || ret=1 937grep "1 !TXT" ns4/named.stats.$n.cachedb > /dev/null || ret=1 938grep "1 NXDOMAIN" ns4/named.stats.$n.cachedb > /dev/null || ret=1 939status=$((status+ret)) 940if [ $ret != 0 ]; then echo_i "failed"; fi 941 942n=$((n+1)) 943echo_i "disable responses from authoritative server ($n)" 944ret=0 945$DIG -p ${PORT} @10.53.0.2 txt disable > dig.out.test$n 946grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1 947grep "TXT.\"0\"" dig.out.test$n > /dev/null || ret=1 948if [ $ret != 0 ]; then echo_i "failed"; fi 949status=$((status+ret)) 950 951n=$((n+1)) 952echo_i "check 'rndc serve-stale status' ($n)" 953ret=0 954$RNDCCMD 10.53.0.4 serve-stale status > rndc.out.test$n 2>&1 || ret=1 955grep '_default: off (stale-answer-ttl=1 max-stale-ttl=604800)' rndc.out.test$n > /dev/null || ret=1 956if [ $ret != 0 ]; then echo_i "failed"; fi 957status=$((status+ret)) 958 959sleep 2 960 961echo_i "sending queries for tests $((n+1))-$((n+4))..." 962$DIG -p ${PORT} @10.53.0.4 data.example TXT > dig.out.test$((n+1)) & 963$DIG -p ${PORT} @10.53.0.4 othertype.example CAA > dig.out.test$((n+2)) & 964$DIG -p ${PORT} @10.53.0.4 nodata.example TXT > dig.out.test$((n+3)) & 965$DIG -p ${PORT} @10.53.0.4 nxdomain.example TXT > dig.out.test$((n+4)) 966 967# ensure all files have been written before proceeding 968waitfile dig.out.test$((n+1)) 969waitfile dig.out.test$((n+2)) 970waitfile dig.out.test$((n+3)) 971waitfile dig.out.test$((n+4)) 972 973n=$((n+1)) 974echo_i "check fail of data.example (serve-stale disabled) ($n)" 975ret=0 976grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1 977grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1 978if [ $ret != 0 ]; then echo_i "failed"; fi 979status=$((status+ret)) 980 981n=$((n+1)) 982echo_i "check fail of othertype.example (serve-stale disabled) ($n)" 983ret=0 984grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1 985grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1 986if [ $ret != 0 ]; then echo_i "failed"; fi 987status=$((status+ret)) 988 989n=$((n+1)) 990echo_i "check fail of nodata.example (serve-stale disabled) ($n)" 991ret=0 992grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1 993grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1 994if [ $ret != 0 ]; then echo_i "failed"; fi 995status=$((status+ret)) 996 997n=$((n+1)) 998echo_i "check fail of nxdomain.example (serve-stale disabled) ($n)" 999ret=0 1000grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1 1001grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1 1002if [ $ret != 0 ]; then echo_i "failed"; fi 1003status=$((status+ret)) 1004 1005n=$((n+1)) 1006echo_i "verify stale cache statistics (serve-stale disabled) ($n)" 1007ret=0 1008rm -f ns4/named.stats 1009$RNDCCMD 10.53.0.4 stats > /dev/null 2>&1 1010[ -f ns4/named.stats ] || ret=1 1011cp ns4/named.stats ns4/named.stats.$n 1012# Check first 10 lines of Cache DB statistics. After last queries, we expect 1013# one active TXT RRset, one stale TXT, one stale nxrrset TXT, and one 1014# stale NXDOMAIN. 1015grep -A 10 "++ Cache DB RRsets ++" ns4/named.stats.$n > ns4/named.stats.$n.cachedb || ret=1 1016grep "1 TXT" ns4/named.stats.$n.cachedb > /dev/null || ret=1 1017grep "1 #TXT" ns4/named.stats.$n.cachedb > /dev/null || ret=1 1018grep "1 #Others" ns4/named.stats.$n.cachedb > /dev/null || ret=1 1019grep "1 #!TXT" ns4/named.stats.$n.cachedb > /dev/null || ret=1 1020grep "1 #NXDOMAIN" ns4/named.stats.$n.cachedb > /dev/null || ret=1 1021status=$((status+ret)) 1022if [ $ret != 0 ]; then echo_i "failed"; fi 1023 1024# Dump the cache. 1025n=$((n+1)) 1026echo_i "dump the cache (serve-stale disabled) ($n)" 1027ret=0 1028$RNDCCMD 10.53.0.4 dumpdb -cache > rndc.out.test$n 2>&1 || ret=1 1029done=0 1030for i in 0 1 2 3 4 5 6 7 8 9; do 1031 grep '^; Dump complete$' ns4/named_dump4.db > /dev/null 2>&1 && done=1 1032 if [ $done != 1 ]; then sleep 1; fi 1033done 1034if [ $done != 1 ]; then ret=1; fi 1035status=$((status+ret)) 1036if [ $ret != 0 ]; then echo_i "failed"; fi 1037 1038echo_i "stop ns4" 1039$PERL $SYSTEMTESTTOP/stop.pl --use-rndc --port ${CONTROLPORT} serve-stale ns4 1040 1041# Load the cache as if it was five minutes (RBTDB_VIRTUAL) older. 1042# Since max-stale-ttl defaults to a week, we need to adjust the date by 1043# one week and five minutes. 1044LASTWEEK=`TZ=UTC perl -e 'my $now = time(); 1045 my $oneWeekAgo = $now - 604800; 1046 my $fiveMinutesAgo = $oneWeekAgo - 300; 1047 my ($s, $m, $h, $d, $mo, $y) = (localtime($fiveMinutesAgo))[0, 1, 2, 3, 4, 5]; 1048 printf("%04d%02d%02d%02d%02d%02d", $y+1900, $mo+1, $d, $h, $m, $s);'` 1049 1050n=$((n+1)) 1051echo_i "mock the cache date to $LASTWEEK (serve-stale disabled) ($n)" 1052ret=0 1053sed -E "s/DATE [0-9]{14}/DATE $LASTWEEK/g" ns4/named_dump4.db > ns4/named_dumpdb4.db.out || ret=1 1054cp ns4/named_dumpdb4.db.out ns4/named_dumpdb4.db 1055if [ $ret != 0 ]; then echo_i "failed"; fi 1056status=$((status+ret)) 1057 1058echo_i "start ns4" 1059$PERL $SYSTEMTESTTOP/start.pl --noclean --restart --port ${PORT} serve-stale ns4 1060 1061n=$((n+1)) 1062echo_i "verify ancient cache statistics (serve-stale disabled) ($n)" 1063ret=0 1064rm -f ns4/named.stats 1065$RNDCCMD 10.53.0.4 stats #> /dev/null 2>&1 1066[ -f ns4/named.stats ] || ret=1 1067cp ns4/named.stats ns4/named.stats.$n 1068# Check first 10 lines of Cache DB statistics. After last queries, we expect 1069# everything to be removed or scheduled to be removed. 1070grep -A 10 "++ Cache DB RRsets ++" ns4/named.stats.$n > ns4/named.stats.$n.cachedb || ret=1 1071grep "#TXT" ns4/named.stats.$n.cachedb > /dev/null && ret=1 1072grep "#Others" ns4/named.stats.$n.cachedb > /dev/null && ret=1 1073grep "#!TXT" ns4/named.stats.$n.cachedb > /dev/null && ret=1 1074grep "#NXDOMAIN" ns4/named.stats.$n.cachedb > /dev/null && ret=1 1075status=$((status+ret)) 1076if [ $ret != 0 ]; then echo_i "failed"; fi 1077 1078echo_i "exit status: $status" 1079[ $status -eq 0 ] || exit 1 1080