dns-scripts/update-rdnszone.sh

94 lines
2.9 KiB
Bash

#!/bin/sh
. ./dns-functions.sh
ReverseDomain="$1"
ReverseZone="${ReverseDomain%*.}"
ForwardZones="$2"
ReverseZoneFile="$3"
TempDir="/tmp/""$ReverseZone"
TTL="${4%% *}"
ReReExMi="${4#* }"
View="$5"
GetIPEntries() {
if [ -z "$RZoneIsIPv6" ]; then
IPPattern="[aA]\s\+\([0-9\.]\+\)"
else
IPPattern="[aA]\{4\}\s\+\([0-9a-f:]\+\)"
fi
sed -ne "s/^\s*\(\S\+\)\s\+\([0-9]*\s\)\?\s*IN\s\+""$IPPattern"".*/\1\/\3/p" "$TempDir/$ForwardZoneFile"
}
ReverseEntry() {
if [ -z "$RZoneIsIPv6" ]; then
echo "$(echo "$1" | awk 'BEGIN { FS = "." } ; { print $4 "." $3 "." $2 "." $1 }')"".in-addr.arpa."
else
echo "$(echo "$1" | \
awk -F: 'BEGIN {OFS=""}{ FillCount=9-NF; for(i=1;i<=NF;i++){if(length($i) == 0){if(i==NF) {$i="0000";} else {for(j=1;j<=FillCount;j++){$i=($i "0000");}}} else {$i=substr(("0000" $i), length($i)+1);}}; print}' | \
awk '{ i=length; x=substr($0,i,1); for(i--;i!=0;i--)x=x "." substr($0,i,1);}END{print x}')"".ip6.arpa."
fi
}
if [ -z "${ReverseDomain##*.in-addr.arpa.}" ]; then
RZoneIsIPv6=""
elif [ -z "${ReverseDomain##*.ip6.arpa.}" ]; then
RZoneIsIPv6=1
else
echo "No valid ReverseDomain" 1>&2
exit 1
fi
mkdir -p "$TempDir"
for ForwardZone in $ForwardZones; do
ZoneName="${ForwardZone%%/*}"
ZoneFile="${ForwardZone#*/}"
named-checkzone -f text -i local -o "$TempDir/$ZoneName" -D "$ZoneName" "$ZoneFile" >/dev/null 2>&1
Serial="$(GetZoneFileSerial "$TempDir/$ZoneName")"
NewReverseSerial=$((Serial + NewReverseSerial))
ZoneRevNS="$(sed -ne 's/^\s*\S\+\s\+\([0-9]*\s\)\?\s*IN\s\+NS\s\+\(\S\+\)\s*.*;\s*Reverse:\s*\([^;]*\)$/\2\/\3/p' "$ZoneFile")"
ZoneRevNS="$(echo "$ZoneRevNS" | sed -e 's/\(.*[^\.]\)\//\1\.'"$ZoneName"'\.\//' )"
SubNSEntries="$SubNSEntries""$ZoneRevNS"
done
if [ -f "$ReverseZoneFile" ]; then
OldSerial=$(GetZoneFileSerial "$ReverseZoneFile")
else
OldSerial=0
fi
if [ $NewReverseSerial -gt $OldSerial ]; then
echo "$ReverseDomain $TTL IN SOA $DNSSCRIPT_SERVER_NAME $DNSSCRIPT_CONTACT_EMAIL $NewReverseSerial $ReReExMi" > "$TempDir/$ReverseZone"
echo "$ReverseDomain $TTL IN NS $DNSSCRIPT_SERVER_NAME" >> "$TempDir/$ReverseZone"
echo "$SubNSEntries" | while read -r SubNSEntry; do
for SubReverseDomain in ${SubNSEntry#*/}; do
if [ -n "$SubReverseDomain" ] && [ -z "${SubReverseDomain##*$ReverseDomain}" ]; then
echo "$SubReverseDomain $TTL IN NS ${SubNSEntry%/*}" >> "$TempDir/$ReverseZone"
fi
done
done
for ForwardZoneFile in $(ls $TempDir); do
IPEntries="$(GetIPEntries)"
for IPEntry in $IPEntries; do
IP="${IPEntry#*/}"
# Gültigkeit der IP-Adressen named-checkzone bereits geprüft
IP=$(ReverseEntry "$IP")
if [ -z "${IP##*$ReverseDomain}" ]; then
Host="${IPEntry%/*}"
echo "$IP $TTL IN PTR $Host" >> "$TempDir/$ReverseZone"
fi
done
done
named-checkzone -o "$ReverseZoneFile" "$ReverseDomain" "$TempDir/$ReverseZone" >/dev/null 2>&1
ReloadZone "$ReverseDomain" "$View"
fi
rm -r "$TempDir"