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 14set -e 15 16. ../conf.sh 17 18DIGOPTS="-p ${PORT}" 19RNDCCMD="$RNDC -c ../_common/rndc.conf -p ${CONTROLPORT} -s" 20 21status=0 22n=0 23 24emptyzones=" 2510.IN-ADDR.ARPA 2616.172.IN-ADDR.ARPA 2717.172.IN-ADDR.ARPA 2818.172.IN-ADDR.ARPA 2919.172.IN-ADDR.ARPA 3020.172.IN-ADDR.ARPA 3121.172.IN-ADDR.ARPA 3222.172.IN-ADDR.ARPA 3323.172.IN-ADDR.ARPA 3424.172.IN-ADDR.ARPA 3525.172.IN-ADDR.ARPA 3626.172.IN-ADDR.ARPA 3727.172.IN-ADDR.ARPA 3828.172.IN-ADDR.ARPA 3929.172.IN-ADDR.ARPA 4030.172.IN-ADDR.ARPA 4131.172.IN-ADDR.ARPA 42168.192.IN-ADDR.ARPA 4364.100.IN-ADDR.ARPA 4465.100.IN-ADDR.ARPA 4566.100.IN-ADDR.ARPA 4667.100.IN-ADDR.ARPA 4768.100.IN-ADDR.ARPA 4869.100.IN-ADDR.ARPA 4970.100.IN-ADDR.ARPA 5071.100.IN-ADDR.ARPA 5172.100.IN-ADDR.ARPA 5273.100.IN-ADDR.ARPA 5374.100.IN-ADDR.ARPA 5475.100.IN-ADDR.ARPA 5576.100.IN-ADDR.ARPA 5677.100.IN-ADDR.ARPA 5778.100.IN-ADDR.ARPA 5879.100.IN-ADDR.ARPA 5980.100.IN-ADDR.ARPA 6081.100.IN-ADDR.ARPA 6182.100.IN-ADDR.ARPA 6283.100.IN-ADDR.ARPA 6384.100.IN-ADDR.ARPA 6485.100.IN-ADDR.ARPA 6586.100.IN-ADDR.ARPA 6687.100.IN-ADDR.ARPA 6788.100.IN-ADDR.ARPA 6889.100.IN-ADDR.ARPA 6990.100.IN-ADDR.ARPA 7091.100.IN-ADDR.ARPA 7192.100.IN-ADDR.ARPA 7293.100.IN-ADDR.ARPA 7394.100.IN-ADDR.ARPA 7495.100.IN-ADDR.ARPA 7596.100.IN-ADDR.ARPA 7697.100.IN-ADDR.ARPA 7798.100.IN-ADDR.ARPA 7899.100.IN-ADDR.ARPA 79100.100.IN-ADDR.ARPA 80101.100.IN-ADDR.ARPA 81102.100.IN-ADDR.ARPA 82103.100.IN-ADDR.ARPA 83104.100.IN-ADDR.ARPA 84105.100.IN-ADDR.ARPA 85106.100.IN-ADDR.ARPA 86107.100.IN-ADDR.ARPA 87108.100.IN-ADDR.ARPA 88109.100.IN-ADDR.ARPA 89110.100.IN-ADDR.ARPA 90111.100.IN-ADDR.ARPA 91112.100.IN-ADDR.ARPA 92113.100.IN-ADDR.ARPA 93114.100.IN-ADDR.ARPA 94115.100.IN-ADDR.ARPA 95116.100.IN-ADDR.ARPA 96117.100.IN-ADDR.ARPA 97118.100.IN-ADDR.ARPA 98119.100.IN-ADDR.ARPA 99120.100.IN-ADDR.ARPA 100121.100.IN-ADDR.ARPA 101122.100.IN-ADDR.ARPA 102123.100.IN-ADDR.ARPA 103124.100.IN-ADDR.ARPA 104125.100.IN-ADDR.ARPA 105126.100.IN-ADDR.ARPA 106127.100.IN-ADDR.ARPA 1070.IN-ADDR.ARPA 108127.IN-ADDR.ARPA 109254.169.IN-ADDR.ARPA 1102.0.192.IN-ADDR.ARPA 111100.51.198.IN-ADDR.ARPA 112113.0.203.IN-ADDR.ARPA 113255.255.255.255.IN-ADDR.ARPA 1140.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.IP6.ARPA 1151.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.IP6.ARPA 116D.F.IP6.ARPA 1178.E.F.IP6.ARPA 1189.E.F.IP6.ARPA 119A.E.F.IP6.ARPA 120B.E.F.IP6.ARPA 1218.B.D.0.1.0.0.2.IP6.ARPA 122EMPTY.AS112.ARPA 123HOME.ARPA 124RESOLVER.ARPA" 125 126n=$((n + 1)) 127ret=0 128count=0 129echo_i "Checking expected empty zones were configured ($n)" 130for zone in ${emptyzones}; do 131 grep "automatic empty zone: $zone" ns1/named.run >/dev/null || { 132 echo_i "failed (empty zone $zone missing)" 133 ret=1 134 } 135 count=$((count + 1)) 136done 137lines=$(grep "automatic empty zone: " ns1/named.run | wc -l) 138test $count -eq $lines -a $count -eq 100 || { 139 ret=1 140 echo_i "failed (count mismatch)" 141} 142if [ $ret != 0 ]; then status=$((status + ret)); fi 143 144n=$((n + 1)) 145echo_i "Checking that reconfiguring empty zones is silent ($n)" 146$RNDCCMD 10.53.0.1 reconfig 147ret=0 148grep "automatic empty zone" ns1/named.run >/dev/null || ret=1 149grep "received control channel command 'reconfig'" ns1/named.run >/dev/null || ret=1 150grep "reloading configuration succeeded" ns1/named.run >/dev/null || ret=1 151sleep 1 152grep "zone serial (0) unchanged." ns1/named.run >/dev/null && ret=1 153if [ $ret != 0 ]; then 154 echo_i "failed" 155 status=$((status + ret)) 156fi 157 158n=$((n + 1)) 159echo_i "Checking that reloading empty zones is silent ($n)" 160rndc_reload ns1 10.53.0.1 161ret=0 162grep "automatic empty zone" ns1/named.run >/dev/null || ret=1 163grep "received control channel command 'reload'" ns1/named.run >/dev/null || ret=1 164grep "reloading configuration succeeded" ns1/named.run >/dev/null || ret=1 165sleep 1 166grep "zone serial (0) unchanged." ns1/named.run >/dev/null && ret=1 167if [ $ret != 0 ]; then 168 echo_i "failed" 169 status=$((status + ret)) 170fi 171 172HOST_NAME=$($FEATURETEST --gethostname) 173BIND_VERSION_STRING=$($NAMED -V | head -1) 174BIND_VERSION=$($NAMED -V | sed -ne 's/^BIND \([^ ]*\).*/\1/p') 175 176n=$((n + 1)) 177ret=0 178echo_i "Checking that default version works for rndc ($n)" 179$RNDCCMD 10.53.0.1 status >rndc.status.ns1.$n 2>&1 180grep -F "version: $BIND_VERSION_STRING" rndc.status.ns1.$n >/dev/null || ret=1 181if [ $ret != 0 ]; then 182 echo_i "failed" 183 status=$((status + ret)) 184fi 185 186n=$((n + 1)) 187ret=0 188echo_i "Checking that custom version works for rndc ($n)" 189$RNDCCMD 10.53.0.3 status >rndc.status.ns3.$n 2>&1 190grep -F "version: $BIND_VERSION_STRING (this is a test of version)" rndc.status.ns3.$n >/dev/null || ret=1 191if [ $ret != 0 ]; then 192 echo_i "failed" 193 status=$((status + ret)) 194fi 195 196n=$((n + 1)) 197ret=0 198echo_i "Checking that default version works for query ($n)" 199$DIG $DIGOPTS +short version.bind txt ch @10.53.0.1 >dig.out.ns1.$n || ret=1 200grep "^\"$BIND_VERSION\"$" dig.out.ns1.$n >/dev/null || ret=1 201if [ $ret != 0 ]; then 202 echo_i "failed" 203 status=$((status + ret)) 204fi 205 206n=$((n + 1)) 207ret=0 208echo_i "Checking that custom version works for query ($n)" 209$DIG $DIGOPTS +short version.bind txt ch @10.53.0.3 >dig.out.ns3.$n || ret=1 210grep "^\"this is a test of version\"$" dig.out.ns3.$n >/dev/null || ret=1 211if [ $ret != 0 ]; then 212 echo_i "failed" 213 status=$((status + ret)) 214fi 215 216n=$((n + 1)) 217ret=0 218echo_i "Checking that default hostname works for query ($n)" 219$DIG $DIGOPTS +short hostname.bind txt ch @10.53.0.1 >dig.out.ns1.$n || ret=1 220grep "^\"$HOST_NAME\"$" dig.out.ns1.$n >/dev/null || ret=1 221if [ $ret != 0 ]; then 222 echo_i "failed" 223 status=$((status + ret)) 224fi 225 226n=$((n + 1)) 227ret=0 228echo_i "Checking that custom hostname works for query ($n)" 229$DIG $DIGOPTS +short hostname.bind txt ch @10.53.0.3 >dig.out.ns3.$n || ret=1 230grep "^\"this.is.a.test.of.hostname\"$" dig.out.ns3.$n >/dev/null || ret=1 231if [ $ret != 0 ]; then 232 echo_i "failed" 233 status=$((status + ret)) 234fi 235 236n=$((n + 1)) 237ret=0 238echo_i "Checking that default server-id is none for query ($n)" 239$DIG $DIGOPTS id.server txt ch @10.53.0.1 >dig.out.ns1.$n || ret=1 240grep "status: NOERROR" dig.out.ns1.$n >/dev/null || ret=1 241grep "ANSWER: 0" dig.out.ns1.$n >/dev/null || ret=1 242if [ $ret != 0 ]; then 243 echo_i "failed" 244 status=$((status + ret)) 245fi 246 247n=$((n + 1)) 248ret=0 249echo_i "Checking that server-id hostname works for query ($n)" 250$DIG $DIGOPTS +short id.server txt ch @10.53.0.2 >dig.out.ns2.$n || ret=1 251grep "^\"$HOST_NAME\"$" dig.out.ns2.$n >/dev/null || ret=1 252if [ $ret != 0 ]; then 253 echo_i "failed" 254 status=$((status + ret)) 255fi 256 257n=$((n + 1)) 258ret=0 259echo_i "Checking that server-id hostname works for EDNS name server ID request ($n)" 260$DIG $DIGOPTS +norec +nsid foo @10.53.0.2 >dig.out.ns2.$n || ret=1 261grep "^; NSID: .* (\"$HOST_NAME\")$" dig.out.ns2.$n >/dev/null || ret=1 262if [ $ret != 0 ]; then 263 echo_i "failed" 264 status=$((status + ret)) 265fi 266 267n=$((n + 1)) 268ret=0 269echo_i "Checking that custom server-id works for query ($n)" 270$DIG $DIGOPTS +short id.server txt ch @10.53.0.3 >dig.out.ns3.$n || ret=1 271grep "^\"this.is.a.test.of.server-id\"$" dig.out.ns3.$n >/dev/null || ret=1 272if [ $ret != 0 ]; then 273 echo_i "failed" 274 status=$((status + ret)) 275fi 276 277n=$((n + 1)) 278ret=0 279echo_i "Checking that custom server-id works for EDNS name server ID request ($n)" 280$DIG $DIGOPTS +norec +nsid foo @10.53.0.3 >dig.out.ns3.$n || ret=1 281grep "^; NSID: .* (\"this.is.a.test.of.server-id\")$" dig.out.ns3.$n >/dev/null || ret=1 282if [ $ret != 0 ]; then 283 echo_i "failed" 284 status=$((status + ret)) 285fi 286 287echo_i "exit status: $status" 288[ $status -eq 0 ] || exit 1 289