#!/bin/sh # ------------------------------------------------------------- # Copyright (c) 1991 Regents of the University of Michigan. # All rights reserved. # # Redistribution and use is permitted provided that this notice # is preserved and that due credit is given to the University of # Michigan. The name of the University may not be used to endorse # or promote products derived from this software without specific # prior written permission. This software is provided "as is" # without express or implied warranty. # ------------------------------------------------------------- RECURSE=0 DEBUG=0 XFER=/etc/named-xfer QUERY=/usr/local/bin/query # ------------------------------------------------------------- # Do args # -R Recursive. Grab all zones below give zone too. # -d Debug. Print handy debugging info. # ------------------------------------------------------------- if [ $# = 0 ] ; then echo "Usage: [-R] [-d] zone" exit -1 fi while [ $# != 1 ] ; do case "$1" in -R) RECURSE=1 ;; -d) DEBUG=1 ;; -?) echo Illegal arg $1 exit -1 ;; esac shift done ZONELIST=$1 while [ 1 ] ; do #---------------------------------------------------- # Loop through the list of zones #---------------------------------------------------- DONE=1 for ZONE in $ZONELIST ; do #---------------------------------------------------- # Get the addr of the zone's nameservers #---------------------------------------------------- $QUERY -t NS -h $ZONE > /tmp/zt.$$ 2> /dev/null if [ $? -ne 0 ] ; then echo Zone $zone unknown or nameserver unavailable exit -1 fi NSLIST=`cat /tmp/zt.$$ | awk '/address/ { print $4 }'` #---------------------------------------------------- # Use named-xfer to bring over a copy of the zone # Use 0 as the serial # since will likely be less # than the current serial number in the SOA #---------------------------------------------------- for I in $NSLIST ; do if [ $DEBUG = 1 ] ; then echo Trying nameserver at address $I fi $XFER -z $ZONE -f /tmp/$ZONE.$$ -s 0 $I if [ $? = 1 ] ; then grep -v ";" /tmp/$ZONE.$$ | awk '{ if ($1 == "$ORIGIN") { origin=$2 if (origin != old) { old = origin print $0 } } else print $0 }' >> /tmp/zt.out.$$ if [ $DEBUG = 1 ] ; then echo Got zone $ZONE fi break elif [ $DEBUG = 1 ] ; then echo Nameserver $I for $ZONE not working fi done rm -f /tmp/zt.$$ #---------------------------------------------------- # If we're doing a recursive query, capture the NS # records to build a new ZONELIST of subdomains #---------------------------------------------------- SUBZONES="" if [ $RECURSE = 1 -a -s /tmp/$ZONE.$$ ] ; then awk '{ if ($1 == "$ORIGIN") origin = substr($2, 1, length($2) - 1) else if ($3 == "NS") { sub = $1 "." origin if (sub != zone) print sub } }' zone=$ZONE /tmp/$ZONE.$$ > /tmp/zl.$$ if [ -s /tmp/zl.$$ ] ; then SUBZONES=`echo $SUBZONES ; sort -u /tmp/zl.$$` DONE=0 fi rm -f /tmp/zl.$$ fi rm -f /tmp/$ZONE.$$ done #---------------------------------------------------- # If we weren't recursive, or we were recursive and # have run out of subdomains, we're done #---------------------------------------------------- if [ $DONE = 1 ] ; then if [ -s /tmp/zt.out.$$ ] ; then cat /tmp/zt.out.$$ else echo "Could not perform a zone transfer of $1" fi rm -f /tmp/zt.out.$$ exit 0 else ZONELIST=$SUBZONES fi done exit 0