NetBSD/usr.sbin/named/host/mxlookup

165 lines
3.4 KiB
Bash

#!/bin/sh -
# $NetBSD: mxlookup,v 1.2 1997/04/13 10:50:32 mrg Exp $
#
# @(#)mxlookup e07@nikhef.nl (Eric Wassenaar) 950108
#
# Author: E.Wassenaar, Nikhef-H
# Version: 09-OCT-1994
# Revision: 08-JAN-1995, Make sure servers come from NS records
#
# This utility looks up the MX and A records for a given domain name
# at each of the authoritative servers for the zone it belongs to.
# The printout shows whether or not the servers have the same notion.
# Too often mail is bounced with a "No address or MX record" message
# whereas the mail address is perfectly valid. Usually this happens
# when one of the servers turns out to be misconfigured and the data
# was retrieved unfortunately from just that server.
#
# With the -t option you can verify resource records of another type
# at each of the servers. The -v option shows the SOA record and the
# NS records of the zone to which the given domain name belongs.
# The -r option disables nameserver recursion at the contacted servers.
exec=echo
exec=
# ----------------------------------------------------------------------
# Setup environment.
# ----------------------------------------------------------------------
# This is where the ``host'' executable lives.
BINDIR=/usr/local/bin
PATH=${BINDIR}:/bin:/usr/bin:/usr/ucb ; export PATH
cmd=`basename $0`
options="[-v] [-r] [-t type]"
usage="Usage: $cmd $options name"
# ----------------------------------------------------------------------
# Exit codes from <sysexits.h>
# ----------------------------------------------------------------------
EX_OK=0
EX_USAGE=64
EX_UNAVAILABLE=69
# ----------------------------------------------------------------------
# Process options.
# ----------------------------------------------------------------------
type=""
recurse=
verbose=
skip=
for i
do
if [ $skip ]
then
skip=
continue
fi
case "$i" in
-t)
case "$2" in
""|-*) echo "$usage" 1>&2 ; exit $EX_USAGE
esac
type="$2"
skip=true
shift
;;
-r)
recurse="-r"
;;
-d)
exec=echo
;;
-v)
verbose=true
;;
-*)
echo "$cmd: Unknown option $i" 1>&2 ; exit $EX_USAGE
;;
*)
break
;;
esac
shift
done
# ----------------------------------------------------------------------
# Process arguments.
# ----------------------------------------------------------------------
name="$1"
if [ "X$name" = "X" ]
then
echo "$usage" 1>&2 ; exit $EX_USAGE
fi
# Remove trailing dots.
name=`echo $name | sed 's/\.*$//'`
# ----------------------------------------------------------------------
# Main loop.
# ----------------------------------------------------------------------
domain="$name"
while [ "X$domain" != "X" ]
do
# Make sure there is at least one dot.
parentdomain=`echo $domain | sed 's/^[^.]*\.//'`
if [ "X$parentdomain" = "X$domain" ]
then
domain=""
continue
fi
# Find the servers for this domain.
servers=`host -t NS "$domain" | awk '$2 == "NS" {print $3}'`
if [ "X$servers" = "X" ]
then
# Move to parent domain and retry.
domain="$parentdomain"
continue
fi
if [ "X$domain" != "X$name" ]
then
echo
fi
if [ $verbose ]
then
echo "--- $domain ---"
$exec host -T -t SOA "$domain"
$exec host -T -t NS "$domain"
echo
fi
for server in $servers
do
echo "--- $server ---"
if [ "X$type" = "X" ]
then
$exec host $recurse -T -t MX "$name" "$server"
$exec host $recurse -T -t A "$name" "$server"
else
$exec host $recurse -T -t "$type" "$name" "$server"
fi
echo
done
exit $EX_OK
done
exit $EX_UNAVAILABLE