File update_dns

Last commit: Tue Aug 15 00:55:03 2017 +0200	dankert	DNS-Adressen aus der Konfiguration lesen
1 #!/bin/bash 2 3 # Erzeugt nach Bedarf neue Zonendateien für den Nameserver. 4 # Aus der Datenbank werden die Domain-Informationen geladen und daraus die Zonefiles geschrieben. 5 6 # Konfiguration: 7 8 CONFIG=/etc/default/ispconfig 9 10 if [ ! -f $CONFIG ]; then 11 echo "File $CONFIG not found" 12 exit 4; 13 fi 14 15 source $CONFIG 16 17 18 if [ ! -d $DNS_ZONEDIR/.hg ]; then 19 hg -R $DNS_ZONEDIR init 20 fi 21 22 function sql { 23 sql=$1 24 mysql -u $MYSQL_USER -p$MYSQL_PASSWORD -se "$sql" $MYSQL_DATABASE 25 } 26 27 28 # Datei mit allen Zonen erzeugen 29 last_domain_modified=`sql "SELECT max(unix_timestamp(modified)) FROM domain WHERE domain REGEXP('^[a-z0-9-]+\..[a-z]+\$') and active=1"` 30 last_file_modified=`stat --format %Y $DNS_ALL_ZONES_FILE` 31 32 if [ "$last_domain_modified" -gt "$last_file_modified" ]; then 33 34 echo "" > $DNS_ALL_ZONES_FILE 35 sql "SELECT domain FROM domain WHERE domain REGEXP('^[a-z0-9-]+\..[a-z]+\$') and active=1 order by domain"|while read domain; do 36 cat >> $DNS_ALL_ZONES_FILE <<EOF 37 38 zone "$domain" { 39 type master; 40 file "$DNS_ZONEDIR/db.$domain"; 41 }; 42 EOF 43 done 44 45 # Änderung Einchecken 46 hg -R $DNS_ZONEDIR diff $DNS_ALL_ZONES_FILE 47 hg -R $DNS_ZONEDIR add $DNS_ALL_ZONES_FILE 48 hg -R $DNS_ZONEDIR commit -u `whoami`/$0 -m "Master-Zonefile $ZONEFILE changed from Cron" $DNS_ALL_ZONES_FILE 49 50 fi 51 52 53 sql "SELECT domain FROM domain WHERE domain REGEXP('^[a-z0-9-]+\..[a-z]+\$') and active=1"|while read domain; do 54 55 #echo "Domain: $domain" 56 last_modified=`sql "SELECT max(unix_timestamp(modified)) FROM domain WHERE domain like '%.$domain' OR domain='$domain'"` 57 58 59 ZONEFILE=$DNS_ZONEDIR/db.$domain 60 if [ -f $ZONEFILE ]; then # Zonefile schon vorhanden? 61 modified=`stat --format %Y $ZONEFILE` 62 else 63 modified=0 # Noch kein Zonefile vorhanden 64 fi 65 66 # Ist das letzte Datum aus der Datenbank größer als das Änderungsdatum des Zonefiles? 67 if [ "$last_modified" -gt "$modified" ]; then 68 echo "Zonefile $ZONFILE wird aktualisiert (Letzte Änderung der Datei: $modified, Letzte Änderung in Datenbank: $last_modified" 69 serial=`date --date @$last_modified +"%Y%m%d%H"` # Seriennummer, eindeutig pro Stunde 70 71 72 cat > $ZONEFILE <<ZEOF 73 ; 74 ; Domain: $domain 75 ; 76 \$TTL 2H 77 @ IN SOA $DNS_SERVER_PRIMARY. root.$DNS_SERVER_PRIMARY. $serial 86400 10800 1209600 57600 78 IN NS $DNS_SERVER_PRIMARY. 79 IN NS $DNS_SERVER_SECONDARY. 80 IN A $DNS_SERVER_IPV4 81 IN AAAA $DNS_SERVER_IPV6 82 IN TXT "v=spf1 a mx -all" 83 ZEOF 84 85 # Hat die Domain Mailboxen oder Aliases? Falls ja, dann MX-Eintrag ergänzen 86 count_mailboxes=`sql "select sum(c) FROM 87 ( select count(*) as c from mailbox WHERE domain='$domain' union all 88 select count(*) as c FROM alias WHERE domain='$domain' ) as counts"` 89 if [ "$count_mailboxes" -gt 0 ]; then 90 echo " IN MX 10 $DNS_MX_HOST1." >> $ZONEFILE 91 echo " IN MX 20 $DNS_MX_HOST2." >> $ZONEFILE 92 fi 93 94 # Subdomain-Liste 95 sql "SELECT replace(domain,'.$domain','') as subdomain FROM domain WHERE domain like '%.$domain' order by subdomain"|while read subdomain; do 96 subdomain_rpad=`echo -n $subdomain|sed -e :a -e 's/^.\{1,20\}$/& /;ta'` # Subdomain 24-stellig aufgefuellt mit Leerzeichen 97 echo "$subdomain_rpad IN A $DNS_SERVER_IPV4" >> $ZONEFILE 98 echo "$subdomain_rpad IN AAAA $DNS_SERVER_IPV6" >> $ZONEFILE 99 100 # Hat die Subdomain Mailboxen oder Aliases? Falls ja, dann MX-Eintrag ergänzen 101 count_mailboxes=`sql "select sum(c) FROM 102 ( select count(*) as c from mailbox WHERE domain='$subdomain.$domain' union all 103 select count(*) as c FROM alias WHERE domain='$subdomain.$domain' ) as counts"` 104 105 if [ "$count_mailboxes" -gt 0 ]; then 106 echo "$subdomain_rpad IN MX 10 $DNS_MX_HOST1." >> $ZONEFILE 107 echo "$subdomain_rpad IN MX 20 $DNS_MX_HOST2." >> $ZONEFILE 108 fi 109 110 done 111 echo "" >> $ZONEFILE 112 113 114 115 # Änderung Einchecken 116 hg -R $DNS_ZONEDIR diff $ZONEFILE 117 hg -R $DNS_ZONEDIR add $ZONEFILE 118 hg -R $DNS_ZONEDIR commit -u `whoami`/$0 -m "Zonefile $ZONEFILE changed from Cron" $ZONEFILE 119 120 # Zonefile im Bind neu laden 121 rndc reload 122 rndc status 123 fi 124 125 done 126
Download update_dns
History Tue, 15 Aug 2017 00:55:03 +0200 dankert DNS-Adressen aus der Konfiguration lesen Mon, 14 Aug 2017 21:58:19 +0200 dankert IPv6 records Wed, 24 Feb 2016 21:30:16 +0100 dankert Update in das SCM Mon, 22 Feb 2016 22:32:54 +0100 dankert Initiale Version seit der Umstellung auf Datenbank-gebriebene Konfiguration