Home | History | Annotate | Line # | Download | only in auth
      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