commit cb9a66725360d35c795f045ef493ca9f53acb277
Author: dankert <devnull@localhost>
Date: Mon, 22 Feb 2016 22:32:54 +0100
Initiale Version seit der Umstellung auf Datenbank-gebriebene Konfiguration
Diffstat:
update_dns | | | 121 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
update_httpd | | | 93 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
update_mta | | | 40 | ++++++++++++++++++++++++++++++++++++++++ |
3 files changed, 254 insertions(+), 0 deletions(-)
diff --git a/update_dns b/update_dns
@@ -0,0 +1,121 @@
+#!/bin/bash
+
+# Erzeugt nach Bedarf neue Zonendateien für den Nameserver.
+# Aus der Datenbank werden die Domain-Informationen geladen und daraus die Zonefiles geschrieben.
+
+# Konfiguration:
+
+# Bind9-Verzeichnis mit Zonen
+ZONEDIR=/etc/bind/db.d
+ALL_ZONES_FILE=/etc/bind/db.d/named.conf.local
+
+# Datenbank
+MYSQL_USER=cron
+MYSQL_PASSWORD=twGeL8nKbECs5aKU
+MYSQL_DATABASE=verwaltung
+
+if [ ! -d $ZONEDIR/.hg ]; then
+ hg -R $ZONEDIR init
+fi
+
+function sql {
+ sql=$1
+ mysql -u $MYSQL_USER -p$MYSQL_PASSWORD -se "$sql" $MYSQL_DATABASE
+}
+
+
+last_domain_modified=`sql "SELECT max(unix_timestamp(modified)) FROM domain WHERE domain REGEXP('^[a-z0-9-]+\..[a-z]+\$') and active=1"`
+last_file_modified=`stat --format %Y $ALL_ZONES_FILE`
+
+if [ "$last_domain_modified" -gt "$last_file_modified" ]; then
+
+ echo "" > $ALL_ZONES_FILE
+ sql "SELECT domain FROM domain WHERE domain REGEXP('^[a-z0-9-]+\..[a-z]+\$') and active=1"|while read domain; do
+ cat >> $ALL_ZONES_FILE <<EOF
+
+zone "$domain" {
+ type master;
+ file "$ZONEDIR/db.$domain";
+};
+EOF
+ done
+
+ # Änderung Einchecken
+ hg -R $ZONEDIR diff $ALL_ZONES_FILE
+ hg -R $ZONEDIR add $ALL_ZONES_FILE
+ hg -R $ZONEDIR commit -u `whoami`/$0 -m "Master-Zonefile $ZONEFILE changed from Cron" $ALL_ZONES_FILE
+
+fi
+
+
+sql "SELECT domain FROM domain WHERE domain REGEXP('^[a-z0-9-]+\..[a-z]+\$') and active=1"|while read domain; do
+
+ #echo "Domain: $domain"
+ last_modified=`sql "SELECT max(unix_timestamp(modified)) FROM domain WHERE domain like '%.$domain' OR domain='$domain'"`
+
+
+ ZONEFILE=$ZONEDIR/db.$domain
+ if [ -f $ZONEFILE ]; then # Zonefile schon vorhanden?
+ modified=`stat --format %Y $ZONEFILE`
+ else
+ modified=0 # Noch kein Zonefile vorhanden
+ fi
+
+ # Ist das letzte Datum aus der Datenbank größer als das Änderungsdatum des Zonefiles?
+ if [ "$last_modified" -gt "$modified" ]; then
+ echo "Zonefile $ZONFILE wird aktualisiert (Letzte Änderung der Datei: $modified, Letzte Änderung in Datenbank: $last_modified"
+ serial=`date --date @$last_modified +"%Y%m%d%H"` # Seriennummer, eindeutig pro Stunde
+
+
+ cat > $ZONEFILE <<ZEOF
+;
+; Domain: $domain
+;
+\$TTL 2H
+@ IN SOA ns1.jdhh.de. root.ns1.jdhh.de. $serial 86400 10800 1209600 57600
+ IN NS ns1.jdhh.de.
+ IN NS nsb3.schlundtech.de.
+ IN MX 10 mail.jdhh.de.
+ IN MX 20 mail02.jdhh.de.
+ IN A 85.214.76.132
+ IN TXT "v=spf1 a mx -all"
+ZEOF
+
+ # Hat die Domain Mailboxen? Falls ja, dann MX-Eintrag ergänzen
+ count_mailboxes=`sql "SELECT count(*) FROM mailbox WHERE domain='$domain'"`
+ if [ "$count_mailboxes" -gt 0 ]; then
+ echo " IN MX 10 mail.jdhh.de." >> $ZONEFILE
+ echo " IN MX 20 mail02.jdhh.de." >> $ZONEFILE
+ fi
+
+ # Subdomain-Liste
+ sql "SELECT replace(domain,'.$domain','') FROM domain WHERE domain like '%.$domain' "|while read subdomain; do
+ echo -n $subdomain|sed -e :a -e 's/^.\{1,20\}$/& /;ta' >> $ZONEFILE # 24-stellig aufgefuellt mit Leerzeichen
+ echo "IN A 85.214.76.132" >> $ZONEFILE
+
+ # Hat die Subdomain Mailboxen? Falls ja, dann MX-Eintrag ergänzen
+ count_mailboxes=`sql "SELECT count(*) FROM mailbox WHERE domain='$subdomain'"`
+ if [ "$count_mailboxes" -gt 0 ]; then
+ echo -n $subdomain|sed -e :a -e 's/^.\{1,20\}$/& /;ta' >> $ZONEFILE # 24-stellig aufgefuellt mit Leerzeichen
+ echo " IN MX 10 mail.jdhh.de." >> $ZONEFILE
+ echo -n $subdomain|sed -e :a -e 's/^.\{1,20\}$/& /;ta' >> $ZONEFILE # 24-stellig aufgefuellt mit Leerzeichen
+ echo " IN MX 20 mail02.jdhh.de." >> $ZONEFILE
+ fi
+
+ done
+ echo "" >> $ZONEFILE
+
+
+
+ # Änderung Einchecken
+ hg -R $ZONEDIR diff $ZONEFILE
+ hg -R $ZONEDIR add $ZONEFILE
+ hg -R $ZONEDIR commit -u `whoami`/$0 -m "Zonefile $ZONEFILE changed from Cron" $ZONEFILE
+
+ # Zonefile im Bind neu laden
+ rndc reload
+ rndc status
+ fi
+
+done
+
diff --git a/update_httpd b/update_httpd
@@ -0,0 +1,93 @@
+#!/bin/bash
+
+# Erzeugt die Virtual-Host-Konfigurationen für den Apache-Webserver.
+#
+# Über ein Python-Skript werden die Dateien erzeugt. Falls diese von den
+# aktuellen Dateien abweichen, werden diese einzeln kopiert und dabei
+# versioniert.
+
+# Apache-Konfigurationsverzeichnis
+VHOSTDIR=/etc/apache2/sites.d
+
+# Temporaeren Ordner erzeugen
+TEMPDIR=`tempfile --prefix=ldap2zone`
+rm $TEMPDIR
+mkdir $TEMPDIR/
+
+# Ordner für "nobody" beschreibbar machen
+chown nobody $TEMPDIR
+
+# LDAP auslesen und VHOST-Dateien erzeugen
+su nobody --command="/usr/local/bin/ldap2vhost \
+ --dn=cn=ldap2dns,ou=batch,ou=users,dc=ds,dc=jandankert,dc=de \
+ -p ldap2dns \
+ --base=ou=dns,dc=ds,dc=jandankert,dc=de \
+ --output-dir=$TEMPDIR"
+
+reload=false
+
+for f in $TEMPDIR/*; do
+ f=`basename $f`
+
+
+ # Datei geaendert? Dann kopieren und dabei Backupfile erzeugen
+ if [ ! -f $VHOSTDIR/$f -o ! `diff -q $TEMPDIR/$f $VHOSTDIR/$f|wc -l` = "0" ]; then
+ reload=true
+ echo "Apache-VHOST ist geaendert oder neu: $VHOSTDIR/$f"
+ diff $VHOSTDIR/$f $TEMPDIR/$f
+ cp -v --backup=t $TEMPDIR/$f $VHOSTDIR/$f
+ fi
+done
+
+# Temporären Ordner löschen
+rm -r $TEMPDIR
+
+# Testen, ob alle DocumentRoot vorhanden sind
+for f in `find /etc/apache2/sites.d/ -regex .+[a-z]$`; do
+ for dc in `grep DocumentRoot $f|cut -f 4 -d " "`; do
+ if [ ! -d $dc ]; then
+ echo "DocumentRoot $dc does not exist"
+ mkdir -v $dc
+ user=`echo $dc|cut -f 3 -d "/"`
+ echo User $user
+ chown -v $user:$user $dc
+ fi
+ done
+done
+
+
+# Testen, ob alle AccessLog/ErrorLog vorhanden sind
+for f in `find /etc/apache2/sites.d/ -regex .+[a-z]$`; do
+ for lf in `egrep "(CustomLog|ErrorLog)" $f|cut -f 4 -d " "`; do
+ ldir=`dirname $lf`
+ if [ ! -d $ldir ]; then
+ echo "Ausgabeordner $ldir does not exist"
+ mkdir -v $ldir
+ fi
+ done
+done
+
+# Apache-Webserver muss Konfiguration neu laden
+if $reload; then
+ if [ ! `apache2ctl -t|grep "Syntax OK"|wc -l` = "0" ]; then
+ echo "Apache-Konfiguraton ist fehlerhaft! Kein Restart."
+ apache2ctl -t
+ else
+ echo "Apache-Konfiguration ist OK."
+ echo "Reloading Apache Webserver."
+ apache2ctl restart
+ fi
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/update_mta b/update_mta
@@ -0,0 +1,40 @@
+#!/bin/bash
+
+# Datenbank
+MYSQL_USER=cron
+MYSQL_PASSWORD=twGeL8nKbECs5aKU
+MYSQL_DATABASE=verwaltung
+
+function sql {
+ sql=$1
+ mysql -u $MYSQL_USER -p$MYSQL_PASSWORD -se "$sql" $MYSQL_DATABASE
+}
+
+
+
+function create_map {
+ mapfile=/etc/postfix/ldap/$1
+ sql=$2
+ echo "# AUTO-GENERATED - DO NOT CHANGE!" > $mapfile
+ sql "$sql"|while read key value; do
+ echo $key $value >> $mapfile
+ done
+ echo "" >> $mapfile
+
+ #hg diff
+ hg add $mapfile
+ hg commit -u `whoami` -m "Updating Postfix configuration in $mapfile" $mapfile
+ /usr/sbin/postmap $mapfile
+}
+
+
+
+create_map transport "select distinct domain,'virtual:' from mailbox where active=1"
+create_map aliases "select address,goto from alias where active=1"
+create_map sender "select concat(local_part,'@',domain),concat(local_part,'@',domain) from mailbox where active=1"
+create_map virtualforward "select '# n/a','' from mailbox where active=1"
+create_map accounts "select concat(local_part,'@',domain) , concat(maildir,'/') from mailbox where active=1"
+create_map accountsmap "select concat(local_part,'@',domain) , concat(local_part,'@',domain) from mailbox where active=1"
+create_map recipient_reject "select concat(local_part,'@',domain), 'REJECT' from mailbox where active=0"
+
+postfix reload