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 18DIGCMD="$DIG +tcp -p ${PORT}" 19RNDCCMD="$RNDC -p ${CONTROLPORT} -c ../_common/rndc.conf" 20 21status=0 22 23ret=0 24n=1 25stats=0 26nsock0nstat=0 27nsock1nstat=0 28rndc_stats() { 29 _ns=$1 30 _ip=$2 31 32 $RNDCCMD -s $_ip stats >/dev/null 2>&1 || return 1 33 [ -f "${_ns}/named.stats" ] || return 1 34 35 last_stats=named.stats.$_ns-$stats-$n 36 mv ${_ns}/named.stats $last_stats 37 stats=$((stats + 1)) 38} 39 40echo_i "fetching a.example from ns2's initial configuration ($n)" 41$DIGCMD +noauth a.example. @10.53.0.2 any >dig.out.ns2.1 || ret=1 42if [ $ret != 0 ]; then echo_i "failed"; fi 43status=$((status + ret)) 44n=$((n + 1)) 45 46ret=0 47echo_i "dumping initial stats for ns2 ($n)" 48rndc_stats ns2 10.53.0.2 || ret=1 49if [ $ret != 0 ]; then echo_i "failed"; fi 50status=$((status + ret)) 51n=$((n + 1)) 52 53ret=0 54echo_i "verifying adb records in named.stats ($n)" 55grep "ADB stats" $last_stats >/dev/null || ret=1 56if [ $ret != 0 ]; then echo_i "failed"; fi 57status=$((status + ret)) 58n=$((n + 1)) 59 60echo_i "checking for 1 entry in adb hash table in named.stats ($n)" 61grep "1 Addresses in hash table" $last_stats >/dev/null || ret=1 62if [ $ret != 0 ]; then echo_i "failed"; fi 63status=$((status + ret)) 64n=$((n + 1)) 65 66ret=0 67echo_i "verifying cache statistics in named.stats ($n)" 68grep "Cache Statistics" $last_stats >/dev/null || ret=1 69if [ $ret != 0 ]; then echo_i "failed"; fi 70status=$((status + ret)) 71n=$((n + 1)) 72 73ret=0 74echo_i "checking for 2 entries in adb hash table in named.stats ($n)" 75$DIGCMD a.example.info. @10.53.0.2 any >/dev/null 2>&1 76rndc_stats ns2 10.53.0.2 || ret=1 77grep "2 Addresses in hash table" $last_stats >/dev/null || ret=1 78if [ $ret != 0 ]; then echo_i "failed"; fi 79status=$((status + ret)) 80n=$((n + 1)) 81 82ret=0 83echo_i "dumping initial stats for ns3 ($n)" 84rndc_stats ns3 10.53.0.3 || ret=1 85nsock0nstat=$(grep "UDP/IPv4 sockets active" $last_stats | awk '{print $1}') 86[ 0 -ne ${nsock0nstat} ] || ret=1 87if [ $ret != 0 ]; then echo_i "failed"; fi 88status=$((status + ret)) 89n=$((n + 1)) 90 91echo_i "sending queries to ns3" 92$DIGCMD +tries=2 +time=1 +recurse @10.53.0.3 foo.info. any >/dev/null 2>&1 || true 93 94ret=0 95echo_i "dumping updated stats for ns3 ($n)" 96getstats() { 97 rndc_stats ns3 10.53.0.3 || return 1 98 grep "2 recursing clients" $last_stats >/dev/null || return 1 99} 100retry_quiet 5 getstats || ret=1 101if [ $ret != 0 ]; then echo_i "failed"; fi 102status=$((status + ret)) 103n=$((n + 1)) 104 105ret=0 106echo_i "verifying recursing clients output in named.stats ($n)" 107grep "2 recursing clients" $last_stats >/dev/null || ret=1 108if [ $ret != 0 ]; then echo_i "failed"; fi 109status=$((status + ret)) 110n=$((n + 1)) 111 112ret=0 113echo_i "verifying active fetches output in named.stats ($n)" 114grep "1 active fetches" $last_stats >/dev/null || ret=1 115if [ $ret != 0 ]; then echo_i "failed"; fi 116status=$((status + ret)) 117n=$((n + 1)) 118 119ret=0 120echo_i "verifying active sockets output in named.stats ($n)" 121nsock1nstat=$(grep "UDP/IPv4 sockets active" $last_stats | awk '{print $1}') 122[ $((nsock1nstat - nsock0nstat)) -eq 1 ] || ret=1 123if [ $ret != 0 ]; then echo_i "failed"; fi 124status=$((status + ret)) 125n=$((n + 1)) 126 127# there should be 1 UDP and no TCP queries. As the TCP counter is zero 128# no status line is emitted. 129ret=0 130echo_i "verifying queries in progress in named.stats ($n)" 131grep "1 UDP queries in progress" $last_stats >/dev/null || ret=1 132grep "TCP queries in progress" $last_stats >/dev/null && ret=1 133if [ $ret != 0 ]; then echo_i "failed"; fi 134status=$((status + ret)) 135n=$((n + 1)) 136 137ret=0 138echo_i "verifying bucket size output ($n)" 139grep "bucket size" $last_stats >/dev/null || ret=1 140if [ $ret != 0 ]; then echo_i "failed"; fi 141status=$((status + ret)) 142n=$((n + 1)) 143 144ret=0 145echo_i "checking priming queries are counted ($n)" 146grep "priming queries" $last_stats >/dev/null || ret=1 147if [ $ret != 0 ]; then echo_i "failed"; fi 148status=$((status + ret)) 149n=$((n + 1)) 150 151ret=0 152echo_i "checking that zones with slash are properly shown in XML output ($n)" 153if $FEATURETEST --have-libxml2 && [ -x ${CURL} ]; then 154 ${CURL} http://10.53.0.1:${EXTRAPORT1}/xml/v3/zones >curl.out.${n} 2>/dev/null || ret=1 155 grep '<zone name="32/1.0.0.127-in-addr.example" rdataclass="IN">' curl.out.${n} >/dev/null || ret=1 156else 157 echo_i "skipping test as libxml2 and/or curl was not found" 158fi 159if [ $ret != 0 ]; then echo_i "failed"; fi 160status=$((status + ret)) 161n=$((n + 1)) 162 163ret=0 164echo_i "checking that zones return their type ($n)" 165if $FEATURETEST --have-libxml2 && [ -x ${CURL} ]; then 166 ${CURL} http://10.53.0.1:${EXTRAPORT1}/xml/v3/zones >curl.out.${n} 2>/dev/null || ret=1 167 grep '<zone name="32/1.0.0.127-in-addr.example" rdataclass="IN"><type>primary</type>' curl.out.${n} >/dev/null || ret=1 168else 169 echo_i "skipping test as libxml2 and/or curl was not found" 170fi 171if [ $ret != 0 ]; then echo_i "failed"; fi 172status=$((status + ret)) 173n=$((n + 1)) 174 175ret=0 176echo_i "checking bind9.xsl vs xml ($n)" 177if $FEATURETEST --have-libxml2 && "${CURL}" --http1.1 http://10.53.0.3:${EXTRAPORT1} >/dev/null 2>&1 && [ -x "${XSLTPROC}" ]; then 178 $DIGCMD +notcp +recurse @10.53.0.3 soa . >dig.out.test$n.1 2>&1 179 $DIGCMD +notcp +recurse @10.53.0.3 soa example >dig.out.test$n.2 2>&1 180 # check multiple requests over the same socket 181 time1=$($PERL -e 'print time(), "\n";') 182 ${CURL} --http1.1 -o curl.out.${n}.xml http://10.53.0.3:${EXTRAPORT1}/xml/v3 \ 183 -o curl.out.${n}.xsl http://10.53.0.3:${EXTRAPORT1}/bind9.xsl 2>/dev/null || ret=1 184 time2=$($PERL -e 'print time(), "\n";') 185 test $((time2 - time1)) -lt 5 || ret=1 186 diff ${TOP_SRCDIR}/bin/named/bind9.xsl curl.out.${n}.xsl || ret=1 187 ${XSLTPROC} curl.out.${n}.xsl - <curl.out.${n}.xml >xsltproc.out.${n} 2>/dev/null || ret=1 188 cp curl.out.${n}.xml stats.xml.out || ret=1 189 190 # 191 # grep for expected sections. 192 # 193 grep "<h1>ISC Bind 9 Configuration and Statistics</h1>" xsltproc.out.${n} >/dev/null || ret=1 194 grep "<h2>Server Status</h2>" xsltproc.out.${n} >/dev/null || ret=1 195 grep "<h2>Incoming Requests by DNS Opcode</h2>" xsltproc.out.${n} >/dev/null || ret=1 196 grep "<h3>Incoming Queries by Query Type</h3>" xsltproc.out.${n} >/dev/null || ret=1 197 grep "<h2>Outgoing Queries per view</h2>" xsltproc.out.${n} >/dev/null || ret=1 198 grep "<h3>View " xsltproc.out.${n} >/dev/null || ret=1 199 grep "<h2>Server Statistics</h2>" xsltproc.out.${n} >/dev/null || ret=1 200 grep "<h2>Zone Maintenance Statistics</h2>" xsltproc.out.${n} >/dev/null || ret=1 201 # grep "<h2>Resolver Statistics (Common)</h2>" xsltproc.out.${n} >/dev/null || ret=1 202 grep "<h3>Resolver Statistics for View " xsltproc.out.${n} >/dev/null || ret=1 203 grep "<h3>ADB Statistics for View " xsltproc.out.${n} >/dev/null || ret=1 204 grep "<h3>Cache Statistics for View " xsltproc.out.${n} >/dev/null || ret=1 205 # grep "<h3>Cache DB RRsets for View " xsltproc.out.${n} >/dev/null || ret=1 206 grep "<h2>Traffic Size Statistics</h2>" xsltproc.out.${n} >/dev/null || ret=1 207 grep "<h4>UDP Requests Received</h4>" xsltproc.out.${n} >/dev/null || ret=1 208 grep "<h4>UDP Responses Sent</h4>" xsltproc.out.${n} >/dev/null || ret=1 209 grep "<h4>TCP Requests Received</h4>" xsltproc.out.${n} >/dev/null || ret=1 210 grep "<h4>TCP Responses Sent</h4>" xsltproc.out.${n} >/dev/null || ret=1 211 grep "<h2>Socket I/O Statistics</h2>" xsltproc.out.${n} >/dev/null || ret=1 212 grep "<h3>Zones for View " xsltproc.out.${n} >/dev/null || ret=1 213 grep "<h2>Received QTYPES per view/zone</h2>" xsltproc.out.${n} >/dev/null || ret=1 214 grep "<h3>View _default" xsltproc.out.${n} >/dev/null || ret=1 215 grep "<h4>Zone example" xsltproc.out.${n} >/dev/null || ret=1 216 grep "<h2>Response Codes per view/zone</h2>" xsltproc.out.${n} >/dev/null || ret=1 217 grep "<h3>View _default" xsltproc.out.${n} >/dev/null || ret=1 218 grep "<h4>Zone example" xsltproc.out.${n} >/dev/null || ret=1 219 # grep "<h2>Glue cache statistics</h2>" xsltproc.out.${n} >/dev/null || ret=1 220 grep "<h3>View _default" xsltproc.out.${n} >/dev/null || ret=1 221 grep "<h4>Zone example" xsltproc.out.${n} >/dev/null || ret=1 222 grep "<h2>Memory Usage Summary</h2>" xsltproc.out.${n} >/dev/null || ret=1 223 grep "<h2>Memory Contexts</h2>" xsltproc.out.${n} >/dev/null || ret=1 224else 225 echo_i "skipping test as libxml2 and/or curl with HTTP/1.1 support and/or xsltproc was not found" 226fi 227if [ $ret != 0 ]; then echo_i "failed"; fi 228status=$((status + ret)) 229n=$((n + 1)) 230 231ret=0 232echo_i "checking bind9.xml socket statistics ($n)" 233if $FEATURETEST --have-libxml2 && [ -e stats.xml.out ] && [ -x "${XSLTPROC}" ]; then 234 # Socket statistics (expect no errors) 235 grep "<counter name=\"TCP4AcceptFail\">0</counter>" stats.xml.out >/dev/null || ret=1 236 grep "<counter name=\"TCP4BindFail\">0</counter>" stats.xml.out >/dev/null || ret=1 237 grep "<counter name=\"TCP4ConnFail\">0</counter>" stats.xml.out >/dev/null || ret=1 238 grep "<counter name=\"TCP4OpenFail\">0</counter>" stats.xml.out >/dev/null || ret=1 239 grep "<counter name=\"TCP4RecvErr\">0</counter>" stats.xml.out >/dev/null || ret=1 240 # grep "<counter name=\"TCP4SendErr\">0</counter>" stats.xml.out >/dev/null || ret=1 241 242 grep "<counter name=\"TCP6AcceptFail\">0</counter>" stats.xml.out >/dev/null || ret=1 243 grep "<counter name=\"TCP6BindFail\">0</counter>" stats.xml.out >/dev/null || ret=1 244 grep "<counter name=\"TCP6ConnFail\">0</counter>" stats.xml.out >/dev/null || ret=1 245 grep "<counter name=\"TCP6OpenFail\">0</counter>" stats.xml.out >/dev/null || ret=1 246 grep "<counter name=\"TCP6RecvErr\">0</counter>" stats.xml.out >/dev/null || ret=1 247 grep "<counter name=\"TCP6SendErr\">0</counter>" stats.xml.out >/dev/null || ret=1 248else 249 echo_i "skipping test as libxml2 and/or stats.xml.out file and/or xsltproc was not found" 250fi 251if [ $ret != 0 ]; then echo_i "failed"; fi 252status=$((status + ret)) 253n=$((n + 1)) 254 255echo_i "Check that 'zone-statistics full;' is processed by 'rndc reconfig' ($n)" 256ret=0 257# off by default 258rndc_stats ns2 10.53.0.2 || ret=1 259sed -n '/Per Zone Query Statistics/,/^++/p' $last_stats | grep -F '[example]' >/dev/null && ret=0 260# turn on 261copy_setports ns2/named2.conf.in ns2/named.conf 262rndc_reconfig ns2 10.53.0.2 263rndc_stats ns2 10.53.0.2 || ret=1 264sed -n '/Per Zone Query Statistics/,/^++/p' $last_stats | grep -F '[example]' >/dev/null || ret=1 265# turn off 266copy_setports ns2/named.conf.in ns2/named.conf 267rndc_reconfig ns2 10.53.0.2 268rndc_stats ns2 10.53.0.2 || ret=1 269sed -n '/Per Zone Query Statistics/,/^++/p' $last_stats | grep -F '[example]' >/dev/null && ret=0 270# turn on 271copy_setports ns2/named2.conf.in ns2/named.conf 272rndc_reconfig ns2 10.53.0.2 273rndc_stats ns2 10.53.0.2 || ret=1 274sed -n '/Per Zone Query Statistics/,/^++/p' $last_stats | grep -F '[example]' >/dev/null || ret=1 275if [ $ret != 0 ]; then echo_i "failed"; fi 276status=$((status + ret)) 277n=$((n + 1)) 278 279echo_i "exit status: $status" 280[ $status -eq 0 ] || exit 1 281