home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Internet Tools 1993 July / Internet Tools.iso / RockRidge / ip / dns / doc.2.0 / doc < prev    next >
Encoding:
Text File  |  1990-09-11  |  30.8 KB  |  1,137 lines

  1. #!/bin/csh -f
  2. ##################################################################
  3. #
  4. #       Doc - Version  2.0.1 (9/14/90)
  5. #          [Version 2.0 8/22/90]
  6. #             [Version 1.1 5/17/90]
  7. #             [Version 1.0 4/25/90]
  8. #
  9. #       Developed by: Steve Hotz (hotz@isi.edu)
  10. #                     Paul Mockapetris (pvm@isi.edu)
  11. #       USC Information Sciences Institute (USC-ISI)
  12. #       Marina del Rey, California
  13. #       1990
  14. #
  15. #       Implementation debugging & design comments by
  16. #       some "dandy" folks:
  17. #           Andrew Cherenson   Steve Hubert   Edward Vielmetti
  18. #
  19. #    This program is Public Domain, and may be freely distributed
  20. #    and used for any non-profit purpose as long as this notice
  21. #    is not removed.
  22. #
  23. ##################################################################
  24.  
  25. #################################################################
  26. ##
  27. #   Any configuration changes that you may need to make will
  28. #   likely be in the next few areas.
  29. ##
  30. #################################################################
  31.  
  32. ######## alias to DiG Version 2.0 (if not in path)
  33. ##
  34. # alias dig '/nfs/u5/hotz/bin.sun3/dig'
  35.  
  36.  
  37. ######## Differences in 'tr' program
  38. ##
  39. ### System V's tr requires []
  40. ##
  41. # set nonomatch
  42. # set tolower="tr '[A-Z]' '[a-z]'"
  43. ##
  44. ##
  45. ### BSD version
  46. ##
  47. set tolower="tr 'A-Z' 'a-z'"
  48.  
  49.  
  50. ####XX# 
  51. ######## where are auxiliary awk files (doc[134].awk)
  52. ##
  53. ## Need to set this if you want to include 'doc' in your path,
  54. ##  and run while in other working directories.
  55. ##
  56. #set auxd=/nfs/u5/hotz/auto/
  57. set auxd=""
  58.  
  59. ######## Number of dig retries
  60. ##
  61. ## Dig default is four, but this makes for a considerable wait
  62. ## when servers are down.  Two retries seems to be a good trade-off
  63. ## between time and completeness.
  64. ##
  65. set RET="+ret=2"
  66.  
  67.  
  68. ######## Default standard output options
  69. ##
  70. set eflag=0    # error info only
  71. set wflag=0     # warning info
  72. set vflag=0    # verbose
  73. set dflag=0    # debug -- *real* verbose
  74. set pflag=0     # skip parent domain testing
  75.  
  76.  
  77. ##################################################################
  78. ##################################################################
  79. ##
  80. ## Unless you want to add/modify tests that are being made,
  81. ## you will likely not need to change things below this line.
  82. ##
  83.  
  84. onintr cleanup
  85.  
  86. set version = "Doc-2.0.1"
  87.  
  88. set ddflag=0    ## DDBUG numeric checkpoints for development
  89. set error = (FORMAT_ERROR SERVER_FAIL NXDOMAIN UNIMPLEMENTED \
  90.              REQ_REFUSED CONN_REFUSED TIME_OUT CONN_REFUSED \
  91.              UNKNOWN UNEXPECTED)
  92.  
  93. set fferror=0    ## count of errors found
  94. set ffwarn=0     ## count of warnings
  95. set ffallone=0     ## unfinished business (dig failed to parent servers)
  96. set ffalltwo=0     ## unfinished business (dig failed to AUTH servers)
  97. set aborted=0    ##
  98.  
  99. ####XX# 
  100. #########################################
  101. #
  102. #  Parse arguments && initialization
  103. #
  104.  
  105. while ("$1" =~ -*)
  106.   switch ($1)
  107.     case "-p":
  108.       set pflag=1
  109.       breaksw
  110.     case "-d":
  111.       set dflag=1
  112.     case "-v":
  113.       set vflag=1
  114.     case "-w":
  115.       set wflag=1
  116.     case "-e":
  117.       set eflag=1
  118.     default:
  119.       breaksw
  120.   endsw
  121. shift
  122. end
  123.  
  124. if ($1 == "") goto show
  125.  
  126. if ($1 =~ *.) then
  127.   set dom=$1
  128. else
  129.   set dom=${1}.
  130. endif
  131.  
  132.  
  133. if ($2 == "") then
  134.    set dad=`echo $dom | sed "s/[a-zA-Z0-9-]*.//p"`
  135.    if ("$dad" == "") then
  136.       set dad="."
  137.    else
  138.       set dad = $dad[1]  ## sed variants do different things with p
  139.    endif
  140. else
  141.    if ($2 =~ *.) then
  142.      set dad=$2
  143.    else
  144.      set dad=${2}.
  145.    endif
  146. endif
  147.  
  148. set stat = `dig | awk '/DiG/ && / 2./ {print "ok"; exit}'`
  149. if ($stat != "ok") then
  150. echo "Abort: This program requires DiG Version-2.x to run."
  151. exit 1
  152. endif
  153.  
  154. ####XX# 
  155.  
  156. set agree=0
  157. echo "${version}: Starting test of $dom   parent is $dad"
  158. echo "${version}: Test date - `date`"
  159. echo "${version}: Starting test of $dom   parent is $dad" >> log.$dom
  160. echo "${version}: Test date - `date`" >> log.$dom
  161.  
  162. echo "" >> logXX.$dom
  163. echo "######## Query Log ########" >> logXX.$dom
  164. echo "" >> logXX.$dom
  165.  
  166. set domservall=""
  167.  
  168. #########################################################
  169. ##
  170. ## Get nameservers for parent zone
  171. ##
  172.  
  173. if ( -e DNsrv.$dad ) then
  174. cat DNsrv.${dad} > $dom.$dad.ns
  175. echo "Note: Using pre-specified $dad NSlist from file." >> log.$dom
  176. if ($vflag) echo "Note: Using pre-specified $dad NSlist from file."
  177. goto skip1
  178. endif
  179.  
  180. dig ns ${dad} +pfset=0xa224 | awk '$3=="NS" {print $4}' | $tolower > $dom.$dad.ns
  181.  
  182. set stat = $status
  183. if ($stat != 0) then
  184.    set estr= $error[$stat]
  185.    echo "DIGERR ($estr): dig for parent NS failed (dig ns $dad)" >> log.$dom
  186.    echo "DIGERR ($estr): dig for parent NS failed (dig ns $dad)"
  187.    if ($ddflag) echo "DDBUG: 1"
  188.    goto dig1err1
  189. endif
  190. set dadcount=`wc -l < $dom.$dad.ns`
  191. if ($dadcount == 0) then
  192.    echo "ABORT: No NS found for parent domain $dad" >> log.$dom
  193.    echo "ABORT: No NS found for parent domain $dad"
  194.    @ ffallone++
  195.    if ($ddflag) echo "DDBUG: 2"
  196.    goto dig1err2
  197. endif
  198.  
  199. skip1:
  200.  
  201. echo "## Nameservers for $dad (dig ns $dad):" >> logXX.$dom
  202. echo "" >> logXX.$dom
  203. cat  $dom.$dad.ns >> logXX.$dom
  204. echo "===================" >> logXX.$dom
  205. echo "" >> logXX.$dom
  206.  
  207. ####XX# 
  208. ########################################################
  209. ##
  210. ## Check SOA's of parent domain at each server for parent
  211. ##
  212. set sns=""
  213. set aafile=""
  214. set aaserv=""
  215. set noaaserv=""
  216. set cntone = 0
  217.  
  218. if ($pflag) then
  219. echo "Note: Skipping parent domain testing" >> log.$dom
  220. if ($vflag) echo "Note: Skipping parent domain testing"
  221. set aaserv = `cat $dom.$dad.ns`
  222. goto skip2
  223. endif
  224.  
  225. foreach i (`cat $dom.$dad.ns`) 
  226.   if ($dflag) echo DEBUG: digging @$i for soa of $dad
  227.   if ($dflag) echo DEBUG: digging @$i for soa of $dad >> log.$dom
  228.  
  229.   dig @$i soa $dad +norec $RET +pfset=0xa224 | $tolower > $dom.$dad.soa.$i
  230.   set stat = $status
  231.   if ($stat != 0) then
  232.      set estr=$error[$stat]
  233. echo "DIGERR ($estr): dig @$i for SOA of parent ($dad) failed" >> log.$dom
  234. echo "DIGERR ($estr): dig @$i for SOA of parent ($dad) failed"
  235.      rm $dom.$dad.soa.$i
  236.      if ($ddflag) echo "DDBUG: 3"
  237.      continue
  238.   endif
  239.  
  240.   echo "## SOA record for $dad domain from nameserver $i" >> logXX.$dom
  241.   echo "" >> logXX.$dom
  242.   cat  $dom.$dad.soa.$i >> logXX.$dom
  243.   echo "===================" >> logXX.$dom
  244.   echo "" >> logXX.$dom
  245.  
  246.   set serial=`awk -f ${auxd}doc1.awk $dom.$dad.soa.$i`
  247.   set stat=$status
  248.  
  249.   if ($vflag) echo "soa @$i for $dad has serial: $serial"
  250.   echo "soa @$i for $dad has serial: $serial" >> log.$dom
  251.  
  252. #####XX# 
  253. ##########################################################
  254. ##
  255. ## Examine SOA information for parent from parent servers
  256. ##
  257.  
  258. ## fix for shells which return unsigned 8 bit exit codes
  259.   if ($stat > 127) then
  260.      @ stat = $stat - 256
  261.   endif
  262.  
  263.   if ($stat < 0) then
  264.      @ ffwarn++
  265.      set noaaserv = ($noaaserv $i)
  266.      echo "WARNING: non-authoritative answer for $dad from $i" >> log.$dom
  267.      if ($wflag) echo "WARNING: non-authoritative answer for $dad from $i"
  268.      if ($ddflag) echo "DDBUG: 4"
  269.   else if ($stat == 0) then
  270.      @ ffwarn++
  271.      echo "WARNING: no SOA record for $dad from $i" >> log.$dom
  272.      if ($wflag) echo "WARNING: no SOA record for $dad from $i"
  273.      if ($ddflag) echo "DDBUG: 5"
  274.   else if ($stat > 1) then
  275.      set aaserv = ($aaserv $i)
  276.      @ ffwarn++
  277.      echo "WARNING: multiple SOA records found for $dad from $i" >> log.$dom
  278.      if ($wflag) echo "WARNING: multiple SOA records found for $dad from $i"
  279.      if ($ddflag) echo "DDBUG: 6"
  280.   else
  281.  
  282. #########################################################
  283. ##
  284. ## Look for multiple serial numbers among SOA records from
  285. ## servers that are authoritative for parent domain.
  286. ##   aafile/aaserve:  files/list of  authoritative servers for parent
  287. ##   noaaserv:        servers not authoritative for parent
  288. ##
  289.     set aafile = ($aafile $dom.$dad.soa.$i)
  290.     set aaserv = ($aaserv $i)
  291.     @ cntone++
  292.     set another=1
  293.     foreach j ($sns)
  294.       if ($serial == $j) then
  295.      set another=0
  296.          break
  297.       endif
  298.     end
  299.     if ($another) then
  300.          set sns=($sns $serial)
  301.     endif
  302.   endif
  303. end    ## foreach
  304.  
  305. #####XX# 
  306.  
  307. if ($#sns > 1) then
  308.   @ ffwarn++
  309.   echo "WARNING: Found $#sns unique SOA serial #'s for $dad" >> log.$dom
  310.   if ($wflag) echo "WARNING: Found $#sns unique SOA serial #'s for $dad"
  311.   if ($ddflag) echo "DDBUG: 7"
  312. else if ($sns != "") then
  313.    if ($cntone > 1) then
  314.       echo "SOA serial #'s agree for $dad domain" >> log.$dom
  315.       if ($vflag) echo "SOA serial #'s agree for $dad domain"
  316.    endif
  317. else
  318.    echo "SYSerr: No servers for $dad returned SOAs ..." >> log.$dom
  319.    echo "SYSerr: No servers for $dad returned SOAs ..."
  320.    if ($ddflag) echo "DDBUG: 8"
  321.    goto dig2err1
  322. endif
  323.  
  324. #####XXX At this point, might want to add check to compare entire
  325. #####XXX SOA (not just serial #) -- appropriate SOAs in ${aafile}s
  326.  
  327. #######################################################
  328. #######################################################
  329. ##
  330. ## Ask all autoritative servers of parent zone for
  331. ## NS records of domain being tested.
  332. ##
  333.  
  334. skip2:
  335.  
  336. set nslists=""        # files with lists of NS recs (unique)
  337. set nslistsaa=""    # (as above) from servers claim AUTH
  338. set nsdad=""        # server list not  AUTH for domain
  339. set nsdadaa=""        # server list also AUTH for domain
  340. set nsdadno=0
  341. set nsdadnoaa=0
  342.  
  343. foreach i ($aaserv)
  344.    dig @$i ns $dom +pfset=0xa7e4 +norec $RET | $tolower > $dom.raw.$i
  345.    set stat = $status
  346.    if ($stat != 0) then
  347.       set estr=$error[$stat]
  348.       echo "DIGERR ($estr): dig @$i for NS of $dom failed" >> log.$dom
  349.       echo "DIGERR ($estr): dig @$i for NS of $dom failed"
  350.       if ($ddflag) echo "DDBUG: 9"
  351.       continue
  352.    endif
  353.  
  354.    echo "## NS records for $dom domain from nameserver $i" >> logXX.$dom
  355.    echo "" >> logXX.$dom
  356.    cat  $dom.raw.$i >> logXX.$dom
  357.    echo "===================" >> logXX.$dom
  358.    echo "" >> logXX.$dom
  359.  
  360. ####XX# 
  361. ##################################################
  362. ##
  363. ##  Examine query response:  (1) find list of nameservers,
  364. ##  (2) determine if authoritative response, (3) look for glue
  365. ##
  366.  
  367.    awk -f ${auxd}doc3.awk $dom.raw.$i | sort -u > $dom.ns.$i
  368.    set stat=$status
  369.    set another=1
  370.  
  371. ## fix for shells which return unsigned 8 bit exit codes
  372.    if ($stat > 127) then
  373.         @ stat = $stat - 256
  374.    endif
  375.    if ($stat < 0) then
  376.     set isaa = 1
  377.         @ stat = $stat + 127
  378.    else
  379.         set isaa = 0;
  380.    endif
  381.    @ glue = $stat % 16
  382.    @ ttls = $stat / 16
  383.  
  384. ####################################################
  385. ##
  386. ## Here we make a seperate list of info based on whether the
  387. ## server (for parent domain) happens to also be authoritative
  388. ## for the domain being tested.
  389. ##
  390. ## 
  391.  
  392.    if ($isaa == 0) then
  393.       @ nsdadno++
  394.       set nsdad=($nsdad $i)
  395.       set what="(non-AUTH)"
  396.       foreach j ($nslists)
  397.      diff -i $j $dom.ns.$i >& /dev/null
  398.          if ($status == 0) then
  399.         set another=0
  400.             break
  401.          endif
  402.        end
  403.        if ($another) set nslists=($nslists $dom.ns.$i)
  404.    else
  405.       @ nsdadnoaa++
  406.       set nsdadaa=($nsdadaa $i)
  407.       set what="(AUTH)"
  408.       foreach j ($nslistsaa)
  409.         diff -i $j $dom.ns.$i >& /dev/null
  410.         if ($status == 0) then
  411.        set another=0
  412.            break
  413.         endif
  414.       end
  415.       if ($another) set nslistsaa=($nslistsaa $dom.ns.$i)
  416.    endif
  417.  
  418. ####XX# 
  419.  
  420.   set dadno = `wc -l < $dom.ns.$i`
  421.   echo Found $dadno NS and $glue glue records for $dom @$i $what >> log.$dom
  422.   if ($vflag) echo Found $dadno NS and $glue glue records for $dom @$i $what
  423.  
  424.    if ($ttls > 1) then
  425.       @ fferror++
  426.       echo "ERROR: multiple TTLs found for $dom NS records @$i" >> log.$dom
  427.       if ($eflag) echo "ERROR: multiple TTLs found for $dom NS records @$i"
  428.       if ($ddflag) echo "DDBUG: 10"
  429.    endif
  430.  
  431.    if ($pflag) then
  432.       set domservall = `cat $dom.ns.$i`
  433.       if ($isaa) then
  434.          set nslistsaa = $dom.ns.$i
  435.       else
  436.          set nslists = $dom.ns.$i
  437.          break
  438.       endif
  439.    endif
  440.  
  441. end  ## foreach
  442.  
  443. if ($pflag) then
  444.    echo "Using NSlist from parent domain server $i" >> log.$dom
  445.    if ($vflag) echo "Using NSlist from parent domain server $i"
  446.    goto skip3
  447. endif
  448.  
  449. echo "DNServers for $dad" >> log.$dom
  450. echo "   === $nsdadnoaa were also authoritatve for $dom" >> log.$dom
  451. echo "   === $nsdadno were non-authoritative for $dom" >> log.$dom
  452. if ($vflag) then
  453.   echo "DNServers for $dad"
  454.   echo "   === $nsdadnoaa were also authoritatve for $dom"
  455.   echo "   === $nsdadno were non-authoritative for $dom"
  456. endif
  457.  
  458. ####XX# 
  459. ################################################
  460. ##
  461. ## Print info about authoritative responses.
  462. ##
  463.  
  464. set tmpcntone=0
  465. if ($#nslistsaa > 1) then
  466.    @ fferror++
  467.    set tmpcntone=$#nslistsaa
  468.    echo "ERROR: Found $#nslistsaa diff sets of NS records" >> log.$dom
  469.    echo "   === from servers authoritative for $dom" >> log.$dom
  470.    if ($eflag) echo "ERROR: Found $#nslistsaa diff sets of NS records"
  471.    if ($eflag) echo "   === from servers authoritative for $dom"
  472.    if ($ddflag) echo "DDBUG: 11"
  473. else if ($nslistsaa != "") then
  474.    set tmpcntone=1
  475.    if ($nsdadnoaa > 1) then
  476.      echo "Servers for $dad that are also authoritative for $dom" >> log.$dom
  477.      echo "   === agree on NS records for $dom" >> log.$dom
  478.      if ($vflag) echo "Servers for $dad that are also authoritative for $dom"
  479.      if ($vflag) echo "   === agree on NS records for $dom"
  480.      if ($ddflag) echo "DDBUG: 12"
  481.    endif
  482. endif
  483.  
  484. ################################################
  485. ##
  486. ## Print info about non-authoritative responses.
  487. ##
  488.  
  489. set tmpcnttwo=0
  490. if ($#nslists > 1) then
  491.    @ ffwarn++
  492.    set tmpcnttwo=$#nslists
  493.    echo "WARN: Found $#nslists diff sets of NS records" >> log.$dom
  494.    echo "   === from servers not authoritative for $dom" >> log.$dom
  495.    if ($wflag) echo "WARN: Found $#nslists diff sets of NS records"
  496.    if ($wflag)  echo "   === from servers not authoritative for $dom"
  497.    if ($ddflag) echo "DDBUG: 13"
  498. else if ($nslists != "") then
  499.    set tmpcnttwo=1
  500.    if ($nsdadno > 1) then
  501.       echo "Servers for $dad (not also authoritative for $dom)" >> log.$dom
  502.       echo "   === agree on NS records for $dom" >> log.$dom
  503.       if ($vflag) echo "Servers for $dad (not also authoritative for $dom)"
  504.       if ($vflag) echo "   === agree on NS records for $dom"
  505.       if ($ddflag) echo "DDBUG: 14"
  506.    endif
  507.  
  508. ####XX# 
  509. ###############################################
  510. ##
  511. ## If both authoritative && non-authoritative responses and
  512. ##   if they agree among themselves,
  513. ##      then check if NS records are consitent among all.
  514. ##
  515.  
  516.   if ($tmpcntone == 1) then
  517.      diff -i $nslists $nslistsaa >& /dev/null
  518.      if ($status == 0) then
  519. echo "NS lists for $dom from all $dad servers are identical" >> log.$dom
  520. echo "   === (both authoritative and non-authoritative for $dom)" >> log.$dom
  521.        if ($ddflag) echo "DDBUG: 15"
  522.        if ($vflag) then
  523.           echo "NS lists for $dom from all $dad servers are identical"
  524.           echo "   === (both authoritative and non-authoritative for $dom)"
  525.        endif
  526.        set agree=1
  527.      else
  528.        @ fferror++
  529. echo "ERROR: NS list for $dom from parent servers differ" >> log.$dom
  530. echo "   ===  authoritative disagree with those not AUTH for $dom " >> log.$dom
  531.        if ($ddflag) echo "DDBUG: 16"
  532.        if ($eflag) then
  533.          echo "ERROR: NS list for $dom from parent servers differ"
  534.          echo "   ===  authoritative disagree with those not AUTH for $dom"
  535.          diff -c -i $nslists $nslistsaa
  536.        endif
  537.      endif
  538.   endif
  539. endif
  540.  
  541. #######################################################
  542. ##
  543. ##  Take union of lists of nameservers for the domain.
  544. ##
  545.  
  546. ###########################################
  547. ##
  548. ## Union of lists from (parent) servers --
  549. ##  those not also authoritative for domain.
  550.  
  551. foreach i ($nsdad)
  552.    cat $dom.ns.$i >> $dom.ns.dad
  553. end
  554. if (-e $dom.ns.dad) then
  555.    sort -u $dom.ns.dad > $dom.tmp
  556.    mv $dom.tmp $dom.ns.dad
  557.    set domserv=`cat $dom.ns.dad`
  558.    if ($dflag) echo "DEBUG: domserv = $domserv"
  559. else
  560.    set domserv=""
  561. endif
  562.  
  563. ####XX# 
  564. ##############################################
  565. ##
  566. ## Union of lists from (parent) servers --
  567. ##  those also authoritative for domain.
  568.  
  569. foreach i ($nsdadaa)
  570.    cat $dom.ns.$i >> $dom.ns.dadaa
  571. end
  572. if (-e $dom.ns.dadaa) then
  573.    sort -u $dom.ns.dadaa > $dom.tmp
  574.    mv $dom.tmp $dom.ns.dadaa
  575.    set domservaa=`cat $dom.ns.dadaa`
  576.    if ($dflag) echo "DEBUG: domservaa = $domservaa"
  577. else
  578.    set domservaa=""
  579. endif
  580.  
  581. #################################################
  582. ##
  583. ##  Look for nameservers (NS records) known by
  584. ##  non-authoritative but not by authoritative servers.
  585. ##
  586. ##  XXX: might want to find the other way also/instead
  587.  
  588. set domservdiff=""
  589. foreach i ($domserv)
  590.    set another=1
  591.    foreach j ($domservaa)
  592.       if ($i == $j) then
  593.          set another = 0
  594.          break
  595.       endif
  596.    end
  597.    if ($another) then
  598.       set domservdiff=($domservdiff $i)
  599.    endif
  600. end
  601.  
  602. ####XX# 
  603. ######################################################
  604. ##
  605. ## Look to make certain that parent servers that claim to be
  606. ## authoritative are listed among the NS records of a server.
  607. ## (Strangely enough, often they claim to be AUTH, but do
  608. ## not hold an NS record for themselves!!
  609. ##
  610. set domservall=($domservaa $domservdiff)
  611.  
  612. foreach i ($nsdadaa)
  613.    set another=1
  614.    foreach j ($domservall)
  615.       if ($i == $j) then
  616.          set another=0
  617.          break
  618.       endif
  619.    end
  620.    if ($another) then
  621.       @ ffwarn++
  622.       echo "WARNING: $i claims to be authoritative for $dom " >> log.$dom
  623.       echo "   == but no NS record at parent zone" >> log.$dom
  624.       if ($wflag) echo "WARNING: $i claims authoritative for $dom"
  625.       if ($wflag) echo "   == but no NS record at parent zone"
  626.       if ($ddflag) echo "DDBUG: 17"
  627.    endif
  628. end
  629.  
  630. skip3:
  631.  
  632. echo "NS list summary for $dom from parent ($dad) servers" >> log.$dom
  633. if ($vflag) echo "NS list summary for $dom from parent ($dad) servers"
  634.  
  635. if ($#domservall > 3) then
  636.    echo "  == $domservall[1-3]" >> log.$dom
  637.    if ($vflag) echo "  == $domservall[1-3]"
  638.  
  639.    if ($#domservall > 6) then
  640.       echo "  == $domservall[4-6]" >> log.$dom
  641.       echo "  == $domservall[7-]" >> log.$dom
  642.       if ($vflag) echo "  == $domservall[4-6]"
  643.       if ($vflag) echo "  == $domservall[7-]"
  644.    else
  645.       echo "  == $domservall[4-]" >> log.$dom
  646.       if ($vflag) echo "  == $domservall[4-]"
  647.    endif
  648. else
  649.    echo "  == $domservall" >> log.$dom
  650.    if ($vflag) echo "  == $domservall"
  651. endif
  652.  
  653.  
  654. ####XX# 
  655. #########################################################
  656. ##
  657. ## Check that SOA's from all NS (for domain) have same serial nos
  658. ## Keep list of nameservers that are authoritative and have
  659. ## exactly one SOA record.
  660.  
  661. set sns=""
  662. set aafile=""
  663. set aaserv=""
  664. set noaaserv=""
  665. set cnttwo=0
  666.  
  667. foreach i ($domservall)
  668.   if ($dflag) echo "digging @$i for soa of $dom"
  669.   if ($dflag) echo "digging @$i for soa of $dom" >> log.$dom
  670.  
  671.   dig @$i soa $dom +norec $RET +pfset=0xa224 | $tolower > $dom.soa.$i
  672.   set stat = $status
  673.   if ($stat != 0) then
  674.      set estr = $error[$stat]
  675.      echo "DIGERR ($estr): dig @$i for SOA of $dom failed" >> log.$dom
  676.      echo "DIGERR ($estr): dig @$i for SOA of $dom failed"
  677.      @ ffallone++
  678.      rm $dom.soa.$i
  679.      if ($ddflag) echo "DDBUG: 20"
  680.      continue
  681.   endif
  682.  
  683.   echo "## SOA record for $dom domain from nameserver $i" >> logXX.$dom
  684.   echo "" >> logXX.$dom
  685.   cat  $dom.soa.$i >> logXX.$dom
  686.   echo "===================" >> logXX.$dom
  687.   echo "" >> logXX.$dom
  688.  
  689.   set serial=`awk -f ${auxd}doc1.awk $dom.soa.$i`
  690.   set stat=$status
  691.   if ($vflag) echo "soa @$i for $dom serial: $serial"
  692.   echo "soa @$i for $dom serial: $serial" >> log.$dom
  693.  
  694. ####XX# 
  695.  
  696. ####################################################
  697. ##
  698. ## Check that answer is authoritative and that
  699. ## SOA record (one) was found.
  700. ##
  701.  
  702. ## fix for shells which return unsigned 8 bit exit codes
  703.   if ($stat > 127) then
  704.      @ stat = $stat - 256
  705.   endif
  706.  
  707.   if ($stat < 0) then
  708.      @ fferror++
  709.      set noaaserv = ($noaaserv $i)
  710.      echo "ERROR: non-authoritative SOA for $dom from $i" >> log.$dom
  711.      if ($eflag) echo "ERROR: non-authoritative SOA for $dom from $i"
  712.      if ($ddflag) echo "DDBUG: 21"
  713.   else if ($stat == 0) then
  714.      @ fferror++
  715.      echo "ERROR: no SOA record for $dom from $i" >> log.$dom
  716.      if ($eflag) echo "ERROR: no SOA record for $dom from $i"
  717.      if ($ddflag) echo "DDBUG: 22"
  718.   else
  719.     if ($stat > 1) then
  720.       @ ffwarn++
  721.       echo "WARNING: multiple SOA records found for $dom from $i" >> log.$dom
  722.       if ($wflag) echo "WARNING: multiple SOA records found for $dom from $i"
  723.       if ($ddflag) echo "DDBUG: 23"
  724.     endif
  725.  
  726. #############################################
  727. ##
  728. ## Check for multiple SOA serial numbers
  729. ##
  730.  
  731.     grep -v ";; flag" $dom.soa.$i | $tolower > tmp.$$
  732.     mv tmp.$$ $dom.soa.$i
  733.     set aafile = ($aafile $dom.soa.$i)
  734.     set aaserv = ($aaserv $i)
  735.     @ cnttwo++
  736.     set another=1
  737.     foreach j ($sns)
  738.       if ($serial == $j) then
  739.      set another=0
  740.          break
  741.       endif
  742.     end
  743.     if ($another) then
  744.          set sns=($sns $serial)
  745.     endif
  746.    endif   ### may need to be removed XXX
  747.   endif
  748. end    ## foreach
  749.  
  750. #####XX# 
  751. ############################################
  752. ##
  753. ## Note results about SOA serial numbers.
  754. ## If only one, check that entire SOA records are identical.
  755. ##
  756.  
  757. if ($#sns > 1) then
  758.    @ ffwarn++
  759.    echo "WARN: Found $#sns unique SOA serial #'s for $dom" >> log.$dom
  760.    if ($wflag) echo "WARN: Found $#sns unique SOA serial #'s for $dom"
  761.    if ($ddflag) echo "DDBUG: 24"
  762. else if ($sns != "") then
  763.    if ($cnttwo > 1) then
  764.       echo "SOA serial #'s agree for $dom" >> log.$dom
  765.       if ($vflag) echo "SOA serial #'s agree for $dom"
  766.       set ii = $#aafile
  767.       @   ij = $ii - 1
  768.      if ($ddflag) echo "DDBUG: 25"
  769.  
  770.       while ($ij)
  771.          diff $aafile[$ii] $aafile[$ij] >& /dev/null
  772.          if ($status) then
  773.             @ ffwarn++
  774. echo "WARN: SOA records differ for $dom from authoritative servers" >> log.$dom
  775. if ($wflag) echo "WARN: SOA records differ for $dom from authoritative servers"
  776.             if ($ddflag) echo "DDBUG: 26"
  777.             break
  778.          endif
  779.          @ ii--
  780.          @ ij--
  781.       end  # while
  782.  
  783.    endif
  784. else
  785.    echo "SYSerr: No servers for $dom returned SOAs ..." >> log.$dom
  786.    echo "SYSerr: No servers for $dom returned SOAs ..."
  787.    if ($ddflag) echo "DDBUG: 27"
  788.    goto dig4err1
  789. endif
  790.  
  791. #####XX# 
  792. ###################################################
  793. ##
  794. ## Query all authoritative nameservers returning SOA
  795. ## for NS records of domain.
  796.  
  797. set domnslists=""
  798. set cntthree=0
  799.  
  800. foreach i ($aaserv)
  801.   dig @$i ns $dom +norec $RET +pfset=0xa7e4 | $tolower >& $dom.raw.$i
  802.   set stat = $status
  803.   if ($stat != 0) then
  804.      set estr = $error[$stat]
  805.      echo "DIGERR ($estr): dig @$i for NS of $dom failed" >> log.$dom
  806.      echo "DIGERR ($estr): dig @$i for NS of $dom failed"
  807.      if ($ddflag) echo "DDBUG: 28"
  808.      @ ffalltwo++
  809.      rm $dom.raw.$i
  810.      continue
  811.   endif
  812.  
  813.   echo "## NS records for $dom domain from nameserver $i" >> logXX.$dom
  814.   echo "" >> logXX.$dom
  815.   cat  $dom.raw.$i >> logXX.$dom
  816.   echo "===================" >> logXX.$dom
  817.   echo "" >> logXX.$dom
  818.  
  819. ######################################################
  820. ##
  821. ## Examine response: get nameserver list, check TTLs
  822. ##  (glue or authoritative not used here)
  823.  
  824.   awk -f ${auxd}doc3.awk $dom.raw.$i | sort -u > $dom.ns.$i
  825.   set stat=$status
  826.  
  827. ## fix for shells which return unsigned 8 bit exit codes
  828.   if ($stat > 127) then
  829.      @ stat = $stat - 256
  830.   endif
  831.  
  832.   if ($stat < 0) then
  833.        set isaa = 1;
  834.        @ stat = $stat + 127;
  835.   else
  836.        set isaa = 0;
  837.   endif
  838.   @ glue = $stat % 16
  839.   @ ttls = $stat / 16
  840.  
  841.   if ($ttls > 1) then
  842.      @ fferror++
  843.      echo "ERROR: multiple TTLs found for $dom NS records @$i" >> log.$dom
  844.      if ($eflag) echo "ERROR: multiple TTLs found for $dom NS records @$i"
  845.      if ($ddflag) echo "DDBUG: 29"
  846.   endif
  847.  
  848. #####XX# 
  849. #############################################
  850. ##
  851. ## Look for conflicting sets of NS records.
  852. ##
  853.  
  854.   @ cntthree++
  855.   set another=1
  856.   foreach j ($domnslists)
  857.     diff -i $j $dom.ns.$i >& /dev/null
  858.         if ($status == 0) then
  859.        set another=0
  860.            break
  861.         endif
  862.   end
  863.   if ($another) then
  864.      cat $dom.ns.$i >> $dom.ns.all
  865.      set domnslists=($domnslists $dom.ns.$i)
  866.   endif
  867. end
  868.  
  869. sort -u $dom.ns.all > tmp.$$
  870. mv tmp.$$ $dom.ns.all
  871.  
  872. set bothagree=""
  873.  
  874. #######################################################
  875. #######################################################
  876. ##
  877. ## Do NS lists agree among authoritative servers??
  878. ##
  879.  
  880. if ($#domnslists > 1) then
  881.    @ fferror++
  882.    echo "ERROR: Found $#domnslists unique sets of NS records" >> log.$dom
  883.    echo "   === from authoritative domain ($dom) servers" >> log.$dom
  884.    if ($ddflag) echo "DDBUG: 30"
  885.    if ($eflag) then
  886.       echo "ERROR: Found $#domnslists unique sets of NS records"
  887.       echo "   === from authoritative domain ($dom) servers"
  888.    endif
  889. else if ($domnslists != "") then
  890.   if ($cntthree > 1) then
  891.     echo "Authoritative domain ($dom) servers agree on NS for $dom" >> log.$dom
  892.     if ($vflag) echo "Authoritative domain ($dom) servers agree on NS for $dom"
  893.     if ($ddflag) echo "DDBUG: 31"
  894.    endif
  895.  
  896. ####XX# 
  897. #######################################################
  898. ##
  899. ## If authoritative servers on NS records
  900. ##   recall which (if any) of parent servers agreed and
  901. ##   check for agreement between parent and child servers.
  902. ##
  903.  
  904.    if ($pflag) then
  905.       if ($nslists == "") then
  906.          set pnslist=$nslistsaa[1]
  907.       else
  908.          set pnslist=$nslists
  909.       endif
  910.       diff -i $pnslist $dom.ns.all > /dev/null
  911.     if ($status == 0) set bothagree = "first parent ($dad) nameserver queried"
  912.       goto skip4
  913.    endif
  914.  
  915.    if ($agree) then
  916.       diff -i $nslists $dom.ns.all > /dev/null
  917.       if ($status == 0) then
  918.          set bothagree="all parent ($dad) servers"
  919.          if ($ddflag) echo "DDBUG: 32"
  920.       endif
  921.    else if ($tmpcntone == 1) then
  922.          diff -i $nslistsaa $dom.ns.all > /dev/null
  923.          if ($status == 0) then
  924.             set bothagree="parent ($dad) servers also authoritative for $dom"
  925.             if ($ddflag) echo "DDBUG: 33"
  926.          else if ($tmpcnttwo == 1) then
  927.             diff -i $nslists $dom.ns.all > /dev/null
  928.             if ($status == 0) then
  929.               set bothagree="parent ($dad) servers not authoritative for $dom"
  930.               if ($ddflag) echo "DDBUG: 34"
  931.              endif
  932.          endif
  933.    else if ($tmpcnttwo == 1) then
  934.          diff -i $nslists $dom.ns.all > /dev/null
  935.          if ($status == 0) then
  936.             set bothagree="parent ($dad) servers not authoritative for $dom"
  937.             if ($ddflag) echo "DDBUG: 35"
  938.          endif
  939.    endif
  940. endif
  941.  
  942. ####XX# 
  943.  
  944. skip4:
  945.  
  946. if ("$bothagree" != "") then
  947.    echo "NS list from $dom authoritative servers matches list from" >> log.$dom
  948.    echo "  ===  $bothagree" >> log.$dom
  949.    if ($vflag) then
  950.       echo "NS list from $dom authoritative servers matches list from"
  951.       echo "  === $bothagree"
  952.    endif
  953. else
  954.    @ fferror++
  955.    echo "ERROR: NS list from $dom authoritative servers does not" >> log.$dom
  956.    echo "  === match NS list from parent ($dad) servers" >> log.$dom
  957.    if ($eflag) then
  958.       echo "ERROR: NS list from $dom authoritative servers does not"
  959.       echo "  === match NS list from parent ($dad) servers"
  960.    endif
  961.    if ($ddflag) echo "DDBUG: 36"
  962.  
  963.    set aanslist = `cat $dom.ns.all`
  964.    echo "NS list summary for $dom from authoritative servers" >> log.$dom
  965.    if ($vflag) echo "NS list summary for $dom from authoritative servers"
  966.  
  967.    if ($#aanslist > 3) then
  968.       echo "  == $aanslist[1-3]" >> log.$dom
  969.       if ($vflag) echo "  == $aanslist[1-3]"
  970.  
  971.       if ($#aanslist > 6) then
  972.          echo "  == $aanslist[4-6]" >> log.$dom
  973.          echo "  == $aanslist[7-]" >> log.$dom
  974.          if ($vflag) echo "  == $aanslist[4-6]"
  975.          if ($vflag) echo "  == $aanslist[7-]"
  976.       else
  977.          echo "  == $aanslist[4-]" >> log.$dom
  978.          if ($vflag) echo "  == $aanslist[4-]"
  979.       endif
  980.    else
  981.       echo "  == $aanslist" >> log.$dom
  982.       if ($vflag) echo "  == $aanslist"
  983.    endif
  984. endif
  985.  
  986. ####XX# 
  987. ##################################################
  988. ##
  989. ## Check that all servers that claim to be authoritative
  990. ## have NS record at other AUTH servers
  991. ##
  992.  
  993. set domnsall=`cat $dom.ns.all`
  994.  
  995. foreach i ($aaserv)
  996.   set missing=1
  997.   foreach j ($domnsall)
  998.     if ($i == $j) then
  999.       set missing=0
  1000.       break
  1001.     endif
  1002.    end
  1003.   if ($missing) then
  1004.      @ fferror++
  1005.      echo -n "ERROR: " >> log.$dom
  1006.      echo "$i claims to be authoritative, but does not appear in" >> log.$dom
  1007.      echo "NS list from authoritative servers" >> log.$dom
  1008.      if ($eflag) then
  1009.         echo -n "ERROR: "
  1010.         echo "$i claims to be authoritative, but does not appear in"
  1011.         echo "NS list from authoritative servers"
  1012.      endif
  1013.      if ($ddflag) echo "DDBUG: 37"
  1014.   endif
  1015. end
  1016.  
  1017. #####################################################
  1018. ##
  1019. ## Determine list of addresses of nameservers for domain
  1020. ## which are also in the domain (currently only one per internet
  1021. ## network is tested).
  1022. ##
  1023. ## Ask for in-addr.arpa. PTR to see if reverse mappings
  1024. ## are set up correctly.
  1025.  
  1026. set netaddr = `cat $dom.raw.* | awk -f ${auxd}doc4.awk`
  1027. echo "Checking $#netaddr potential addresses for hosts at $dom" >> log.$dom
  1028. if ($vflag) echo "Checking $#netaddr potential addresses for hosts at $dom"
  1029. if ($#netaddr > 4) then
  1030.    echo "  == $netaddr[1-4]" >> log.$dom
  1031.    echo "  == $netaddr[5-]" >> log.$dom
  1032.    if ($vflag) then
  1033.       echo "  == $netaddr[1-4]"
  1034.       echo "  == $netaddr[5-]"
  1035.     endif
  1036. else
  1037.     echo "  == $netaddr" >> log.$dom
  1038.     if ($vflag) echo "  == $netaddr"
  1039. endif
  1040.  
  1041. ####XX# 
  1042.  
  1043.  
  1044. echo "### Queries for nameserver address in-addr.arpa. records" >> logXX.$dom
  1045. echo "" >> logXX.$dom
  1046.  
  1047. foreach i ($netaddr)
  1048.    dig +pfset=0x2738 -x $i >>& logXX.$dom
  1049.    set stat = $status
  1050.    if ($stat == 0) then
  1051.       echo "in-addr PTR record found for $i" >> log.$dom
  1052.       if ($vflag) echo "in-addr PTR record found for $i"
  1053.    else if ($stat == 3) then
  1054.       echo "ERROR: no in-addr PTR recorder found for $i" >> log.$dom
  1055.       if ($eflag) echo "ERROR: no in-addr PTR recorder found for $i"
  1056.       @ fferror++
  1057.       if ($ddflag) echo "DDBUG: 38"
  1058.    else
  1059.       set estr = $error[$stat]
  1060.       echo "DIGERR ($estr): dig for $i in-addr PTR failed" >> log.$dom
  1061.       echo "DIGERR ($estr): dig for $i in-addr PTR failed"
  1062.       @ ffalltwo++
  1063.       if ($ddflag) echo "DDBUG: 39"
  1064.    endif
  1065. end
  1066.  
  1067. goto around
  1068.  
  1069. dig1err1:
  1070. dig1err2:
  1071. dig2err1:
  1072. dig4err1:
  1073. @ ffallone++
  1074. set aborted=1
  1075.  
  1076. ####XX# 
  1077.  
  1078. around:
  1079.  
  1080. (rm $dom.* &) >& /dev/null
  1081. set isok=1
  1082. echo "Summary:" >> log.$dom
  1083. echo "Summary:"
  1084. if ($aborted) then
  1085.    echo "   YIKES: doc aborted while testing $dom  parent $dad" >> log.$dom
  1086.    echo "   YIKES: doc aborted while testing $dom  parent $dad"
  1087.    set isok=0
  1088. endif
  1089. if ($fferror) then
  1090.    echo "   ERRORS found for $dom (count: $fferror)" >> log.$dom
  1091.    echo "   ERRORS found for $dom (count: $fferror)"
  1092.    set isok=0
  1093. endif
  1094. if ($ffwarn) then
  1095.    echo "   WARNINGS issued for $dom (count: $ffwarn)" >> log.$dom
  1096.    echo "   WARNINGS issued for $dom (count: $ffwarn)"
  1097.    set isok=0
  1098. endif
  1099. if ($isok) then
  1100.    echo "   No errors or warnings issued for $dom" >> log.$dom
  1101.    echo "   No errors or warnings issued for $dom"
  1102. endif
  1103. @ ffall = $ffallone + $ffalltwo
  1104. if ( $ffallone | $ffalltwo ) then
  1105.    echo "   Incomplete test for $dom ($ffall)" >> log.$dom
  1106.    echo "   Incomplete test for $dom ($ffall)"
  1107. endif
  1108.  
  1109. echo "Done testing $dom  `date`" >> log.$dom
  1110. echo "" >> log.$dom
  1111. echo "Done testing $dom  `date`"
  1112. echo ""
  1113.  
  1114. cat logXX.$dom >> log.$dom
  1115. rm logXX.$dom
  1116.  
  1117. exit 0
  1118.  
  1119. show:
  1120. echo "Usage:  doc [-e][-w][-v][-d] domain_name [parent_domain_name]"
  1121. echo " Note:  You must have DiG Version-2.0 for this program to run."
  1122. exit 9
  1123.  
  1124. cleanup:
  1125.  
  1126. (rm $dom.* &) >& /dev/null
  1127.  
  1128. if ( -e log.$dom ) then
  1129.   if ( -e logXX.$dom ) then
  1130.      cat logXX.$dom >> log.$dom
  1131.      rm logXX.$dom
  1132.   endif
  1133.   echo "Doc interrupted - partial logfile: log.$dom exists."
  1134. endif
  1135.  
  1136. ####XX#
  1137.