2021-01-04 20:53:39 +01:00
|
|
|
#!/bin/sh
|
|
|
|
|
|
|
|
. ./dns-functions.sh
|
|
|
|
|
|
|
|
ReverseDomain="$1"
|
|
|
|
ReverseZone="${ReverseDomain%*.}"
|
|
|
|
ForwardZones="$2"
|
2021-01-21 19:21:25 +01:00
|
|
|
ReverseZoneFile="$3"
|
2021-01-04 20:53:39 +01:00
|
|
|
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
|
|
|
|
|
2021-01-21 19:21:25 +01:00
|
|
|
sed -ne "s/^\s*\(\S\+\)\s\+\([0-9]*\s\)\?\s*[Ii][Nn]\s\+""$IPPattern"".*/\1\/\3/p" "$1"
|
2021-01-04 20:53:39 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
ReverseEntry() {
|
|
|
|
if [ -z "$RZoneIsIPv6" ]; then
|
2021-01-15 17:20:50 +01:00
|
|
|
GetReverseDomains "$1""/32"
|
2021-01-04 20:53:39 +01:00
|
|
|
else
|
2021-01-15 17:20:50 +01:00
|
|
|
GetReverseDomains "$1""/128"
|
2021-01-04 20:53:39 +01:00
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
|
|
|
if [ -z "${ReverseDomain##*.in-addr.arpa.}" ]; then
|
|
|
|
RZoneIsIPv6=""
|
|
|
|
elif [ -z "${ReverseDomain##*.ip6.arpa.}" ]; then
|
|
|
|
RZoneIsIPv6=1
|
|
|
|
else
|
2021-01-19 17:49:06 +01:00
|
|
|
TraceErrAndExit "$ReverseDomain"" is no valid reverse domain"
|
2021-01-04 20:53:39 +01:00
|
|
|
fi
|
|
|
|
|
|
|
|
mkdir -p "$TempDir"
|
|
|
|
|
|
|
|
for ForwardZone in $ForwardZones; do
|
|
|
|
ZoneFile="${ForwardZone#*/}"
|
2021-01-21 19:21:25 +01:00
|
|
|
Serial="$(GetZoneFileSerial "$ZoneFile")"
|
2021-01-04 20:53:39 +01:00
|
|
|
NewReverseSerial=$((Serial + NewReverseSerial))
|
|
|
|
done
|
|
|
|
|
2021-01-19 17:49:06 +01:00
|
|
|
OldSerial="$(GetZoneFileSerial "$ReverseZoneFile")"
|
2021-01-04 20:53:39 +01:00
|
|
|
|
2021-01-19 17:49:06 +01:00
|
|
|
if [ $((NewReverseSerial)) -gt $((OldSerial)) ]; then
|
|
|
|
{
|
|
|
|
echo "$ReverseDomain $TTL IN SOA $DNSSCRIPT_SERVER_NAME""."" $DNSSCRIPT_CONTACT_EMAIL $NewReverseSerial $ReReExMi"
|
|
|
|
echo "$ReverseDomain $TTL IN NS $DNSSCRIPT_SERVER_NAME""."""
|
2021-01-21 19:21:25 +01:00
|
|
|
Static="/""$ReverseZoneFile"
|
|
|
|
Static="${Static%/*}""/static.""${Static##*/}"
|
|
|
|
Static="${Static#*/}"
|
2021-01-23 23:37:49 +01:00
|
|
|
[ -f "$Static" ] && echo "$(cat "$Static")"
|
2021-01-21 19:21:25 +01:00
|
|
|
echo
|
2021-01-19 17:49:06 +01:00
|
|
|
} > "$TempDir/$ReverseZone"
|
2021-01-04 20:53:39 +01:00
|
|
|
|
2021-01-21 19:21:25 +01:00
|
|
|
for ForwardZone in $ForwardZones; do
|
|
|
|
ZoneName="${ForwardZone%%/*}"
|
|
|
|
ZoneFile="${ForwardZone#*/}"
|
|
|
|
ZoneRevNSSubnets="$(sed -ne 's/^\s*\S\+\s\+\([0-9]*\s\)\?\s*[Ii][Nn]\s\+[Nn][Ss]\s\+\(\S\+\).*;\s*Subnets:\s*\([^;]*\)\s*\(;[^;]*\s*\)$/\2@\3/p' "$ZoneFile" |
|
|
|
|
sed -e 's/\(.*[^\.]\)@/\1\.'"$ZoneName"'\.@/;s/@/ /;s/\s\+/@/g')"
|
|
|
|
for NSSubnets in $ZoneRevNSSubnets; do
|
|
|
|
Subnets="$(echo "${NSSubnets#*@}" | sed -e 's/@/ /g')"
|
|
|
|
for Subnet in $Subnets; do
|
|
|
|
for ReverseNS in $(GetReverseDomains "$Subnet"); do
|
|
|
|
if [ -n "$ReverseNS" ] && [ -z "${ReverseNS##*$ReverseDomain}" ]; then
|
|
|
|
echo "$ReverseNS $TTL IN NS ${NSSubnets%%@*}" >> "$TempDir/$ReverseZone"
|
|
|
|
fi
|
|
|
|
done
|
2021-01-14 23:50:36 +01:00
|
|
|
done
|
2021-01-04 20:53:39 +01:00
|
|
|
done
|
2021-01-21 19:21:25 +01:00
|
|
|
|
|
|
|
IPEntries="$(GetIPEntries "$ZoneFile")"
|
2021-01-04 20:53:39 +01:00
|
|
|
|
|
|
|
for IPEntry in $IPEntries; do
|
|
|
|
IP="${IPEntry#*/}"
|
2021-01-14 20:46:10 +01:00
|
|
|
IP="$(ReverseEntry "$IP")"
|
2021-01-04 20:53:39 +01:00
|
|
|
if [ -z "${IP##*$ReverseDomain}" ]; then
|
2021-01-21 19:21:25 +01:00
|
|
|
Host="$(ExpandHostname "${IPEntry%%/*}" "$ZoneName"".")"
|
2021-01-04 20:53:39 +01:00
|
|
|
echo "$IP $TTL IN PTR $Host" >> "$TempDir/$ReverseZone"
|
|
|
|
fi
|
|
|
|
done
|
|
|
|
done
|
|
|
|
|
2021-01-19 17:49:06 +01:00
|
|
|
named-checkzone -o "$ReverseZoneFile" "$ReverseDomain" "$TempDir/$ReverseZone" >/dev/null
|
2021-01-04 20:53:39 +01:00
|
|
|
ReloadZone "$ReverseDomain" "$View"
|
|
|
|
fi
|
|
|
|
|
2021-01-21 19:21:25 +01:00
|
|
|
rm -r "$TempDir"
|