1 1.1 christos #!/bin/sh 2 1.1.1.5 christos 3 1.1 christos # Copyright (C) Internet Systems Consortium, Inc. ("ISC") 4 1.1 christos # 5 1.1.1.5 christos # SPDX-License-Identifier: MPL-2.0 6 1.1.1.5 christos # 7 1.1 christos # This Source Code Form is subject to the terms of the Mozilla Public 8 1.1.1.5 christos # License, v. 2.0. If a copy of the MPL was not distributed with this 9 1.1.1.4 christos # file, you can obtain one at https://mozilla.org/MPL/2.0/. 10 1.1 christos # 11 1.1 christos # See the COPYRIGHT file distributed with this work for additional 12 1.1 christos # information regarding copyright ownership. 13 1.1 christos 14 1.1.1.6 christos set -e 15 1.1.1.6 christos 16 1.1.1.6 christos . ../conf.sh 17 1.1 christos 18 1.1 christos DIGOPTS="+tcp -p ${PORT}" 19 1.1 christos 20 1.1 christos status=0 21 1.1 christos n=0 22 1.1 christos 23 1.1.1.6 christos n=$((n + 1)) 24 1.1.1.3 christos echo_i "wait for zones to finish transferring to ns2 ($n)" 25 1.1.1.6 christos for i in 1 2 3 4 5 6 7 8 9 10; do 26 1.1 christos ret=0 27 1.1.1.6 christos for zone in example.com example.net; do 28 1.1.1.6 christos $DIG $DIGOPTS @10.53.0.2 soa $zone >dig.out.test$n || ret=1 29 1.1.1.6 christos grep "ANSWER: 1," dig.out.test$n >/dev/null || ret=1 30 1.1 christos done 31 1.1 christos [ $ret -eq 0 ] && break 32 1.1 christos sleep 1 33 1.1 christos done 34 1.1 christos [ $ret -eq 0 ] || echo_i "failed" 35 1.1.1.6 christos status=$((status + ret)) 36 1.1 christos 37 1.1 christos # 38 1.1 christos # If recursion is unrequested or unavailable, then cross-zone CNAME records 39 1.1 christos # should not be followed. If both requested and available, they should be. 40 1.1 christos # 41 1.1.1.6 christos n=$((n + 1)) 42 1.1 christos echo_i "check that cross-zone CNAME record does not return target data (rd=0/ra=0) ($n)" 43 1.1 christos ret=0 44 1.1.1.6 christos $DIG $DIGOPTS +norec @10.53.0.1 www.example.com >dig.out.test$n || ret=1 45 1.1.1.6 christos grep "ANSWER: 1," dig.out.test$n >/dev/null || ret=1 46 1.1.1.6 christos grep "flags: qr aa;" dig.out.test$n >/dev/null || ret=1 47 1.1.1.6 christos grep "www.example.com.*CNAME.*server.example.net" dig.out.test$n >/dev/null || ret=1 48 1.1.1.6 christos grep "server.example.net.*A.*10.53.0.100" dig.out.test$n >/dev/null && ret=1 49 1.1 christos [ $ret -eq 0 ] || echo_i "failed" 50 1.1.1.6 christos status=$((status + ret)) 51 1.1 christos 52 1.1.1.6 christos n=$((n + 1)) 53 1.1 christos echo_i "check that cross-zone CNAME record does not return target data (rd=1/ra=0) ($n)" 54 1.1 christos ret=0 55 1.1.1.6 christos $DIG $DIGOPTS +rec @10.53.0.1 www.example.com >dig.out.test$n || ret=1 56 1.1.1.6 christos grep "ANSWER: 1," dig.out.test$n >/dev/null || ret=1 57 1.1.1.6 christos grep "flags: qr aa rd;" dig.out.test$n >/dev/null || ret=1 58 1.1.1.6 christos grep "www.example.com.*CNAME.*server.example.net" dig.out.test$n >/dev/null || ret=1 59 1.1.1.6 christos grep "server.example.net.*A.*10.53.0.100" dig.out.test$n >/dev/null && ret=1 60 1.1 christos [ $ret -eq 0 ] || echo_i "failed" 61 1.1.1.6 christos status=$((status + ret)) 62 1.1 christos 63 1.1.1.6 christos n=$((n + 1)) 64 1.1 christos echo_i "check that cross-zone CNAME record does not return target data (rd=0/ra=1) ($n)" 65 1.1 christos ret=0 66 1.1.1.6 christos $DIG $DIGOPTS +norec @10.53.0.2 www.example.com >dig.out.test$n || ret=1 67 1.1.1.6 christos grep "ANSWER: 1," dig.out.test$n >/dev/null || ret=1 68 1.1.1.6 christos grep "flags: qr aa ra;" dig.out.test$n >/dev/null || ret=1 69 1.1.1.6 christos grep "www.example.com.*CNAME.*server.example.net" dig.out.test$n >/dev/null || ret=1 70 1.1.1.6 christos grep "server.example.net.*A.*10.53.0.100" dig.out.test$n >/dev/null && ret=1 71 1.1 christos [ $ret -eq 0 ] || echo_i "failed" 72 1.1.1.6 christos status=$((status + ret)) 73 1.1 christos 74 1.1.1.6 christos n=$((n + 1)) 75 1.1.1.4 christos echo_i "check that cross-zone CNAME records return target data (rd=1/ra=1) ($n)" 76 1.1 christos ret=0 77 1.1.1.6 christos $DIG $DIGOPTS @10.53.0.2 www.example.com >dig.out.test$n || ret=1 78 1.1.1.6 christos grep "ANSWER: 2," dig.out.test$n >/dev/null || ret=1 79 1.1.1.6 christos grep "flags: qr aa rd ra;" dig.out.test$n >/dev/null || ret=1 80 1.1.1.6 christos grep "www.example.com.*CNAME.*server.example.net" dig.out.test$n >/dev/null || ret=1 81 1.1.1.6 christos grep "server.example.net.*A.*10.53.0.100" dig.out.test$n >/dev/null || ret=1 82 1.1 christos [ $ret -eq 0 ] || echo_i "failed" 83 1.1.1.6 christos status=$((status + ret)) 84 1.1 christos 85 1.1 christos # 86 1.1 christos # In-zone CNAME records should always be followed regardless of RD and RA. 87 1.1 christos # 88 1.1.1.6 christos n=$((n + 1)) 89 1.1.1.4 christos echo_i "check that in-zone CNAME records return target data (rd=0/ra=0) ($n)" 90 1.1 christos ret=0 91 1.1.1.6 christos $DIG $DIGOPTS +norec @10.53.0.1 inzone.example.com >dig.out.test$n || ret=1 92 1.1.1.6 christos grep "ANSWER: 2," dig.out.test$n >/dev/null || ret=1 93 1.1.1.6 christos grep "flags: qr aa;" dig.out.test$n >/dev/null || ret=1 94 1.1.1.6 christos grep "inzone.example.com.*CNAME.*a.example.com" dig.out.test$n >/dev/null || ret=1 95 1.1.1.6 christos grep "a.example.com.*A.*10.53.0.1" dig.out.test$n >/dev/null || ret=1 96 1.1 christos [ $ret -eq 0 ] || echo_i "failed" 97 1.1.1.6 christos status=$((status + ret)) 98 1.1 christos 99 1.1.1.6 christos n=$((n + 1)) 100 1.1 christos echo_i "check that in-zone CNAME records returns target data (rd=1/ra=0) ($n)" 101 1.1 christos ret=0 102 1.1.1.6 christos $DIG $DIGOPTS +rec @10.53.0.1 inzone.example.com >dig.out.test$n || ret=1 103 1.1.1.6 christos grep "ANSWER: 2," dig.out.test$n >/dev/null || ret=1 104 1.1.1.6 christos grep "flags: qr aa rd;" dig.out.test$n >/dev/null || ret=1 105 1.1.1.6 christos grep "inzone.example.com.*CNAME.*a.example.com" dig.out.test$n >/dev/null || ret=1 106 1.1.1.6 christos grep "a.example.com.*A.*10.53.0.1" dig.out.test$n >/dev/null || ret=1 107 1.1 christos [ $ret -eq 0 ] || echo_i "failed" 108 1.1.1.6 christos status=$((status + ret)) 109 1.1 christos 110 1.1.1.6 christos n=$((n + 1)) 111 1.1.1.4 christos echo_i "check that in-zone CNAME records return target data (rd=0/ra=1) ($n)" 112 1.1 christos ret=0 113 1.1.1.6 christos $DIG $DIGOPTS +norec @10.53.0.2 inzone.example.com >dig.out.test$n || ret=1 114 1.1.1.6 christos grep "ANSWER: 2," dig.out.test$n >/dev/null || ret=1 115 1.1.1.6 christos grep "flags: qr aa ra;" dig.out.test$n >/dev/null || ret=1 116 1.1.1.6 christos grep "inzone.example.com.*CNAME.*a.example.com" dig.out.test$n >/dev/null || ret=1 117 1.1.1.6 christos grep "a.example.com.*A.*10.53.0.1" dig.out.test$n >/dev/null || ret=1 118 1.1 christos [ $ret -eq 0 ] || echo_i "failed" 119 1.1.1.6 christos status=$((status + ret)) 120 1.1 christos 121 1.1.1.6 christos n=$((n + 1)) 122 1.1.1.4 christos echo_i "check that in-zone CNAME records return target data (rd=1/ra=1) ($n)" 123 1.1 christos ret=0 124 1.1.1.6 christos $DIG $DIGOPTS @10.53.0.2 inzone.example.com >dig.out.test$n || ret=1 125 1.1.1.6 christos grep "ANSWER: 2," dig.out.test$n >/dev/null || ret=1 126 1.1.1.6 christos grep "flags: qr aa rd ra;" dig.out.test$n >/dev/null || ret=1 127 1.1.1.6 christos grep "inzone.example.com.*CNAME.*a.example.com" dig.out.test$n >/dev/null || ret=1 128 1.1.1.6 christos grep "a.example.com.*A.*10.53.0.1" dig.out.test$n >/dev/null || ret=1 129 1.1 christos [ $ret -eq 0 ] || echo_i "failed" 130 1.1.1.6 christos status=$((status + ret)) 131 1.1 christos 132 1.1.1.6 christos n=$((n + 1)) 133 1.1.1.4 christos echo_i "check that in-zone CNAME records does not return target data when QTYPE is CNAME (rd=1/ra=1) ($n)" 134 1.1.1.4 christos ret=0 135 1.1.1.6 christos $DIG $DIGOPTS @10.53.0.2 -t cname inzone.example.com >dig.out.test$n || ret=1 136 1.1.1.6 christos grep 'ANSWER: 1,' dig.out.test$n >/dev/null || ret=1 137 1.1.1.6 christos grep 'flags: qr aa rd ra;' dig.out.test$n >/dev/null || ret=1 138 1.1.1.6 christos grep 'inzone\.example\.com\..*CNAME.a\.example\.com\.' dig.out.test$n >/dev/null || ret=1 139 1.1.1.6 christos grep 'a\.example\.com\..*A.10\.53\.0\.1' dig.out.test$n >/dev/null && ret=1 140 1.1.1.4 christos [ $ret -eq 0 ] || echo_i "failed" 141 1.1.1.6 christos status=$((status + ret)) 142 1.1.1.4 christos 143 1.1.1.6 christos n=$((n + 1)) 144 1.1.1.4 christos echo_i "check that in-zone CNAME records does not return target data when QTYPE is ANY (rd=1/ra=1) ($n)" 145 1.1.1.4 christos ret=0 146 1.1.1.6 christos $DIG $DIGOPTS @10.53.0.2 -t any inzone.example.com >dig.out.test$n || ret=1 147 1.1.1.6 christos grep 'ANSWER: 1,' dig.out.test$n >/dev/null || ret=1 148 1.1.1.6 christos grep 'flags: qr aa rd ra;' dig.out.test$n >/dev/null || ret=1 149 1.1.1.6 christos grep 'inzone\.example\.com\..*CNAME.a\.example\.com\.' dig.out.test$n >/dev/null || ret=1 150 1.1.1.6 christos grep 'a\.example\.com\..*A.10\.53\.0\.1' dig.out.test$n >/dev/null && ret=1 151 1.1.1.4 christos [ $ret -eq 0 ] || echo_i "failed" 152 1.1.1.6 christos status=$((status + ret)) 153 1.1.1.4 christos 154 1.1.1.6 christos n=$((n + 1)) 155 1.1.1.4 christos echo_i "check that in-zone DNAME records does not return target data when QTYPE is CNAME (rd=1/ra=1) ($n)" 156 1.1.1.4 christos ret=0 157 1.1.1.6 christos $DIG $DIGOPTS @10.53.0.2 -t cname inzone.dname.example.com >dig.out.test$n || ret=1 158 1.1.1.6 christos grep 'ANSWER: 2,' dig.out.test$n >/dev/null || ret=1 159 1.1.1.6 christos grep 'flags: qr aa rd ra;' dig.out.test$n >/dev/null || ret=1 160 1.1.1.6 christos grep 'dname\.example\.com\..*DNAME.example\.com\.' dig.out.test$n >/dev/null || ret=1 161 1.1.1.6 christos grep 'inzone\.dname\.example\.com\..*CNAME.inzone\.example\.com\.' dig.out.test$n >/dev/null || ret=1 162 1.1.1.6 christos grep 'inzone\.example\.com\..*CNAME.a\.example\.com\.' dig.out.test$n >/dev/null && ret=1 163 1.1.1.6 christos grep 'a\.example\.com\..*A.10\.53\.0\.1' dig.out.test$n >/dev/null && ret=1 164 1.1.1.4 christos [ $ret -eq 0 ] || echo_i "failed" 165 1.1.1.6 christos status=$((status + ret)) 166 1.1.1.4 christos 167 1.1.1.6 christos n=$((n + 1)) 168 1.1.1.4 christos echo_i "check that in-zone DNAME records does not return target data when QTYPE is ANY (rd=1/ra=1) ($n)" 169 1.1.1.4 christos ret=0 170 1.1.1.6 christos $DIG $DIGOPTS @10.53.0.2 -t any inzone.dname.example.com >dig.out.test$n || ret=1 171 1.1.1.6 christos grep 'ANSWER: 2,' dig.out.test$n >/dev/null || ret=1 172 1.1.1.6 christos grep 'flags: qr aa rd ra;' dig.out.test$n >/dev/null || ret=1 173 1.1.1.6 christos grep 'dname\.example\.com\..*DNAME.example\.com\.' dig.out.test$n >/dev/null || ret=1 174 1.1.1.6 christos grep 'inzone\.dname\.example\.com\..*CNAME.inzone\.example\.com\.' dig.out.test$n >/dev/null || ret=1 175 1.1.1.6 christos grep 'inzone\.example\.com.*CNAME.a\.example\.com\.' dig.out.test$n >/dev/null && ret=1 176 1.1.1.6 christos grep 'a\.example\.com.*A.10\.53\.0\.1' dig.out.test$n >/dev/null && ret=1 177 1.1.1.4 christos [ $ret -eq 0 ] || echo_i "failed" 178 1.1.1.6 christos status=$((status + ret)) 179 1.1.1.4 christos 180 1.1.1.6 christos n=$((n + 1)) 181 1.1.1.2 christos echo_i "check that CHAOS addresses are compared correctly ($n)" 182 1.1.1.2 christos ret=0 183 1.1.1.7 christos $DIG $DIGOPTS @10.53.0.1 +noall +answer ch test.example.chaos >dig.out.test$n || ret=1 184 1.1.1.6 christos lines=$(wc -l <dig.out.test$n) 185 1.1.1.2 christos [ ${lines:-0} -eq 2 ] || ret=1 186 1.1.1.2 christos [ $ret -eq 0 ] || echo_i "failed" 187 1.1.1.6 christos status=$((status + ret)) 188 1.1.1.2 christos 189 1.1.1.8 christos n=$((n + 1)) 190 1.1.1.8 christos echo_i "check delegation response to ANY query ($n)" 191 1.1.1.8 christos ret=0 192 1.1.1.8 christos $DIG $DIGOPTS @10.53.0.1 foo.child.example.net any >dig.out.test$n || ret=1 193 1.1.1.8 christos grep "ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 2" dig.out.test$n >/dev/null || ret=1 194 1.1.1.8 christos grep 'child\.example\.net\..300.IN.NS.ns\.child\.example\.net\.$' dig.out.test$n >/dev/null || ret=1 195 1.1.1.8 christos grep 'ns\.child\.example\.net\..300.IN.A.10\.53\.0\.1$' dig.out.test$n >/dev/null || ret=1 196 1.1.1.8 christos [ $ret -eq 0 ] || echo_i "failed" 197 1.1.1.8 christos status=$((status + ret)) 198 1.1.1.8 christos 199 1.1 christos echo_i "exit status: $status" 200 1.1 christos [ $status -eq 0 ] || exit 1 201