#!/bin/sh
#
# Build zone containing blackholed addresses. Uses Christian Rignoni's
# DNS zone templates.
#
# Boyd Roberts
# November 1997
#
myname="`basename \"$0\"`"
RBL=rbl.maps.france3.fr # blackhole domain name
ADDR=127.0.0.2 # address attributed to a blackholed 'host'
LIST=rbl.list # list of blackholed addresses
# Configation files
BOOT=/etc/named.boot
RCONF=/etc/resolv.conf
# File extensions
SOA=soa
HOSTS=hosts
HOSTNAMES=hostnames
# Templates
MODELE=modele
# Determine current domain
DOM="`awk \"\\$1 == \\"domain\\" {
print \\$2
exit
}\" \"$RCONF\""
case "$DOM" in
'')
echo "$myname: Could not find 'domain' in '$RCONF'." 1>&2
exit 1
;;
esac
# Determine configuration directory
DIR="`awk \"\\$1 == \\"directory\\" {
print \\$2
exit
}\" \"$BOOT\""
case "$DIR" in
'')
echo "$myname: Could not find 'directory' in '$BOOT'." 1>&2
exit 1
;;
esac
# Determine zone file for domain
FILE="`awk \"\\$1 == \\"primary\\" && \\$2 == \\"$RBL\\" {
print \\$3
exit
}\" \"$BOOT\""
case "$FILE" in
'')
echo "$myname: Could not find primary for $RBL in '$BOOT'." 1>&2
exit 1
;;
esac
# Check the list exists
if [ ! -r "$DIR/$LIST" ]
then
echo "$myname: Realtime Blackhole List '$DIR/$LIST' missing." 1>&2
exit 1
fi
# Determine hostname
UNAME="`(uname -n || hostname) | sed 's/\..*$//'`"
case "$UNAME" in
'')
echo "$myname: Could not determine hostname." 1>&2
exit 1
;;
esac
# Build $FILE
f="$DIR/$FILE"
if [ ! -s "$f" ]
then
m="$DIR/$MODELE.$HOSTS"
sed -e "s/ZONE/$RBL/g" "$m" > "$f" || exit 1
fi
ZONE_A="$RBL"
# Construct Start Of Authority
f="$DIR/$RBL.$SOA"
if [ ! -s "$f" ]
then
m="$DIR/$MODELE.$SOA"
sed -e "s/UNAME.ZONE_A/$UNAME.$DOM/g" -e "s/ZONE_A/$ZONE_A/g" "$m" > "$f" || exit 1
fi
# Build host list
#
# Comments after the address are appended as comments in the zone file.
awk '
$0 ~ /^;/ { next }
$1 !~ /[0-9]+.[0-9]+.[0-9]+.[0-9]+/ { next }
{
split($1, a, ".")
print a[4] "." a[3] "." a[2] "." a[1] "\tIN\tA\t" addr "\t; " $0
}
' addr="$ADDR" "$DIR/$LIST" > "$DIR/$RBL.$HOSTNAMES" || exit 1
# Update serial number
serial="`awk '$0 ~ /;[ ]*serial/ { print $1 }' \"$DIR/$RBL.$SOA\"`"
case "$serial" in
00000001)
n=0
;;
*)
n="`expr \"$serial\" : '......\\(..\\)'`"
;;
esac
day="`date '+%y%m%d'`"
n="`awk 'END { printf("%02d\n", n + 1)}' n=\"$n\" /dev/null`"
ed - "$DIR/$RBL.$SOA" <<! && exit 0
/;[ ]*serial/s/$serial/$day$n/
w
q
!
echo "$myname: Could not modify serial number of '$DIR/$RBL.$SOA'." 1>&2
exit 1
© 1998,
Boyd Roberts:
boyd@fr.inter.net