dns-scripts/usr/lib/ffdns/update-hoodzone.sh

75 lines
2.5 KiB
Bash
Executable File

#!/bin/sh
# SPDX-License-Identifier: GPL-3.0
#
# freifunk-franken dns-scipts (c) 2021-2023 Blackyfff
. ./dns-functions.sh
HoodZoneFile="$1"
Domain="$2"
Subnets="$3"
View="$4"
ZoneTempFolder="$5"
ZoneFilesFolder="$6"
DomainReg=".""$Domain"
DomainReg="$(echo "$DomainReg" | sed -e 's/\./\\\./g')"
GetLeaseEntriesInSubnet() {
echo "$1" | while read -r LeaseLine; do
if IPv4IsInSubnet "${LeaseLine##* }" "$2";then
echo "$LeaseLine"
fi
done
}
ZoneTempFolder="$ZoneTempFolder""$Domain""/"
OldSerial="$(GetZoneFileSerial "$ZoneTempFolder""db.""$Domain"".bkp")"
NewSerial="$(GetZoneFileSerial "$HoodZoneFile")"
ForceUpdate=""
[ $((OldSerial)) -gt 0 ] && [ $((OldSerial)) -lt $((NewSerial)) ] && ForceUpdate="1"
OldLeases="$(sed -e '/^;### Leases ###/,$!d;/^\s*\S\+\.\s\+\([0-9]*\s\)\?\s*[Ii][Nn]\s\+[Dd][Ss]\s/d' "$HoodZoneFile" | sed 1d)"
if [ -f "/tmp/dhcp.leases" ]; then
DnsmasqLeases="$(sed -ne 's/^\s*\(\S\+\s\+\)\{2\}\(\S\+\)\s\+\([_0-9a-zA-Z-]\+\)\s\+.*/\3 IN A \2/p' "/tmp/dhcp.leases")"
for Subnet in $Subnets; do
IsValidIPv4Subnet "$Subnet" && NewLeases="$(echo "$NewLeases"; GetLeaseEntriesInSubnet "$DnsmasqLeases" "$Subnet")"
done
fi
for Leasefile in /tmp/hosts/*; do
if [ -n "${Leasefile##*/tmp/hosts/\*}" ] && [ -n "${Leasefile##*fffmanage}" ]; then
NewLeases="$(echo "$NewLeases"; sed -ne 's/^\s*\([0-9.]*\)\s\+\([_0-9a-zA-Z-]\+\)'"$DomainReg"'.*/\2 IN A \1/p' "$Leasefile")"
NewLeases="$(echo "$NewLeases"; sed -ne 's/^\s*\([0-9a-fA-F:]*\)\s\+\([_0-9a-zA-Z-]\+\)'"$DomainReg"'.*/\2 IN AAAA \1/p' "$Leasefile")"
fi
done
NewLeases="$(echo "$NewLeases" |
sed -ne 's/^\(\(\(\S\+\)'"$DomainReg"'\)\|\(\S\+\)\)\(.*\)$/\3\4\5/p' |
awk '!a[$0]++' |
# uncomment and duplicate to secure static DNS-Entries
# sed -e '/^dns\s\+.*/d' |
# sed -e '/^gw01\s\+.*/d' |
NormalizeZoneFileFormatting; \
echo "_dnsscript_version IN TXT ""$DNSSCRIPT_VERSION" | NormalizeZoneFileFormatting)"
UpdateZone="$(UpdateDNSSECEntryCache "$Domain" "$ZoneTempFolder" "$HoodZoneFile")"
if [ "$NewLeases" != "$OldLeases" ] || [ -n "$UpdateZone" ] || [ -n "$ForceUpdate" ]; then
NewSerial=$((NewSerial+1))
sed -i -e 's/^\(\s*\)\(\S\+\)\(\s*;\s*Serial.*\)/\1'"$NewSerial"'\3/g' "$HoodZoneFile"
sed -i -e '/^;### Leases ###/,$d' "$HoodZoneFile"
{
echo ";### Leases ###"
echo "$NewLeases"
} >> "$HoodZoneFile"
for KeyFile in "$ZoneTempFolder"*; do
[ "$KeyFile" = "$ZoneTempFolder""*" ] || \
cat "$KeyFile" >> "$HoodZoneFile"
done
ReloadZone "$Domain" "$View" "$ZoneFilesFolder"
fi
cp -f "$HoodZoneFile" "$ZoneTempFolder""db.""$Domain"".bkp"