#!/bin/sh . ./dns-functions.sh ReverseDomain="$1" ReverseZone="${ReverseDomain%*.}" ForwardZones="$2" ReverseZoneFile="$3""db.""$(echo "$ReverseZone" | awk -F. '{ printf $(NF-2);for(i=NF-3;i>0;--i) printf "."$i}')" 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*[Ii][Nn]\s\+""$IPPattern"".*/\1\/\3/p" "$TempDir/$ForwardZoneFile" } ReverseEntry() { if [ -z "$RZoneIsIPv6" ]; then echo "$(GetReverseDomains "$1""/32")" else echo "$(GetReverseDomains "$1""/128")" 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*[Ii][Nn]\s\+[Nn][Ss]\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#*/}" # IP syntax checked by named-checkzone 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"