2019-09-04 18:15:10 +02:00
#!/bin/sh
2021-07-08 00:39:48 +02:00
# SPDX-License-Identifier: GPL-3.0
#
# freifunk-franken dns-scipts (c) 2016 mayosemmel
# (c) 2020-2021 Fabian Bläse
# (c) 2021 Blackyfff
2019-09-04 18:15:10 +02:00
# exit script when command fails
set -e
2021-07-10 01:13:29 +02:00
. /etc/ffdns/community.conf
. /etc/ffdns/local.conf
2021-01-04 20:53:39 +01:00
2021-07-10 01:13:29 +02:00
export DNSSCRIPT_CONTACT_EMAIL
export DNSSCRIPT_SERVER_NAME
export DNSSCRIPT_BIND_RELOAD_VER
2021-01-21 19:21:25 +01:00
2021-07-10 01:13:29 +02:00
cd /usr/lib/ffdns/
2021-01-14 20:46:10 +01:00
. ./dns-functions.sh
2021-01-04 20:53:39 +01:00
2021-07-10 01:20:50 +02:00
MasterDomain = " $CommunityDomain "
[ -z " $SubCommunityDomain " ] || MasterDomain = " $SubCommunityDomain " "." " $MasterDomain "
if [ -n " $CommunityExternPrefix " ] ; then
MasterExternDomain = " $CommunityExternPrefix " "." " $CommunityDomain "
[ -z " $SubCommunityDomain " ] || MasterExternDomain = " $SubCommunityDomain " "." " $MasterExternDomain "
fi
2021-02-08 01:34:03 +01:00
FirstInternal = " $( echo " $InternalViews " | sed -ne 's/^\(\S\+\)\s.*$/\1/p' ) "
2021-07-10 01:13:29 +02:00
# ForwardZones: "<Zone>/<Zonendatei>" ; optionaly multiple " ""<ZoneX>/<ZonendateiX>" no spaces in full filename
2021-07-10 01:20:50 +02:00
ForwardZones = " $MasterDomain " "/" " $ZoneFilesFolder " "db." " $FirstInternal " "." " $MasterDomain "
2021-03-10 00:02:15 +01:00
BindIcvpnAclTmp = " $TempFolder " "icvpn-acl.conf"
2021-01-15 17:12:33 +01:00
BindIcvpnAcl = " $BindIncludeFileFolder " "icvpn-acl.conf"
2021-06-28 00:47:45 +02:00
[ -n " $DNSSECPolicy " ] || DNSSECKeyFolder = ""
2021-03-10 00:02:15 +01:00
mkdir -p " $TempFolder " "cache"
2021-01-04 20:53:39 +01:00
2021-02-08 01:34:03 +01:00
for IView in $InternalViews ; do
2021-03-10 00:02:15 +01:00
rm -f " $TempFolder " " $IView " ".conf"
2021-02-08 01:34:03 +01:00
done
2021-03-10 00:02:15 +01:00
rm -f " $TempFolder " " $ExternalView " ".conf"
2021-02-08 01:34:03 +01:00
2021-07-10 01:20:50 +02:00
CachedMasterFile = " $TempFolder " "cache/db." " $MasterDomain "
2021-03-10 00:02:15 +01:00
PreFetchMasterSerial = " $( GetZoneFileSerial " $CachedMasterFile " ) "
2021-07-23 00:14:10 +02:00
curl -s -S -f " $RemoteLocation " "db." " $MasterDomain " --output " $CachedMasterFile " && [ -f " $CachedMasterFile " ] && echo "" >> " $CachedMasterFile " || :
2021-03-10 00:02:15 +01:00
PostFetchMasterSerial = " $( GetZoneFileSerial " $CachedMasterFile " ) "
2021-07-10 01:20:50 +02:00
[ -n " $SubCommunityDomain " ] || ServeMasterZone = " $( GetAllZoneNameservers " $MasterDomain " " $CachedMasterFile " | awk '{for(i=NF;i>0;--i) if($i=="' " $DNSSCRIPT_SERVER_NAME " '") {printf 1}}' ) "
if [ -n " $MasterExternDomain " ] ; then
2021-03-10 00:02:15 +01:00
if [ -n " $ServeMasterZone " ] ; then
ServeExtZone = "1"
else
ServeExtZone = " $( GetAllSubNameservers " $CommunityDomain " " $CommunityExternPrefix " " $CachedMasterFile " | awk '{for(i=NF;i>0;--i) if($i=="' " $DNSSCRIPT_SERVER_NAME " '") {printf 1}}' ) "
fi
else
ServeExtZone = ""
fi
2019-09-04 18:15:10 +02:00
2021-07-23 00:14:10 +02:00
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." " $FirstInternal " "." " $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 "
2021-07-23 00:21:18 +02:00
sed -i -e 's/^\s*' " $CommunityExternPrefix " '\s/@ /g;/^\s*\S\+\.\s\+\([0-9]*\s\)\?\s*[Ii][Nn]\s\+[Dd][Ss]\s/d' " $CachedZoneFile "
2021-07-23 00:14:10 +02:00
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
}
2021-03-10 00:02:15 +01:00
if [ -n " $ServeMasterZone " ] || [ -n " $ServeExtZone " ] ; then
sed -i -e '/^\s*_dnsseckeys\./d' " $CachedMasterFile "
FileForExternGeneration = " $CachedMasterFile "
if [ -n " $ExternalView " ] ; then
2021-07-10 01:20:50 +02:00
ExternFile = " $ZoneFilesFolder " "db." " $ExternalView " "." " $MasterDomain "
2021-03-10 00:02:15 +01:00
else
2021-07-23 00:14:10 +02:00
ExternFile = " $ZoneFilesFolder " "db.extern." " $MasterDomain "
2021-02-08 01:34:03 +01:00
fi
2021-03-10 00:02:15 +01:00
LocalMasterSerial = $(( PostFetchMasterSerial))
if [ -n " $ServeMasterZone " ] ; then
2021-07-10 01:20:50 +02:00
MasterFile = " $ZoneFilesFolder " "db." " $FirstInternal " "." " $MasterDomain "
2021-03-10 00:02:15 +01:00
FileForExternGeneration = " $MasterFile "
2021-07-10 01:20:50 +02:00
ZoneTempFolder = " $TempFolder " "cache/" " $MasterDomain " "/"
2021-02-08 01:34:03 +01:00
2021-07-10 01:20:50 +02:00
UpdateMaster = " $( UpdateDNSSECEntryCache " $MasterDomain " " $ZoneTempFolder " " $CachedMasterFile " " $DNSSECKeyFolder " ) "
2021-06-27 22:51:24 +02:00
if [ $(( PostFetchMasterSerial)) -gt $(( PreFetchMasterSerial)) ] || [ $UpdateMaster -ne 0 ] ; then
2021-03-10 00:02:15 +01:00
cp -f " $CachedMasterFile " " $CachedMasterFile " "I"
for KeyFile in " $ZoneTempFolder " *; do
2021-07-23 00:14:10 +02:00
[ " $KeyFile " = " $ZoneTempFolder " "*" ] || \
2021-03-10 00:02:15 +01:00
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 "
2021-07-23 00:14:10 +02:00
ReloadZone " $MasterDomain " " $InternalViews " " $ZoneFilesFolder "
2021-03-10 00:02:15 +01:00
2021-07-10 01:20:50 +02:00
InsertZoneToViews " $InternalViews " " $ZoneFilesFolder " " $MasterDomain " " $MasterFile " " $TempFolder " " $DNSSECPolicy "
2021-03-10 00:02:15 +01:00
fi
if [ -n " $ExternalView " ] ; then
2021-07-10 01:20:50 +02:00
InsertZoneToIncludeFile " $MasterDomain " " $ExternFile " " $TempFolder " " $ExternalView " ".conf" " $DNSSECPolicy "
2021-03-10 00:02:15 +01:00
fi
fi
2021-02-08 01:34:03 +01:00
2021-07-23 00:14:10 +02:00
InternalZoneFile = " $FileForExternGeneration "
ExternalZoneFile = " $ExternFile "
InternalDomain = " $MasterDomain "
ExternDomain = " $MasterExternDomain "
SerialIntern = " $LocalMasterSerial "
UpdateExternal
2021-02-08 01:34:03 +01:00
fi
2019-09-04 18:15:10 +02:00
2021-03-10 00:02:15 +01:00
if [ -z " $MasterFile " ] ; then
2021-07-10 01:20:50 +02:00
MasterFile = " $ZoneFilesFolder " "db." " $FirstInternal " "." " $MasterDomain "
2021-03-10 00:02:15 +01:00
cp -f " $CachedMasterFile " " $MasterFile "
fi
2021-07-23 00:14:10 +02:00
for Subnet in $CommunitySubnets ; do
ReverseDomains = " $( GetReverseDomains " $Subnet " ) "
for RDomain in $ReverseDomains ; do
ReverseZoneFile = " $( GetReverseZoneFileFromZone " ${ RDomain %*. } " ) "
! curl -s -f " $RemoteLocation " "static." " $ReverseZoneFile " \
--output " $ZoneFilesFolder " "static." " $ReverseZoneFile " && \
rm -f " $ZoneFilesFolder " "static." " $ReverseZoneFile "
./update-rdnszone.sh " $RDomain " " $ForwardZones " " $ZoneFilesFolder " " $ReverseZoneFile " " $TTLReReExMi " " $InternalViews "
for IView in $InternalViews ; do
InsertZoneToIncludeFile " ${ RDomain %*. } " " $ZoneFilesFolder " " $ReverseZoneFile " " $TempFolder " " $IView " ".conf"
done
done
done
2021-01-14 20:46:10 +01:00
# set shorter TTL for Hoods
TTLReReExMi = "420 360 180 1800 360"
2021-07-10 01:20:50 +02:00
Hoods = " $( GetOwnHoods " $MasterDomain " " $MasterFile " ) "
2021-07-23 00:14:10 +02:00
DNSSECKeyFolder = ""
2021-01-14 20:46:10 +01:00
for Hood in $Hoods ; do
2021-07-10 01:20:50 +02:00
HoodDomain = " ${ Hood %% \# * } " "." " $MasterDomain "
2021-01-14 20:46:10 +01:00
Subnets = " $( echo " ${ Hood #* \# } " | sed -e 's/#/ /g' ) "
2021-02-08 01:34:03 +01:00
HoodZoneFile = " $ZoneFilesFolder " "db." " $FirstInternal " "." " $HoodDomain "
2021-01-14 20:46:10 +01:00
if [ ! -f " $HoodZoneFile " ] ; then
2021-01-19 17:49:06 +01:00
{
echo " \$TTL ${ TTLReReExMi %% * } "
2021-06-27 22:51:24 +02:00
echo " @ IN SOA $DNSSCRIPT_SERVER_NAME " "." " $DNSSCRIPT_CONTACT_EMAIL ( "
echo " 1 ; Serial"
echo " " " $( echo " $TTLReReExMi " | awk '{print $2}' ) " " ; Refresh"
echo " " " $( echo " $TTLReReExMi " | awk '{print $3}' ) " " ; Retry"
echo " " " $( echo " $TTLReReExMi " | awk '{print $4}' ) " " ; Expire"
echo " " " $( echo " $TTLReReExMi " | awk '{print $5}' ) " " ) ; Negative Cache TTL"
2021-01-21 19:21:25 +01:00
echo ";"
2021-06-27 22:51:24 +02:00
echo " @ IN NS $DNSSCRIPT_SERVER_NAME " "." ""
2021-07-10 01:20:50 +02:00
GetOwnGlueRecords " $MasterDomain " " $HoodDomain " " $MasterFile "
2021-01-21 19:21:25 +01:00
echo ";"
2021-01-19 17:49:06 +01:00
} > " $HoodZoneFile "
2021-01-14 20:46:10 +01:00
fi
2021-07-23 00:14:10 +02:00
ZoneTempFolder = " $TempFolder " "cache/" " $HoodDomain " "/"
./update-hoodzone.sh " $HoodZoneFile " " $HoodDomain " " $Subnets " " $InternalViews " " $ZoneTempFolder " " $ZoneFilesFolder "
InsertZoneToViews " $InternalViews " " $ZoneFilesFolder " " $HoodDomain " " $HoodZoneFile " " $TempFolder " " $DNSSECPolicy "
2021-01-15 17:12:33 +01:00
2021-01-21 19:21:25 +01:00
HoodForwardZones = " $ForwardZones $HoodDomain " "/" " $HoodZoneFile "
2021-01-14 20:46:10 +01:00
for Subnet in $Subnets ; do
ReverseDomains = " $( GetReverseDomains " $Subnet " ) "
for RDomain in $ReverseDomains ; do
2021-01-21 19:21:25 +01:00
ReverseZoneFileFullPath = " $ZoneFilesFolder " " $( GetReverseZoneFileFromZone " ${ RDomain %*. } " ) "
./update-rdnszone.sh " $RDomain " " $HoodForwardZones " " $ReverseZoneFileFullPath " " $TTLReReExMi " " $InternalViews "
2021-02-08 01:34:03 +01:00
for IView in $InternalViews ; do
2021-03-10 00:02:15 +01:00
InsertZoneToIncludeFile " ${ RDomain %*. } " " $ReverseZoneFileFullPath " " $TempFolder " " $IView " ".conf"
2021-02-08 01:34:03 +01:00
done
2021-01-14 20:46:10 +01:00
done
done
2021-07-10 01:20:50 +02:00
if [ -n " $MasterExternDomain " ] ; then
HoodExternDomain = " ${ Hood %% \# * } " "." " $MasterExternDomain "
2021-02-08 21:23:15 +01:00
else
HoodExternDomain = ""
fi
2021-06-27 22:51:24 +02:00
if [ -n " $ExternalView " ] ; then
2021-07-23 00:14:10 +02:00
ExternFile = " $ZoneFilesFolder " "db." " $ExternalView " "." " $HoodDomain "
2021-06-27 22:51:24 +02:00
elif [ -n " $HoodExternDomain " ] ; then
ExternFile = " $ZoneFilesFolder " "db." " $HoodExternDomain "
else
ExternFile = ""
fi
2021-02-08 01:34:03 +01:00
2021-06-27 22:51:24 +02:00
if [ -n " $ExternFile " ] ; then
2021-07-23 00:14:10 +02:00
if [ -n " $ExternalView " ] ; then
InsertZoneToIncludeFile " $HoodDomain " " $ExternFile " " $TempFolder " " $ExternalView " ".conf" " $DNSSECPolicy "
fi
InternalZoneFile = " $HoodZoneFile "
ExternalZoneFile = " $ExternFile "
InternalDomain = " $HoodDomain "
ExternDomain = " $HoodExternDomain "
SerialIntern = " $( GetZoneFileSerial " $InternalZoneFile " ) "
UpdateExternal
2021-02-08 01:34:03 +01:00
fi
2021-01-15 17:12:33 +01:00
done
2021-01-26 22:53:02 +01:00
./update-public-acl.sh " $BindIcvpnAclTmp " " $RemoteLocation " " $RoutingTables "
2021-01-15 17:12:33 +01:00
2021-02-08 01:34:03 +01:00
ReConfigBind = 0
2021-01-15 17:12:33 +01:00
UpdateBindConfig( ) {
2021-01-19 17:49:06 +01:00
if [ -f " $1 " ] && ! cmp -s " $1 " " $2 " ; then
mv " $1 " " $2 "
2021-02-08 01:34:03 +01:00
ReConfigBind = 1
2021-01-15 17:12:33 +01:00
else
2021-01-19 17:49:06 +01:00
rm -f " $1 "
2021-01-04 20:53:39 +01:00
fi
2021-01-15 17:12:33 +01:00
}
2021-01-19 17:49:06 +01:00
UpdateBindConfig " $BindIcvpnAclTmp " " $BindIcvpnAcl "
2021-02-08 01:34:03 +01:00
for IView in $InternalViews ; do
2021-03-10 00:02:15 +01:00
UpdateBindConfig " $TempFolder " " $IView " ".conf" " $BindIncludeFileFolder " " $IView " ".conf"
2021-02-08 01:34:03 +01:00
done
2021-06-27 22:51:24 +02:00
if [ -n " $ExternalView " ] ; then
2021-07-23 00:14:10 +02:00
UpdateBindConfig " $TempFolder " " $ExternalView " ".conf" " $BindIncludeFileFolder " " $ExternalView " ".conf"
2021-06-27 22:51:24 +02:00
fi
2021-01-15 17:12:33 +01:00
2021-02-08 01:34:03 +01:00
if [ $ReConfigBind -ne 0 ] || [ -f "/tmp/dnsscript-forcereconf" ] ; then
2021-01-19 17:49:06 +01:00
if [ $(( DNSSCRIPT_BIND_RELOAD_VER)) -eq 0 ] ; then
2021-01-15 17:12:33 +01:00
systemctl restart bind9
2021-01-19 17:49:06 +01:00
elif [ $(( DNSSCRIPT_BIND_RELOAD_VER)) -eq 1 ] ; then
2021-01-15 17:12:33 +01:00
rndc reconfig
2021-01-19 20:24:33 +01:00
elif [ $(( DNSSCRIPT_BIND_RELOAD_VER)) -eq 2 ] ; then
2021-01-15 17:12:33 +01:00
/etc/init.d/named restart
fi
2021-01-21 19:21:25 +01:00
rm -f "/tmp/dnsscript-forcereconf"
fi