#!/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"