isp-tools

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

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