136 lines
6.1 KiB
Bash
136 lines
6.1 KiB
Bash
|
#!/bin/sh
|
||
|
# SPDX-License-Identifier: GPL-3.0
|
||
|
#
|
||
|
# freifunk-franken dns-scipts (c) 2021 Blackyfff
|
||
|
|
||
|
SetupCache() {
|
||
|
mkdir -p "$TempFolder""cache"
|
||
|
|
||
|
for IView in $InternalViews; do
|
||
|
rm -f "$TempFolder""$IView"".conf"
|
||
|
done
|
||
|
rm -f "$TempFolder""$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 "$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"
|
||
|
}
|
||
|
UpdateMasterZone() {
|
||
|
LocalMasterSerial=$((PostFetchMasterSerial))
|
||
|
if [ -n "$ServeMasterZone" ]; then
|
||
|
ZoneTempFolder="$TempFolder""cache/""$MasterDomain""/"
|
||
|
|
||
|
UpdateMaster="$(UpdateDNSSECEntryCache "$MasterDomain" "$ZoneTempFolder" "$CachedMasterFile" "$DNSSECKeyFolder")"
|
||
|
if [ $((PostFetchMasterSerial)) -gt $((PreFetchMasterSerial)) ] || [ $UpdateMaster -ne 0 ]; 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"'\3/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
|
||
|
mv "$CachedMasterFile""I" "$MasterFile"
|
||
|
ReloadZone "$MasterDomain" "$InternalViews" "$ZoneFilesFolder"
|
||
|
|
||
|
fi
|
||
|
InsertZoneToViews "$InternalViews" "$ZoneFilesFolder" "$MasterDomain" "$MasterFile" "$TempFolder" "$DNSSECPolicy"
|
||
|
if [ -n "$ExternalView" ]; then
|
||
|
InsertZoneToIncludeFile "$MasterDomain" "$ExternFile" "$TempFolder""$ExternalView"".conf" "$DNSSECPolicy"
|
||
|
fi
|
||
|
fi
|
||
|
|
||
|
echo "$LocalMasterSerial"
|
||
|
}
|
||
|
UpdateExternal() {
|
||
|
CachedZoneFile="$TempFolder""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
|
||
|
fi
|
||
|
|
||
|
if [ -n "$ExternDomain" ]; then
|
||
|
ExtDomainFile="$ZoneFilesFolder""db.""$FirstInternalView"".""$ExternDomain"
|
||
|
ZoneTempFolder="$TempFolder""cache/""$ExternDomain""/"
|
||
|
cp -f "$ExternalZoneFile" "$CachedZoneFile"
|
||
|
[ -z "$DNSSECKeyFolder" ] || sed -i -e '/^\s*_dnsseckeys\./d' "$CachedZoneFile"
|
||
|
[ -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*'"$CommunityExternPrefix"'\s/@ /g;/^\s*\(@\|\S\+\.\)\s\+\([0-9]*\s\)\?\s*[Ii][Nn]\s\+[Dd][Ss]\s/d' "$CachedZoneFile"
|
||
|
|
||
|
UpdateExternDomain="$(UpdateDNSSECEntryCache "$ExternDomain" "$ZoneTempFolder" "$CachedZoneFile" "$DNSSECKeyFolder")"
|
||
|
if [ $UpdateExternView -ne 0 ] || [ $UpdateExternDomain -ne 0 ]; 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"'\3/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
|
||
|
mv "$CachedZoneFile" "$ExtDomainFile"
|
||
|
ReloadZone "$ExternDomain" "$InternalViews" "$ZoneFilesFolder"
|
||
|
ReloadZone "$ExternDomain" "$ExternalView" "$ZoneFilesFolder"
|
||
|
fi
|
||
|
|
||
|
InsertZoneToViews "$InternalViews" "$ZoneFilesFolder" "$ExternDomain" "$ExtDomainFile" "$TempFolder" "$DNSSECPolicy"
|
||
|
InsertZoneToViews "$ExternalView" "$ZoneFilesFolder" "$ExternDomain" "$ExtDomainFile" "$TempFolder" "$DNSSECPolicy"
|
||
|
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" "$TempFolder""$IView"".conf"
|
||
|
done
|
||
|
done
|
||
|
done
|
||
|
}
|