#!/bin/bash
# Script zum Einfuegen vieler DNS Eintraege anhand einer Liste
# (c) 2016 Stefan Schaefer - invis-server.org

# License: GPLv3
# Dieses Programm ist freie Software. Sie können es unter den Bedingungen der 
# GNU General Public License, wie von der Free Software Foundation veröffentlicht,
# weitergeben und/oder modifizieren, entweder gemäß Version 3 der Lizenz oder
# (nach Ihrer Option) jeder späteren Version.

# Die Veröffentlichung dieses Programms erfolgt in der Hoffnung, daß es Ihnen
# von Nutzen sein wird, aber OHNE IRGENDEINE GARANTIE, sogar ohne die implizite 
# Garantie der MARKTREIFE oder der VERWENDBARKEIT FÜR EINEN BESTIMMTEN ZWECK. 
# Details finden Sie in der GNU General Public License.

# Sie sollten ein Exemplar der GNU General Public License zusammen mit diesem 
# Programm erhalten haben. Falls nicht, siehe <http://www.gnu.org/licenses/>. 

#Konfigurationsdaten
conffile="/etc/invis/invis.conf"
confdir="/etc/invis"
passfile="/etc/invis/invis-pws.conf"

# Funktionen
# Werte aus Konfigurationsdatendatei extrahieren
# $1 = Konfigurationsdatei, $2 = Parameter, $3 Wert (Feld)
getconfdata() {
    cat $1 |grep "$2" | cut -d ":" -f $3
}

# Importliste
liste="$1"


# Pruefen, ob eine Liste genannt wurde
if [[ -z $liste ]]; then
    echo "Bitte den Pfad zur Host-Liste angeben."
    echo "hostadd2ad /pfad/zur/liste.txt"
    exit
fi

# Daten aus Konfiguration holen
basedn=`getconfdata $conffile "baseDN" "2"`
fwzone=`getconfdata $conffile "intDomain" "2"`
revzone=`getconfdata $conffile "revDomain" "2"`
server=`getconfdata $conffile "ldapHost" "2"`
user="ldap.admin"
pw=`getconfdata $passfile "LDAPAdminPW" "2"`

mask=`ifconfig intern |grep Mask |cut -d ":" -f4`
maskcidr=`netcalc $mask`

case $maskcidr in
    24)
	fields="4"
	;;
    16)
	fields="3-4"
	;;
    8)
	fields="2-4"
	;;
esac

# dhcphostfile
dhcphostfile="/tmp/dhcphost.ldif"

# IFS auf Zeilenumbruch umstellen
IFS=$'\n'

# Liste verarbeiten.
for entry in `cat $liste`; do
    echo "----------------"
    # Verwendung samba-tool DNS
    # samba-tool dns add <server> <zone> <name> <A|AAAA|PTR|CNAME|NS|MX|SRV|TXT> <data>
    # PTR Record hinzufuegen
    type="PTR"
    hname=`echo $entry |cut -d "," -f3`
    name=`echo $entry |cut -d "," -f2 | cut -d "." -f$fields`
    case $maskcidr in
	24)
	    echo "dns add $server $revzone $name $type $hname.$fwzone. -U $user --password=$pw"
	    samba-tool dns add $server $revzone $name $type $hname.$fwzone. -U $user --password=$pw
	    ;;
	16)
	    name1=`echo $name |cut -d "." -f2`
	    name2=`echo $name |cut -d "." -f1`
	    echo "dns add $server $revzone $name1.$name2 $type $hname.$fwzone. -U $user --password=$pw"
	    samba-tool dns add $server $revzone $name1.$name2 $type $hname.$fwzone. -U $user --password=$pw
	    ;;
	8)
	    name1=`echo $name |cut -d "." -f3`
	    name2=`echo $name |cut -d "." -f2`
	    name3=`echo $name |cut -d "." -f1`
	    echo "dns add $server $revzone $name1.$name2.$name3 $type $hname.$fwzone. -U $user --password=$pw"
	    samba-tool dns add $server $revzone $name1.$name2.$name3 $type $hname.$fwzone. -U $user --password=$pw
	    ;;
    esac

    # A-Record hinzufuegen
    type="A"
    name=`echo $entry |cut -d "," -f3 | cut -d "." -f3`
    ip=`echo $entry |cut -d "," -f2`
    samba-tool dns add $server $fwzone $name $type $ip -U $user --password=$pw
    echo dns add $server $fwzone $name $type $ip -U $user --password=$pw

    # DHCP Record hinzufuegen
    mac=`echo $entry |cut -d "," -f1`
    comment=`echo $entry |cut -d "," -f4`
    # temporaere LDIF Datei erzeugen
    echo "dn: CN=$hname,CN=DHCP Config,CN=DHCP-Server,CN=invis-server,$basedn" > $dhcphostfile
    echo "iscDhcpHWAddress: ethernet $mac" >> $dhcphostfile
    echo "objectClass: top" >> $dhcphostfile
    echo "objectClass: iscDhcpHost" >> $dhcphostfile
    echo "iscDhcpStatements: fixed-address $ip" >> $dhcphostfile
    echo "cn: $hname" >> $dhcphostfile
    echo "iscDhcpComments: $comment" >> $dhcphostfile
    # LDIF ausgeben
    cat $dhcphostfile
    # Eintrag anlegen
    ldbadd -v -H /var/lib/samba/private/sam.ldb $dhcphostfile
done
