isp-tools

git clone http://git.code.weiherhei.de/isp-tools.git
Log | Files | Refs | README

update_dns (4534B)


      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