dns-scripts/10-50-reverse.sh

82 lines
2.4 KiB
Bash
Executable File

#!/bin/sh
DomainZone="50.10.in-addr.arpa."
ForwardZoneFiles="/srv/fff-dns/db.fff.community"
ReverseZoneFile="/var/lib/bind/db.50.10"
#Temporäres Verzeichnis - muss pro Zone exclusiv sein!
TempDir="/tmp/50.10.in-addr.arpa"
TTL=3600
refresh=2000
retry=6400
expire=2419200
minimum=86400
ContactEMail=franken.freifunk.net.
ReverseServerName=aquarius.gw.fff.community.
#################################################################
function GetZoneFileSerial() {
local INSOAPrefix="^\s*\S\+\s\+\([0-9]*\s\)\?\s*IN\s\+SOA\s\+"
local FirstSOALineAndFollowing="/""$INSOAPrefix""/,\$!d;"
local RemoveComments=":a;s/;.*$//g;"
local RemoveLineBreaks=":a;N;\$!ba;s/\n//g;"
local SearchPrintSerial="s/""$INSOAPrefix""\S\+\s\+\S\+\s\+\((\s\)\?\s*\([0-9]*\).*/\3/i"
local Serial=$(sed -e "$FirstSOALineAndFollowing""$RemoveComments""$RemoveLineBreaks""$SearchPrintSerial" "$1")
echo "$Serial"
}
function DNSReload {
if [[ -n "$Usernc" ]]; then
rndc reload "$DomainZone" IN "icvpn-internal-view"
else
systemctl reload bind9
fi
}
function ValidateIPv4() {
[[ -n "$(echo "$1" | sed -e '/^\(\(25[0-5]\|\(2[0-4]\|1[0-9]\|[1-9]\)\?[0-9]\)\.\)\{0,3\}\(25[0-5]\|\(2[0-4]\|1[0-9]\|[1-9]\)\?[0-9]\)$/!d')" ]]
return $?
}
mkdir -p $TempDir
for ForwardZoneFile in $ForwardZoneFiles
do
ZoneName="$DomainZone" #$(sed -ne 's/\(\S\+\)\s\+IN\s\+SOA\s\+\S\+.*/\1/p' "$ForwardZoneFile")
named-checkzone -o "$TempDir/$ZoneName" -D $ZoneName $ForwardZoneFile >/dev/null 2>&1
Serial=$(GetZoneFileSerial "$TempDir/$ZoneName")
NewSerial=$((Serial+NewSerial))
done
echo "$DomainZone $TTL IN SOA $ReverseServerName $ContactEMail $NewSerial $refresh $retry $expire $minimum" > "$TempDir/$DomainZone"
echo "$DomainZone $TTL IN NS $ReverseServerName" >> "$TempDir/$DomainZone"
for ForwardZoneFile in $(ls $TempDir)
do
Hosts=($(cat "$TempDir/$ForwardZoneFile" | grep -v SOA | awk '{ print $1 }'))
IPs=$(cat "$TempDir/$ForwardZoneFile" | grep -v SOA | awk '{ print $5 }')
i=0
for IP in $IPs
do
if ValidateIPv4 $IP
then
echo $(echo $IP | awk 'BEGIN { FS = "." } ; { print $4 "." $3 "." $2 "." $1 }')".in-addr.arpa." $TTL IN PTR ${Hosts[$i]} >> "$TempDir/$DomainZone"
fi
i=$((i+1))
done
done
if [[ -f $ReverseZoneFile ]]; then
OldSerial="$(GetZoneFileSerial '$ReverseZoneFile')"
else
OldSerial=0
fi
if [[ $NewSerial -gt $OldSerial ]]
then
named-compilezone -o $ReverseZoneFile $DomainZone "$TempDir/$DomainZone" >/dev/null 2>&1
DNSReload
fi
rm -r $TempDir