#!/bin/bash
# Script zum schnellen Anlegen neuer DNS-Zonen.
# Version: 0.5
# (C) 2010 invis-server.org
# Author: Stefan Schäfer <stefan@invis-server.org>
# Questions: http://forum.invis-server.org
# License: GPLv3

## Globale Variablen
rootpackdir="/etc/rootpack"
rootpackconfig="$rootpackdir/rootpack.cfg"

# Eigene IP-Adresse ermitteln
myip=$(ifconfig eth0|grep "inet Adr"|tr -s " " | cut -d ":" -f2 | cut -d " " -f1)

## Funktionen
usage() {
    echo "-------------------------------------------------------------------------------------"
    echo "Übergeben Sie diesem Script die Domain der neuen Zone und den Usernamen des Besitzers"
    echo
    echo "Beispiel: \$> mkzone example.com username"
    echo "-------------------------------------------------------------------------------------"
}

# Konfigurationsparameter tauschen
changevalues() {
    # Arg1 = Pfad, Arg2 = Datei, Arg3 = sed String
    cat $1/$2|sed "s%$3%g" > $1/$2.new
    mv $1/$2.new $1/$2
}

getconfvalue() {
    cat $rootpackconfig | grep "$1:" | cut -d ":" -f 2
}

# Templates fuer Zonenkonfiguration
zonedeftemplate=$(getconfvalue ZoneDefTemplate)
#echo $zonedeftemplate
zoneconftemplate=$(getconfvalue ZoneConfTemplate)
#echo $zoneconftemplate
# Verzeichnis der Zonendateien
zonedir=$(getconfvalue ZoneDir)
#echo $zonedir

# Bildschirm putzen
clear

# Domain angegeben?
if [[ -z $1 || -z $2 ]]; then
    usage
    exit
else
    # Domain
    domain=$1
    zowner=$2
fi

# Testen, ob der Kunde/User existiert, wenn nicht -> Hinweis & Script beenden.
if [[ -z $(ls $rootpackdir/kunden/ | grep "$zowner-") ]]; then
    echo -e "Der angegebene Username: $zowner existiert nicht.\nBitte legen Sie ihn zunächst mit dem Script \"mkcustomer\" an."
    exit
fi

# Testen, ob die Zone bereits existiert, wenn nicht -> dann anlegen.
# Erst alle zugehoerigen Einträge aus dem cache werfen -- ist wichtig, wenn die Zone schon mal existierte
rndc flushname $domain

if [[ -n $(dig @localhost $domain +short) ]]; then
    nameservers=($(dig @localhost $domain ns +short))
    oldifs=$IFS
    IFS=$'\n'
    for nameserver in ${nameservers[*]}; do
	#echo $nameserver
	if [[ $myip == $(dig @localhost $nameserver +short) ]]; then
	    echo "Die Zone $domain ist bereits angelegt."
	    exit
	else
	    nozone=2
	fi
    done
    IFS=$oldifs
else
    nozone=1
fi

# Domain übernehmen?
if [[ $nozone == "2" ]]; then
    echo -e "Die Domain $domain ist bereits anderweitig registriert,\nsetzen Sie dieses Script nur fort, wenn Sie berechtigt sind\ndiese zu übernehmen!\n"
    echo -e "Zur berechtigten Übernahme der Domain müssen Sie entweder\nderen rechtmäßiger Besitzer sein, oder eine gültigen\nKK-Antrag vorliegen haben.\n"
    # Solange Fragen bis endlich das richtige eingegeben wurde
    until [[ $yesno =~ [j,n] ]]; do
	read -p "Möchten Sie die Domain $domain übernehmen [j/n]: " yesno
    done
    
    if [[ $yesno == "j" ]]; then
	nozone=1
    fi
fi

if [[ $nozone == "1" ]]; then

    # Vorlage für neue Zonenkonfiguration kopieren
    cp $zoneconftemplate /etc/named.d/zones/$domain.conf
    
    # Vorlage für neue Zonendefinition kopieren
    cp $zonedeftemplate $zonedir/$domain.zone

    # Zonenkonfiguration an Domain anpassen
    path="/etc/named.d/zones"
    file="$domain.conf"
    string="domain.tld%$domain"
    changevalues $path $file "$string"

    string="domain.zone%$domain.zone"
    changevalues $path $file "$string"
    
    ## Zone anpassen
    # IP Adresse des Default Webservers ermitteln
    #wsip=$(dig $(cat $rootpackdir/kunden/$zowner-*| grep ^Webserver|tr "\t" " "| tr -s " "| cut -d ":" -f2) +short)
    webserver=`getconfvalue DefaultWebserver`
    wsip=`dig $webserver +short`
    
    if [[ `echo $wsip | grep "root-servers"` ]]; then
	wsip="0.0.0.0"
    fi
    
    # Zonendefinition an Domain anpassen
    path="$zonedir"
    file="$domain.zone"

    dnsserver=$(hostname -f)
    dnsip=$(dig $dnsserver A +short)
    
    string="ns1.dnsserver.tld%$dnsserver"
    echo $string
    changevalues $path $file "$string"

    string="1.1.1.1%$dnsip"
    echo $string
    changevalues $path $file "$string"

    string="domain.tld%$domain"
    echo $string
    changevalues $path $file "$string"
    
    string="0.0.0.0%$wsip"
    echo $string
    changevalues $path $file "$string"
    
    # Zone in die include-Datei eintragen
    echo "include \"/etc/named.d/zones/$domain.conf\";" >> /etc/named.zones.include
    # Nameserver neu laden
    systemctl restart named.service
    
    # Domain in die Kundendatei eintragen
    echo -e "$domain" >> $rootpackdir/kunden/$zowner-*.info
fi
