165 lines
3.4 KiB
Bash
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
|