#!/bin/bash
# invis AD 10.3 Server Setup Script
# Version 1.04
# (c) August 2008 Stefan Schäfer / FSP Computer & Netzwerke
# (c) 2009-2015 Stefan Schäfer / invis-server.org / stefan@invis-server.org
# (c) 2013,2014 Dimitri Asarowski / invis-server.org / dimitri@invis-server.org
# (c) 2013-2015 Ingo Göppert / invis-server.org / ingo@invis-server.org

# License: GPLv3
# Questions: info@invis-server.org

# Dieses Script führt alle zur Installation eines invis Servers AD notwendigen 
# Konfigurationsschritte aus.
# Das Script sine nutzt /var/lib/sine als Arbeitsverzeichnis, hier sind von sine
# verwendete Kontroll-, Variablen- und Protokolldateien zu finden.

# 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/>. 

# Setup-Verzeichnis einlesen
setupdir="/var/lib/sine"
cfilesdir="/usr/share/doc/packages/invisAD-setup/examples"

invisversion="10.3"

# Setup-Dialog Titel
dialogtitle="invis AD Server $invisversion Setup"
dialogshorthelp="Cursor- ([Auf]/[Ab]) und Tabulatortaste zur Navigation, Leertaste zum auswählen und Enter-Taste zum Bestätigen verwenden."

# zentrales invis Konfigurationsverzeichnis anlegen & Konfig-Datei kopieren
confdir="/etc/invis"
if [[ ! -d $confdir ]]; then
    chown -R root:root $confdir/invis.conf
    chmod 0640 $confdir/invis.conf

    chown root:root $confdir/invis-pws.conf
    chmod 0600 $confdir/invis-pws.conf
fi

if [[ -d $cfilesdir ]]; then
    if [[ ! -f $setupdir/prepstat ]]; then
	echo "check" > $setupdir/prepstat
    fi
else
	echo "Die Konfigurationsdateien sind nicht vorhanden!"
	exit
fi

# Testen, ob es sich um ein 64Bit-System handelt.
if [[ -d /usr/lib64 ]]; then
    libdir="/usr/lib64"
else
    libdir="/usr/lib"
fi

# Funktionen
# Werte aus Konfigurationsdatendatei extrahieren
getconfdata() {
    cat $setupdir/invis_confdata |grep "$1:" | cut -d ":" -f $2
}

# 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
}

writeprepstat() {
	read -a prepstat < $setupdir/prepstat
	if [[ $prepstat != "ready" ]]; then
		echo "$1" > $setupdir/prepstat
	fi
}
# Strings in Kleinschreibung umwandeln
tolower() {
    echo $1 | tr [:upper:] [:lower:]
}

yesno() {
    # Argument $1 = Fragetext $2 = Dialogtitel
    dialog --backtitle "$dialogtitle" --title "$2" --yesno "$1" 0 0
}

textbox() {
    # Argument $1 = Ausgabedatei $2 = Dialogtitel $3 = Exit-Label
    if [[ -z $3 ]]; then
        dialog --backtitle "$dialogtitle" --title "$2" --textbox "$1" 0 0
    else
	dialog --backtitle "$dialogtitle" --title "$2" --exit-label "$3" --textbox "$1" 0 0
    fi
}

msgbox() {
    # Argument $1 = Ausgabedatei $2 = Dialogtitel
    dialog --backtitle "$dialogtitle" --title "$2" --msgbox "$1" 0 0
}

pgbox() {
    dialog --sleep 2 --backtitle "$dialogtitle" --title "$windowtitle" --progressbox  "$pgsubtitle" 25 110
}

waitbox() {
    # Fortschrittsbalken
    i=0

    { while [ $i -lt 50 ]; do
	(( i=$i+1 ))
	echo $(( $i * 100 / 50 ))
	sleep 0.1
    done } | dialog --backtitle "$dialogtitle" --title "Modul \"$1\" abgeschlossen" --gauge "Sie haben ca. 5 Sekunden Zeit um das Setup-Script mit \"Strg+C\" abzubrechen. Beim nächsten Aufruf wird sine mit Modul \"$2\" fortgesetzt." 8 70 0
}

waitinfobox() {
    # Fortschrittsbalken
    i=0

    { while [ $i -lt 70 ]; do
	(( i=$i+1 ))
	echo $(( $i * 100 / 70 ))
	sleep 0.1
    done } | dialog --backtitle "$dialogtitle" --title "$2" --gauge "$1" 12 70 0
}

zyppercheck() {
    # Argument $1 = Exit Corde
    if (( $1 == 104 )); then
	textbox "$setupdir/infofiles/zypper104.txt" "Zypper hat einen Fehler bei der Software-Installation gemeldet"
	exit 1
    elif (( $1 != 0 )); then 
	textbox "$setupdir/infofiles/zypperunex.txt" "Zypper hat einen Fehler bei der Software-Installation gemeldet"
	exit 1
    fi
}

chkservice() {
    systemctl --system daemon-reload
    case "$2" in
    "d")
	pgsubtitle="$1-Daemon wird aus der Runlevelkonfiguration entfernt"
	if [[ ! -f "/etc/init.d/$1" ]]; then
	    systemctl disable $1.service 2>&1| tee -a $setupdir/sine.log | pgbox
	else
    	    chkconfig --del "$1" 2>&1| tee -a $setupdir/sine.log | pgbox
    	fi
	pgsubtitle="$1-Daemon wird gestoppt"
    	service "$1" stop 2>&1| tee -a $setupdir/sine.log | pgbox
    	;;
    "r")
	pgsubtitle="$1-Daemon wird neu geladen."
	if [[ ! -f "/etc/init.d/$1" ]]; then
	    systemctl reload $1.service 2>&1| tee -a $setupdir/sine.log | pgbox
	else
    	    service "$1" reload 2>&1| tee -a $setupdir/sine.log | pgbox
    	fi
    	;;
    "")
	pgsubtitle="$1-Daemon wird neu gestartet"
	if [[ ! -f "/etc/init.d/$1" ]]; then
	    if [[ `systemctl is-enabled "$1.service"` != "enabled" ]]; then
		systemctl enable $1.service 2>&1| tee -a $setupdir/sine.log | pgbox
	    fi
	    systemctl restart $1.service 2>&1| tee -a $setupdir/sine.log | pgbox
	else
	    if [[ `chkconfig $1 |tr -s " "|cut -d " " -f 2` == "off" ]]; then
		chkconfig -a $1 2>&1| tee -a $setupdir/sine.log | pgbox
	    fi
    	    if [[ $1 != "avguard" ]]; then
    		service "$1" restart 2>&1| tee -a $setupdir/sine.log | pgbox
    	    else
    		service "$1" restart
    	    fi
	fi   
	;;
esac
}

# Passwoerter sicher aendern
smbadpw() {
    ok=0
    while (( $ok != "1" ));do
	dialog --backtitle "$dialogtitle" --title "Benutzer Passwort ändern" --insecure --passwordform "$dialogshorthelp\n\n
Geben Sie das Passwort für Benutzer $1 ein.\n\n
Das vergebene Passwort muss mindestens 7 Zeichen lang sein, Zahlen und Sonderzeichen enthalten." 17 64 2 \
	"Benutzer Passwort:" 2 2 "" 2 23 10 0\
	"Kontrolle:" 2 36 "" 2 47 10 0\
	2>$setupdir/sine_temp
	usersecrets=(`cat $setupdir/sine_temp`)

	    if [[ ${usersecrets[0]} == ${usersecrets[1]} ]] && (( ${#usersecrets[0]} >= 7 ));then
		ok=1
	    fi
    done
    newpw="${usersecrets[0]}"

    samba-tool user setpassword $1 --newpassword="$newpw"
}

revzone() {
	localip=$(hostname -i)
	netmask=$(ifconfig intern | grep ask| cut -d ":" -f4)
	netbase=($(ipcalc -b $localip/$netmask |grep Network|tr -s " "|cut -d " " -f 2|cut -d '/' -f1| tr "." " "))
	for wert in ${netbase[*]}; do
	    #echo "$wert -"
	    if [[ $wert == 0 ]]; then
		revzone=$revzone
	    else
		revzone=$wert.$revzone
	    fi
	done
	echo "$revzone""in-addr.arpa"
}


# Installationsvoraussetzungen prüfen
check() {
    dialog --backtitle "$dialogtitle" --title "Installationvoraussetzungen" --exit-label "Weiter" --textbox "$setupdir/infofiles/setuprequires.txt" 0 0 --and-widget --backtitle "$dialogtitle" --title "Installationvoraussetzungen"  --defaultno --yesno "Sind alle Voraussetungen erfüllt?" 0 0
    prepok=${?}

    if [[ $prepok == "0" ]]; then
	windowtitle="Software Installation"
	msgbox "Es wird alle für den invis Server benötigte Software installiert." "Software Installation"
	# Schlüssel der neuen Repositories importieren
	rpmkeyimporter
        ## zypper repo-Cache aktualisieren und Update fahren
        pgsubtitle="Repository-Cache wird aktualisiert"
        zypper refresh 2>&1| tee -a $setupdir/sine.log | pgbox
        zyppercheck ${PIPESTATUS[0]}
        pgsubtitle="Online Update wird durchgeführt" 
        zypper -n up --type package 2>&1| tee -a $setupdir/sine.log | pgbox
        zyppercheck ${PIPESTATUS[0]}
	
	# Postfix aktivieren
	chkservice "postfix"
	
	# Neuere Pakete aus spins_invis Repo beziehen
        pgsubtitle="Distributions-Upgrade wird durchgeführt" 
        zypper -n dup --from spins_invis_common 2>&1| tee -a $setupdir/sine.log | pgbox
        zyppercheck ${PIPESTATUS[0]}

	# Patterns
	pgsubtitle="Software-Gruppen werden installiert" 
	zypper -n install -t pattern `cat $setupdir/zypper-package-lists/invis_schemes` 2>&1 | tee -a $setupdir/sine.log | pgbox
        zyppercheck ${PIPESTATUS[0]}
        # Basis Software
	pgsubtitle="Basis Software wird installiert" 
	zypper -n install -n `cat $setupdir/zypper-package-lists/invis_base` 2>&1| tee -a $setupdir/sine.log | pgbox 25 110 
        zyppercheck ${PIPESTATUS[0]}

	# NTP Dienst wird konfiguriert
	windowtitle="Grundkonfiguration"
	pgsubtitle="Die Systemuhr wird gestellt und Zeit-Server wird gestartet." 
	file="config"
	path="/etc/sysconfig/network"
	strings="NETCONFIG_DNS_POLICY=\"auto\"%NETCONFIG_DNS_POLICY=\"\""
	changevalues $path $file "$strings"
	strings="NETCONFIG_NTP_POLICY=\"auto\"%NETCONFIG_NTP_POLICY=\"\""
	changevalues $path $file "$strings"
	
	cp $cfilesdir/System/ntp/servers-netconfig /var/run/ntp
	
	chkservice "ntp"
        hwclock --systohc

        # cron & at-Daemon in Runlevel integrieren und starten
	chkservice "cron"
	chkservice "atd"

        # Grub2-Konfiguration
        # Eigenes Grub2 Theme installieren
        tar -xf $cfilesdir/grub/invis8.tar.gz -C /boot/grub2/themes/
        
        # Grub2 Konfiguration erstellen
        mv /etc/default/grub /etc/default/grub.opensuse
        cp $cfilesdir/grub/grub /etc/default/
        grub2-mkconfig -o /boot/grub2/grub.cfg  2>&1| tee -a $setupdir/sine.log | pgbox 25 110 

	# Grub2 auf allen Festplattne installieren, die Teil des RAID-Verbundes md0 sind
	if [[ -z `cat /proc/mdstat | grep "md0"` ]]; then
	    for device in `mdadm -D /dev/md0 |grep "/dev/sd" |tr "\t" " "| tr -s " " |cut -d " " -f8 |cut -d "1" -f1`; do
		echo "Grub2 wird im Master-Boot-Record von Festplatte $device installiert." 2>&1| tee -a $setupdir/sine.log | pgbox 25 110
		grub2-install $device 2>&1| tee -a $setupdir/sine.log | pgbox 25 110
	    done
	fi

	# Modul check beendet
        writeprepstat "quest"
	waitbox "check" "quest"

    else
    	msgbox "Erfüllen Sie zunächst alle Voraussetzungen und starten Sie das Script dann erneut" "Installationsvoraussetzungen"
	exit
    fi
}

# Umgebungsdaten abfragen
quest() {
    cd $setupdir
    clear

    # Trennzeichen für Arrays auf \n (Zeilenumbruch setzen.
    oldifs=$IFS
    IFS=$'\n'

    # zentrales invis Konfigurationsverzeichnis anlegen
    textbox "$setupdir/infofiles/setupquestions.txt" "Wir hätten da ein paar Fragen an Sie." "Weiter"

    # Vorgaben ermitteln
    vhn=`hostname -s`
    vdomname=`hostname -d`
    vipaddr=`ifconfig intern|grep "Bcast:"| cut -d ":" -f 2| cut -d " " -f 1`
    vlongnmask=`ifconfig intern|grep "Mask"| cut -d ":" -f 4`
    country="DE"

#---# openSSL
    ok=0
    while (( $ok != "6" ));do
	dialog --backtitle "$dialogtitle" --title "Fragen zur openSSL Umgebung" --form "$dialogshorthelp\n\n
Die eingegebenen Daten sollten der Realität entsprechen, da sie beim Bau von SSL-Zertifikaten verwendet werden.
Vor allem die email-Adresse des für die Zertifikate Verantwortlichen (Feld: Name) muss erreichbar sein.\n\n
Alle Eingaben werden auf Plausibilität geprüft, fehlerhaft ausgefüllte Felder werden geleert." 26 80 10 \
	"Staat:" 2 2 "$country" 2 16 2 2\
	"Bundesland:" 2 24 "$region" 2 38 33 0\
	"Stadt:" 4 2 "$city" 4 16 55 0\
	"Organisation:" 6 2 "$organisation" 6 16 55 0\
	"email:" 8 2 "$admail" 8 16 55 0\
	"Name:" 10 2 "$admin" 10 16 55 0\
	2>$setupdir/sine_temp
	opensslvalues=(`cat "$setupdir/sine_temp"`)
	# Werte prüfen und zuordnen
	if (( ${#opensslvalues[0]} == 2 ));then
	    country="${opensslvalues[0]}"
	    ok=1
	fi

	if (( ${#opensslvalues[1]} >= 3 ));then
	    region="${opensslvalues[1]}"
	    (( ok=$ok + 1 ))
	fi

	if (( ${#opensslvalues[2]} >= 3 ));then
	    city="${opensslvalues[2]}"
	    (( ok=$ok + 1 ))
	fi

	if (( ${#opensslvalues[3]} >= 3 ));then
	    organisation="${opensslvalues[3]}"
	    (( ok=$ok + 1 ))
	fi
	
	if [[ ${opensslvalues[4]} =~ ^[a-zA-Z0-9-]+([._a-zA-Z0-9.-]+)*@[a-zA-Z0-9.-]+\.([a-zA-Z]{2,4}) ]];then
	    admail="${opensslvalues[4]}"
	    (( ok=$ok + 1 ))
	fi

	if (( ${#opensslvalues[5]} >= 5 ));then
	    admin="${opensslvalues[5]}"
	    (( ok=$ok + 1 ))
	fi
	
    done


#---# Netzwerk
    ok=1
    while (( $ok != "0" ));do
	dialog --backtitle "$dialogtitle" --title "Fragen zur Netzwerkumgebung" --form "$dialogshorthelp\n\n
Die Vorgabewerte wurden aus der Systemkonfiguration ermittelt und sollten somit richtig sein. \nPrüfen Sie vor allem,
ob der angezeigte Domänenname aus Domain und Top-Level-Domain besteht; also zweiteilig ist. Domänennamen wie der bei
openSUSE vorgegebene \"site\" bereiten im weiteren Verlauf der invis Server Installation Probleme.\nVerwenden Sie 
keinesfalls eine real existierende Top-Level-Domain wie \".de\" oder \".com\". Statt dessen eigenet sich beispielsweise
\".loc\" (für local).\n\n 
Wenn Sie hier Änderungen vornehmen, müssen Sie diese nachträglich in Ihre Systemkonfiguration übernehmen.\n\n
Achtung: Fehlerhafte Eingaben sind nach der vollständigen Installation nur sehr schwer zu korrigieren." 29 80 5 \
	"Hostname:" 2 2 "$vhn" 2 13 20 0\
	"Domain:" 2 35 "$vdomname" 2 43 27 0\
	"IP (intern):" 4 2 "$vipaddr" 4 13 20 0\
	"Netzwerkmaske:" 4 35 "$vlongnmask" 4 50 20 0\
	2>$setupdir/sine_temp
	netvalues=(`cat $setupdir/sine_temp`)
	
	# Alle Daten ermitteln.
	hn="${netvalues[0]}"
	domain="${netvalues[1]}"
	ipaddr="${netvalues[2]}"
	longnmask="${netvalues[3]}"
	shortnmask=`netcalc $longnmask`
	netaddr=`ipcalc -bn ${netvalues[2]}/$longnmask | grep "^Network:"|tr -s " "| cut -d " " -f2|cut -d "/" -f1`
	bcastaddr=`ipcalc -bn ${netvalues[2]}/$longnmask | grep "^Broadcast:"|tr -s " "| cut -d " " -f2`
	dp1=`echo "$domain" | cut -d "." -f 1`
	dp2=`echo "$domain" | cut -d "." -f 2`
	ldapbase="DC=$dp1,DC=$dp2"
	# Testweise auf volle Domain geaendert -- noch nicht
        smbdomain=`echo $dp1 | tr [a-z] [A-Z]`
        
        # Umgekehrte Netzwerkadresse bilden
        i=0
        while (( $i < 4 )); do
    	    (( feld=$i + 1 ))
    	    if [[ `echo "$longnmask" | cut -d "." -f $feld` != "0" ]];then
		revd[$i]=`echo "$netaddr" | cut -d "." -f $feld`
	    fi
	i=$feld
	done
	
	imax=${#revd[*]}
	i=0
	while (( $i < $imax )); do
	    if (( $i == 0));then
		revnet="${revd[$i]}"
	    else
		revnet="${revd[$i]}.$revnet"
	    fi
	    (( i=$i + 1 ))
	done
	
	yesno "Prüfen Sie bitte genau ob die folgenden Angaben korrekt sind.\n
	\nIP-Adresse(intern):   $ipaddr
	\nNetzwerkbasis:        $netaddr
	\nNetzwerkmaske (lang): $longnmask / (kurz): $shortnmask
	\nBroadcast-Adresse:    $bcastaddr
	\nFQDN:                 $hn.$domain
	\nLDAP Base:            $ldapbase
	\nSamba-Domäne:         $smbdomain
	\n\nSind alle Angaben korrekt?" "Netzwerkdaten"
	
	ok=${?}
    done

# DNS Forwarder
    ok=3
    while (( $ok != "0" ));do
	dialog --backtitle "$dialogtitle" --title "Forward DNS Server" --form "$dialogshorthelp\n\n
Auf Ihrem invis Server wird ein DNS-Dienst eingerichtet. Zur Beschleunigung von DNS Anfragen ist es sinnvoll
diesem bis zu drei \"Forward Nameserver\" zu nennen. Dies können beispielsweise der DNS eines vorgeschalteten
Routers, DNS Server des Internet Zugangs Providers oder unabhängige DNS-Server im Internet sein.\n\n
Achtung:
Prüfen Sie bitte, ob die angegebenen DNS-Server auf Anfragen antworten, da ansonsten sowohl die weitere
Installation, als auch der Betrieb des invis-Servers beeinträchtigt wird.\n\n
Geben Sie midestens eine IP-Adresse ein.\n\n" 28 70 7 \
	"DNS 1:" 2 2 "${fdns[0]}" 2 10 30 0\
	"DNS 2:" 4 2 "${fdns[1]}" 4 10 30 0\
	"DNS 3:" 6 2 "${fdns[2]}" 6 10 30 0\
	2>$setupdir/sine_temp
	fdns=(`cat $setupdir/sine_temp`)
	
	if (( ${#fdns[@]} == 0 )); then
	    continue
	else
	    ok=${#fdns[@]}
	fi
	i=0
	# Pruefen ob die eingegebenen Werte korrekte IP-Adressen sind.
	for dns in ${fdns[@]}; do
	    # IPv4 and IPv6 (full and compressed): ^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3}))|:)))(%.+)?\s*$
	    # IPv4: ^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$
	    if [[ ! $dns =~ ^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$ && ! $dns =~ ^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$ ]]; then
		fdns[$i]=""
		((ok=$ok - 1))
	    fi
	    ((i=$i + 1))
	done
	((ok=${#fdns[@]} - $ok))
    done
    # Forward-String erzeugen
    forwarders=`echo ${fdns[@]} | sed s/" "/"; "/g`";"
#---#System Passwörter
    ok=0

    # MySQL root-Passwort 
    ok=0
    while (( $ok != "1" ));do
	dialog --backtitle "$dialogtitle" --title "MySQL-Root Passwort" --insecure --passwordform "$dialogshorthelp\n\n
Für die Administration des MySQL-Servers muss ein Passwort für den MySQL-Root Zugang gesetzt werden.\n\n
Das vergebene Passwort muss mindestens 6 Zeichen lang sein." 17 64 2 \
	"MySQL-Root-Passwort:" 2 2 "" 2 23 10 0\
	"Kontrolle:" 2 36 "" 2 47 10 0\
	2>$setupdir/sine_temp
	mysqlsecrets=(`cat $setupdir/sine_temp`)

	    if [[ ${mysqlsecrets[0]} == ${mysqlsecrets[1]} ]] && (( ${#mysqlsecrets[0]} >= 6 ));then
		ok=1
	    fi
    done
    mysqlpw="${mysqlsecrets[0]}"

    # Ntop Admin-Passwort 
    ok=0
    while (( $ok != "1" ));do
	dialog --backtitle "$dialogtitle" --title "ntop-Admin Passwort" --insecure --passwordform "$dialogshorthelp\n\n
Für die Administration des ntop-Netzwerkanlysators muss ein Passwort für den ntop-Admin Zugang gesetzt werden.\n\n
Das vergebene Passwort muss mindestens 6 Zeichen lang sein." 17 64 2 \
	"ntop-Admin Passwort:" 2 2 "" 2 23 10 0\
	"Kontrolle:" 2 36 "" 2 47 10 0\
	2>$setupdir/sine_temp
	ntopsecrets=(`cat $setupdir/sine_temp`)

	    if [[ ${ntopsecrets[0]} == ${ntopsecrets[1]} ]] && (( ${#ntopsecrets[0]} >= 6 ));then
		ok=1
	    fi
    done
    ntoppw="${ntopsecrets[0]}"

#---# MAIL & Groupware Server
    ## Dovecot, Cyrus oder Zarafa?
    ## Hier wird es zukuenftig lustig:
    # - Dovecot laesst sich bedingt mit Group-e kombinieren
    # - Dovecot laesst sich mit der Software "Mailbridge" als IMAP-Cache fuer Zarafa verwenden, wird auf jeden Fall getestet
    # - Cyrus und Group-e sind ein gutes Team
    # - Zarafa schließt Cyrus und Group-e aus
    dialog --backtitle "$dialogtitle" --title "MAIL & Groupware Server" --radiolist "$dialogshorthelp\n\n
Wählen Sie die von Ihnen bevorzugte Kombination aus IMAP-Server und Groupware aus." 16 80 7 \
	zarafa "Mailserver/Groupware Kombination für Outlook-Freunde" on\
	roundcube "Webmailer Roundcube in Kombination mit Dovecot." off\
	groupe "Group-e in Kombination mit Cyrus IMAP (not yet with AD)" off\
	sogo "SOGo in Kombination mit Dovecot (not yet with AD)" off\
	2>$setupdir/sine_temp
	whichimap=`cat $setupdir/sine_temp`
    
    if [[ $whichimap == "groupe" ]]; then
	ok=0
	while (( $ok != "1" ));do
	    dialog --backtitle "$dialogtitle" --title "cyrus Admin Passwort" --insecure --passwordform "$dialogshorthelp\n\n
Für die Administration des IMAP-Servers Cyrus muss ein Passwort für den cyrus-Admin Zugang gesetzt werden.\n\n
Das vergebene Passwort muss mindestens 6 Zeichen lang sein." 17 64 2 \
	    "cyrus Passwort:" 2 2 "" 2 23 10 0\
	    "Kontrolle:" 2 36 "" 2 47 10 0\
	    2>$setupdir/sine_temp
	    cyrussecrets=(`cat $setupdir/sine_temp`)

		if [[ ${cyrussecrets[0]} == ${cyrussecrets[1]} ]] && (( ${#cyrussecrets[0]} >= 6 ));then
		    ok=1
		fi
	done
	cyruspw="${cyrussecrets[0]}"
    fi

#---# Samba Pakete - Es muessen zwingend die Sernet-Pakete verwendet werden
#---# Zugangsdaten fuer Sernet-Repo abfragen
    whichsamba="sernet"
    ok=0
    if [[ $whichsamba == "sernet" ]]; then
	while (( $ok != "2" ));do
	    dialog --backtitle "$dialogtitle" --title "Enterprise Samba Zugangsdaten" --form "$dialogshorthelp\n\n
Geben Sie bitte Ihre Zugangsdaten für das Enterprise-Samba Repository ein." 18 74 5 \
	    "Benutzername:" 2 2 "$esusername" 2 20 45 0\
	    "Accesskey:" 4 2 "$esaccesskey" 4 20 45 0\
	    2>$setupdir/sine_temp
	    exitcode=${?}
	    enterprisesambavalues=(`cat $setupdir/sine_temp`)

	    if [[ -n ${enterprisesambavalues[0]} ]] ;then
		esusername="${enterprisesambavalues[0]}"
		(( ok=$ok + 1 ))
	    else
		ok=0
	    fi
	
	    if (( ${#enterprisesambavalues[1]} >= 10 ));then
		esaccesskey=${enterprisesambavalues[1]}
		(( ok=$ok + 1 ))
	    else
		ok=0
	    fi
	done
    fi
    
#---# ERP-Software
    # Es kann zwischen Kivitendo, Wawisoon oder keiner ERP-Software entschieden werden
    dialog --backtitle "$dialogtitle" --title "Enterprise Ressource Planning Software" --radiolist "$dialogshorthelp\n\n
Wählen Sie die von Ihnen bevorzugte ERP-Software (Warenwirtschaftssystem) aus." 14 85 5 \
	Kivitendo "Konzentriert sich auf Handel und Finanzbuchhaltung, wenig modular." off\
	waWision "Moderne ERP Lösung für Handel und Dienstleistung inkl. Webshop-Schnittstelle." on\
	Keine "Sie verwenden ein eigenes System" off\
	2>$setupdir/sine_temp
	whicherp=`cat $setupdir/sine_temp`
	whicherp=`tolower $whicherp`
	
#---# Virenscanner Radiobutton
    dialog --backtitle "$dialogtitle" --title "Virenscanner" --radiolist "$dialogshorthelp\n\n
Wählen Sie den von Ihnen bevorzugten Virenscanner aus. Er wird zum regelmäßen Scannen der Filerserver-Freigaben sowie
aller ein- und ausgehenden emails verwendet.\n\n
Wenn Sie Antivir von Avira auswählen, wird im weiteren Verlauf der Installation eine kostenfreie Lizenz zur privaten
Nutzung von Antivir installiert. Bei gewerblicher Nutzung des Servers muss eine entsprechende Lizenz käuflich erworben
werden.\nClamav hingegen ist zu 100% Open-Source-Software, d.h. dessen Nutzung ist auch im gewerblichen Umfeld kostenfrei." 22 80 8 \
	clamav "Open-Source Virenscanner" on\
	antivir "Kommerzieller Virenscanner von Avira" off\
	2>$setupdir/sine_temp
	av=`cat $setupdir/sine_temp`

#---# Monitoring

    dialog --backtitle "$dialogtitle" --title "Vorbereitung für Server Monitoring" --radiolist "$dialogshorthelp\n\n
Planen Sie Ihren Server durch eine Monitoring Lösung zu überwachen?
Für die Lösungen Icinga, Nagios oder Zabbix können im Verlauf des Setups Vorbereitungen getroffen werden.
\n\n
Welche Lösung möchten Sie einsetzen?\n\n" 18 80 8 \
	nagios "Nagios-Plugins (Icinga & Nagios)" on\
	zabbix "Zabbix-Agent" off\
	keine  "Keine Überwachung" off\
	2>$setupdir/sine_temp
	whichmonitoring=`cat $setupdir/sine_temp`

#---# HTTPS    
    yesno "Soll Ihr invis Server via Internet (HTTPS) erreichbar sein?\n\nVoraussetzung dafür ist ein etwa bei DynDNS.org registrierter Hostname, Zugriff auf einen eigenen DNS Server im Internet oder eine feste IP-Adresse." "HTTPs Zugang"
    exthttps=${?}
    
    if [[ $exthttps == "0" ]]; then
	ok=0
	while [[ $ok != "1" ]]; do
	dialog --backtitle "$dialogtitle" --title "HTTPs Zugang" --inputbox "Geben Sie bitten den vollständigen Namen (FQDN) oder die IP-Adresse ein unter dem/der ihr invis Server erreichbar sein soll." 0 0 \
	2>$setupdir/sine_temp
	exitcode=${?}
	ddnshn=`cat $setupdir/sine_temp`
	
	# Doch noch abbrechen
	if [[ $exitcode == "1" || $exitcode == "255" ]]; then
	    ddnshn="none"
	    break
	fi
	
	if [[ $ddnshn =~ ^[a-zA-Z0-9_\-]{1,254}\.[a-zA-Z0-9_\-]{1,254}+\.?[a-zA-Z0-9_\-]{1,254}+\.[a-zA-Z]{1,5}$ || $ddnshn =~ ^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$ ]] ;then
	    ok=1
	fi
	done
    else
	ddnshn="none"
    fi

#---#SMTP Daten
    yesno "Um Emails zuverlässig versenden zu können werden die Zugangsdaten zum SMTP-Server (Server für ausgehende Mails) Ihres Providers benötigt.\n\nSind Ihnen diese Daten bekannt?\n(Wenn nicht, müssen Sie dies zu einem späteren Zeitpunkt von Hand in den Dateien /etc/postfix/main.cf & sasl_passwd eintragen.)" "SMTP Zugangsdaten"
    bekannt=${?}
    ok=0
    if [[ $bekannt == "0" ]]; then
    while (( $ok != "4" ));do
	dialog --backtitle "$dialogtitle" --title "SMTP Zugangsdaten" --form "$dialogshorthelp\n\n
Geben Sie bitte den Hostnamen bzw. die IP-Adresse Ihres SMTP-Relays, sowie den zuhehörigen Benutzernamen und das Passwort ein." 18 74 9 \
	"Hostname/IP:" 2 2 "$mailserver" 2 20 45 0\
	"Port [25/587]:" 4 2 "$smtpport" 4 20 45 0\
	"Benutzername:" 6 2 "$smtpun" 6 20 45 0\
	"Passwort:" 8 2 "$smtppw" 8 20 45 0\
	2>$setupdir/sine_temp
	exitcode=${?}
	# Doch noch abbrechen
	if [[ $exitcode == "1" || $exitcode == "255" ]]; then
	    mailrelay="none"
	    break
	fi
	
	smtpvalues=(`cat $setupdir/sine_temp`)
	
	if [[ ${smtpvalues[0]} =~ ^[a-zA-Z0-9_\-]{1,254}\.[a-zA-Z0-9_\-]{1,254}+\.?[a-zA-Z0-9_\-]{1,254}+\.[a-zA-Z]{1,5}$ || ${smtpvalues[0]} =~ ^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$ ]] ;then
	    mailserver="${smtpvalues[0]}"
	    (( ok=$ok + 1 ))
	else
	    ok=0
	fi
	
	if (( ${smtpvalues[1]} == 25 || ${smtpvalues[1]} == 587 ));then
	    smtpport=${smtpvalues[1]}
	    (( ok=$ok + 1 ))
	else
	    ok=0
	fi
	
	if (( ${#smtpvalues[2]} > 2 ));then
	    smtpun="${smtpvalues[2]}"
	    (( ok=$ok + 1 ))
	else
	    ok=0
	fi
	
	if (( ${#smtpvalues[3]} > 2 ));then
	    smtppw="${smtpvalues[3]}"
	    (( ok=$ok + 1 ))
	else
	    ok=0
	fi
	done

	if (( $smtpport == 587 )); then
	    mailrelay="[$mailserver]:$smtpport"
	else
	    mailrelay="[$mailserver]"
	fi
	
    else
	mailrelay="none"
    fi

#---# CleanTransfer
    yesno "Auf Ihrem Fileserver wird eine Verzeichnisfreigabe (Transfer) für den allgemeinen Dateiaustausch angelegt.\n\n
Bekanntermaßen häufen sich dort die Datenmengen schnell an und sind größtenteils unstrukturiert. In der Regel fühlt sich niemand 
dafür verantwortlich in besagtem Verzeichnis aufzuräumen.\n\n
Sollen alte Dateien und Verzeichnisse automatisch aus der Transfer-Freigabe gelöscht werden?" "Transferverzeichnis aufräumen"
    cleantr=${?}
    
    if [[ $cleantr == "0" ]]; then
	dialog --backtitle "$dialogtitle" --title "Transferverzeichnis aufräumen" --radiolist "Wie alt dürfen Dateien und Verzeichnisse in der Transferfreigabe maximal werden?" 12 50 4\
	"21 Tage" "3 Wochen" on\
	"42 Tage" "6 Wochen" off\
	"90 Tage" "3 Monate" off\
	2>$setupdir/sine_temp
	trdays=`cat $setupdir/sine_temp|cut -d " " -f1`
    fi

#---# CleanTransfer
    yesno "Auf Ihrem invis-Server werden regelmäßig Sicherung vorhandener Datenbanken und des Wiki-Datenbestandes angelegt.\n\n
Dabei fallen schnell große Datenmengen schnell an. Da jeweils Vollsicherungen angelegt werden, können problemlos ältere 
Sicherungen gelöscht werden.\n\n
Sollen alte Datesicherungen automatisch gelöscht werden?" "Datensicherungen aufräumen"
    cleandasi=${?}
    
    if [[ $cleandasi == "0" ]]; then
	dialog --backtitle "$dialogtitle" --title "Datensicherungen aufräumen" --radiolist "Wie alt sollen interne Datensicherungen maximal werden?" 12 50 4\
	"21 Tage" "3 Wochen" on\
	"42 Tage" "6 Wochen" off\
	"90 Tage" "3 Monate" off\
	2>$setupdir/sine_temp
	dasidays=`cat $setupdir/sine_temp|cut -d " " -f1`
    fi

#   regelmässige Virenscans
    yesno "Sollen Cronjobs für regelmäßige Virenscanns der Fileserver-Verzeichnisse eingerichtet werden?" "Regelmäßige Virenscans der Serverfreigaben"
    avcron=${?}

## Wird dank ownCloud-Integration und Server zu Server sync nicht mehr benoetigt
#    yesno "Soll Ihr Server ein beliebiges Verzeichnis im Hintergrund mit einem ownCloud Konto synchronisieren?" "ownCloud Synchronisation"
#    owncloudsync=${?}

    ok=0
    if [[ $owncloudsync == "0" ]]; then
    ocsyncdir="/srv/shares/media/owncloud"
    while (( $ok != "4" ));do
	dialog --backtitle "$dialogtitle" --title "ownCloud Zugangsdaten" --form "$dialogshorthelp\n\n
Geben Sie bitte den Hostnamen bzw. die IP-Adresse Ihres ownCloud Servers, sowie die zuhehörigen Zugangsdaten ein." 19 74 9 \
	"ownCloud Server:" 2 2 "$ocserver" 2 20 45 0\
	"Sync-Verzeichnis" 4 2 "$ocsyncdir" 4 20 45 0\
	"Benutzername:" 6 2 "$ocusername" 6 20 45 0\
	"Passwort:" 8 2 "$ocpassword" 8 20 45 0\
	2>$setupdir/sine_temp
	exitcode=${?}
	# Doch noch abbrechen
	if [[ $exitcode == "1" || $exitcode == "255" ]]; then
	    break
	fi
	
	ocvalues=(`cat $setupdir/sine_temp`)

	if (( ${#ocvalues[0]} > 0 ));then
	    ocserver=${ocvalues[0]}
	    (( ok=$ok + 1 ))
	else
	    ok=0
	fi

	if (( ${#ocvalues[1]} > 0 ));then
	    ocsyncdir=${ocvalues[1]}
	    (( ok=$ok + 1 ))
	else
	    ok=0
	fi

	if (( ${#ocvalues[2]} > 0 ));then
	    ocusername=${ocvalues[2]}
	    (( ok=$ok + 1 ))
	else
	    ok=0
	fi

	if (( ${#ocvalues[3]} > 0 ));then
	    ocpassword=${ocvalues[3]}
	    (( ok=$ok + 1 ))
	else
	    ok=0
	fi

    done
    fi
#---# Ende der Fragestunde

    sshport=`freeports`
    httpsport=`freeports`
    ocport=`freeports`
    # Doppelte Portbelegung verhindern
    while [[ $sshport == $httpsport ]]; do
	httpsport=`freeports`
    done

    while [[ $ocport == $httpsport || $ocport == $sshport ]]; do
	ocport=`freeports`
    done

    msgbox "Für den externen Zugriff auf Server per SSH oder HTTPS wurden per Zufallsgenerator vom Standard abweichende Ports ermittelt. Dies erhöht die Sicherheit des Servers.\n\n
Notieren Sie sich bitte die folgenden Ports in Ihrem Protokoll:\n\n
SSH Port: $sshport\n\n
HTTPS Port: $httpsport\n\n
ownCloud Port: $ocport\n\n
Aus Ihrem lokalen Netz heraus kann für SSH weiter Port 22 verwendet werden." "SSH und HTTPS Port"

    # Passwort fuer LDAP-Lesezugang erzeugen
    ldappw=`pwgen -s 8 1`

    # Alle Daten in Kontrolldatei Schreiben
    echo "Country:$country" > $setupdir/invis_confdata
    echo "Region:$region" >> $setupdir/invis_confdata
    echo "City:$city" >> $setupdir/invis_confdata
    echo "Organisation:$organisation" >> $setupdir/invis_confdata
    echo "Admail:$admail" >> $setupdir/invis_confdata
    echo "Admin:$admin" >> $setupdir/invis_confdata

    echo "Hostname:$hn" >> $setupdir/invis_confdata
    echo "Domain:$domain" >> $setupdir/invis_confdata
    echo "FQDN:$hn.$domain" >> $setupdir/invis_confdata
    echo "baseDN:$ldapbase" >> $setupdir/invis_confdata
    echo "Workgroup:$smbdomain" >> $setupdir/invis_confdata
    echo "IP:$ipaddr" >> $setupdir/invis_confdata
    echo "Networkbase:$netaddr" >> $setupdir/invis_confdata
    echo "NMask-short:$shortnmask" >> $setupdir/invis_confdata
    echo "NMask-long:$longnmask" >> $setupdir/invis_confdata
    echo "Broadcast:$bcastaddr" >> $setupdir/invis_confdata
    echo "ReverseDom:$revnet" >> $setupdir/invis_confdata
    echo "Forwarders:$forwarders"  >> $setupdir/invis_confdata

    echo "LDAPAdminPW:$ldappw" >> $setupdir/invis_confdata
    echo "MySQLpw:$mysqlpw" >> $setupdir/invis_confdata
    echo "NtopPw:$ntoppw" >> $setupdir/invis_confdata
    echo "IMAPserver:$whichimap"  >> $setupdir/invis_confdata
    if [[ $whichimap == "groupe" ]];then
	echo "CyrusPw:$cyruspw" >> $setupdir/invis_confdata
    fi
    echo "SambaPakete:$whichsamba" >> $setupdir/invis_confdata
    echo "EnterpriseSambaUsername:$esusername" >> $setupdir/invis_confdata
    echo "EnterpriseSambaAccesskey:$esaccesskey" >> $setupdir/invis_confdata

    echo "ERPSoftware:$whicherp" >> $setupdir/invis_confdata

    echo "MonitoringSoftware:$whichmonitoring" >> $setupdir/invis_confdata

    echo "SSHPORT:$sshport" >> $setupdir/invis_confdata
    echo "HTTPSPORT:$httpsport" >> $setupdir/invis_confdata
    echo "OCPORT:$ocport" >> $setupdir/invis_confdata
    
    echo "AV:$av" >> $setupdir/invis_confdata
    if [[ $avcron == "0" ]]; then
        echo "AVCRON:j" >> $setupdir/invis_confdata
    else
	echo "AVCRON:n" >> $setupdir/invis_confdata
    fi
    echo "DDNS:$ddnshn" >> $setupdir/invis_confdata
    if [[ $mailrelay == "none" ]]; then
	echo "SMTPRELAY:$mailrelay" >> $setupdir/invis_confdata 
    else
	echo "SMTPRELAY:$mailrelay" >> $setupdir/invis_confdata 
	echo "SMTPRUN:$smtpun" >> $setupdir/invis_confdata 
	echo "SMTPRPW:$smtppw" >> $setupdir/invis_confdata 
    fi    
    if [[ $cleantr == "0" ]]; then
	echo "cleanTR:j" >> $setupdir/invis_confdata
	echo "TRmaxDays:$trdays" >> $setupdir/invis_confdata
    else
	echo "cleanTR:n" >> $setupdir/invis_confdata
    fi

    if [[ $cleandasi == "0" ]]; then
	echo "cleanDasi:j" >> $setupdir/invis_confdata
	echo "DasimaxDays:$trdays" >> $setupdir/invis_confdata
    else
	echo "cleanDasi:n" >> $setupdir/invis_confdata
    fi

    if [[ $owncloudsync == "0" ]]; then
	echo "ownCloudSync:j" >> $setupdir/invis_confdata
	echo "ownCloudServer:$ocserver" >> $setupdir/invis_confdata
	echo "ownCloudSyncDir:$ocsyncdir" >> $setupdir/invis_confdata
	echo "ownCloudUser:$ocusername" >> $setupdir/invis_confdata
	echo "ownCloudPassword:$ocpassword" >> $setupdir/invis_confdata
    else
	echo "ownCloudSync:n" >> $setupdir/invis_confdata
    fi
    
    writeprepstat "sysprep" 
    waitbox "quest" "sysprep" 

    # Trennzeichenvariable zurück auf alten Wert setzen
    IFS=$oldifs
    
    #Temporaermuell loeschen
    rm -f ./sine_temp
}

# System vorbereiten - Dateien nach /etc/sysconfig kopieren
sysprep() {
    cd $setupdir

    timestamp=`date +%s`
    windowtitle="Systemvorbereitung"
    pgsubtitle="Es wird eine Sicherung des /etc Verzeichnisses ertellt."
    tar -czf $setupdir/etc-backup-$timestamp.tar.gz /etc 2>&1| tee -a $setupdir/sine.log | pgbox

    # /etc/issue anpassen
    opensuseversion=`cat /etc/os-release |grep VERSION=|cut -d = -f2| tr -d "\""`
    mv /etc/issue /etc/issue.old
    mv /etc/issue.net /etc/issue.net.old
    
    echo "Willkommen an invis-Server Active Directory $invisversion auf openSUSE $opensuseversion. \r (\l)." > /etc/issue
    echo "Willkommen an invis-Server Active Directory $invisversion auf openSUSE $opensuseversion. %r (%t)." > /etc/issue.net

    # temporaerer Bugfix fuer sysconf_addword
    # Original wird ueberschrieben
    cp $cfilesdir/../scripts/sysconf_addword /usr/sbin

    # Verzeichnisse in /etc/skel anlegen
    mkdir /etc/skel/Dokumente
    mkdir /etc/skel/Downloads
    mkdir /etc/skel/Bilder
    mkdir /etc/skel/Musik
    mkdir /etc/skel/Videos
    
    ## Virenscanner einrichten

    # Quarantäneverzeichnis anlegen
    mkdir /var/spool/infected
    av=`getconfdata "AV" "2"`
    avcron=`getconfdata "AVCRON" "2"`
    
    # Samba Pakete werden installiert
    pgsubtitle="Die gewählten Samba-Pakete werden installiert"
    sambapackages=`getconfdata "SambaPakete" "2"`
    if [[ $sambapackages == "sernet" ]]; then
	esusername=`getconfdata "EnterpriseSambaUsername" "2"`
	esaccesskey=`getconfdata "EnterpriseSambaAccesskey" "2"`
	path="/etc/zypp/repos.d"
	cp $cfilesdir/zypper/sernet-samba4.repo $path
	file=sernet-samba4.repo
	strings="USERNAME:ACCESSKEY%$esusername:$esaccesskey"
	#echo $strings
	changevalues $path $file $strings
	rpmkeyimporter
        pgsubtitle="Repository-Cache wird aktualisiert"
        zypper refresh 2>&1| tee -a $setupdir/sine.log | pgbox
	# Suse Samba libraries entfernen wegen sssd
        pgsubtitle="openSUSE Samba Pakete werden restlos entfernt"
	zypper -n remove -n `cat $setupdir/zypper-package-lists/smbpacktoremove` 2>&1| tee -a $setupdir/sine.log | pgbox

        pgsubtitle="Sernet Samba Pakete werden installiert"
	zypper -n install -n `cat $setupdir/zypper-package-lists/sernet_samba` 2>&1| tee -a $setupdir/sine.log | pgbox
    else
	zypper -n install -n `cat $setupdir/zypper-package-lists/opensuse_samba` 2>&1| tee -a $setupdir/sine.log | pgbox
    fi
    
    # Links fuer sssd anlegen, startet ansonsten nicht mit den Sernet-Samba Paketen
    libtevent=`find $libdir/samba/ -type f -name "libtevent.so*"`
    libtevent=`basename $libtevent`
    cd $libdir
    ln -s samba/$libtevent libtevent.so.0 2>&1| tee -a $setupdir/sine.log | pgbox
    
    libndr=`find $libdir/samba/ -type f -name "libndr.so*"`
    libndr=`basename $libndr`
    ln -s samba/$libndr libndr.so.0 2>&1| tee -a $setupdir/sine.log | pgbox
    
    # NFS-Server
    pgsubtitle="Zusätzliche Fileserver Software wird installiert" 
    zypper -n install -n `cat $setupdir/zypper-package-lists/fileserver_additional` 2>&1| tee -a $setupdir/sine.log | pgbox 25 110 
    zyppercheck ${PIPESTATUS[0]}

    # Der ausgewählte Virenscanner wird in invis.conf eingetragen
    strings="AV:clamav%AV:$av"
    changevalues $confdir "invis.conf" "$strings"
    
    # Eintragen, ob regelmäßig auf Viren geprüft wird.
    strings="avCheck:j%avCheck:$avcron"
    changevalues $confdir "invis.conf" "$strings"

    pgsubtitle="Der ausgewählte Virenscanner wird installiert.\nAls globales Quarantäneverzeichnis wurde /var/spool/infected angelegt."
    if [[ $av == "clamav" ]]; then 
	zypper -n install -n clamav 2>&1| tee -a $setupdir/sine.log | pgbox
	zyppercheck ${PIPESTATUS[0]}
	cp $cfilesdir/Virenscanner/clamd.conf /etc 	2>&1| tee -a $setupdir/sine.log
        cp $cfilesdir/Virenscanner/freshclam.conf /etc 	2>&1| tee -a $setupdir/sine.log
        touch /var/log/clamd.log 				2>&1| tee -a $setupdir/sine.log
        chown vscan:vscan /var/log/clamd.log 			2>&1| tee -a $setupdir/sine.log
        touch /var/log/freshclam.log 				2>&1| tee -a $setupdir/sine.log
        chown vscan:vscan /var/log/freshclam.log 		2>&1| tee -a $setupdir/sine.log
        freshclam 2>&1| tee -a $setupdir/sine.log | pgbox
        chkservice "freshclam"
	chkservice "clamd"
    else  
	# Info einblenden
	clear
	windowtitle="Avira Antivir Installation"
	dialog --backtitle "$dialogtitle" --title "$windowtitle" --exit-label "Weiter" --textbox "$setupdir/infofiles/avira.txt" 0 0
	zypper -n install -n antivir 2>&1| tee -a $setupdir/sine.log | pgbox
	zyppercheck ${PIPESTATUS[0]}
	pgsubtitle="Die Antivir Lizenzdatei wird heruntergeladen und Avira Antivir wird aktualisiert"
	fetchavkey 2>&1| tee -a $setupdir/sine.log | pgbox
		cp avupdate /etc/cron.hourly/ 2>&1| tee -a $setupdir/sine.log
	# Quick'n'Dirty -- SUID-Bit für avscan setzen
	chmod u+s /usr/lib/AntiVir/guard/avscan 2>&1| tee -a $setupdir/sine.log
	# Antivir-Konfiguration anpassen
	cp $cfilesdir/Virenscanner/avguard.conf /etc/avira/ 2>&1| tee -a $setupdir/sine.log
	cp $cfilesdir/Virenscanner/avscan.conf /etc/avira/ 2>&1| tee -a $setupdir/sine.log
	# avguard in RL-Konzept aufnehmen und starten
	chkservice "avguard"
    fi

    ## invis-Konfigurationsdatei anpassen
    domain=`getconfdata "Domain" "2"`
    adminmail=`getconfdata "Admail" "2"`
    
    path="/etc/invis"
    file="invis.conf"
    strings="administrator@invis-net.loc%$adminmail"
    changevalues $path $file "$strings"
    
    strings="invis-net.loc%$domain"
    changevalues $path $file "$strings"

    ## ownCloud Synchronisation
    ocsync=`getconfdata "ownCloudSync" "2"`
    if [[ $ocsync == "j" ]]; then
        zypper refresh 2>&1| tee -a $setupdir/sine.log | pgbox
	zypper -n install -n csync libcsync-plugin-owncloud  2>&1| tee -a $setupdir/sine.log | pgbox
	ocsyncdir=`getconfdata "ownCloudSyncDir" "2"`
	if [[ ! -d $ocsyncdir ]]; then
	    mkdir -p $ocsyncdir
	fi
	ocserver=`getconfdata "ownCloudServer" "2"`
	ocusername=`getconfdata "ownCloudUser" "2"`
	ocpassword=`getconfdata "ownCloudPassword" "2"`
	echo $ocserver
	echo $ocusername
	echo $ocpassword
	sleep 3
	path="/etc/invis"
	file="invis.conf"
	strings="ocSync:n%ocSync:j"
	changevalues $path $file "$strings"
	strings="oc-user%$ocusername"
	changevalues $path $file "$strings"
	strings="oc-syncdir%$ocsyndir"
	changevalues $path $file "$strings"
	strings="oc-server%$ocserver"
	changevalues $path $file "$strings"
	file="invis-pws.conf"
	strings="oc-secret%$ocpassword"
	changevalues $path $file "$strings"
    fi

    # Limits erhoehen fuer Samba und Zarafa
    cp $cfilesdir/System/security/limits.conf /etc/security/ 2>&1| tee -a $setupdir/sine.log | pgbox

    # Vorbereitete sysconfig Dateien kopieren
    # Ist QnD, sollte mit changevalues erledigt werden....
    cp $cfilesdir/System/sysconfig/* /etc/sysconfig/ 2>&1| tee -a $setupdir/sine.log | pgbox

    #/etc/hosts anpassen
    file="hosts"
    path="/etc"
    ipaddr=`getconfdata "IP" "2"`
    strings="127.0.0.2%$ipaddr"
    changevalues $path $file "$strings"
    
    #/etc/sysconfig/ntop anpassen
    file="ntop"
    path="/etc/sysconfig"
    strings="192.168.220.10%$ipaddr"
    changevalues $path $file "$strings"

    #Admin PW fuer ntop-user wwwrun setzen
    # Achtung Bug im ntop Paket: Das Verzeichnis ind dem ntop versucht die user-db anzulegen existiert nicht. Workaround:
    mkdir /var/lib/ntop
    ntoppw=`getconfdata "NtopPw" "2"`
    ntop --set-admin-password=$ntoppw -u wwwrun 2>&1| tee -a $setupdir/sine.log | pgbox

    #openSSL einrichten und CA bauen
    cp $cfilesdir/ssl/openssl.cnf /etc/ssl 2>&1| tee -a $setupdir/sine.log | pgbox
    cp $cfilesdir/ssl/CA.pl /usr/share/ssl/misc/ 2>&1| tee -a $setupdir/sine.log | pgbox

    file="openssl.cnf"
    path="/etc/ssl"
    
    country=`getconfdata "Country" "2"`
    strings="DE%$country"
    changevalues $path $file "$strings"

    region=`getconfdata "Region" "2"`
    strings="Hessen%$region"
    changevalues $path $file "$strings"

    city=`getconfdata "City" "2"`
    strings="Schotten%$city"
    changevalues $path $file "$strings"

    organisation=`getconfdata "Organisation" "2"`
    strings="invis-server.org%$organisation"
    changevalues $path $file "$strings"

    admail=`getconfdata "Admail" "2"`
    strings="domadmin@invis-net.loc%$admail"
    changevalues $path $file "$strings"
    
    msgbox "Um auf Ihrem invis Server SSL-Schlüssel und Zertifikate für Web- und Mailserver zu erstellen wird eine Zertifizierungsstelle (CA) benötigt.\n\nDies wird im Folgenden vorgenommen. 
Beantworten Sie die Fragen gewissenhaft. Die meisten Vorgabewerte können Sie übernehmen. Lediglich den Common Name müssen Sie selbst erdenken. Er taucht als Name der CA in allen damit signierten Zertifikaten auf.
\n\nNotieren Sie sich auf jeden Fall dass hierbei zu vergebende Passwort, Sie werden es immer wieder benötigen!\n\nDrücken Sie nach dem OK bitte noch einmal die Enter-Taste." "CA erstellen"
    # invis CA erstellen
    cd /etc/ssl
    /usr/share/ssl/misc/CA.pl -newca | tee -a $setupdir/sine.log
    cd $OLDPWD
    # Verzeichnis fuer dnssec Schluessel erzeugen
    mkdir -p /etc/ssl/ddns 2>&1| tee -a $setupdir/sine.log

    # Konfiguration fuer Notfall-Internetzugang via Handy und T-Mobile (Teathering)
    cp $cfilesdir/invis/wvd_tmobile.conf /etc/invis 2>&1| tee -a $setupdir/sine.log

    # Zeitzoneneinstellung des Servers ermitteln
    # php versteht CEST nict mehr
    #timezone=`date +%Z`
    timezone=`cat /etc/sysconfig/clock|grep ^TIMEZONE=|tr -d "\""|cut -d "=" -f 2`

    # PHP ini-Dateien anpassen
    cp $cfilesdir/webserver/apache2/php.ini /etc/php5/apache2/ 2>&1| tee -a $setupdir/sine.log
    path="/etc/php5/apache2"
    file="php.ini"
    strings="i6lib%$libdir"
    changevalues $path $file "$strings"

    strings="UTC%$timezone"
    changevalues $path $file "$strings"

    cp $cfilesdir/webserver/fcgid/php.ini /etc/php5/fastcgi/
    path="/etc/php5/fastcgi"
    strings="i6libdir%$libdir"
    changevalues $path $file "$strings"

    strings="UTC%$timezone"
    changevalues $path $file "$strings"

    # Workaround fuer fastcgi php.ini Bug
    ln -s /etc/php5/fastcgi /etc/php5/fpm

    # invis Konfigurationsdatei anpassen
    file="invis.conf"

    strings="domadmin@invis-net.loc%$admail"
    changevalues $confdir $file "$strings"

    basedn=`getconfdata "baseDN" "2"`
    strings="dc=invis-net,dc=loc%$basedn"
    changevalues $confdir $file "$strings"

    cleantr=`getconfdata "cleanTR" "2"`
    if [[ $cleantr == "j" ]]; then
	strings="cleanTrOn:n%cleanTrOn:$cleantr"
	changevalues $confdir $file "$strings"
	maxdays=`getconfdata "TRmaxDays" "2"`
	strings="trMaxDays:21%trMaxDays:$maxdays"
	changevalues $confdir $file "$strings"
    fi

    cleandasi=`getconfdata "cleanDasi" "2"`
    if [[ $cleantr == "j" ]]; then
	strings="cleanDasi:n%cleanDasi:$cleandasi"
	changevalues $confdir $file "$strings"
	maxdays=`getconfdata "DasimaxDays" "2"`
	strings="DasiMaxDays:21%DasiMaxDays:$maxdays"
	changevalues $confdir $file "$strings"
    fi

    ddnshn=`getconfdata "DDNS" "2"`
    if [[ $ddnshn != "none" ]]; then
	strings="hostname.ihredomain.de%$ddnshn"
	changevalues $confdir $file "$strings"
    fi

    groupware=`getconfdata "IMAPserver" "2"`
    ## verwendete Groupware in Konfigurationsdatei schreiben
    case $groupware in
	"zarafa" ) 
	    strings="usedgroupware%zarafa"
	    changevalues $confdir $file "$strings"
	    ;;
	"groupe" )
	    strings="usedgroupware%groupe"
	    changevalues $confdir $file "$strings"
	    ;;
	"sogo" )
	    strings="usedgroupware%sogo"
	    changevalues $confdir $file "$strings"
	    ;;
	"roundcube" )
	    strings="usedgroupware%roundcube"
	    changevalues $confdir $file "$strings"
	    ;;
    esac
    
    # NTP-Dienst fuer AD anpassen
    ntpconf="/etc/ntp.conf"
    echo -e "\n" >> $ntpconf
    echo '# Signed Socket for Samba 4 AD DC' >> $ntpconf
    echo 'ntpsigndsocket /var/lib/samba/ntp_signd' >> $ntpconf
    echo 'restrict default mssntp' >> $ntpconf
    
    sockdir="/var/lib/ntp/var/lib/samba/ntp_signd"
    mkdir -p $sockdir
    chown .ntp $sockdir
    chmod 0750 $sockdir

    # Pfade gehen fest von CHROOTED yes aus, deshalb:
    #sed -i /NTPD_RUN_CHROOTED/s/no/yes/ /etc/sysconfig/ntp
    # ntp muss chrooted laufen
    sysconf_addword -r /etc/sysconfig/ntp NTPD_RUN_CHROOTED no
    sysconf_addword /etc/sysconfig/ntp NTPD_RUN_CHROOTED yes

    chkservice "ntp"

    # invis Passwort-Datei anpassen
    file="invis-pws.conf"

    ldappw=`getconfdata "LDAPAdminPW" "2"`
    strings="ldap-secret%$ldappw"
    changevalues $confdir $file "$strings"

    mysqlpw=`getconfdata "MySQLpw" "2"`
    strings="mysql-rootpw%$mysqlpw"
    changevalues $confdir $file "$strings"
    
    writeprepstat "samba_ad"
    waitbox "sysprep" "samba_ad"
}

# Domain aufbauen
samba_ad() {
    cd $setupdir
    clear
    windowtitle="Samba AD DC"
    pgsubtitle="Samba AD DC wird eingerichtet"

    # "realm" bei AD DC = "Domain" im sine
    ad_realm=`getconfdata "Domain" "2"`

    # "domain" bei AD DC = "Workgroup" im sine
    ad_domain=`getconfdata "Workgroup" "2"`

    # Interne IP fuer DNS
    ad_ip=`getconfdata "IP" "2"`

    # Passwort vorher abfragen!
    ad_adminpass="p@ssw0rd"
    msgbox "Das Passwort des Domänenadministrators lautet: $ad_adminpass\nBitte ändern Sie es später." "AD Administrator Passwort"

    # Bisher nur dc unterstuezt
    ad_server_role="dc"

    # Domain Function level
    # --function-level="2003"
    # Default: 2003, moeglich 2008, 2008_r2. Wir verwenden den aktuellen Default und lassen es weg

    # Fuer UNIX UID/GID RFC2307 aktiv
    # --use-rfc2307

    samba-tool domain provision --realm="$ad_realm" --domain="$ad_domain" --host-ip="$ad_ip" --adminpass="$ad_adminpass" --server-role="$ad_server_role" --use-rfc2307 --dns-backend="BIND9_DLZ" 2>&1 | tee -a $setupdir/sine.log | pgbox
    provresult=${PIPESTATUS[0]}

    if [[ $provresult != 0 ]]; then
      echo "Provisioning meldet Fehler $provresult! Script wird beendet!" 2>&1| tee -a $setupdir/sine.log | pgbox
      #exit $provresult
    fi

    # Neue config kopieren
    cp /var/lib/samba/private/krb5.conf /etc/krb5.conf

    # AD aktivieren
    path="/etc/default"
    file="sernet-samba"
    strings="none%ad"
    changevalues $path $file "$strings"
    chkservice "sernet-samba-nmbd" "d"
    chkservice "sernet-samba-smbd" "d"
    chkservice "sernet-samba-winbindd" "d"
    chkservice "sernet-samba-ad"

    # User fuer LDAP-Lese-Zugang anlegen
    ldappw=`getconfdata "LDAPAdminPW" "2"`
    samba-tool user add ldap.admin "$ldappw" --surname="LDAP" --given-name="Admin" --description="Administrator fuer LDAP-Operationen" 2>&1| tee -a $setupdir/sine.log | pgbox
    ## Passwort dard nicht ablaufen
    samba-tool user setexpiry --noexpiry ldap.admin
    #samba-tool group addmembers "Domain Guests" ldap.readonly 2>&1| tee -a $setupdir/sine.log | pgbox
    #samba-tool group removemembers "Domain Users" ldap.readonly 2>&1| tee -a $setupdir/sine.log | pgbox
    samba-tool group addmembers "Administrators" ldap.admin 2>&1| tee -a $setupdir/sine.log | pgbox

    # User fuer Junk-Postfach anlegen
    samba-tool user add junk "$ldappw" --surname="Junk Owner" --given-name="Junk" --description="Benutzer für Junk-Postfach" 2>&1| tee -a $setupdir/sine.log | pgbox
    samba-tool group addmembers "Domain Guests" junk 2>&1| tee -a $setupdir/sine.log | pgbox
    samba-tool group removemembers "Domain Users" junk 2>&1| tee -a $setupdir/sine.log | pgbox
    smbadpw junk

    # Primary Group?

    # Sernet-Samba AD stoppen
    systemctl stop sernet-samba-ad.service 2>&1| tee -a $setupdir/sine.log | pgbox

    # Samba Konfiguration anpassen
    smbworkingfile="$setupdir/smb.conf"
    head -n 8 /etc/samba/smb.conf > $smbworkingfile
    echo -e "\n\tinclude = /etc/samba/smb.invis.conf" >> $smbworkingfile
    tail -n 8 /etc/samba/smb.conf >> $smbworkingfile
    mv /etc/samba/smb.conf /etc/samba/smb.conf.ori
    cp $smbworkingfile /etc/samba
    cp $cfilesdir/fileserver/samba/smb.invis.conf /etc/samba

    ## LDIF-Dateien vorbereiten
    pgsubtitle="LDAP Schema-Erweiterungen werden vorbereitet"
    mkdir $setupdir/schema 2>&1| tee -a $setupdir/sine.log | pgbox
    { for x in `find $cfilesdir/LDAP/Schemas/ -name "*.ldif"`; do
	cp $x $setupdir/schema| tee -a $setupdir/sine.log
    done } 2>&1| tee -a $setupdir/sine.log | pgbox

    path="$setupdir/schema"
    { for x in $path/*; do
	file=`basename $x`
	echo "Bereite Datei $file vor."
	basedn=`getconfdata "baseDN" "2"`
	strings="dc=invis-net,dc=loc%$basedn"
	changevalues $path $file "$strings"
	strings="DC=invis-net,DC=loc%$basedn"
	changevalues $path $file "$strings"
    done } 2>&1| tee -a $setupdir/sine.log | pgbox

    # Schemaerweiterung Attributtypen einpflegen
    pgsubtitle="LDAP Schema-Erweiterungen werden eingepflegt"
    { for attrfile in `ls $setupdir/schema/*-ad-attributes-schema.ldif`; do
	ldbadd -v -H /var/lib/samba/private/sam.ldb $attrfile --option="dsdb:schema update allowed"=true
    done } 2>&1| tee -a $setupdir/sine.log | pgbox

    # Schemaerweiterungen Objektklassen einpflegen
    { for objcfile in `ls $setupdir/schema/*-ad-objectclasses-schema.ldif`; do
	ldbadd -v -H /var/lib/samba/private/sam.ldb $objcfile --option="dsdb:schema update allowed"=true
    done } 2>&1| tee -a $setupdir/sine.log | pgbox

    ## LDIF-Dateien vorbereiten
    pgsubtitle="Ergänzende LDAP Daten werden vorbereitet"
    mkdir $setupdir/ldif 2>&1| tee -a $setupdir/sine.log | pgbox
    
    { for x in `find $cfilesdir/LDAP/LDIF-DATEIEN -name "*.ldif"`; do
	cp $x $setupdir/ldif| tee -a $setupdir/sine.log
    done } 2>&1| tee -a $setupdir/sine.log | pgbox
    
    path="$setupdir/ldif"
    { for x in $path/*; do
	file=`basename $x`
	echo "Bereite Datei $file vor."
	basedn=`getconfdata "baseDN" "2"`
	strings="dc=invis-net,dc=loc%$basedn"
	changevalues $path $file "$strings"

	strings="DC=invis-net,DC=loc%$basedn"
	changevalues $path $file "$strings"
        
	organization=`getconfdata "Organisation" "2"`
	strings="targetOrganization%$organization"
	changevalues $path $file "$strings"

	strings="descriptionText%Basisknoten des LDAP-Verzeichnisses von $organization"
        changevalues $path $file "$strings"
	
	hname=`getconfdata "Hostname" "2"`
	strings="invis5%$hname"
	changevalues $path $file "$strings"
	
	fqdn=`getconfdata "FQDN" "2"`
	strings="invisfqdn%$fqdn"
	changevalues $path $file "$strings"

	ddnsname=`getconfdata "DDNS" "2"`
	ocport=`getconfdata "OCPORT" "2"`
	strings="server-fqdn-ocport%$ddnsname:$ocport"
	changevalues $path $file "$strings"
	
	domain=`getconfdata "Domain" "2"`
        strings="invis-net.loc%$domain"
	changevalues $path $file "$strings"
	
	dompart1=`echo $domain|cut -d "." -f 1`
	strings="invis-net%$dompart1"
	changevalues $path $file "$strings"
	
	ipaddr=`getconfdata "IP" "2"`
	strings="192.168.220.10%$ipaddr"
	changevalues $path $file "$strings"
	
	netpart1=`echo "$ipaddr" | cut -d "." -f 1`
	netpart2=`echo "$ipaddr" | cut -d "." -f 2`
	netpart3=`echo "$ipaddr" | cut -d "." -f 3`
	netpart="$netpart1.$netpart2.$netpart3."
	strings="192.168.220.%$netpart"
	changevalues $path $file "$strings"
	
	rd=`getconfdata "ReverseDom" "2"`
	strings="220.168.192%$rd"
	changevalues $path $file "$strings"
	
	hostpart=`echo "$ipaddr" | cut -d "." -f 4`
	strings="relativeDomainName:10%relativeDomainName:$hostpart"
	changevalues $path $file "$strings"
	
	strings="relativeDomainName=10,%relativeDomainName=$hostpart,"
	changevalues $path $file "$strings"
	
	strings="dhcpNetMask:24%dhcpNetMask:$shortnmask"
	changevalues $path $file "$strings"
	
    done } 2>&1| tee -a $setupdir/sine.log | pgbox

    # LDAP fuellen
    pgsubtitle="Ergänzende LDAP Daten werden eingepflegt"
    { for x in $path/*; do
	#echo $x
	 ldbadd -v -H /var/lib/samba/private/sam.ldb $x
    done } 2>&1| tee -a $setupdir/sine.log | pgbox
    
    
    # Bauen des Server-Schlüsselsatzes
    cd /etc/ssl
    msgbox "Es wird jetzt ein SSL-Schlüsselsatz für Ihren LDAP-Server erzeugt.\n\n
Das verlangte Passwort ist dass Passwort Ihrer SSL-Zertifizierungsstelle (CA)." "Erzeugen des LDAP-Server Schlüsselsatzes"

    serverkeys ldap 2>&1| tee -a $setupdir/sine.log
    chown -R :pkeys /etc/ssl/private 2>&1| tee -a $setupdir/sine.log
    chmod g+rx /etc/ssl/private 2>&1| tee -a $setupdir/sine.log

    systemctl start sernet-samba-ad.service 2>&1| tee -a $setupdir/sine.log | pgbox
    
    ## sssd einrichten
    # hostname ermitteln
    hn=`hostname`
    # keytab erzeugen
    samba-tool domain exportkeytab /etc/krb5.keytab --principal="$hn\$"
    chmod 0600 /etc/krb5.keytab
    cp $cfilesdir/System/sssd/sssd.conf /etc/sssd/
    cp $cfilesdir/System/nsswitch.conf /etc/
    
    # Links auf Sambalibs erzeugen
    ln -s /usr/lib64/samba/libndr-nbt.so.0.0.1 /usr/lib64/libndr-nbt.so.0 
    ln -s /usr/lib64/samba/libndr.so.0.0.2 /usr/lib64/libndr.so.0 
    ln -s /usr/lib64/samba/libtevent.so.0.9.18 /usr/lib64/libtevent.so.0

    ## sssd konfiguration erzeugen
    domain=`getconfdata "Domain" "2"`
    fqdn=`getconfdata "FQDN" "2"`

    path="/etc/sssd"
    file="sssd.conf"
	
    strings="invis.invis-net.loc%$fqdn"
    changevalues $path $file "$strings"
    strings="invis-net.loc%$domain"
    changevalues $path $file "$strings"
    
    chmod 600 /etc/sssd/sssd.conf
    
    # sssd neu starten
    chkservice "sssd"

    # PAM Dateien kopieren
    cp $cfilesdir/System/pam.d/* /etc/pam.d/

    # phpldapadmin konfigurieren
    # Installation entfaellt, da es per rpm installiert wird.
    cp $cfilesdir/LDAP/phpldapadmin/config.php /srv/www/htdocs/phpldapadmin/config/

    writeprepstat "dns"
    waitbox "samba_ad" "dns"
}

# DNS-Server einrichten
dns() {
    cd $setupdir
    clear
    s4workingdir="/var/lib/samba/private"
    windowtitle="DNS Server"
    domain=`getconfdata "Domain" "2"`
    fqdn=`getconfdata "FQDN" "2"`
    forwarders=`getconfdata "Forwarders" "2"`
    ipaddr=`getconfdata "IP" "2"`
    ldapadminpw=`getconfdata "LDAPAdminPW" "2"`
    
    hostaddr=`echo $ipaddr|cut -d "." -f4`
    
    #echo -e "\033[1;33mIhr Nameserver wird eingerichtet\033[0m"
    cp $cfilesdir/dhcp-dns/named.conf /etc 2>&1| tee -a $setupdir/sine.log
    cp $cfilesdir/dhcp-dns/s4.named.conf $s4workingdir/named.conf 2>&1| tee -a $setupdir/sine.log

    # Zugriffsrechte auf /var/lib/samba/private setzen
    chmod go+rx $s4workingdir

    # Konfiguration von bind wird angepasst
    path="/etc"
    file="named.conf"
    strings="FORWARD-DNS-SERVERS%$forwarders"
    changevalues $path $file "$strings"

    # Anpassen der Datei /etc/resolv.conf
    cp $cfilesdir/dhcp-dns/resolv.conf /etc 2>&1| tee -a $setupdir/sine.log
    file="resolv.conf"
    strings="192.168.220.10%$ipaddr"
    changevalues $path $file "$strings"
    
    strings="invis-net.loc%$domain"
    changevalues $path $file "$strings" 

    # Bind darf in Kombination mit Samba4 AD nicht chrooted laufen
    sysconf_addword -r /etc/sysconfig/named NAMED_RUN_CHROOTED yes
    sysconf_addword /etc/sysconfig/named NAMED_RUN_CHROOTED no

    # DNS Dienst starten und ins Runlevel-Konzept einbinden.
    chkservice "named"
    
    # Reverse-Zone anlegen
    zone=$(revzone)
    samba-tool dns zonecreate 127.0.0.1 $zone -U ldap.admin --password $ldapadminpw 2>&1| tee -a $setupdir/sine.log | pgbox

    ## DNS PTR Eintrag fuer den Server selbst anlegen
    samba-tool dns add 127.0.0.1 $zone $hostaddr PTR "$fqdn." -U ldap.admin --password $ldapadminpw 2>&1| tee -a $setupdir/sine.log | pgbox
    
    ## DNS Eintraege fuer Mailserver in Zone eintragen
    samba-tool dns add 127.0.0.1 $domain @ MX "mail.$domain 10" -U ldap.admin --password $ldapadminpw 2>&1| tee -a $setupdir/sine.log | pgbox
    samba-tool dns add 127.0.0.1 $domain mail A $ipaddr -U ldap.admin --password $ldapadminpw 2>&1| tee -a $setupdir/sine.log | pgbox

    writeprepstat "dhcp"
    waitbox "dns" "dhcp"
}

# DHCP-Server einrichten
dhcp() {
    cd $setupdir
    clear
    windowtitle="DHCP Server"

    cp $cfilesdir/dhcp-dns/dhcpd.conf /etc

    # Konfiguration des DHCP Servers wird angepasst
    path="/etc"
    file="dhcpd.conf"
    domain=`getconfdata "Domain" "2"`
    strings="invis-net.loc%$domain"
    changevalues $path $file "$strings"

    ldappw=`getconfdata "LDAPAdminPW" "2"`
    strings="ldap-secret%$ldappw"
    changevalues $path $file "$strings"

    basedn=`getconfdata "baseDN" "2"`
    strings="dc=invis-net,dc=loc%$basedn"
    changevalues $path $file "$strings"

    # DHCP Dienst starten und ins Runlevel-Konzept einbinden.
    chkservice "dhcpd"
        
    writeprepstat "mailserver"
    waitbox "dhcp" "mailserver"
}

# Mail-Server einrichten
mailserver() {
    cd $setupdir
    pgsubtitle="Mailserver wird eingerichtet"
    clear
    windowtitle="Mail Server"
    zypper -n install -n `cat $setupdir/zypper-package-lists/mailserver_additional` 2>&1| tee -a $setupdir/sine.log | pgbox
    zyppercheck ${PIPESTATUS[0]}

    # amavisd-new und clamav einrichten
    av=`getconfdata "AV" "2"`
    if [[ $av == "clamav" ]]; then
        cp $cfilesdir/mailserver/amavisd/amavisd_clamav.conf /etc/amavisd.conf 2>&1| tee -a $setupdir/sine.log
    else
	cp $cfilesdir/mailserver/amavisd/amavisd.conf /etc/amavisd.conf 2>&1| tee -a $setupdir/sine.log
    fi

    # Der Dienst freshclam wird auf jeden Fall gestartet, da Clamav zur Standart Installation gehoert
    # und er von amavis immer als secondary Virenscanner genutzt wird.
    chkservice "freshclam"

    # Rechte am Virusmails-Quarantaene-Verzeichnis anpassen
    chown -R vscan:vscan /var/spool/amavis 2>&1| tee -a $setupdir/sine.log
    chmod g+rwx /var/spool/amavis/virusmails 2>&1| tee -a $setupdir/sine.log

    path="/etc"
    file="amavisd.conf"
    fqdn=`getconfdata "FQDN" "2"`
    strings="invis.invis-net.loc%$fqdn"
    changevalues $path $file "$strings"
    domain=`getconfdata "Domain" "2"`
    strings="invis-net.loc%$domain"
    changevalues $path $file "$strings"
    chkservice "amavis"

    # Mailkonto fuer SPAM-Mails kann erst nach Einrichtung der Samba-Domäne angelegt werden
    
    # Bauen des Server-Schlüsselsatzes
    cd /etc/ssl
    msgbox "Es wird jetzt ein SSL-Schlüsselsatz für Ihren Mailserver erzeugt.\n\n
Das verlangte Passwort ist dass Passwort Ihrer SSL-Zertifizierungsstelle (CA)." "Erzeugen des Mailserver Schlüsselsatzes"

    serverkeys ms 2>&1| tee -a $setupdir/sine.log
    chown :pkeys /etc/ssl/private 2>&1| tee -a $setupdir/sine.log
    chmod g+rx /etc/ssl/private 2>&1| tee -a $setupdir/sine.log
    usermod -a -G pkeys postfix 2>&1| tee -a $setupdir/sine.log
    usermod -a -G pkeys wwwrun 2>&1| tee -a $setupdir/sine.log
    usermod -a -G mail postfix 2>&1| tee -a $setupdir/sine.log

    cd $OLDPWD

    # Kopieren der Postfix-Konfigurationsdateien
    cp $cfilesdir/mailserver/postfix/* /etc/postfix 2>&1| tee -a $setupdir/sine.log
    
    ## SOGo, Group-e, Zarafa oder Roundcube
    whichimap=`getconfdata "IMAPserver" "2"`
    case "$whichimap" in
    
	"sogo"|"roundcube" )
	    # Dovecot einrichten 
    	    pgsubtitle="Dovecot IMAP wird installiert und eingerichtet"
	    zypper -n install -n dovecot22 2>&1| tee -a $setupdir/sine.log | pgbox
	    zyppercheck ${PIPESTATUS[0]}
	    # Konfiguration anpassen
	    cp -r $cfilesdir/mailserver/dovecot/ad/* /etc/dovecot/ 2>&1| tee -a $setupdir/sine.log
	    path="/etc/dovecot/conf.d"
	    file="15-lda.conf"
	    domain=`getconfdata "Domain" "2"`
	    strings="invis-net.loc%$domain"
	    changevalues $path $file "$strings"
	    #Dovecot-LDAP Anbindung konfigurieren
	    path="/etc/dovecot/"
	    file="dovecot-ldap.conf.ext"
	    basedn=`getconfdata "baseDN" "2"`
	    strings="dc=invis-net,dc=.loc%$basedn"
	    changevalues $path $file "$strings"

	    ldapadminpw=`getconfdata "LDAPAdminPW" "2"`
	    strings="admin-secret%$ldapadminpw"
	    changevalues $path $file "$strings"

	    # Benutzerkonto fuer das Mailhandling anlegen
	    groupadd -r -g 399 vmail| tee -a $setupdir/sine.log
	    useradd -r -u 399 -d /var/spool/mail -c "Benutzerkonto fuer Dovecot Mailhandling" -s /bin/false -g vmail vmail| tee -a $setupdir/sine.log
	
	    # Rechte an Verzeichnissen so anpassen, dass dovecot darin schreiben darf
	    chown vmail:mail /var/lib/dovecot 2>&1| tee -a $setupdir/sine.log
	    chmod 0775 /var/lib/dovecot 2>&1| tee -a $setupdir/sine.log
	    chown -R :vmail /var/spool/mail 2>&1| tee -a $setupdir/sine.log

	    # Dictionary Verzeichnis fuer IMAP ACLs anlegen.
	    mkdir /var/lib/dovecot/db
	    chown vmail.vmail /var/lib/dovecot/db
	    
	    # Dovecots Modulpfad an Systemarchitektur anpassen
	    if [[ $libdir == "/usr/lib64" ]]; then 
		strings="/usr/lib/dovecot/modules%$libdir/dovecot/modules"
		changevalues $path $file "$strings"
	    fi
	    usermod -a -G pkeys dovecot 2>&1| tee -a $setupdir/sine.log
	    chkservice "dovecot"

	    # Postfix konfiguration kopieren
	    rm -f `ls /etc/postfix/ |grep "main.[zarafa|cyrus]"`
	    mv /etc/postfix/main.dovecot /etc/postfix/main.cf 2>&1| tee -a $setupdir/sine.log
	    
	    # Transportweg fuer lokale emails festlegen
	    echo "$domain	dovecot:" >> /etc/postfix/relay
	    postmap /etc/postfix/relay
	    ;;
	"groupe" )
	    # Cyrus einrichten
	    pgsubtitle="Cyrus IMAP wird installiert und eingerichtet"
	    zypper -n install -n cyrus-imapd 2>&1| tee -a $setupdir/sine.log | pgbox
	    zyppercheck ${PIPESTATUS[0]}
	    zypper -n install -n `cat $setupdir/zypper-package-lists/sasl_mechs` 2>&1| tee -a $setupdir/sine.log | pgbox
	    zyppercheck ${PIPESTATUS[0]}
	    cp $cfilesdir/mailserver/cyrus/*.conf /etc 2>&1| tee -a $setupdir/sine.log
	    # Passwort für den User cyrus setzen
	    cyruspw=`getconfdata "CyrusPw" "2"`
	    #msgbox "Für den Benutzer \"cyrus\" muss ein Passwort gesetzt werden" "Cyrus IMAP wird vorbereitet"
	    echo "cyrus:$cyruspw" | chpasswd | tee -a $setupdir/sine.log | pgbox
	    usermod -a -G pkeys cyrus 2>&1| tee -a $setupdir/sine.log
	    chkservice "saslauthd"
	    chkservice "cyrus"
	    # Postfix Konfiguration kopieren
	    rm -f `ls /etc/postfix/ |grep "main.[dovecot|zarafa]"` 2>&1| tee -a $setupdir/sine.log
	    mv /etc/postfix/main.cyrus /etc/postfix/main.cf 2>&1| tee -a $setupdir/sine.log
	    ;;
	"zarafa" )
	    pgsubtitle="Zarafa Groupware und Mailserver wird installiert und eingerichtet"
	    zyppercheck ${PIPESTATUS[0]}
	    zypper -n install -n `cat $setupdir/zypper-package-lists/zarafa` 2>&1| tee -a $setupdir/sine.log | pgbox
	    zyppercheck ${PIPESTATUS[0]}
	    # Zarafa konfigurieren hier, Starten der Dienste erfolgt im Groupware Abschnitt
	    # Apache Confs fuer Webaccess kopieren
	    cp $cfilesdir/webserver/zarafa-wa/*.conf /etc/apache2/conf.d/ 2>&1| tee -a $setupdir/sine.log
	    
	    # Symbolischen Link auf das z-push2 Verzeichnis anlegen
	    ln -s /srv/www/htdocs/z-push2 /srv/www/htdocs/z-push
	    
	    rm -f `ls /etc/postfix/ |grep "main.[dovecot|cyrus]"` 2>&1| tee -a $setupdir/sine.log
	    mv /etc/postfix/main.zarafa /etc/postfix/main.cf 2>&1| tee -a $setupdir/sine.log
	    
	    # Zarafa AD Schema-Erweiterungen einpflegen
	    basedn=`getconfdata "baseDN" "2"`
	    pgsubtitle="Zarafa AD Schema-Erweiterungen werden installiert - das dauert..."
	    systemctl stop sernet-samba-ad.service 2>&1| tee -a $setupdir/sine.log | pgbox
	    adbackup 2>&1| tee -a $setupdir/sine.log | pgbox
	    zarafa_schema_add.sh $basedn $setupdir/zarafa-ads/ -v -H /var/lib/samba/private/sam.ldb -writechanges 2>&1| tee -a $setupdir/sine.log
	    systemctl start sernet-samba-ad.service 2>&1| tee -a $setupdir/sine.log | pgbox
	    ;;
esac
    pgsubtitle="Weitere Konfigurationsanpassungen am Mailserver-Setup werden durchgeführt"
    
    # Postfix Konfiguration anpassen
    path="/etc/postfix"
    file="main.cf"
    fqdn=`getconfdata "FQDN" "2"`
    strings="invis.invis-net.loc%$fqdn"
    changevalues $path $file "$strings"
    
    domain=`getconfdata "Domain" "2"`
    strings="invis-net.loc%$domain"
    changevalues $path $file "$strings"
    
    nw=`getconfdata "Networkbase" "2"`
    shortnmask=`getconfdata "NMask-short" "2"`
    strings="192.168.220.0/24%$nw/$shortnmask"
    changevalues $path $file $strings
    
    # Wenn Zugangsdaten für mailrelay bekannt sasl_passwd erzeugen
    mailrelay=`getconfdata "SMTPRELAY" "2"`
    smtpport=`getconfdata "SMTPRELAY" "3"`
    if [[ $mailrelay != "none" ]]; then
	strings="\[mail.example.org\]%$mailrelay:$smtpport"
	changevalues $path $file "$strings"
        smtpun=`getconfdata "SMTPRUN" "2"`
        smtppw=`getconfdata "SMTPRPW" "2"`
	echo "$mailrelay:$smtpport		$smtpun:$smtppw" >> /etc/postfix/sasl_passwd
	/usr/sbin/postmap /etc/postfix/sasl_passwd
    fi
    
    # canonical-files anpassen
    file="canonical"
    fqdn=`getconfdata "FQDN" "2"`
    strings="invis.invis-net.loc%$fqdn"
    changevalues $path $file "$strings"
    
    domain=`getconfdata "Domain" "2"`
    strings="invis-net.loc%$domain"
    changevalues $path $file "$strings"
    postmap $path/$file

    files=(s-canonical.cf r-canonical.cf ldap-users.cf ldap-users2.cf ldap-aliases.cf ldap-groups.cf)

    for datei in ${files[*]}; do
	#echo $datei
	basedn=`getconfdata "baseDN" "2"`
	strings="dc=invis-net,dc=loc%$basedn"
	changevalues $path $datei "$strings"
    
	adminpw=`getconfdata "LDAPAdminPW" "2"`
	strings="admin-secret%$adminpw"
	changevalues $path $datei "$strings"

	strings="invis-net.loc%$domain"
	changevalues $path $datei "$strings"
    done
    
    # Mailman einrichten ????
    clear
    windowtitle="Mailman Installation"
    dialog --backtitle "$dialogtitle" --title "$windowtitle"  --exit-label "Weiter" --textbox "$setupdir/infofiles/mailman.txt" 28 90 --and-widget --backtitle "$dialogtitle" --title "$windowtitle"  --defaultno --yesno "Möchten Sie Mailman installieren?" 0 0
    cont=${?}

    if [[ $cont == "0" ]]; then
	#Mailman installieren
	zypper -n in -n mailman 2>&1| tee -a $setupdir/sine.log|pgbox
	/usr/lib/mailman/bin/mailman-generate-sysconfig 2>&1| tee -a $setupdir/sine.log|pgbox

	# Mailman einrichten
	msgbox "Das Programm Mailman wird vorbereitet.\n\nEs wird für Verwaltungszwecke eine erste Mailingliste eingerichtet,\nsowie ein Masterepasswort zur Administration aller Listen. ." "Mailman Installation"
	#Globales Master-Passwort setzen
	/usr/lib/mailman/bin/mmsitepass
	#Verwaltungsmailingliste einrichten
	/usr/lib/mailman/bin/newlist mailman
    fi

    # Postfix neustarten und in Runlevel aufnehmen
    chkservice "postfix"

    writeprepstat "cups"
    waitbox "mailserver" "cups"
}

# CUPS Server einrichten
cups() {
    cd $setupdir
    clear
    windowtitle="CUPS Server"

    cp $cfilesdir/cups/cupsd.conf /etc/cups/cupsd.conf 

    ipaddr=`getconfdata "IP" "2"`
    path="/etc/cups"
    file="cupsd.conf"
    strings="192.168.220.10%$ipaddr"
    changevalues $path $file $strings

    net=`getconfdata "Networkbase" "2"`
    path="/etc/cups"
    file="cupsd.conf"
    strings="192.168.220.0%$net"
    changevalues $path $file $strings

    chkservice "cups"

    writeprepstat "fileserver"
    waitbox "cups" "fileserver"
}

# Samba-Server einrichten (wird uebersprungen)
fileserver() {
    cd $setupdir
    clear
    windowtitle="Samba Server"
    pgsubtitle="Fileserver wird eingerichtet"
    ipaddr=`getconfdata "IP" "2"`
    smbdom=`getconfdata "Workgroup" "2"`
    basedn=`getconfdata "baseDN" "2"`
    hn=`getconfdata "Hostname" "2"`
    smbhostname=`echo $hn | tr [a-z] [A-Z]`
    masterpw=`getconfdata "LDAPAdminPW" "2"`
    av=`getconfdata "AV" "2"`
#    whichsamba=`getconfdata "SambaPakete" "2"`
    domain=`getconfdata "Domain" "2"`
    netbase=`getconfdata "Networkbase" "2"`
    nmaskshort=`getconfdata "NMask-short" "2"`
    smbdom=`getconfdata "Workgroup" "2"`
    ddns=`getconfdata "DDNS" "2"`
    # Scriptvorlage fuer das Verschieben der Windows-Bibliotheken kopieren
    unix2dos /etc/invis/templates/*.cmd 2>&1| tee -a $setupdir/sine.log | pgbox
    unix2dos /srv/shares/service/Win_Scripts/*.cmd 2>&1| tee -a $setupdir/sine.log | pgbox
    unix2dos /srv/shares/service/Win_Timeserver/*.cmd 2>&1| tee -a $setupdir/sine.log | pgbox
    unix2dos /srv/shares/service/VPN-Clients/Windows/vpn-client.ovpn 2>&1| tee -a $setupdir/sine.log | pgbox
    unix2dos /srv/shares/service/Remove_DC/* 2>&1| tee -a $setupdir/sine.log | pgbox

    # Gruppen anlegen
    samba-tool group add --description="Mitglieder dürfen sich via Internet am Portal anmelden" mobilusers 2>&1| tee -a $setupdir/sine.log | pgbox
    samba-tool group add --description="Nur Mailkonto" maildummies 2>&1| tee -a $setupdir/sine.log | pgbox
    samba-tool group add --description="Mitglieder haben Zugriff auf die Freigabe Verwaltung" Verwaltung 2>&1| tee -a $setupdir/sine.log | pgbox
    samba-tool group add --description="Mitglieder haben Zugriff auf die Freigabe Archiv" Archiv 2>&1| tee -a $setupdir/sine.log | pgbox

    # invisconnect-Script anpassen
    path="/srv/shares/service/VPN-Clients/Linux"
    file="invisconnect"
    strings="192.168.220.10%$ipaddr"
    changevalues $path $file "$strings"

    strings="invis-net.loc%$domain"
    changevalues $path $file "$strings"

    # OpenVPN Client-Konfigurationsdateien anpassen
    file="vpn-client.ovpn"
    strings="invis-net.loc%$domain"
    changevalues $path $file "$strings"

    strings="server.ihredomain.de%$ddns"
    changevalues $path $file "$strings"

    path="/srv/shares/service/VPN-Clients/Windows"
    file="vpn-client.ovpn"
    strings="invis-net.loc%$domain"
    changevalues $path $file "$strings"

    strings="server.ihredomain.de%$ddns"
    changevalues $path $file "$strings"

    # Anpassen der Datei smb.conf
    path="/etc/samba"
    file="smb.conf"
    
    # Freigaben Erweiterung in Samba-Konfiguration einbinden
    echo >> $path/$file
    echo "## invis-server.org Freigabenkonfiguration einbinden" >> $path/$file
    echo "include = /etc/samba/smb.shares.conf" >> $path/$file
    
    if [[ $av == "beide" ]]; then
	av="antivir"
    fi

    #Erstellen der Virenscanner-Konfiguration
    cp $cfilesdir/fileserver/samba/vscan-$av.conf /etc/samba/vscan-$av.conf 2>&1| tee -a $setupdir/sine.log

    # Freigaben werden angelegt
    cp $cfilesdir/fileserver/samba/smb.shares.conf /etc/samba/smb.shares.conf 2>&1| tee -a $setupdir/sine.log
    path="/etc/samba"
    file="smb.shares.conf"
    strings="vscan-av%vscan-$av"
    changevalues $path $file "$strings"
    
    # Verzeichnis fuer Windows-Batch-Scripts anlegen
    mkdir -p -m 2775 /srv/shares/service/winscripts 2>&1| tee -a $setupdir/sine.log
    
    # Service Dateien kopieren
    chmod -R g+w /srv/shares/service 2>&1| tee -a $setupdir/sine.log
    
    # Logon-Scripts werden kopiert und ins DOS-Format ueberfuehrt
    netlogonpath="/var/lib/samba/sysvol/$domain/scripts"
    cp $cfilesdir/fileserver/samba/logon-scripts/*.cmd $netlogonpath/ 2>&1| tee -a $setupdir/sine.log
    unix2dos $netlogonpath/*.cmd 2>&1| tee -a $setupdir/sine.log | pgbox

    path="$netlogonpath"
    file="user.cmd"
    strings="invis5%$hn"
    changevalues $path $file "$strings"

    file="admin.cmd"
    strings="invis5%$hn"
    changevalues $path $file "$strings"

    file="gast.cmd"
    strings="invis5%$hn"
    changevalues $path $file "$strings"

    file="verwaltung.cmd"
    strings="invis5%$hn"
    changevalues $path $file "$strings"

    # Samba4 wertet X-Bit aus
    chmod +x $netlogonpath/*  2>&1| tee -a $setupdir/sine.log
    
    # SSSD Cache fuer ungueltig erklaeren
    #sss_cache -UG

    #Anpassen der Besitzrechte der Freigaben
    #chown -R root:"Archiv" /srv/shares/archiv 2>&1| tee -a $setupdir/sine.log
    #chown -R root:"Domain Users" /srv/shares/gruppen 2>&1| tee -a $setupdir/sine.log
    #chown -R root:"Domain Users" /srv/shares/projekte 2>&1| tee -a $setupdir/sine.log
    #chown -R root:"Domain Users" /srv/shares/media 2>&1| tee -a $setupdir/sine.log
    #chown -R root:"Domain Admins" /srv/shares/service 2>&1| tee -a $setupdir/sine.log
    #chown -R root:"Domain Guests" /srv/shares/transfer 2>&1| tee -a $setupdir/sine.log
    #chown -R root:"Verwaltung" /srv/shares/verwaltung 2>&1| tee -a $setupdir/sine.log

    # Zielverzeichnis fuer aschenputtel anlegen
    #chown root:"Domain Users" /srv/shares/portal/uploads 2>&1| tee -a $setupdir/sine.log
    # Download-Verzeichnis anlegen
    #chown administrator:"Domain Users" /srv/shares/portal/downloads 2>&1| tee -a $setupdir/sine.log

    #Verzeichnisrechte anpassen - Profilverzeichnisse
    #chown root:"Domain Users" /srv/shares/profiles 2>&1| tee -a $setupdir/sine.log
    chmod 1777 /srv/shares/profiles 2>&1| tee -a $setupdir/sine.log

    #Verzeichnisrechte anpassen - Druckertreiber Freigabe print$
    #chown -R root:"Domain Admins" /var/lib/samba/drivers 2>&1| tee -a $setupdir/sine.log
    chmod -R g+ws /var/lib/samba/drivers 2>&1| tee -a $setupdir/sine.log

    msgbox "Auf Ihrem Server wurde ein Samba-PDC eingerichtet.\n\n
Es wurden grundlegende Gruppen und Systemaccounts angelegt.\nDer Server verfügt über die Freigaben:\n\n
    - Verwaltung: Freigabe für Mitglieder der gleichnamigen Gruppe.\n
    - Archiv: Ablageort für nicht mehr aktuelle Dateien.\n
    - Projekte: Ablageort für aktuelle Dateien und das Group-e Projektmanagement.\n
    - Service: Dateien für den Domänen-Administrator, wie Software, Treiber und Patches.\n
    - Transfer: Freigabe für Dateiaustausch.\n
    - & Media: Freigabe für Multimedia-Dateien.\n\n
Es wurde die Gruppen Verwaltung, Archiv, mobilusers und maildummies angelegt.\n" "Samba Installation abgeschlossen."

    systemctl restart sernet-samba-ad.service

    # NFSv4 Server vorbereiten -- aber nicht starten
    cp $cfilesdir/fileserver/nfs/exports_nfs4 /etc/exports  2>&1| tee -a $setupdir/sine.log
    cp $cfilesdir/fileserver/nfs/nfs /etc/sysconfig  2>&1| tee -a $setupdir/sine.log
    cat $cfilesdir/fileserver/nfs/fstab_extention >> /etc/fstab
    mount -a
    path="/etc"
    file="idmapd.conf"
    strings="localdomain%$domain"
    changevalues $path $file "$strings"
    file=exports
    strings="192.168.220.0/24%$netbase/$nmaskshort"
    changevalues $path $file "$strings"
    
    writeprepstat "webserver"
    waitbox "fileserver" "webserver"

}

# Web-Server einrichten
webserver() {
    cd $setupdir
    clear
    windowtitle="Web Server"
    pgsubtitle="Webserver wird vorbereitet"
    waitinfobox "Ihr Webserver sowie das invis-Portal werden eingerichtet.
Individuelle Konfigurationen des Portals können in /etc/invis/portal/config.php vorgenommen werden." "Webserver-Konfiguration"
    fqdn=`getconfdata "FQDN" "2"`
    ldapadminpw=`getconfdata "LDAPAdminPW" "2"`
    company=`getconfdata "Organisation" "2"`
    path="/etc/invis/portal"
    cp $path/config.php.dist $path/config.php
    file="config.php"
    strings="admin-secret%$ldapadminpw"
    changevalues $path $file "$strings"

    strings="invis.invis-net.loc%$fqdn"
    changevalues $path $file "$strings"

    strings="MyCompany%$company"
    changevalues $path $file "$strings"
    
    ipaddr=`getconfdata "IP" "2"`
    netpart1=`echo "$ipaddr" | cut -d "." -f 1`
    netpart2=`echo "$ipaddr" | cut -d "." -f 2`
    netpart3=`echo "$ipaddr" | cut -d "." -f 3`
    netpart="$netpart1.$netpart2.$netpart3"
    strings="192.168.220%$netpart"
    changevalues $path $file "$strings"
    
    netpart="$netpart3.$netpart2.$netpart1"
    strings="220.168.192%$netpart"
    changevalues $path $file "$strings"
    
    groupware=`getconfdata "IMAPserver" "2"`
    if [[ $groupware == "cyrus" ]]; then
	groupware="groupe"
    fi
    if [[ $groupware == "dovecot" ]]; then
	groupware="sogo"
    fi
    strings="usedgroupware%$groupware"
    changevalues $path $file "$strings"

    # Link fuer Portal-Konfiguration anlegen
    ln -s $path/$file /srv/www/htdocs/portal/config.php
    
    # Putty bereitstellen
    cp $cfilesdir/putty/putty.exe /srv/www/htdocs/portal/
    
    # Testen, ob php5 Modul aktiviert ist,
    
    if [[ ! `a2enmod -l |grep php5` ]]; then
	a2enmod php5
    fi
    
    # Proxy-Module einrichten
    a2enmod headers
    #a2enmod xml2enc
    a2enmod proxy
    a2enmod proxy_http
    a2enmod proxy_html
    a2enmod socache_shmcb
    a2enmod version
    
    # Stammzertifikat der Server-CA bereitstellen
    cp /etc/ssl/CA/cacert.pem /srv/www/htdocs/portal/inc/
    
    cp $cfilesdir/webserver/invis-vh.conf /etc/apache2/vhosts.d/
    path="/etc/apache2/vhosts.d"
    file="invis-vh.conf"
    fqdn=`getconfdata "FQDN" "2"`
    strings="invisX.invis-net.loc%$fqdn"
    changevalues $path $file "$strings"
    
    domain=`getconfdata "Domain" "2"`
    strings="invis-net.loc%$domain"
    changevalues $path $file "$strings"

    # php5-apc Modul konfigurieren - ermoeglicht Fortschrittsbalken beim Datei-Upload
    echo "apc.rfc1867 = On" >> /etc/php5/conf.d/apc.ini
    # die folgende Einstellung verhindert den Versuch die Klasse adLDAP mehrfach zu laden.
    # gefunden bei Stack Overflow
    echo "apc.include_once_override = 0" >> /etc/php5/conf.d/apc.ini

    # HTTPS-Port ändern
    cp $cfilesdir/webserver/listen.conf /etc/apache2/
    file="listen.conf"
    path="/etc/apache2"
    
    httpsport=`getconfdata "HTTPSPORT" "2"`
    strings="httpsport%$httpsport"
    changevalues $path $file "$strings"

    ## Externer Zugriff via HTTPS?
    ddnshn=`getconfdata "DDNS" "2"`
    if [[ $ddnshn != "none" ]]; then

	msgbox "Es werden Schlüssel für den https-Zugriff erzeugt." "Webserver-Konfiguration"
	serverkeys ws
	
        # Kopieren und anpassend der Konfigurationsdateien
        cd $setupdir
        cp $cfilesdir/webserver/invis-sslvh.conf /etc/apache2/vhosts.d/
        path="/etc/apache2/vhosts.d"
        file="invis-sslvh.conf"
        strings="your.ddns-domain.net%$ddnshn"
        changevalues $path $file "$strings"

	# Lokalen Hostnamen ersetzten
	fqdn=`getconfdata "FQDN" "2"`
        strings="invis.invis-net.loc%$fqdn"
        changevalues $path $file "$strings"

	# Https Port setzen
	httpsport=`getconfdata "HTTPSPORT" "2"`
        strings="httpsport%$httpsport"
        changevalues $path $file "$strings"

    fi

    # LDAP Client- und adLDAP-Konfiguration anpassen
    # Konfigurationsdaten ermitteln.
    cp $cfilesdir/LDAP/conf-client/etc/openldap/ldap.conf /etc/openldap
    #domain=`getconfdata "Domain" "2"`
    ldaphost=`getconfdata "FQDN" "2"`
    basedn=`getconfdata "baseDN" "2"`
    path="/etc/openldap/"
    file="ldap.conf"
    strings="dc=invis-net,dc=loc%$basedn"
    changevalues $path $file "$strings"
    strings="ldapserver%$ldaphost"
    changevalues $path $file "$strings"

    path="/srv/www/htdocs/portal/inc"
    file="adLDAP.php"
    strings="DC=invis-net,DC=loc%$basedn"
    changevalues $path $file "$strings"
    strings="ldapserver%$ldaphost"
    changevalues $path $file "$strings"

    ln -s /etc/openldap/ldap.conf /var/lib/wwwrun/
    
    # Sysconfig Datei bearbeiten
    cp $cfilesdir/mailserver/fetchmail/fetchmail /etc/sysconfig/
    path="/etc/sysconfig/"
    file="fetchmail"
    strings="localdomain%$domain"
    changevalues $path $file "$strings"

    # Dummy fetchmailrc anlegen.
    fetchmailrc="/var/lib/cornaz/build/.fetchmailrc"
    echo 'poll pop.example.com protocol pop3 user dummy pass . is junk here' > $fetchmailrc
    chown wwwrun.www $fetchmailrc
    chmod 0660 $fetchmailrc
    
    # fetchcopy ausfuehren
    /var/lib/cornaz/bin/fetchcopy				2>&1|tee -a $setupdir/sine.log |pgbox
    chmod 0700 /var/lib/cornaz/inuse/.fetchmailrc		2>&1|tee -a $setupdir/sine.log |pgbox
    chown fetchmail /var/lib/cornaz/inuse/.fetchmailrc	2>&1|tee -a $setupdir/sine.log |pgbox

    # Webserver fuer prefork-MPM konfigurieren
    a2enmod fcgid
    a2enmod rewrite
    path="/etc/sysconfig/"
    file="apache2"
    strings="APACHE_MPM=\"\"%APACHE_MPM=\"prefork\""
    changevalues $path $file "$strings"
    a2enflag FCGID
    a2enflag SSL
    
    # Webserver, shellinabox, fetchmail und Mailman neustarten und in Runlevel integrieren
    pgsubtitle="Mehrere Dienste werden neu gestartet"
    chkservice "fetchmail"
    chkservice "shellinaboxd-invis"
    chkservice "apache2"
    #chkservice "mailman"

    writeprepstat "mysqlserver"
    waitbox "webserver" "mysqlserver"
}

# MySQL-Server einrichten
mysqlserver() {
    cd $setupdir
    clear
    windowtitle="MariaDB Server"
    pgsubtitle="MariaDB einrichten, bitte haben Sie etwas Geduld."

    waitinfobox "Für MariaDB werden Einstellungen zur Speichernutzung getroffen
die sich am verfügbaren RAM des Servers und den Empfehlungen von Zarafa orientieren. 
Bei weniger als 2GB RAM werden ca. 30%, bei 2-4GB
RAM ca. 40% und bei mehr als 4GB RAM ca 50% des RAMs reserviert.
Beachten Sie dies beispielsweise bei der Einrichtung virtueller Maschinen." "Speicherreservierung für MariaDB"
    cp $cfilesdir/sql/mysql/config.inc.php /srv/www/htdocs/phpMyAdmin/config.inc.php
    chown wwwrun:www /srv/www/htdocs/phpMyAdmin/config.inc.php
    # MySQL Config schreiben, Speichereinstellungen anpassen
    # und in Runlevel integrieren und starten.
    cp $cfilesdir/sql/mysql/my.cnf /etc/
    memsizes=($(zmemcalc))
    path="/etc/"
    file="my.cnf"
    strings="innodbbps%${memsizes[0]}M"
    changevalues $path $file "$strings"

    strings="innodblfs%${memsizes[1]}M"
    changevalues $path $file "$strings"

    chkservice "mysql"

    # Der besch. systemd wartet einfach nicht lange genug auf den MySQL Socket
    until [[ -S /var/run/mysql/mysql.sock ]]; do
	echo "Warte, bis der MySQL-Socket erscheint. ;-)" | pgbox
	sleep 2 | pgbox
    done

    # Restart, weil systemd ggf. glaubt, dass mysql nicht laeuft.
    systemctl restart mysql.service 2>&1|tee -a $setupdir/sine.log |pgbox
    
    #MySQL Root-Passwort setzen
    mysqlpw=`getconfdata "MySQLpw" "2"`
    mysqladmin password $mysqlpw

    # Neuaufbau der Postfix chroot Umgebung zur Unsterstützung von mysql.sock 
    chkservice "postfix"

    writeprepstat "postgresqlserver"
    waitbox "mysqlserver" "postgresqlserver"
}

# PostgreSQL-Server einrichten
postgresqlserver() {
    cd $setupdir
    clear
    windowtitle="PostgreSQL Server"
    #Frage nach Version von PostgreSQL
    dialog --backtitle "$dialogtitle" --title "$windowtitle" --exit-label "Weiter" --textbox "$setupdir/infofiles/postgresql.txt" 0 0 --and-widget --backtitle "$dialogtitle" --title "$windowtitle" --yesno "Soll eine aktuelle Version von PostgreSQL installiert werden?" 0 0
    cont=${?}

    # Weitermachen?
    if [[ $cont == "0" ]]; then
        pgsubtitle="Aktuelle Version wird installiert"
        zypper -n install -n `cat $setupdir/zypper-package-lists/postgresql` 2>&1| tee -a $setupdir/sine.log | pgbox 25 110
    else
        pgsubtitle="Spezielle Version wird installiert"
        zypper -n install -D -n `cat $setupdir/zypper-package-lists/postgresql` 2>&1| tee -a $setupdir/sine.log | pgbox 25 110
    fi

    zyppercheck ${PIPESTATUS[0]}

    #cp /srv/www/htdocs/phpPgAdmin/conf/config.inc.php-dist /srv/www/htdocs/phpPgAdmin/conf/config.inc.php
    pgsubtitle="PostgreSQL \"vorübergehend\" starten."
    systemctl start postgresql.service 2>&1|tee -a $setupdir/sine.log |pgbox

    # Konfigurationsdateien kopieren -> sind fuer kivitendo vorbereitet.
    cp $cfilesdir/sql/postgresql/*.conf /var/lib/pgsql/data 2>&1 |tee -a $setupdir/sine.log
    chown -R postgres:postgres /var/lib/pgsql/ 2>&1 |tee -a $setupdir/sine.log
    # Postgresql neu starten

    yesno "Soll PostgreSQL automatisch gestartet werden? (Ist nur notwendig, wenn Kivitendo installiert wird.)" "Runlevel Eintrag für PostgreSQL wird konfiguriert."
    pgsqlrl=${?}
    if [[ $pgsqlrl == "1" ]]; then
#       /etc/init.d/postgresql stop 2>&1 |tee -a $setupdir/sine.log |pgbox
        chkservice "postgresql" disable
    else
        chkservice "postgresql"
    fi

    writeprepstat "firewall"
    waitbox "postgresqlserver" "firewall"
}

# Firewall einrichten und SSH-Port ändern
firewall() {
    cd $setupdir
    clear
    windowtitle="Firewall"
    pgsubtitle="Firewall-Setup wird an invis-Server Anforderungen angepasst."

    # Kopieren und anpassen der Firewall Konfiguration
    cp $cfilesdir/System/sysconfig/SuSEfirewall2 /etc/sysconfig/
    file="SuSEfirewall2"
    path="/etc/sysconfig"
    nw=`getconfdata "Networkbase" "2"`
    netpart1=`echo "$nw" | cut -d "." -f 1`
    netpart2=`echo "$nw" | cut -d "." -f 2`
    netpart3=`echo "$nw" | cut -d "." -f 3`
    netpart4=`echo "$nw" | cut -d "." -f 4`
    netpart="$netpart1.$netpart2.$netpart3.$netpart4"
    shortnmask=`getconfdata "NMask-short" "2"`
    strings="192.168.220.0/24%$netpart/$shortnmask"
    changevalues $path $file $strings
    
    # geaenderten SSH-Port einfuegen
    sshport=`getconfdata "SSHPORT" "2"`
    strings="sshport%$sshport"
    changevalues $path $file "$strings"

    # geaenderten HTTPS-Port einfuegen
    httpsport=`getconfdata "HTTPSPORT" "2"`
    strings="httpsport%$httpsport"
    changevalues $path $file "$strings"

    # OwnCloud-Port einfuegen
    ocport=`getconfdata "OCPORT" "2"`
    strings="ocport%$httpsport"
    changevalues $path $file "$strings"
    
    # SSH Port ändern
    cp $cfilesdir/ssh/sshd_config /etc/ssh
    path="/etc/ssh"
    file="sshd_config"

    sshport=`getconfdata "SSHPORT" "2"`
    strings="sshport%$sshport"
    changevalues $path $file "$strings"


    # Kleinen Bug im SSH init-Script fixen
    path="/etc/init.d"
    file="sshd"
    strings="ssh-keygen -t dsa -b 2048%ssh-keygen -t dsa -b 1024"
    changevalues $path $file "$strings"
    chmod a+x $path/$file
    
    # SSHd neu starten
    chkservice "sshd"
    
    # Firewall starten und in Runlevel eintragen
    chkservice "SuSEfirewall2_init"
    chkservice "SuSEfirewall2"

    writeprepstat "monitoring"
    waitbox "firewall" "monitoring"
}

monitoring() {
    cd $setupdir
    clear
    whichmonitoring=`getconfdata "MonitoringSoftware" "2"`
    windowtitle="Vorbereitung für Server Monitoring"
    dialog --backtitle "$dialogtitle" --title "Vorbereitung für Server Monitoring" --exit-label "Weiter" --textbox "$setupdir/infofiles/monitoring.txt" 24 90 --and-widget --backtitle "$dialogtitle" --title "$windowtitle"  --defaultno --yesno "Planen Sie den Server via $whichmonitoring zu überwachen?" 0 0
    cont=${?}
    if [[ $cont == "0" ]]; then

    case $whichmonitoring in
    "nagios" )
        # Vorbereitung zur Ueberwachung des Servers via Icinga oder Nagios
	zypper -n install -n `cat $setupdir/zypper-package-lists/nagios_plugins` 2>&1 | tee -a $setupdir/sine.log | pgbox
	groupadd -g 9000 nagios 2>&1 | tee -a $setupdir/sine.log | pgbox
	useradd -u 9000 -g nagios -d /home/nagios -m -c "Nagios Admin" nagios 2>&1 | tee -a $setupdir/sine.log | pgbox
	mkdir /home/nagios/.ssh 2>&1 | tee -a $setupdir/sine.log
	chown -R nagios:nagios /home/nagios/ 2>&1 | tee -a $setupdir/sine.log
	;;
    "zabbix" )
        # Vorbereitung zur Ueberwachung des Servers via Zabbix-Agent mit Zabbix-Proxy
	zypper -n install -n zabbix-agent zabbix-proxy zabbix-proxy-mysql fping 2>&1 | tee -a $setupdir/sine.log | pgbox
        chmod ug+s /usr/sbin/fping* 2>&1 | tee -a $setupdir/sine.log
        zabbixdbpw=`mkdbsilent zabbix zabbix a`
        mysql -u zabbix -p$zabbixdbpw zabbix < $cfilesdir/zabbix/schema.sql
        cp $cfilesdir/zabbix/zabbix-agentd.conf /etc/zabbix 	2>&1| tee -a $setupdir/sine.log
        cp $cfilesdir/zabbix/zabbix-proxy.conf /etc/zabbix 	2>&1| tee -a $setupdir/sine.log
        confdir="/etc/zabbix"
        file="zabbix-proxy.conf"
        strings="zabbixdbpw%$zabbixdbpw"
        changevalues $confdir $file "$strings"
        chkservice "zabbix-proxy"
        chkservice "zabbix-agentd"
	;;
    esac
    fi
    writeprepstat "groupware"
    waitbox "monitoring" "groupware"
}

apcupsd() {
    cd $setupdir
    clear
    windowtitle="Installation von apcupsd"

    dialog --backtitle "$dialogtitle" --title "$windowtitle" --exit-label "Weiter" --textbox "$setupdir/infofiles/apcupsd.txt" 0 0 --and-widget --backtitle "$dialogtitle" --title "$windowtitle"  --defaultno --yesno "Möchten Sie apcupsd installieren?" 0 0
    cont=${?}

    # Weitermachen?
    if [[ $cont == "0" ]]; then
	pgsubtitle="Software wird installiert"
	zypper refresh 2>&1 | tee -a $setupdir/sine.log | pgbox
	zypper -n install apcupsd apcupsd-cgi 2>&1 | tee -a $setupdir/sine.log | pgbox
	zyppercheck ${PIPESTATUS[0]}

	confdir="/etc/apcupsd"
	file="apcupsd.conf"
#	mv $confdir/$file $confdir/$file.orig
#	#cp $cfilesdir/etherpad/$file $confdir/$file 2>&1 | tee -a $setupdir/sine.log | pgbox
#	#cp $confdir/settings.json.template $confdir/settings.json
	strings="UPSCABLE smart%UPSCABLE usb"
	changevalues $confdir $file "$strings"
	strings="UPSTYPE apcsmart%UPSTYPE usb"
	changevalues $confdir $file "$strings"
	strings="DEVICE /dev/ttyS0%DEVICE"
	changevalues $confdir $file "$strings"
	chkservice "apcupsd"
	
	# apcupsd im Portal aktivieren
#	swpestat Etherpad TRUE 2>&1 | tee -a $setupdir/sine.log | pgbox
    else
	msgbox "apcupsd Installation übersprungen" "$windowtitle"
    fi
    writeprepstat "groupware"
    waitbox "apcupsd" "groupware"
}

groupware() {

whichimap=`getconfdata "IMAPserver" "2"`

case "$whichimap" in

    "groupe" )
	cd $setupdir
	clear
	windowtitle="Group-e Installation"
	dialog --backtitle "$dialogtitle" --title "$windowtitle" --exit-label "Weiter" --textbox "$setupdir/infofiles/group-e.txt" 38 90 --and-widget --backtitle "$dialogtitle" --title "$windowtitle"  --defaultno --yesno "Möchten Sie Group-e installieren?" 0 0
	cont=${?}

	if [[ $cont == "0" ]]; then
	    pgsubtitle="Zusätzliche Software wird installiert"
	    zypper refresh 2>&1 | tee -a $setupdir/sine.log | pgbox
	    zypper -n install -n group-e 2>&1 | tee -a $setupdir/sine.log | pgbox
	    zyppercheck ${PIPESTATUS[0]}

	    pgsubtitle="Group-e wird installiert."
	    path="/etc/apache2/conf.d"
	    file="groupe.conf"
	    strings="/opt/group-e%/srv/www/htdocs/group-e"
	    changevalues $path $file "$strings"
	    path="/srv/www/htdocs/group-e/www/cfg"
	    file="global.inc.php"
	    changevalues $path $file "$strings"
	    path="/srv/www/htdocs/group-e/etc/phplib"
	    file="prepend.php"
	    changevalues $path $file "$strings"
	    msgbox "Die Datenbank für Group-e wird installiert - Sie benötigen das MySQL root-Passwort." "Group-e Installation"
	    mysqladmin -u root -p create groupe
	    msgbox "Für die Group-e-Datenbank wird UTF8 als Zeichensatz gewählt - Sie benötigen das MySQL root-Passwort." "Group-e Installation"
	    mysql -u root -p --default-character-set=utf8 groupe < /srv/www/htdocs/group-e/dump/group-e_1.6_utf8.sql
	    msgbox "Die Tabellenstruktur für die Group-e-Datenbank wird installiert - Sie benötigen das MySQL root-Passwort." "Group-e Installation"
	    mysql -u root -p < $cfilesdir/groupe/user.sql
	    path="/srv/www/htdocs/group-e/etc/phplib/lib"
	    file="local.inc"
	    strings="YOUR_GROUPE_PASSWORD%myxlgruss"
	    changevalues $path $file "$strings"
	    # Links fuer cifsmount Kommandos erstellen
	    ln -s /sbin/mount.cifs /bin/smbmount
	    ln -s /sbin/umount.cifs /bin/smbumount

	    # Mail-Dummy für Projektmanagement anlegen
	    smbldap-useradd -m -s /bin/false projekte
	    msgbox "Es wurde ein Postfach-User für den Group-e Projektmanager angeleget, bitte geben Sie ein Passwort ein." "$windowtitle"
	    smbldappw projekte
	    echo "Initmail" |mailx -s Initmail projekte@localhost

	    ## z-push konfigurieren
	    cp $cfilesdir/webserver/z-push_vh-groupe.conf /etc/apache2/vhosts.d/
	    
	    file="z-push_vh-groupe.conf"
	    path="/etc/apache2/vhosts.d/"
	    
	    ddnsname=`getconfdata "DDNS" "2"`
	    strings="your.ddns-domain.net%$ddnsname"
	    changevalues $path $file "$strings"

	    # Group-e im Portal aktivieren
	    swpestat Group-e TRUE 2>&1 | tee -a $setupdir/sine.log | pgbox
	
	    chkservice "apache2"
	
	    writeprepstat "erp"
	    waitbox "groupware" "erp"
	else
	    msgbox "Group-e Installation übersprungenen." "$windowtitle"
	    writeprepstat "erp" 
	fi
	;; 

    "sogo" )
	cd $setupdir
	clear
	windowtitle="SOGo Installation"
	dialog --backtitle "$dialogtitle" --title "$windowtitle" --exit-label "Weiter" --textbox "$setupdir/infofiles/sogo.txt" 38 90

	zypper -n install -n `cat $setupdir/zypper-package-lists/sogo` 2>&1 | tee -a $setupdir/sine.log | pgbox
	zyppercheck ${PIPESTATUS[0]}
	cp $cfilesdir/sogo/SOGo /etc/sysconfig/SOGo
	mkdir /etc/sogo
	cp $cfilesdir/sogo/sogo.conf /etc/sogo/
	confdir="/etc/sogo"
	file="sogo.conf"
	basedn=`getconfdata "baseDN" "2"`
	strings="dc=i5-net,dc=loc%$basedn"
	changevalues $confdir $file "$strings"
	adminpw=`getconfdata "AdminPW" "2"`
	strings="admin-secret%$adminpw"
	changevalues $confdir $file "$strings"
	sogodbuserpw=`mkdbsilent sogo sogo a`
	strings="dbuserpw%$sogodbuserpw"
	changevalues $confdir $file "$strings"
	chown :sogo /etc/sogo/sogo.conf
	chkservice "sogod"

	# SoGo im Portal aktivieren
	swpestat SOGo TRUE 2>&1 | tee -a $setupdir/sine.log | pgbox

	writeprepstat "erp"
	waitbox "groupware" "erp"
	;;
    "zarafa" )
	## Zarafa
	cd $setupdir
	clear
	windowtitle="Zarafa Konfiguration"
	dialog --backtitle "$dialogtitle" --title "$windowtitle"  --exit-label "Weiter" --textbox "$setupdir/infofiles/zarafa.txt" 38 90

	## Fix Zarafa Package-Bugs
	# Spaeter wieder entfernen
	mkdir -p /var/lib/zarafa-webaccess/tmp
	mkdir -p /var/lib/zarafa-webaccess/plugins
	chmod a+rwx /var/lib/zarafa-webaccess/tmp

	# htaccess-Dateien entfernen, wenn Apache Worker MPM aktiv ist
	isworker=`ps ax |grep httpd2-worker |grep -v grep|wc -l`
	if (( $isworker > 0 )); then
	    rm -f /usr/share/zarafa-webaccess/.htaccess
	    rm -f /usr/share/zarafa-webapp/.htaccess
	    chkservice "apache2"
	fi

	## Leere Zarafa-Datenbank anlegen
	zarafadbuserpw=`mkdbsilent zarafa zarafa a`

        # Locales-Vorlage kopieren
	cp $cfilesdir/zarafa/zarafa /etc/sysconfig/

	# Konfigurationsvorlagen kopieren
	cp $cfilesdir/zarafa/*.cfg /etc/zarafa/
    
	# Konfigurationsdaten einlesen
	domain=`getconfdata "Domain" "2"`
	basedn=`getconfdata "baseDN" "2"`
	ldapmasterpw=`getconfdata "LDAPAdminPW" "2"`

	# Datenbank Zugang in Zarafa Konfiguration einfuegen usw.
	path="/etc/zarafa"
	file="server.cfg"
	strings="dbuserpass%$zarafadbuserpw"
	changevalues $path $file "$strings"

	strings="postmaster@localhost%administrator@$domain"
	changevalues $path $file "$strings"

	# cache_cell_size anpassen, wenn zmemcalc mehr als 512M berechnet
	zarafamem=($(zmemcalc))
	if (( ${zarafamem[2]} > 512 ));then
	    strings="512M%${zarafamem[2]}M"
	    changevalues $path $file "$strings"
	fi
	
	## Plugin-Path bei Bedarf anpassen
	if [[ $libdir == "/usr/lib64" ]]; then
	    strings="/usr/lib/zarafa%$libdir/zarafa"
	    changevalues $path $file "$strings"
	fi

	# LDAP Konfiguration anpassen
	file="ldap.cfg"
	strings="admin-secret%$ldapmasterpw"
	changevalues $path $file "$strings"

	strings="dc=zarafa,dc=com%$basedn"
	changevalues $path $file "$strings"
    
	strings="dc=invis-net,dc=loc%$basedn"
	changevalues $path $file "$strings"
	
	strings="invis-net.loc%$domain"
	changevalues $path $file "$strings"
    
	## Locales anpassen
	path="/etc/zarafa/userscripts"
	strings="en_US%de_DE.UTF-8"
	file="companies_common.sh"
	changevalues $path $file "$strings"

	file="groups_common.sh"
	changevalues $path $file "$strings"

	file="users_common.sh"
	changevalues $path $file "$strings"

	path="/etc/zarafa/webaccess-ajax"
	file="config.php"
    
	strings="London%Berlin"
	changevalues $path $file "$strings"

	strings="en_GB%de_DE.UTF-8"
	changevalues $path $file "$strings"

	path="/etc/zarafa/webapp"
	file="config.php"
    
	strings="London%Berlin"
	changevalues $path $file "$strings"

	strings="en_GB%de_DE.UTF-8"
	changevalues $path $file "$strings"
    
	# Zarafa-Schluessel erzeugen
	mkzarafakey
    
	# Dienste ins Runlevel-Konzept eintragen
	for zinit in /etc/init.d/zarafa-* ; do
	    zinit=`basename $zinit`
	    chkservice $zinit
	done
    
	# z-push als vHost anlegen & apache reload
	cp $cfilesdir/webserver/z-push_vh.conf /etc/apache2/vhosts.d/
	rm -f /etc/apache2/conf.d/z-push.conf

	file="z-push_vh.conf"
	path="/etc/apache2/vhosts.d/"
	ddnsname=`getconfdata "DDNS" "2"`
	strings="your.ddns-domain.net%$ddnsname"
	changevalues $path $file "$strings"

	chkservice apache2 r
    
	# Oeffentlichen Speicher anlegen
	zarafa-admin -s    

	# Webapp im Portal aktivieren
	swpestat ZarafaApp TRUE 2>&1 | tee -a $setupdir/sine.log | pgbox
    
	writeprepstat "erp"
	waitbox "groupware" "erp"
	;;
    "roundcube" )
	cd $setupdir
	clear
	windowtitle="Roundcube Installation"
	dialog --backtitle "$dialogtitle" --title "$windowtitle" --exit-label "Weiter" --textbox "$setupdir/infofiles/roundcube.txt" 38 90
	zypper -n install -n roundcubemail 2>&1 | tee -a $setupdir/sine.log | pgbox
	zyppercheck ${PIPESTATUS[0]}
	
	# Datenbank anlegen
	rcmdbpass=`mkdbsilent roundcubemail roundcube a`
	mysql -u roundcube --password=$rcmdbpass roundcubemail < /usr/share/doc/packages/roundcubemail/SQL/mysql.initial.sql

	# Konfigurationsdateien kopieren und anpassen
	path="/etc/roundcubemail/"
	cp $cfilesdir/roundcubemail/*.php $path
	file="config.inc.php"
	strings="rcmdbpass%$rcmdbpass"
	changevalues $path $file "$strings"

	domain=`getconfdata "Domain" "2"`
	file="defaults.inc.php"
	strings="invis-net.loc%$domain"
	changevalues $path $file "$strings"

	# Roundcube im Portal aktivieren
	swpestat Roundcube TRUE 2>&1 | tee -a $setupdir/sine.log | pgbox

	writeprepstat "erp"
	waitbox "groupware" "erp"
	;;
esac

}

erp() {
whicherp=`getconfdata "ERPSoftware" "2"`
case $whicherp in

    "kivitendo" )
    # PostgreSQL in RL eintragen, wenn noch nicht geschehen
    srvon=`chkconfig postgresql|grep " on"`
    if [[ -z $srvon ]]; then chkservice "postgresql"; fi
	#lxerpversion="2.7.0"
	cd $setupdir
	clear
	windowtitle="Kivitendo Installation"
	dialog --backtitle "$dialogtitle" --title "$windowtitle"  --exit-label "Weiter" --textbox "$setupdir/infofiles/kivitendo.txt" 38 90 --and-widget --backtitle "$dialogtitle" --title "$windowtitle"  --defaultno --yesno "Möchten Sie Kivitendo installieren?" 0 0
	cont=${?}

	if [[ $cont == "0" ]]; then
	    pgsubtitle="Zusätzliche Software wird installiert"
	    zypper refresh 2>&1 |pgbox
	    zypper -n install -n `cat $setupdir/zypper-package-lists/kivitendo` 2>&1 |pgbox
	    zyppercheck ${PIPESTATUS[0]}
	
	    # Apache FCGID-Modul aktivieren, wenn nicht bereits geschehen
	    if [[ -z `a2enmod -l | grep fcgid` ]]; then
		a2enmod fcgid
		/etc/init.d/apache2 reload 2>&1 |pgbox
	    fi

	    # Kivitendo Konfiguration vorbereiten
	    cp $cfilesdir/kivitendo-erp/kivitendo.conf /srv/www/htdocs/kivitendo-erp/config/kivitendo.conf

	    msgbox "Der Kivitendo Taskserver wird ins Runklevelkonzept integriert.
Sein Start wird solange fehlschlagen, bis Sie einen gültigen Kivitendo Benutzernamen in
/srv/www/htdocs/kivitendo-erp/config/kivitendo.conf eingetragen haben." "$windowtitle"

	    #cp /srv/www/htdocs/kivitendo-erp/scripts/boot/systemd/kivitendo-task-server.service /usr/lib/systemd/system/
	    chkservice "kivitendo-task-server"

	    msgbox "Es wird ein Postgresql-Benutzer - kivitendo - für Kivitendo angelegt. 
Vergessen Sie bitte nicht das hierbei von Ihnen zu vergebende Passwort. ;-)" "$windowtitle"
	    sudo -u postgres createuser -d -r -S -P kivitendo
	    ok=0
	    while (( $ok != "1" ));do
		dialog --backtitle "$dialogtitle" --title "Kivitendo-DB Passwort" --insecure --passwordform "$dialogshorthelp\n\n
Bitte geben Sie dass soeben vergebene Passwort für den Kivitendo Datenbankbenutzer zur weiteren Verwendung erneut ein.\n\n" 17 64 2 \
		"Kivitendo-DB-Passwort:" 2 2 "" 2 23 10 0\
		"Kontrolle:" 2 36 "" 2 47 10 0\
		2>$setupdir/sine_temp
		lxpassword=(`cat $setupdir/sine_temp`)
		if [[ ${lxpassword[0]} == ${lxpassword[1]} ]];then
		    ok=1
		fi
	    done
	    lxpw="${lxpassword[0]}"

	    pgsubtitle="Datenbanken werden angelegt"
	    cd $setupdir
	    dialog --backtitle "$dialogtitle" --title "$windowtitle" --radiolist "$dialogshorthelp\n\n
Legen Sie jetzt bitte fest auf welche Art Kivitendo Benutzer authentifiziert werden.\n
Da Kivitendo nur eine 1 zu 1 Zuordnung von Benutzer zu Datenbank zulässt, ist die LDAP-Authentifizierung nur
dann sinnvoll, wenn lediglich mit einer Kivitendo Datenbank gearbeitet wird."  16 80 8 \
	    SQL "Benutzerverwaltung über eigene Authentifizierungsdatenbank" on\
	    LDAP "Anbindung an die vorhandene LDAP Benutzerverwaltung" off\
	    2>$setupdir/sine_temp
	    lxauth=`cat $setupdir/sine_temp`
	    path="/srv/www/htdocs/kivitendo-erp/config"
	    file="kivitendo.conf"
	    if [[ $lxauth == "LDAP" ]]; then
		basedn=`getconfdata "baseDN" "2"`
		strings="dc=invis-net,dc=loc%$basedn"
		changevalues $path $file "$strings"
		strings="module = DB%module = LDAP"
		changevalues $path $file "$strings"
		ldapadminpw=`getconfdata "LDAPAdminPW" "2"`
		strings="admin_secret%$ldapadminpw"
		changevalues $path $file "$strings"
	    fi
	    strings="lxpw%$lxpw"
	    changevalues $path $file "$strings"

	    # Kivitendo im Portal aktivieren
	    swpestat Kivitendo TRUE 2>&1 | tee -a $setupdir/sine.log | pgbox
	    
	    writeprepstat "faxgate"
	    waitbox "erp" "faxgate"
	
	else
	    msgbox "Kivitendo Installation übersprungenen" "$windowtitle"
	    writeprepstat "faxgate"
	fi 
	;;
    
    "wawision")
	cd $setupdir
	clear
	windowtitle="waWision Installation"
	dialog --backtitle "$dialogtitle" --title "$windowtitle"  --exit-label "Weiter" --textbox "$setupdir/infofiles/wawision.txt" 20 90 --and-widget --backtitle "$dialogtitle" --title "$windowtitle"  --defaultno --yesno "Möchten Sie waWision installieren?" 0 0
	cont=${?}
	
	if [[ $cont == "0" ]]; then
	    pgsubtitle="Zusätzliche Software wird installiert"
	    zypper refresh 2>&1 |pgbox
	    zypper -n install -n `cat $setupdir/zypper-package-lists/wawision` 2>&1 |pgbox
	    zyppercheck ${PIPESTATUS[0]}
	    # Hier Datenbank installation einfügen
	    wawipass=`mkdbsilent wawision1 wawision a`
	    msgbox "Datenbank für waWision wurde angelegt.\n\nDatenbank: wawision1\nBenutzer: wawision\nPasswort: $wawipass\n\nNotieren Sie sich bitte diese Daten. Sie werden beim ersten Zugriff auf waWision benötigt." "$windowtitle"
	    chkservice apache2 r
	    # Wawision im Portal aktivieren
	    swpestat waWision TRUE 2>&1 | tee -a $setupdir/sine.log | pgbox

	    writeprepstat "faxgate"
	    waitbox "erp" "faxgate"
	    
	    
	else
	    msgbox "waWision Installation übersprungenen" "$windowtitle"
	    writeprepstat "faxgate"
	fi
	;;

    *)
        msgbox "Keine ERP Software gewünscht" "$windowtitle"
	writeprepstat "faxgate"
	waitbox "erp" "faxgate"
	;;
esac
}

faxgate() {
    cd $setupdir
    clear
    windowtitle="Faxgate/Capisuite Installation"
    dialog --backtitle "$dialogtitle" --title "$windowtitle" --exit-label "Weiter" --textbox "$setupdir/infofiles/faxgate.txt" 38 90 --and-widget --backtitle "$dialogtitle" --title "$windowtitle"  --defaultno --yesno "Möchten Sie Faxgate installieren?" 0 0
    cont=${?}

    if [[ $cont == "0" ]]; then
	ok=0
	while [[ $ok != "1" ]]; do
	dialog --backtitle "$dialogtitle" --title "$windowtitle" --inputbox "Geben Sie bitte Ihre Telefonvorwahl ein." 0 0 \
	2>$setupdir/sine_temp
	exitcode=${?}
	vorwahl=`cat $setupdir/sine_temp`
	
	if [[ $vorwahl =~ ^[0-9]{3,7}$ ]] ;then
	    ok=1
	fi
	done
	# Treiber installieren
	pgsubtitle="Fritzcard-Treiber werden installiert"
	#cp /usr/bin/fcinst /usr/sbin
	fcinst 2>&1 | tee -a $setupdir/sine.log | pgbox
	pgsubtitle="Zusätzliche Software wird installiert"
	zypper -n install -n `cat $setupdir/zypper-package-lists/faxgate`  2>&1 | tee -a $setupdir/sine.log | pgbox
	zyppercheck ${PIPESTATUS[0]}
	
	# System fuer AVM-Treiber vorbereiten
	echo -e "mknod /dev/capi20 c 68 0\nchmod 0660 /dev/capi20\nchgrp dialout /dev/capi20\ncapiinit start\n" >> /etc/init.d/boot.local
	file="50-blacklist.conf"
	path="/etc/modprobe.d"
	strings="blacklist fcpci%#blacklist fcpci"
        changevalues $path $file "$strings"
	echo -e "## invis-server.org -- Modul avmfritz blockieren\nblacklist avmfritz\n" >> /etc/modprobe.d/50-blacklist.conf
	
	# FritCard einrichten
	fcname=`lspci |grep AVM|cut -d ":" -f3|cut -d " " -f2-`
	cp $cfilesdir/CapiSuite/cfg-contr0 /etc/sysconfig/isdn/
	file="cfg-contr0"
	path="/etc/sysconfig/isdn"
	strings="fcname%$fcname"
        changevalues $path $file "$strings"
	strings="vorwahl%$vorwahl"
        changevalues $path $file "$strings"

    dialog --backtitle "$dialogtitle" --title "$windowtitle" --radiolist "$dialogshorthelp\n\n
Je nach dem, ob Sie über lediglich eine oder mehrere Faxnummern verfügen,
können Sie Faxgate für den Single- oder Multi-User-Betrieb einrichten.\n\n
Für den Multi-User-Betrieb sollten Sie über einen ISDN Anlagenanschluss verfügen."  16 90 8 \
	Single-User "Es steht nur eine Fax-Nummer zur Verfügung (ISDN Mehrgeräteanschluss)." on\
	Multi-User "Es stehen mehrere Faxnummern zur Verfügung (ISDN Anlagenanschluss). " off\
	2>$setupdir/sine_temp
	singleuser=`cat $setupdir/sine_temp`

    if [[ $singleuser == "Single-User" ]]; then
	cat $cfilesdir/fileserver/samba/smb.faxgate.su >> /etc/samba/smb.shares.conf
	msgbox "Es wird ein neuer Benutzer unter dem Namen \"fax\" angelegt, mit dem Sie sich später
am Faxgate Client anmelden und der alle eingehenden Faxe per email erhält.
Geben Sie ein zugehöriges Passwort ein." "$windowtitle"

	smbldap-useradd -m fax
	smbldappw fax
	echo "Fax-Benutzer erfolgreich eingerichtet"|mailx -s "Init-Mail" fax@localhost

	chkservice "nmb"
	chkservice "smb"
    else
	cat $cfilesdir/fileserver/samba/smb.faxgate.mu >> /etc/samba/smb.shares.conf
	chkservice "nmb"
	chkservice "smb"
    fi
	# sudoers Erweiterung wird eingefügt
	cp $cfilesdir/CapiSuite/faxgate/sudoers-expansion $setupdir

	fqdn=`getconfdata "FQDN" "2"`
        path="$setupdir"
        file="sudoers-expansion"
        strings="invis5.invis-net.loc%$fqdn"
        changevalues $path $file "$strings"

        ip=`getconfdata "IP" "2"`
        strings="192.168.220.10%$ip"
        changevalues $path $file "$strings"

        cp /etc/sudoers /etc/sudoers.ori
	cat $setupdir/sudoers-expansion >> /etc/sudoers
	
	# Fax-Drucker wird eingerichtet
	pgsubtitle="Faxdrucker wird eingerichtet"
	lpadmin -p Faxgate -v faxgate://capisuite -m Faxgate.ppd.gz -E 2>&1 |pgbox
	
	sleep 1
	# Faxgate im Portal aktivieren
	swpestat FaxClient TRUE 2>&1 | tee -a $setupdir/sine.log | pgbox

	writeprepstat "webcdwriter"
	waitbox "lxerp" "webcdwriter"
	
	
    else
	msgbox "Fax-Server-Installation übersprungenen." "$windowtitle"
	writeprepstat "webcdwriter"
    fi 
}

webcdwriter() {
    cd $setupdir
    clear
    windowtitle="WebCDWriter Installation"

    dialog --backtitle "$dialogtitle" --title "$windowtitle" --exit-label "Weiter" --textbox "$setupdir/infofiles/webcdcreator.txt" 0 0 --and-widget --backtitle "$dialogtitle" --title "$windowtitle"  --defaultno --yesno "Möchten Sie WebCDCreator installieren?" 0 0
    cont=${?}

    # Weitermachen?
    if [[ $cont == "0" ]]; then
	pgsubtitle="Software wird installiert"
	zypper -n install -n webcdwriter sox 2>&1 | tee -a $setupdir/sine.log |pgbox
	zyppercheck ${PIPESTATUS[0]}
	# wodim verfügbar machen
	rm -f /var/CDWserver/bin/cdrecord
	cp -af /usr/bin/wodim /var/CDWserver/bin/wodim
	chown root:root /var/CDWserver/bin/wodim
	chmod 4750 /var/CDWserver/bin/wodim
	ln -s /var/CDWserver/bin/wodim /var/CDWserver/bin/cdrecord
	# genisoimage verfügbar machen
	rm -f /var/CDWserver/bin/mkisofs
	cp -af /usr/bin/genisoimage /var/CDWserver/bin/genisoimage
	chown root:root /var/CDWserver/bin/genisoimage
	chmod 4750 /var/CDWserver/bin/genisoimage
	ln -s /var/CDWserver/bin/genisoimage /var/CDWserver/bin/mkisofs
	# readom verfügbar machen
	rm -f /var/CDWserver/bin/readcd
	cp -af /usr/bin/readom /var/CDWserver/bin/readom
	chown root:root /var/CDWserver/bin/readom
	chmod 4750 /var/CDWserver/bin/readom
	ln -s /var/CDWserver/bin/readom /var/CDWserver/bin/readcd
	# permanenten fstab Eintrag für Brenner hinzufügen
	cp /etc/fstab /etc/fstab.ori
	echo "/dev/sr0 /media/cdrom0	udf,iso9660 noauto,utf8 0 0" >> /etc/fstab

	# cdwserver ins Runlevel-Konzept integrieren und starten
	cp $cfilesdir/CDWserver/CDWserver /etc/init.d
	chkservice "CDWserver"
	
	# CDWServer im Portal aktivieren
	swpestat WebCDWriter TRUE 2>&1 | tee -a $setupdir/sine.log | pgbox
	
    else
	msgbox "WebCDWriter Installation übersprungen" "$windowtitle"
    fi
    writeprepstat "openvpn"
    waitbox "webcdwriter" "openvpn"
}

openvpn() {
    cd $setupdir
    clear
    windowtitle="OpenVPN Installation"
    dialog --backtitle "$dialogtitle" --title "$windowtitle" --exit-label "Weiter" --textbox "$setupdir/infofiles/openvpn.txt" 38 92 --and-widget --backtitle "$dialogtitle" --title "$windowtitle"  --defaultno --yesno "Möchten Sie OpenVPN installieren?" 0 0
    cont=${?}

    if [[ $cont == "0" ]]; then
	pgsubtitle="openvpn wird installiert" 
	zypper -n install -n openvpn 2>&1 | tee -a $setupdir/sine.log | pgbox
	zyppercheck ${PIPESTATUS[0]}

	unix2dos $cfilesdir/openvpn/vpn-client.ovpn
	unix2dos $cfilesdir/openvpn/jowi_openvpnmanager/vpn-client-management.ovpn

	# openVPN Key-Center einrichten
	domain=`getconfdata "Domain" "2"`
	path="$cfilesdir/openvpn/easy-rsa/2.0"
	file="Makefile"
	cp $path/$file $path/$file.ori
	strings="openvpndomain%$domain"
        changevalues $path $file "$strings"
	cd $path
	pgsubtitle="easy-rsa wird installiert"
	make install 2>&1 | tee -a $setupdir/sine.log | pgbox
	cp $path/$file.ori $path/$file
	
        path="/etc/openvpn/$domain"
        file="vars"
	cd $path
        strings="\`pwd\`%$path"
        changevalues $path $file "$strings"

        country=`getconfdata "Country" "2"`
        strings="KEY_COUNTRY=\"US\"%KEY_COUNTRY=\"$country\""
        changevalues $path $file "$strings"

        region=`getconfdata "Region" "2"`
        strings="KEY_PROVINCE=\"CA\"%KEY_PROVINCE=\"$region\""
        changevalues $path $file "$strings"

        city=`getconfdata "City" "2"`
        strings="SanFrancisco%$city"
        changevalues $path $file "$strings"

        organisation=`getconfdata "Organisation" "2"`
        strings="Fort-Funston%$organisation"
	changevalues $path $file "$strings"

        admail=`getconfdata "Admail" "2"`
        strings="mail@host.domain%$admail"
        changevalues $path $file "$strings"

        strings="KEY_SIZE=1024%KEY_SIZE=2048"
        changevalues $path $file "$strings"

	name=`getconfdata "Admin" "2"`
	echo "export KEY_NAME=\"$name\"" >> $path/$file

	# Server-Konfiguration erzeugen.
	cp $cfilesdir/openvpn/invis-server.conf /etc/openvpn
	path="/etc/openvpn"
	file="invis-server.conf"

	strings="invis-net.loc%$domain"
        changevalues $path $file "$strings"

	ip=`getconfdata "IP" "2"`
        strings="192.168.220.10%$ip"
        changevalues $path $file "$strings"

	net=`getconfdata "Networkbase" "2"`
        strings="192.168.220.0%$net"
        changevalues $path $file "$strings"

	ddns=`getconfdata "DDNS" "2"`
        strings="openvpn_server%$ddns"
        changevalues $path $file "$strings"

	# CA, Schlüssel usw. erzeugen
	msgbox "CA, Server-Key und Diffie-Hellmann Parameter werden erzeugt. Speziell letzteres kann dauern...\nBeim Erzeugen von Zertifizierungsstelle und Server Zertifikaten können Sie in der Regel die vorgegebenen Parameter übernehmen.\nLediglich beim Feld \"Organizational Unit\" existiert keine Vorgabe. Der Parameter kann frei vergeben werden, sollte aber sinnvoll sein. Beispiel: \n\nOrganizational Unit: VPN CA bei der CA oder VPN Server beim Server-Zertifikat." "$windowtitle"
	cd /etc/openvpn/$domain
	# Umgebungsvariablen setzen
	source ./vars 
	./clean-all 
	./build-ca
	pgsubtitle="Diffie-Hellmann Parameter werden erzeugt"
	./build-dh 2>&1 |pgbox
	./build-key-server $ddns
	# Leere CRL erzeugen.
	openssl ca -config ./openssl-1.0.0.cnf -gencrl -keyfile ./keys/ca.key -cert ./keys/ca.crt -out ./keys/crl.pem
	msgbox "Beispiel Client-Konfigurationsdateien finden Sie im cfiles Unterverzeichnis.
Um Schlüssel für einen Client zu erzeugen wechseln Sie nach /etc/openvpn/$domain und führen Sie 
build-key \"clienthostname\" aus. Weitere Infos unter wiki.invis-server.de." "openVPN Clients einrichten"
    # openvpn ins Runlevel-Konzept integrieren und starten
	# Seit openSUSE 13.1 bekommt jede openvpn-Konfiguration ein eigenes systemd Service-File
	# Start und Stop koennen damit fuer jede Konfiguration einzeln erfolgen.
	cp /usr/lib/systemd/system/openvpn@.service /usr/lib/systemd/system/openvpn@invis-server.service
	chkservice "openvpn@invis-server"
    else
	msgbox "Wenn Sie es sich zu einem späteren Zeitpunkt anders überlegen, können Sie diesen Schritt durch erneutes Aufrufen des Setup-Scripts mit dem Parameter \"openvpn\" wiederholen." "OpenVPN Installation übersprungen"

    fi
    writeprepstat "dokuwiki"
    waitbox "openvpn" "dokuwiki"
}

dokuwiki() {
    cd $setupdir
    clear
    windowtitle="Dokuwiki Installation"
    dialog --backtitle "$dialogtitle" --title "$windowtitle" --exit-label "Weiter" --textbox "$setupdir/infofiles/dokuwiki.txt" 38 90 --and-widget --backtitle "$dialogtitle" --title "$windowtitle"  --defaultno --yesno "Möchten Sie Dokuwiki installieren?" 0 0
    cont=${?}

    if [[ $cont == "0" ]]; then

    # Downloadlink ermitteln
    pgsubtitle="Dokuwiki wird heruntergeladen und installiert"
    cd $setupdir
    #wget `lynx --dump http://www.splitbrain.org/projects/dokuwiki|grep "http"|grep ".tgz"|head -n1|tr -s " "|cut -d " " -f3` 2>&1 |pgbox
    #wget http://download.dokuwiki.org/src/dokuwiki/dokuwiki-stable.tgz
    
    #getpath=`find $setupdir -name "dokuwiki*.tgz"`
    #tar -xzf $getpath -C /srv/www/htdocs 2>&1 |pgbox
    #mv /srv/www/htdocs/dokuwiki* /srv/www/htdocs/dokuwiki

    pgsubtitle="Dokuwiki wird installiert" 
    zypper -n install -n dokuwiki 2>&1 | tee -a $setupdir/sine.log | pgbox
    zyppercheck ${PIPESTATUS[0]}

    # Display Wiki Page Plugin herunterladen
    # Vorübergehender Link fuer Displaywikipage
    pgsubtitle="Dokuwiki-Erweiterungen werden heruntergeladen und installiert"
    wget http://cloud.github.com/downloads/tatewake/dokuwiki-plugin-displaywikipage/displaywikipage-stable.tar.gz 2>&1 | tee -a $setupdir/sine.log | pgbox
    getpath=`find $setupdir -name "display*.tar.gz"`
    tar -xzf $getpath -C /srv/www/htdocs/dokuwiki/lib/plugins/ 2>&1 | tee -a $setupdir/sine.log | pgbox

    # Display Wiki Page Plugin herunterladen
    # Voruebergehender Link fuer Monobook Template
    wget http://cloud.github.com/downloads/tatewake/dokuwiki-template-monobook/monobook-stable.tar.gz 2>&1 | tee -a $setupdir/sine.log | pgbox
    getpath=`find $setupdir -name "monobook*.tar.gz"`
    tar -xzf $getpath -C /srv/www/htdocs/dokuwiki/lib/tpl/ 2>&1 | tee -a $setupdir/sine.log | pgbox

    # Encrypt Password Plugin
    #wget http://www.werbeagentur-willers.de/download/dokuwiki-plugins/encryptedpasswords.zip
    wget https://github.com/ssahara/dw-plugin-encryptedpasswords/archive/master.zip
    getpath=`find $setupdir -name "master.zip"`
    unzip $getpath -d /srv/www/htdocs/dokuwiki/lib/plugins/ 2>&1 | tee -a $setupdir/sine.log | pgbox
    mv /srv/www/htdocs/dokuwiki/lib/plugins/dw-plugin-encryptedpasswords-master /srv/www/htdocs/dokuwiki/lib/plugins/encryptedpasswords
    chown -R wwwrun:www /srv/www/htdocs/dokuwiki
    
    # Konfigurieren
    path="/srv/www/htdocs/dokuwiki/conf"
    file="local.php"
    cp $cfilesdir/dokuwiki/$file $path/$file
    
    organisation=`getconfdata "Organisation" "2"`
    strings="organization%$organisation"
    changevalues $path $file "$strings"
    
    adminpw=`getconfdata "LDAPAdminPW" "2"`
    strings="admin-secret%$adminpw"
    changevalues $path $file "$strings"
    
    basedn=`getconfdata "baseDN" "2"`
    strings="dc=invis-net,dc=loc%$basedn"
    changevalues $path $file "$strings"

    domain=`getconfdata "Domain" "2"`
    strings="invis-net.loc%$domain"
    changevalues $path $file "$strings"
    
    # Gruppen fuer Dokuwiki anlegen
    samba-tool group add --description="Mitlieder dürfen im Wiki lesen" wiki-nutzer 2>&1 |pgbox
    samba-tool group add --description="Mitglieder dürfen im Wiki schreiben" wiki-redakteure 2>&1 |pgbox
    samba-tool group add --description="Mitglieder dürfen im Wiki löschen" wiki-chefredakteure 2>&1 |pgbox
    
    # ACL-Datei kopieren
    cp $cfilesdir/dokuwiki/acl.auth.php /srv/www/htdocs/dokuwiki/conf/
    chown wwwrun:www /srv/www/htdocs/dokuwiki/conf/acl.auth.php

    # Dokuwiki im Portal aktivieren
    swpestat Dokuwiki TRUE 2>&1 | tee -a $setupdir/sine.log | pgbox

    else
	msgbox "Wenn Sie es sich zu einem späteren Zeitpunkt anders überlegen, können Sie diesen Schritt durch erneutes Aufrufen des Setup-Scripts mit dem Parameter \"dokuwiki\" wiederholen." "Dokuwiki Installation übersprungen"
    fi
    writeprepstat "owncloud"
    waitbox "dokuwiki" "owncloud"
}

etherpad() {
    # Wird uebersprungen bis nodejs funktioniert. April 2015
    cd $setupdir
    clear
    windowtitle="Etherpad Lite Installation"

    dialog --backtitle "$dialogtitle" --title "$windowtitle" --exit-label "Weiter" --textbox "$setupdir/infofiles/etherpad.txt" 0 0 --and-widget --backtitle "$dialogtitle" --title "$windowtitle"  --defaultno --yesno "Möchten Sie Etherpadd-Lite installieren?" 0 0
    cont=${?}

    # Weitermachen?
    if [[ $cont == "0" ]]; then
	pgsubtitle="Software wird installiert"
	zypper refresh 2>&1 | tee -a $setupdir/sine.log | pgbox
	zypper -n install nodejs etherpad-lite 2>&1 | tee -a $setupdir/sine.log | pgbox
	zyppercheck ${PIPESTATUS[0]}
	#npm install -g node-inspector 2>&1 | tee -a $setupdir/sine.log | pgbox
	confdir="/var/lib/etherpad-lite"
	file="settings.json"
	mv $confdir/$file $confdir/$file.orig
	#cp $cfilesdir/etherpad/$file $confdir/$file 2>&1 | tee -a $setupdir/sine.log | pgbox
	#cp $confdir/settings.json.template $confdir/settings.json
	etherpaddbuserpw=`mkdbsilent etherpad etherpad a`
	strings="dbuserpassword%$etherpaddbuserpw"
	changevalues $confdir $file "$strings"
	chkservice "etherpad-lite"
	#service etherpad-lite stop
	#mysql -u etherpad --password=$etherpaddbuserpw -D etherpad < $cfilesdir/etherpad/charset.sql
	#service etherpad-lite start
	
	# Etherpad im Portal aktivieren
	swpestat Etherpad TRUE 2>&1 | tee -a $setupdir/sine.log | pgbox
    else
	msgbox "Etherpad-Lite Installation übersprungen" "$windowtitle"
    fi
    writeprepstat "owncloud"
    waitbox "etherpad" "owncloud"
}

owncloud() {
    cd $setupdir
    clear
    windowtitle="ownCloud Installation"

    dialog --backtitle "$dialogtitle" --title "$windowtitle" --exit-label "Weiter" --textbox "$setupdir/infofiles/owncloud.txt" 0 0 --and-widget --backtitle "$dialogtitle" --title "$windowtitle"  --defaultno --yesno "Möchten Sie ownCloud installieren?" 0 0
    cont=${?}

    # Weitermachen?
    if [[ $cont == "0" ]]; then
	pgsubtitle="Software wird installiert"
	zypper refresh 2>&1 | tee -a $setupdir/sine.log | pgbox
	zypper -n install owncloud 2>&1 | tee -a $setupdir/sine.log | pgbox
	zyppercheck ${PIPESTATUS[0]}
	# Hier Datenbank installation einfügen
	ocpass=`mkdbsilent owncloud owncloud a`

	## Apache vorbereiten
	# Flag OWNCLOUD setzen
	a2enflag OWNCLOUD
	
	# HTTPS-owncloud-Port ändern
	ocport=`getconfdata "OCPORT" "2"`

	file="listen.conf"
	path="/etc/apache2"
	strings="ocport%$ocport"
	changevalues $path $file "$strings"

	# Apache vHost Konfiguration fuer ownCloud kopieren und anpassen
	cp $cfilesdir/webserver/owncloud_vh.conf /etc/apache2/vhosts.d/
	file="owncloud_vh.conf"
	path="/etc/apache2/vhosts.d"
	strings="ocport%$ocport"
	changevalues $path $file "$strings"

	ddnsname=`getconfdata "DDNS" "2"`
	strings="dummy.invis-server.org%$ddnsname"
	changevalues $path $file "$strings"

	# Original owncloud-Konfig ueberschreiben
	echo "# invis-Server Dummy File -> to prevent updates" > "/etc/apache2/conf.d/onwncloud.conf"

	msgbox "Datenbank für ownCloud wurde angelegt.\n\nDatenbank: owncloud\nBenutzer: owncloud\nPasswort: $ocpass\n\nNotieren Sie sich bitte diese Daten. Sie werden beim ersten Zugriff auf ownCloud benötigt." "$windowtitle"
	chkservice apache2 r
	
	# Gruppe "owncloud" anlegen
	samba-tool group add --description="Gruppe zur Beschränkung der ownCloud Nutzer" owncloud 2>&1| tee -a $setupdir/sine.log | pgbox

	# ownCloud im Portal aktivieren
	swpestat ownCloud TRUE 2>&1 | tee -a $setupdir/sine.log | pgbox
	
    else
	msgbox "ownCloud Installation übersprungen" "$windowtitle"
    fi
    writeprepstat "virtualbox"
    waitbox "owncloud" "virtualbox"
}

virtualbox() {
    cd $setupdir
    clear
    windowtitle="Virtualbox Virtualisierungsumgebung einrichten"

    dialog --backtitle "$dialogtitle" --title "$windowtitle" --exit-label "Weiter" --textbox "$setupdir/infofiles/virtualbox.txt" 0 0 --and-widget --backtitle "$dialogtitle" --title "$windowtitle"  --defaultno --yesno "Möchten Sie Virtualbox installieren?" 0 0
    cont=${?}

    # Weitermachen?
    if [[ $cont == "0" ]]; then
	pgsubtitle="Software wird installiert"
	
	# Umgebungsvariablen fuer Virtualbox erstellen
	cp $cfilesdir/virtualbox/virtualbox /etc/default
	# Virtualbox Repo installieren
	cp $cfilesdir/zypper/virtualbox.repo /etc/zypp/repos.d/
	rpmkeyimporter
	zypper refresh 2>&1 | tee -a $setupdir/sine.log | pgbox
	zypper -n install -n `cat $setupdir/zypper-package-lists/virtualbox` 2>&1 | tee -a $setupdir/sine.log | pgbox
	zyppercheck ${PIPESTATUS[0]}
	# lokaler Benutzer vbox wird angelegt
	useradd -c "Dummy Benutzer fuer phpVirtualBox" vbox 2>&1 | tee -a $setupdir/sine.log | pgbox
	pwvbox=`pwgen -sn 8 1`
	echo "vbox:$pwvbox" | chpasswd | tee -a $setupdir/sine.log | pgbox
	# phpvirtualbox Konfiguration anpassen
	path="/etc/phpvirtualbox"
	file="config.php"
	cp $cfilesdir/virtualbox/config.php $path
	strings="vboxpass%$pwvbox"
	changevalues $path $file "$strings"
	swpestat phpvirtualbox TRUE 2>&1 | tee -a $setupdir/sine.log | pgbox
	chkservice "vboxweb-service"
	
	# vbinit installieren
	# Konfigurationsverzeichnis einrichten
	mkdir /etc/vbinit
	cp $cfilesdir/virtualbox/vboxinit.conf /etc/vbinit/
	chown -R root.root /etc/vbinit
	chmod 0640 /etc/vbinit/vboxinit.conf

	# initscript kopieren
	cp $cfilesdir/virtualbox/vboxinit /etc/init.d/
	chown -R root.root /etc/init.d/vboxinit
	chmod 0750 /etc/init.d/vboxinit
	chkservice "vboxinit"
	
	# Arbeitsverzeichnisse für Virtualbox anlegen
	vbworkingdir="/srv/virtualbox"
	mkdir -p $vbworkingdir/apps
	mkdir -p $vbworkingdir/isos
	chown -R .vboxusers $vbworkingdir
	chmod -R g+ws $vbworkingdir
	VBoxManage setproperty machinefolder $vbworkingdir

    else
	msgbox "Virtualbox Installation übersprungen" "$windowtitle"
    fi
    writeprepstat "ready"
    #waitbox "virtualbox" "xfce"

}

#xfce() {
#    cd $setupdir
#    clear
#    windowtitle="XFCE Desktop-Umgebung einrichten"
#
#    dialog --backtitle "$dialogtitle" --title "$windowtitle" --exit-label "Weiter" --textbox "$setupdir/infofiles/xfce.txt" 0 0 --and-widget --backtitle "$dialogtitle" --title "$windowtitle"  --defaultno --yesno "Möchten Sie XFCE installieren?" 0 0
#    cont=${?}
#
#    # Weitermachen?
#    if [[ $cont == "0" ]]; then
#	pgsubtitle="Software wird installiert"
#	# x2go Repo installieren
#	cp $cfilesdir/zypper/x2go.repo /etc/zypp/repos.d/
#	rpmkeyimporter
#	zypper refresh 2>&1 | tee -a $setupdir/sine.log | pgbox
#	zypper -n install -n `cat $setupdir/zypper-package-lists/xfce-x2go` 2>&1 | tee -a $setupdir/sine.log | pgbox
#	zyppercheck ${PIPESTATUS[0]}

    
#    
#    else
#	msgbox "XFCE Installation übersprungen" "$windowtitle"
#    fi
#    writeprepstat "ready"

#}

### Ende der Funktionen - Beginn Hauptprogramm

# Einlesen des aktuellen Setup-Status
read -a prepstat < $setupdir/prepstat

# Hilfe ausgeben
if [[ $1 == "help" ]]; then
    echo -e "sine Aufrufe:\n"
    echo "\"sine\" ohne weitere Argumente startet das Script regulär."
    echo "\"sine status\" gibt das nächste zu startende Modul aus."
    echo "\"sine log\" gibt das Logfile aus."
    echo "\"sine showconf\" gibt die gespeicherten Konfigurationsdaten aus."
    echo -e "\"sine modulname\" ruft das angegebene Modul auf. Dies ist nur\nfür optionale Module möglich, nachdem sine einmal vollständig\ndurchgelaufen ist."
    echo -e "Optionale Module: monitoring, groupware, erp, faxgate, webcdwriter,\nopenvpn, dokuwiki, etherpad.\n"
    exit
fi


# Status Ausgabe
if [[ $1 == "status" ]]; then
    if [[ -f $setupdir/prepstat ]]; then
	echo "Nächstes sine Modul ist: $prepstat"
    else
	echo "sine wurde noch nie aufgerufen. Es wird mit Modul \"check\" begonnen."
    fi
    exit
fi

# Logfile Ausgabe
if [[ $1 == "log" ]]; then
    if [[ -f $setupdir/sine.log ]]; then
	less $setupdir/sine.log
    else
	echo "Es ist noch kein Logfile vorhanden."
    fi
    exit
fi

# Konfigurationsdaten ausgeben
if [[ $1 == "showconf" ]]; then
    if [[ -f $setupdir/sine.log ]]; then
	less $setupdir/invis_confdata
    else
	echo "Es sind noch keine Konfigurationsdaten vorhanden."
    fi
    exit
fi

# Testen, ob dialog installiert ist.

if [[ -z `which dialog 2>/dev/null` ]]; then
    echo  -e "\n\033[1;33mDas Programm \"dialog\" wird installiert.\033[0m"
    zypper -n install -n dialog
    zyppercheck ${PIPESTATUS[0]}
fi

if [[ $prepstat == "ready" ]] && [[ $1 == "monitoring" || $1 == "groupware" || $1 == "erp" || $1 == "faxgate" || $1 == "webcdwriter" || $1 == "openvpn" || $1 == "dokuwiki" || $1 == "etherpad" || $1 == "owncloud" || $1 == "virtualbox" ]]; then
	echo $1
	sleep 1
	$1
	echo "ready" > $setupdir/prepstat
else
    read -a nextstep < $setupdir/prepstat
    while [[ $nextstep != "ready" ]]; do
	# Aufruf des nächsten Setup-Schrittes
	#echo $nextstep
	sleep 1
	$nextstep
	read -a nextstep < $setupdir/prepstat
    done
fi

# Und Tschuess
textbox "$setupdir/infofiles/aftersetup.txt" "Installation abgeschlossen" "Beenden"

# Auräumen -- Evtl. verwaiste dialog Prozesse killen
killall dialog > /dev/null 2>&1
rm -f ./$setupdir/sine_temp

