From 2b8b3765d59c4b472846de05bfe4f9d40eea85da Mon Sep 17 00:00:00 2001 From: Blackyfff Date: Sun, 6 Mar 2022 00:56:09 +0100 Subject: [PATCH] initial code Signed-off-by: Blackyfff --- LICENSE => LICENSE.txt | 0 README.md | 5 + fffdnsstatus.sh | 455 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 460 insertions(+) rename LICENSE => LICENSE.txt (100%) create mode 100755 fffdnsstatus.sh diff --git a/LICENSE b/LICENSE.txt similarity index 100% rename from LICENSE rename to LICENSE.txt diff --git a/README.md b/README.md index e7f48a9..780328b 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,7 @@ # dns-monitor +Quick&Dirty Script zur Überwachung der DNS-Server der Freifunk-Franken-[fff.community](https://fff.community)-Zone + +## Voraussetzung + +[dns-scripts](https://git.freifunk-franken.de/feifunk-franken/dns-scripts) \ No newline at end of file diff --git a/fffdnsstatus.sh b/fffdnsstatus.sh new file mode 100755 index 0000000..0a63a8e --- /dev/null +++ b/fffdnsstatus.sh @@ -0,0 +1,455 @@ +#!/bin/sh + +. /etc/ffdns/community.conf +. /etc/ffdns/local.conf +. /usr/lib/ffdns/dns-functions.sh + +InternalIPv4="" +InternalIPv4GU="" +ExternalIPv4="" +InternalIPv6ULA="" +InternalIPv6GU="" +ExternalIPv6="" + +Destination="/wwwcommon/ffdns/monitor.html" + +if [ -n "$CommunityExternPrefix" ];then + MasterExternDomain="$CommunityExternPrefix"".""$CommunityDomain" +fi + +curl -s -S -f "$RemoteLocation""db.""$CommunityDomain" --output "$TempFolder""ffdnsstatusmaster" + +HiddenServers="$(GetAllZoneNameservers "$CommunityDomain" "$TempFolder""ffdnsstatusmaster")" +FirstLocal="$(sed -e '/^[^;]*\s\(10\.\|[fF][cdCD][0-9a-fA-F]\{2\}:\)\S*\s*.*/!d;q' "$TempFolder""ffdnsstatusmaster" | sed -e 's/\s.*//g;s/\([^.]\)$/\1\.'"$(SEDifyHostname "$CommunityDomain")"'/g')" +MasterSerial="$(GetZoneFileSerial "$TempFolder""ffdnsstatusmaster")" + +CommunityTLD="$(echo "$CommunityDomain" | sed -ne 's/^[^.]\+\.\(.*\)$/\1/p')" +[ -n "$CommunityTLD" ] || CommunityTLD="." +TLDServer="$(dig "$CommunityTLD" -t NS 2>/dev/null | sed -ne 's/^[^;]\S*\s\+\S\+\s\+IN\s\+\NS\s\+\(\S\+\)$/\1/p' | sed 1!d)" +[ -n "$TLDServer" ] || Error="No TLD-Server" +AdditionalServers="$(cat /etc/scripts/AddServers)" + +if [ -z "$Error" ]; then + dig @"$TLDServer" "$CommunityDomain" -t NS 2>/dev/null | sort > "$TempFolder""ffdnsstatus" + TopMasterServers="$(GetAllZoneNameservers "$CommunityDomain" "$TempFolder""ffdnsstatus")" + for MasterServer in $TopMasterServers; do + HiddenServers="$(echo "$HiddenServers" | sed -e '/'"$(SEDifyHostname "$MasterServer")"'/d' | sort)" + done +fi + +GetIPEntry() { + sed -ne 's/^'"$MasterServer"'\.\s\+\S\+\s\+IN\s\+\(A\|AAAA\)\s\+\(\S\+\)$/\2/p' +} +GetIPs() { + dig "$MasterServer" -t A 2>/dev/null | GetIPEntry | sort -n + dig "$MasterServer" -t AAAA 2>/dev/null | GetIPEntry | sort -n +} +GetDNSSECTable() { + echo "" + echo -n "" + dig +timeout=2 @"$MasterServer" _dnsseckeys."$1" -t TXT 2>/dev/null | \ + sed -ne 's/^\S\+\s\+\S\+\s\+IN\s\+TXT\s\+\"\(.*\)\"$/
DNSSEC""$1""
own key<\/th>\1<\/th><\/tr>/p' | \ + sort + dig +timeout=2 @"$MasterServer" "$1" -t DNSKEY 2>/dev/null | \ + sed -ne 's/^\S\+\s\+\S\+\s\+IN\s\+DNSKEY\s\+\(.*\)$/
all keys<\/th>\1<\/th><\/tr>/p' | \ + sort + echo "

" +} +HasRAFlag() { + [ -n "$(echo "$1" | sed -e '/^;; flags:[^;]*\s\+ra\(\s\|;\)/!d')" ] && echo "+ra" +} +HasAAFlag() { + [ -n "$(echo "$1" | sed -e '/;; flags:[^;]*\s\+aa\(\s\|;\)/!d')" ] && echo "1" +} +GetServerTable() { + if [ -z "$2" ]; then + Color="1C8000" + elif [ "$2" = "stealth" ]; then + Color="96A300" + elif [ "$2" = "other" ]; then + Color="00A276" + else + Color="801C88" + fi + if [ -z "$2" ]; then + AllIPs="$(cat "$TempFolder""ffdnsstatus" | GetIPEntry | sed -e 's/$/@✓@/g')" + else + AllIPs="" + fi + AARR="" + Authoritative="" + GlueIPs="$(GetIPs)" + for IP in $GlueIPs; do + if [ -n "$( echo "$AllIPs" | sed -e '/'"$(SEDifyHostname "$IP")"'/!d')" ]; then + AllIPs="$(echo "$AllIPs" | sed -e '/'"$(SEDifyHostname "$IP")"'/s/@$/@✓/g')" + AARR="1" + elif [ -z "$2" ] || [ "$2" = "stealth" ]; then + AllIPs="$(echo "$AllIPs"; echo "$IP""@@✓")" + AARR="1" + else + AllIPs="$(echo "$AllIPs"; echo "$IP""@@")" + fi + done + if [ -z "$2" ] || [ "$2" = "stealth" ]; then + AllIPs="$(echo "$AllIPs" | sed -e 's/^\(.*@\)$/\1X/g')" + fi + for IP in $3; do + if [ -z "$( echo "$AllIPs" | sed -e '/'"$(SEDifyHostname "$IP")"'/!d')" ]; then + AllIPs="$(echo "$AllIPs"; echo "$IP""@@")" + fi + done + + AllIPs="$(echo "$AllIPs" | sed -e '/^$/d')" + + Orange="" + Red="" + RedIE="" + AllEntries="" + FirstAnswerInt="" + FirstAnswerExt="" + FirstSerialInt="" + FirstSerialExt="" + for Entry in $AllIPs; do + IP="$(echo "$Entry" | sed -ne 's/^\([^@]*\).*/\1/p')" + if IsValidIPv4 "$IP"; then + OwnInternULA="$InternalIPv4" + OwnInternGU="$InternalIPv4GU" + OwnExtern="$ExternalIPv4" + IsGlobal="$( echo "$IP" | sed -ne 's/^10\..*/1/p')" + IsIPv4="1" + else + OwnInternULA="$InternalIPv6ULA" + OwnInternGU="$InternalIPv6GU" + OwnExtern="$ExternalIPv6" + IsGlobal="$( echo "$IP" | sed -ne 's/^[fF][cdCD][0-9a-fA-F]\{2\}:.*/1/p')" + IsIPv4="" + fi + if [ -z "$IsGlobal" ]; then + CurAnswer="$(dig +timeout=2 @"$IP" +notcp +nsid "$CommunityDomain" -b "$OwnExtern" -t SOA 2>/dev/null)" + Serial="$( echo "$CurAnswer" | sed -ne 's/^[^;]\S*\s\+\S\+\s\+IN\s\+SOA\s\+\S\+\s\+\S\+\s\+\(\S\+\).*/\1/p')" + if [ -n "$Serial" ]; then + [ -n "$FirstSerialExt" ] || FirstSerialExt="$Serial" && FirstAnswerExt="$CurAnswer" + Authoritative="$(HasAAFlag "$CurAnswer")" + Entry="$Entry""@✓""$(HasRAFlag "$CurAnswer")" + elif [ -n "$AARR" ]; then + Entry="$Entry""@X" + else + Entry="$Entry""@" + fi + else + Entry="$Entry""@" + fi + if [ -n "$OwnInternGU" ]; then + CurAnswer="$(dig +timeout=2 @"$IP" +notcp +nsid "$CommunityDomain" -b "$OwnInternGU" -t SOA 2>/dev/null)" + Serial="$( echo "$CurAnswer" | sed -ne 's/^[^;]\S*\s\+\S\+\s\+IN\s\+SOA\s\+\S\+\s\+\S\+\s\+\(\S\+\).*/\1/p')" + if [ -n "$Serial" ]; then + Entry="$Entry""@""✓""$(HasRAFlag "$CurAnswer")" + elif [ -n "$AARR" ]; then + Entry="$Entry""@""X" + else + Entry="$Entry""@" + fi + else + Entry="$Entry""@" + fi + if [ "$IP" != "$ExternalIPv4" ] && [ "$IP" != "$ExternalIPv6" ]; then + CurAnswer="$(dig +timeout=2 @"$IP" +notcp +nsid "$CommunityDomain" -b "$OwnInternULA" -t SOA 2>/dev/null)" + else + CurAnswer="" + fi + Serial="$( echo "$CurAnswer" | sed -ne 's/^[^;]\S*\s\+\S\+\s\+IN\s\+SOA\s\+\S\+\s\+\S\+\s\+\(\S\+\).*/\1/p')" + if [ -n "$Serial" ]; then + [ -n "$FirstSerialInt" ] || FirstSerialInt="$Serial" && FirstAnswerInt="$CurAnswer" + Entry="$Entry""@""✓""$(HasRAFlag "$CurAnswer")" + elif [ -n "$IsGlobal" ]; then + Entry="$Entry""@""X" + else + Entry="$Entry""@" + fi + if [ -z "$IsGlobal" ]; then + CurAnswer="$(dig +timeout=2 @"$IP" +tcp +nsid "$CommunityDomain" -b "$OwnExtern" -t SOA 2>/dev/null)" + Serial="$( echo "$CurAnswer" | sed -ne 's/^[^;]\S*\s\+\S\+\s\+IN\s\+SOA\s\+\S\+\s\+\S\+\s\+\(\S\+\).*/\1/p')" + if [ -n "$Serial" ]; then + [ -n "$FirstSerialExt" ] || FirstSerialExt="$Serial" && FirstAnswerExt="$CurAnswer" + Entry="$Entry""@""✓""$(HasRAFlag "$CurAnswer")" + elif [ -n "$AARR" ]; then + Entry="$Entry""@""X" + else + Entry="$Entry""@" + fi + else + Entry="$Entry""@" + fi + if [ -n "$OwnInternGU" ]; then + CurAnswer="$(dig +timeout=2 @"$IP" +tcp +nsid "$CommunityDomain" -b "$OwnInternGU" -t SOA 2>/dev/null)" + Serial="$( echo "$CurAnswer" | sed -ne 's/^[^;]\S*\s\+\S\+\s\+IN\s\+SOA\s\+\S\+\s\+\S\+\s\+\(\S\+\).*/\1/p')" + if [ -n "$Serial" ]; then + Entry="$Entry""@""✓""$(HasRAFlag "$CurAnswer")" + elif [ -n "$AARR" ]; then + Entry="$Entry""@""X" + else + Entry="$Entry""@" + fi + else + Entry="$Entry""@" + fi + if [ "$IP" != "$ExternalIPv4" ] && [ "$IP" != "$ExternalIPv6" ]; then + CurAnswer="$(dig +timeout=2 @"$IP" +tcp +nsid "$CommunityDomain" -b "$OwnInternULA" -t SOA 2>/dev/null)" + else + CurAnswer="" + fi + Serial="$( echo "$CurAnswer" | sed -ne 's/^[^;]\S*\s\+\S\+\s\+IN\s\+SOA\s\+\S\+\s\+\S\+\s\+\(\S\+\).*/\1/p')" + if [ -n "$Serial" ]; then + [ -n "$FirstSerialInt" ] || FirstSerialInt="$Serial" && FirstAnswerInt="$CurAnswer" + Entry="$Entry""@""✓""$(HasRAFlag "$CurAnswer")" + elif [ -n "$IsGlobal" ]; then + Entry="$Entry""@""X" + else + Entry="$Entry""@" + fi + + if [ -z "$IsGlobal" ] && [ -n "$(dig +timeout=2 @"$IP" google.com -b "$OwnExtern" -t SOA 2>/dev/null | sed -e '/^[^;]\S*\s\+\S\+\s\+IN\s\+SOA\s\+\S\+.*/!d')" ]; then + Entry="$Entry""@""

O

" + else + Entry="$Entry""@" + fi + + if [ -n "$OwnInternGU" ] && [ -n "$(dig +timeout=2 @"$IP" google.com -b "$OwnInternGU" -t SOA 2>/dev/null | sed -e '/^[^;]\S*\s\+\S\+\s\+IN\s\+SOA\s\+\S\+.*/!d')" ]; then + Entry="$Entry""@""✓" + else + Entry="$Entry""@" + fi + if [ "$IP" != "$ExternalIPv4" ] && [ "$IP" != "$ExternalIPv6" ] && [ -n "$(dig +timeout=2 @"$IP" google.com -b "$OwnInternULA" -t SOA 2>/dev/null | sed -e '/^[^;]\S*\s\+\S\+\s\+IN\s\+SOA\s\+\S\+.*/!d')" ]; then + Entry="$Entry""@""✓" + else + Entry="$Entry""@" + fi + + + if [ -z "$FirstLocal" ]; then + Entry="$Entry""@?@?" + else + if [ -z "$IsGlobal" ] && [ -n "$(dig +timeout=2 @"$IP" "$FirstLocal" -b "$OwnExtern" -t ANY 2>/dev/null | sed -e '/^[^;]*\s\(10\.\|[fF][cdCD][0-9a-fA-F]\{2\}:\)\S*\s*.*/!d')" ]; then + if [ -n "$Authoritative" ]; then + Entry="$Entry""@""

O

" + Red="1" + else + Entry="$Entry""@""

O

" + fi + else + Entry="$Entry""@" + fi + if [ -n "$OwnInternGU" ] && [ -n "$(dig +timeout=2 @"$IP" "$FirstLocal" -b "$OwnInternGU" -t ANY 2>/dev/null | sed -e '/^[^;]*\s\(10\.\|[fF][cdCD][0-9a-fA-F]\{2\}:\)\S*\s*.*/!d')" ]; then + if [ -z "$IsGlobal" ]; then + if [ -n "$Authoritative" ]; then + Entry="$Entry""@""

O

" + Red="1" + else + Entry="$Entry""@""

O

" + fi + else + Entry="$Entry""@""✓" + fi + else + Entry="$Entry""@" + fi + if [ "$IP" != "$ExternalIPv4" ] && [ -n "$(dig +timeout=2 @"$IP" "$FirstLocal" -b "$OwnInternULA" -t ANY 2>/dev/null | sed -e '/^[^;]*\s\(10\.\|[fF][cdCD][0-9a-fA-F]\{2\}:\)\S*\s*.*/!d')" ]; then + if [ -z "$IsGlobal" ] && [ -n "$IsIPv4" ]; then + Entry="$Entry""@""

O-NAT?

" + else + Entry="$Entry""@""✓" + fi + elif [ -n "$IsGlobal" ]; then + Entry="$Entry""@""X" + else + Entry="$Entry""@" + fi + fi + AllEntries="$(echo "$AllEntries"; echo "$Entry")" + done + + [ -z "$(echo "$AllEntries" | sed -e '/X/!d')" ] || Red="1" + + echo "
" + echo "
" + + RedIE="$Red" + if [ -n "$FirstSerialInt" ]; then + Tmp="$( + echo "" + echo "" + echo -n "Serial" + echo -n "Authoritative" + echo -n "" + echo -n "" + echo -n "" + echo "
Intern
""$FirstSerialInt" + Red="1" + else + Tmp="$Tmp"">Serial""$FirstSerialInt" + fi + Tmp="$(echo "$Tmp""
X" + RedIE="1" + else + Tmp="$Tmp"">Authoritative" + fi + else + Authoritative="1" + if [ -z "$2" ] || [ "$2" = "stealth" ]; then + Tmp="$Tmp"">Authoritative✓" + else + Tmp="$Tmp"" style=\"color:#FA8D07\">Authoritative✓" + fi + fi + Tmp="$(echo "$Tmp""
NSID" + echo "$FirstAnswerInt" | sed -ne 's/; NSID:.*(\"\(.*\)\")$/\1/p' + echo "
dns-script" + dig +timeout=2 @"$MasterServer" _dnsscript_version."$CommunityDomain" -t TXT 2>/dev/null | \ + sed -ne 's/^\S\+\s\+\S\+\s\+IN\s\+TXT\s\+\"\(.\+\)\"$/\1/p' + echo "
Version.Bind" + dig +timeout=2 @"$MasterServer" version.bind chaos -t TXT 2>/dev/null | \ + sed -ne 's/^\S\+\s\+\S\+\s\+CH\s\+TXT\s\+\"\(.\+\)\"$/\1/p' + echo "

")" + else + RedIE="1" + fi + + if [ -n "$FirstSerialExt" ]; then + Tmp="$( echo "$Tmp" + echo "" + echo "" + echo -n "Serial" + echo -n "Authoritative" + echo -n "" + echo -n "" + echo -n "" + echo "
Extern
""$FirstSerialExt" + Red="1" + else + Tmp="$Tmp"">Serial""$FirstSerialExt" + fi + Tmp="$(echo "$Tmp""
X" + RedIE="1" + else + Tmp="$Tmp"">Authoritative" + fi + else + Authoritative="1" + if [ -z "$2" ] || [ "$2" = "stealth" ]; then + Tmp="$Tmp"">Authoritative✓" + else + Tmp="$Tmp"" style=\"color:#FA8D07\">Authoritative✓" + fi + fi + Tmp="$(echo "$Tmp""
NSID" + echo "$FirstAnswerExt" | sed -ne 's/; NSID:.*(\"\(.*\)\")$/\1/p' + echo "
dns-script" + dig +timeout=2 @"$MasterServer" _dnsscript_version."$CommunityDomain" -t TXT 2>/dev/null | \ + sed -ne 's/^\S\+\s\+\S\+\s\+IN\s\+TXT\s\+\"\(.\+\)\"$/\1/p' + echo "
Version.Bind" + dig +timeout=2 @"$MasterServer" version.bind chaos -t TXT 2>/dev/null | \ + sed -ne 's/^\S\+\s\+\S\+\s\+CH\s\+TXT\s\+\"\(.\+\)\"$/\1/p' + echo "

")" + else + RedIE="1" + fi + + if [ -z "$2" ] || [ "$2" = "stealth" ]; then + [ -n "$Red" ] || Red="$RedIE" + fi + + if [ -n "$Red" ]; then + Color="FF0000" + elif [ -n "$Orange" ]; then + Color="FA8D07" + fi + echo -n "

""$MasterServer" + [ -z "$2" ] || echo -n " (""$2"")" + echo "

" + + echo "$Tmp" + Tmp="" + + if [ -n "$Authoritative" ]; then + GetDNSSECTable "$CommunityDomain" + + [ -z "$MasterExternDomain" ] || GetDNSSECTable "$MasterExternDomain" + fi + + echo "" + echo "" + echo "$AllEntries" | sed -e 's/^\(.*X.*\)$/
IPglue RRAA RRUDP
+ra flag
ext
UDP
+ra flag
int GU
UDP
+ra flag
int ULA
TCP
+ra flag
ext
TCP
+ra flag
int GU
TCP
+ra flag
int ULA
recursion
ext
recursion
int GU
recursion
int ULA
serving
local IPs
ext
serving
local IPs
int GU
serving
local IPs
int ULA
\1/g;s/^\([^<].*#FF0000\">O.*\)$/
\1/g;s/^\([^<].*\([^>]O\|O[^-]\).*\)$/
\1/g;s/^\([^<]\)/
\1/g;s/@/<\/th>/g;s/$/<\/th><\/tr>/g' + echo "
" +} + +if [ -z "$Error" ]; then + { + echo "" + echo "" + echo " " + echo " DNS-Monitor" + echo " " + echo " " + echo " " + echo " " + echo " " + echo "" + echo "" + echo "

Freifunk-Franken DNS-Monitor

" + + echo "Last Updated ""$(date)""
" + for MasterServer in $TopMasterServers; do + AddIP="" + if [ -n "$(echo "$AdditionalServers" | sed -e '/'"$(SEDifyHostname "$MasterServer")"'/!d')" ]; then + AddIP="$(echo "$AdditionalServers" | sed -e '/'"$(SEDifyHostname "$MasterServer")"'/!d;s/^[^ ]*\( \)\?//g')" + AdditionalServers="$(echo "$AdditionalServers" | sed -e '/'"$(SEDifyHostname "$MasterServer")"'/d')" + fi + GetServerTable "$MasterServer" "" "$AddIP" + done + for MasterServer in $HiddenServers; do + AddIP="" + if [ -n "$(echo "$AdditionalServers" | sed -e '/'"$(SEDifyHostname "$MasterServer")"'/!d')" ]; then + AddIP="$(echo "$AdditionalServers" | sed -e '/'"$(SEDifyHostname "$MasterServer")"'/!d;s/^[^ ]*\( \)\?//g')" + AdditionalServers="$(echo "$AdditionalServers" | sed -e '/'"$(SEDifyHostname "$MasterServer")"'/d')" + fi + GetServerTable "$MasterServer" "stealth" + done + AdditionalServers="$(echo "$AdditionalServers" | sed -e 's/ /#/g')" + for ServerEntry in $AdditionalServers; do + MasterServer="$(echo "$ServerEntry" | sed -e 's/#.*//g')" + GetServerTable "$MasterServer" "other" "$(echo "$ServerEntry" | sed -e 's/^[^#]*\(#\)\?//g;s/#/ /g')" + done + echo "" + echo "" + } > "$TempFolder""ffdnsmonitor.html" + mv -f "$TempFolder""ffdnsmonitor.html" "$Destination" +fi + + +rm -f "$TempFolder""ffdnsstatusmaster" \ No newline at end of file