#!/bin/sh

# Tries to download a DNS zone file by testing one after the other all
# its authoritative name servers.

# Where to put the downloaded zone
if [ -d $HOME/System/DNS/zonefiles ]; then
    use_date=1
    basedir=$HOME/System/DNS/zonefiles 
else
    use_date=0
    basedir=$HOME/tmp
fi

if [ -z "$1" ]; then
   echo "Usage: $0 zone" >&2
   exit 1
fi

zone=$1
nameservers=`dig +short NS ${zone}.` 
if [ -z "$nameservers" ]; then
    echo "Unknown zone $zone or DNS resolution not working" >&2
    exit 1
fi
tmp=`mktemp /tmp/.try-get-zone.XXXXXXXXXX`
for ns in $nameservers; do
    dig @${ns} AXFR ${zone}. > $tmp 2>&1
    # Testing the return code is useless, dig always return zero :-(
    if ! egrep "Transfer failed|connection timed out|Name or service not known|connection refused|network unreachable|host unreachable|end of file|communications error|couldn't get address" $tmp > /dev/null; then 
	if [ $use_date = 1 ]; then
	    filename=${basedir}/${zone}-$(date +%Y-%m-%d).db
        else
	    filename=${basedir}/${zone}.db
        fi
	if [ -e $filename ]; then
	    echo "$filename already exists, leaving zone in $tmp" >&2
	    exit 1
	fi
	mv $tmp $filename
	echo "Got $zone from $ns, saved in $filename"
	exit 0
    fi
done
echo "No willing nameservers from which to transfer $zone" >&2
exit 2

