#!/bin/sh # SPDX-License-Identifier: GPL-3.0 # # freifunk-franken dns-scipts (c) 2021-2023 Blackyfff SetupCache() { mkdir -p "$DNSSCRIPT_TEMP_FOLDER""cache" for IView in $InternalViews; do rm -f "$DNSSCRIPT_TEMP_FOLDER""$IView"".conf" done rm -f "$DNSSCRIPT_TEMP_FOLDER""$ExternalView"".conf" } GetMasterFile() { curl -s -S -f "$RemoteLocation""db.""$MasterDomain" --output "$CachedMasterFile" && \ [ -f "$CachedMasterFile" ] && \ { echo "" echo "_dnsscript_version IN TXT ""$DNSSCRIPT_VERSION" | NormalizeZoneFileFormatting } >> "$CachedMasterFile" || : if [ ! -f "$CachedMasterFile" ]; then cp -f "$ZoneFilesFolder""db.""$FirstInternalView"".""$MasterDomain" "$CachedMasterFile" sed -i -e '/^_dnsscript_version.*/,$d' "$CachedMasterFile" echo "_dnsscript_version IN TXT ""$DNSSCRIPT_VERSION" | NormalizeZoneFileFormatting >> "$CachedMasterFile" fi } DoServeMasterZone() { [ -n "$SubCommunityDomain" ] || \ GetAllZoneNameservers "$MasterDomain" "$CachedMasterFile" | \ awk '{for(i=NF;i>0;--i) if($i=="'"$DNSSCRIPT_SERVER_NAME"'") {printf 1}}' } DoServeOnlyExternZone() { if [ -n "$MasterExternDomain" ] && [ -z "$ServeMasterZone" ]; then GetAllSubNameservers "$CommunityDomain" "$CommunityExternPrefix" "$CachedMasterFile" | \ awk '{for(i=NF;i>0;--i) if($i=="'"$DNSSCRIPT_SERVER_NAME"'") {printf 1}}' fi } RemoveDNSSECKeysFromCacheFile() { sed -i -e '/^\s*_dnsseckeys\./d' "$CachedMasterFile" sed -i -e '/^\s*_cdskey\./d' "$CachedMasterFile" } UpdateMasterZone() { LocalMasterSerial=$((PostFetchMasterSerial)) if [ -n "$ServeMasterZone" ]; then ZoneTempFolder="$DNSSCRIPT_TEMP_FOLDER""cache/""$MasterDomain""/" UpdateMaster="$(UpdateDNSSECEntryCache "$MasterDomain" "$ZoneTempFolder" "$CachedMasterFile" "$DNSSECKeyFolder" "$InternalUpstreamIP" )" if [ $((PostFetchMasterSerial)) -gt $((PreFetchMasterSerial)) ] || [ -n "$UpdateMaster" ] || [ ! -f "$MasterFile" ]; then cp -f "$CachedMasterFile" "$CachedMasterFile""I" for KeyFile in "$ZoneTempFolder"*; do [ "$KeyFile" = "$ZoneTempFolder""*" ] || \ cat "$KeyFile" >> "$CachedMasterFile""I" done LocalMasterSerial="$(GetZoneFileSerial "$MasterFile")" if [ $((PostFetchMasterSerial)) -le $((LocalMasterSerial)) ]; then LocalMasterSerial=$((LocalMasterSerial+1)) sed -i -e 's/^\(\s*\)'"$PostFetchMasterSerial"'\(\s*;\s*[Ss]erial.*\)$/\1'"$LocalMasterSerial"'\2/g' "$CachedMasterFile""I" sed -i -e 's/^\(\s*\S\+\s\+\([0-9]*\s\)\?\s*[Ii][Nn]\s\+[Ss][Oo][Aa]\s\+\S\+\s\+\S\+\s\+\)'"$PostFetchMasterSerial"'\(\s\+.*\)$/\1'"$LocalMasterSerial"'\3/g' "$CachedMasterFile""I" else LocalMasterSerial=$((PostFetchMasterSerial)) fi awk '/^$/ || !a[$0]++' "$CachedMasterFile""I" > "$MasterFile" ReloadZone "$MasterDomain" "$InternalViews" "$ZoneFilesFolder" fi InsertZoneToViews "$InternalViews" "$ZoneFilesFolder" "$MasterDomain" "$MasterFile" fi echo "$LocalMasterSerial" } UpdateExternal() { CachedZoneFile="$DNSSCRIPT_TEMP_FOLDER""cache/db.""$InternalDomain""E" UpdateExternView=0 if [ -n "$ExternalView" ] || [ -n "$ExternDomain" ]; then SerialExtern="$(GetZoneFileSerial "$ExternalZoneFile")" if [ $((SerialIntern)) -gt $((SerialExtern)) ]; then sed -e '/^[^;]*\s\(10\.\|[fF][cdCD][0-9a-fA-F]\{2\}:\)\S*\s*\(;.*\)\?$/d;s/^[^;^@]*\s\+\([^;]*\)\s[Ii][Nn]\s\+[Ss][Oo][Aa]\s/@ \1 IN SOA /g' "$InternalZoneFile" \ > "$ExternalZoneFile" UpdateExternView=1 ReloadZone "$InternalDomain" "$ExternalView" "$ZoneFilesFolder" fi if [ -n "$ExternalView" ]; then InsertZoneToViews "$ExternalView" "$ZoneFilesFolder" "$InternalDomain" "$InternalZoneFile" fi fi if [ -n "$ExternDomain" ]; then ExtDomainFile="$ZoneFilesFolder""db.""$FirstInternalView"".""$ExternDomain" ZoneTempFolder="$DNSSCRIPT_TEMP_FOLDER""cache/""$ExternDomain""/" named-checkzone -q -i none -o "$CachedZoneFile" "$InternalDomain" "$ExternalZoneFile" InternalDomainSed="$(SEDifyHostname "$InternalDomain")" ExternDomainSed="$(SEDifyHostname "$ExternDomain")" if [ -n "$(sed -e '/^'"$ExternDomainSed"'\.\s\+\([0-9]*\s\)\?\s*[Ii][Nn]\s\+[Nn][Ss]\s/!d' "$CachedZoneFile")" ]; then sed -i -e '/^'"$InternalDomainSed"'\.\s\+\([0-9]*\s\)\?\s*[Ii][Nn]\s\+[Nn][Ss]\s/d' "$CachedZoneFile" sed -i -e 's/^'"$ExternDomainSed"'\.\(\s\)/@\1/g' "$CachedZoneFile" fi if [ -n "$DNSSECKeyFolder" ]; then sed -i -e '/^_cdskey\./d' "$CachedZoneFile" sed -i -e '/^\S\+\s\+\([0-9]*\s\)\?\s*[Ii][Nn]\s\+[Dd][Nn][Ss][Kk][Ee][Yy]/d' "$CachedZoneFile" fi [ -n "$(sed -e '/^\s*\(@\s\+\([0-9]*\s\)\?\s*[Ii][Nn]\s\+[Nn][Ss]\)\s/!d' "$CachedZoneFile")" ] || \ sed -i -e 's/^\s*\(@\s\+\([0-9]*\s\)\?\s*[Ii][Nn]\s\+[Ss][Oo][Aa]\)\s\+\S\+\s\+\S\+\s/\1 '"$DNSSCRIPT_SERVER_NAME"'. '"$DNSSCRIPT_CONTACT_EMAIL"' /g' "$CachedZoneFile" sed -i -e '/^\S\+\s\+\([0-9]*\s\)\?\s*[Ii][Nn]\s\+[Dd][Ss]\s/d' "$CachedZoneFile" sed -i -e '/^_dnsseckeys\./d' "$CachedZoneFile" sed -i -e 's/^'"$InternalDomainSed"'\.\(\s\)/@\1/g' "$CachedZoneFile" sed -i -e 's/^\(\S\+\)\.'"$InternalDomainSed"'\.\(\s\)/\1\2/g' "$CachedZoneFile" echo "\$TTL ${TTLReReExMi%% *}" >> "$CachedZoneFile" UpdateExternDomain="$(UpdateDNSSECEntryCache "$ExternDomain" "$ZoneTempFolder" "$CachedZoneFile" "$DNSSECKeyFolder" "$InternalUpstreamIP" )" if [ $UpdateExternView -ne 0 ] || [ -n "$UpdateExternDomain" ]; then for KeyFile in "$ZoneTempFolder"*; do [ "$KeyFile" = "$ZoneTempFolder""*" ] || \ cat "$KeyFile" >> "$CachedZoneFile" done LocalExtDomainMasterSerial="$(GetZoneFileSerial "$ExtDomainFile")" if [ $((SerialIntern)) -le $((LocalExtDomainMasterSerial)) ]; then LocalExtDomainMasterSerial=$((LocalExtDomainMasterSerial+1)) sed -i -e 's/^\(\s*\)'"$SerialIntern"'\(\s*;\s*[Ss]erial.*\)$/\1'"$LocalExtDomainMasterSerial"'\2/g' "$CachedZoneFile" sed -i -e 's/^\(\s*\S\+\s\+\([0-9]*\s\)\?\s*[Ii][Nn]\s\+[Ss][Oo][Aa]\s\+\S\+\s\+\S\+\s\+\)'"$SerialIntern"'\(\s\+.*\)$/\1'"$LocalExtDomainMasterSerial"'\3/g' "$CachedZoneFile" fi awk '/^$/ || !a[$0]++' "$CachedZoneFile" > "$ExtDomainFile" ReloadZone "$ExternDomain" "$InternalViews" "$ZoneFilesFolder" ReloadZone "$ExternDomain" "$ExternalView" "$ZoneFilesFolder" fi InsertZoneToViews "$InternalViews" "$ZoneFilesFolder" "$ExternDomain" "$ExtDomainFile" InsertZoneToViews "$ExternalView" "$ZoneFilesFolder" "$ExternDomain" "$ExtDomainFile" fi } UpdateReverseZones() { for Subnet in $1; do ReverseDomains="$(GetReverseDomains "$Subnet")" for RDomain in $ReverseDomains; do ReverseZoneFile="$(GetReverseZoneFileFromZone "${RDomain%*.}")" if [ -n "$RemoteLocation" ]; then ! curl -s -f "$RemoteLocation""static.""$ReverseZoneFile" \ --output "$ZoneFilesFolder""static.""$ReverseZoneFile" && \ rm -f "$ZoneFilesFolder""static.""$ReverseZoneFile" fi ./update-rdnszone.sh "$RDomain" "$2" "$ZoneFilesFolder""$ReverseZoneFile" "$TTLReReExMi" "$InternalViews" for IView in $InternalViews; do InsertZoneToIncludeFile "${RDomain%*.}" "$ZoneFilesFolder""$ReverseZoneFile" "$DNSSCRIPT_TEMP_FOLDER""$IView"".conf" done done done }