#!/bin/bash
# invis AD 11.0 Server Setup Script
# Version 11.0
# (c) August 2008 Stefan Schäfer / FSP Computer & Netzwerke
# (c) 2009-2016 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="11.0"

# 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 "." " "))
    # Neue QnD Loesung zum Bau der Reverse-Zone
    # funktioniert zumindest bei glatten Netzwerkmasken zuverlaessig.
    case $netmask in
	"255.255.255.0"|"24")
		revzone="${netbase[2]}.${netbase[1]}.${netbase[0]}"
		;;
	"255.255.0.0"|"16")
		revzone="${netbase[1]}.${netbase[0]}"
		;;
	"255.0.0.0"|"8")
		revzone="${netbase[0]}"
		;;
    esac
    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 "ntpd"
        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 oder Zarafa?
    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 ähnlich MS Exchange" on\
	roundcube "Webmailer Roundcube in Kombination mit Dovecot." off\
	tine20 "tine2.0 in Kombination mit Dovecot IMAP (Experimentell)" off\
	sogo "SOGo in Kombination mit Dovecot (noch nicht mit invisAD)" off\
	2>$setupdir/sine_temp
	whichgroupware=`cat $setupdir/sine_temp`

#---# Samba Pakete - Es werden ab 11.1 unsere eigenen Samba-Pakete in V. 4.5 inkl. AD installiert
#---# Zugangsdaten fuer Sernet-Repo abfragen
    whichsamba="invis"
## Stefan
# Der nachfolgende Block wurde lediglich auskommentiert, koennte ja moeglich sein,
# dass wir die Installation kostenpflichtiger Sernet-Pakete ermoeglichen wollen.

#    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=${?}

    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-Admin und junk erzeugen
    ldappw=`pwgen -snc 8 1`
    junkpw=`pwgen -snc 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 "JunkPW:$junkpw" >> $setupdir/invis_confdata
    echo "MySQLpw:$mysqlpw" >> $setupdir/invis_confdata
    echo "NtopPw:$ntoppw" >> $setupdir/invis_confdata
    echo "Groupware:$whichgroupware"  >> $setupdir/invis_confdata
    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

    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

    # Internes Interface auch offline hochfahren erzwingen
    grep LINK_REQUIRED /etc/sysconfig/network/ifcfg-intern 2>&1| tee -a $setupdir/sine.log | pgbox
    if [[ "${PIPESTATUS[0]}" -ne "0" ]]; then
        echo "LINK_REQUIRED='no'" >> /etc/sysconfig/network/ifcfg-intern
        echo "LINK_REQUIRED der Netzwerkkonfiguration hinzugefügt!" 2>&1| tee -a $setupdir/sine.log | pgbox
    fi

    # 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

        pgsubtitle="Sernet Samba Pakete werden installiert"
	zypper -n install --force-resolution -n `cat $setupdir/zypper-package-lists/sernet_samba` 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

    else
	zypper -n install --force-resolution -n `cat $setupdir/zypper-package-lists/invis_samba` 2>&1| tee -a $setupdir/sine.log | pgbox
    fi

    # Nachfolgenden Block erhalten, aber an die sernet-Pakete gekoppelt
    if [[ $sambapackages == "sernet" ]]; then
	# Links fuer sssd anlegen, startet ansonsten nicht mit den Sernet-Samba Paketen
	cd $libdir
	libtevent=`find $libdir/samba/ -type f -name "libtevent.so*"`
	libtevent=`basename $libtevent`
	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

	#libndrnbt=`find $libdir/samba/ -type f -name "libndr-nbt.so*"`
	#libndrnbt=`basename $libndrnbt`
	#ln -s samba/$libndrnbt libndr-nbt.so.0 2>&1| tee -a $setupdir/sine.log | pgbox

	libtalloc=`find $libdir/samba/ -type f -name "libtalloc.so*"`
	libtalloc=`basename $libtalloc`
	ln -s samba/$libtalloc libtalloc.so.2 2>&1| tee -a $setupdir/sine.log | pgbox

	libldb=`find $libdir/samba/ -type f -name "libldb.so*"`
	libldb=`basename $libldb`
	ln -s samba/$libldb libldb.so.1 2>&1| tee -a $setupdir/sine.log | pgbox

	libkrb5pac=`find $libdir/samba/ -type f -name "libndr-krb5pac.so*"`
	libkrb5pac=`basename $libkrb5pac`
	ln -s samba/$libkrb5pac libndr-krb5pac.so.0 2>&1| tee -a $setupdir/sine.log | pgbox
    fi
    
    # 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"`
    revdomain=`getconfdata "ReverseDom" "2"`
    revdomain="$revdomain.in-addr.arpa"

    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"

    strings="220.168.192.in-addr.arpa%$revdomain"
    changevalues $path $file "$strings"

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

    pgsubtitle="Es wird eine Zertifizierungsstelle erzeugt"
    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!" "CA erstellen"

    ## easy-rsa einrichten und CA bauen
    cp $cfilesdir/easy-rsa/vars /etc/easy-rsa 2>&1| tee -a $setupdir/sine.log | pgbox
    file="vars"
    path="/etc/easy-rsa"

    domain=`getconfdata "Domain" "2"`
    strings="localdomain%$domain"
    changevalues $path $file "$strings"
    
    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"

    # PKI initialisieren
    easyrsa init-pki 2>&1| tee -a $setupdir/sine.log | pgbox

    # CA aufbauen
    easyrsa build-ca
    # CA Datei kopieren
    cp $path/$domain/ca.crt /etc/invis/certs
    chmod go+r /etc/invis/certs/ca.crt
    
    # DH-Parameterdatei erzeugen
    # easyrsa nutzt die Vorgabe der allgemeinen Schluessellaenge
    # auch fuer die DH Parameter Datei. Daraus resultiert eine
    # sehr laaaaaaaange dauernde Berechnung.
    #easyrsa gen-dh 2>&1| tee -a $setupdir/sine.log | pgbox
    
    # 2048 und 512 Bit DH-Parameter direkt mit openssl 
    openssl gendh -out $path/$domain/dh.pem -2 2048 2>&1| tee -a $setupdir/sine.log | pgbox
    openssl gendh -out $path/$domain/dh_512.pem -2 512 2>&1| tee -a $setupdir/sine.log | pgbox
    # Beide Dateien auch fuer Postfix bereit stellen
    cp $path/$domain/dh*.pem /etc/postfix
    
    # CRL Umgebung initialisieren
    easyrsa gen-crl

    # CRL Chain Datei erzeugen
    cat $path/$domain/ca.crt $path/$domain/crl.pem > $path/$domain/crl-chain.pem

    # Zeitzoneneinstellung des Servers ermitteln
    # php versteht CEST nicht 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 "Groupware" "2"`
    ## verwendete Groupware in Konfigurationsdatei schreiben
    case $groupware in
	"zarafa" ) 
	    strings="usedgroupware%zarafa"
	    changevalues $confdir $file "$strings"
	    ;;
	"tine20" )
	    strings="usedgroupware%tine20"
	    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 "ntpd"

    # 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"
    
    # Apparmor deaktivieren -> muss mit eigenen Samba Paketen wieder aktiviert werden
    systemctl disable apparmor.service
    systemctl stop apparmor.service
    
    # Workaround, da apparmor scheinbar nichts von Systemd haelt
    chkconfig -d boot.apparmor
    
    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
    fi

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

    # Verwendete Samba-Pakete ermitteln
    sambapackages=`getconfdata "SambaPakete" "2"`

    if [[ $sambapackages == "sernet" ]]; then
	# 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"
    else
	chkservice "samba"
    fi
    # 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

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

    # User fuer Junk-Postfach anlegen
    junkpw=`getconfdata "JunkPW" "2"`
    samba-tool user create junk "$junkpw" --surname="Junk Owner" --given-name="Junk" --description="Benutzer für Junk-Postfach" 2>&1| tee -a $setupdir/sine.log | pgbox
    samba-tool user setexpiry --noexpiry junk
    samba-tool group addmembers "maildummies" junk 2>&1| tee -a $setupdir/sine.log | pgbox
    samba-tool group removemembers "Domain Users" junk 2>&1| tee -a $setupdir/sine.log | pgbox

    msgbox "Es wurde ein Benutzer \"junk\" angelegt. Dieser Benutzer fungiert als \"Spam-Owner\".\nSein Passwort lautet: $junkpw"

    if [[ $sambapackages == "sernet" ]]; then
	# Sernet-Samba AD stoppen
	systemctl stop sernet-samba-ad.service 2>&1| tee -a $setupdir/sine.log | pgbox
    else
	systemctl stop samba.service 2>&1| tee -a $setupdir/sine.log | pgbox
    fi

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

    inviscerts intern 2>&1| tee -a $setupdir/sine.log
    chown -R :pkeys /etc/invis/private 2>&1| tee -a $setupdir/sine.log
    chmod g+rx,o-rx /etc/invis/private 2>&1| tee -a $setupdir/sine.log

    if [[ $sambapackages == "sernet" ]]; then
	# Sernet-Samba AD stoppen
	systemctl start sernet-samba-ad.service 2>&1| tee -a $setupdir/sine.log | pgbox
    else
	systemctl start samba.service 2>&1| tee -a $setupdir/sine.log | pgbox
    fi
    
    ## 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/
    
    ## 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/
    fullhostname=$(hostname -f)
    strings="invis.invis-net.loc%$fullhostname"
    changevalues /srv/www/htdocs/phpldapadmin/config/ config.php "$strings"

    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 wird nicht mehr benoetigt, da jetzt das Script moddnsrecors zum Anlegen des 
    # Server PTRs verwendet wird.
    #hostaddr=`echo $ipaddr|cut -d "." -f4`
    
    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
    moddnsrecords a PTR $ipaddr $fqdn
    #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"

    # Für LDAP TLS notwendig
    sysconf_addword /etc/sysconfig/dhcpd DHCPD_CONF_INCLUDE_FILES /etc/invis/certs/ca.crt 2>&1| tee -a $setupdir/sine.log | pgbox

    # 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

    # Spam-Assassin aktualisieren
    sa-update

    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
    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"

    inviscerts ms 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

    # Kopieren der Postfix-Konfigurationsdateien
    cp $cfilesdir/mailserver/postfix/* /etc/postfix 2>&1| tee -a $setupdir/sine.log
    # ldap-aliases wird nicht mehr benoetigt
    rm /etc/postfix/ldap-aliases.cf 2>&1| tee -a $setupdir/sine.log
    
    ## SOGo, Group-e, Zarafa oder Roundcube
    whichgroupware=`getconfdata "Groupware" "2"`
    case "$whichgroupware" in
    
	"sogo"|"roundcube"|"tine20" )
	    # 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"

	    strings="DC=invis-net,DC=loc%$basedn"
	    changevalues $path $file "$strings"

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

	    ldaphost=`hostname -f`
	    strings="ldaphostname%$ldaphost"
	    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"`
	    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 2>&1| tee -a $setupdir/sine.log
	    postmap /etc/postfix/relay 2> /dev/null
	    ;;
	"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 2> /dev/null
    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-groups.cf)

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

	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/VPN-Clients/Windows/jowi_openvpnmanager/vpn-client-management.ovpn 2>&1| tee -a $setupdir/sine.log | pgbox
    unix2dos /srv/shares/service/Remove_DC/* 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

    #Verzeichnisrechte anpassen - Profilverzeichnisse
    chmod 1777 /srv/shares/profiles 2>&1| tee -a $setupdir/sine.log

    #Verzeichnisrechte anpassen - Druckertreiber Freigabe print$
    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`

    # 24 oder 16 Bit Netzwerkmaske?
    ipnetmask=`getconfdata "NMask-short" "2"`
    if [[ $ipnetmask == "24" ]]; then
	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"
    elif [[ $ipnetmask == "16" ]]; then
	netpart="$netpart1.$netpart2"
	strings="192.168.220%$netpart"
	changevalues $path $file "$strings"
	netpart="$netpart2.$netpart1"
	strings="220.168.192%$netpart"
	changevalues $path $file "$strings"
    
	# IP Bereiche an 16 Bit Netzwerkmaske anpassen
	# Server
	strings="11, 19%0.11, 0.253"
	changevalues $path $file "$strings"
	# Drucker
	strings="20, 50%1.1, 1.254"
	changevalues $path $file "$strings"
	# IP-Geraete 
	strings="60, 90%2.1, 3.254"
	changevalues $path $file "$strings"
	# Client Computer
	strings="120, 199%4.1, 4.254"
	changevalues $path $file "$strings"
    fi
    # Netzwerkmaske in Portalkonfigurationen eintragen. 
    strings="ipnetmask%$ipnetmask"
    changevalues $path $file "$strings"

    ipnetbase=`getconfdata "Networkbase" "2"`
    # Netzwerkmaske in Portalkonfigurationen eintragen. 
    strings="ipnetbase%$ipnetbase"
    changevalues $path $file "$strings"

    # Verwendete Groupware in Portal-Konfiguration eintragen
    groupware=`getconfdata "Groupware" "2"`
    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, wenn nicht aktivieren
    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/invis/certs/ca.crt /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"

### aufraeumen -> PHP 5.5 verwendet internes opcache Modul und nicht mehr APC
    # 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"
	inviscerts extern
	
        # 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
    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.service /etc/systemd/system/
    systemctl daemon reload
    path="/etc/systemd/system"
    file="fetchmail.service"
    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"
    chkservice "apache2"

    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 die openSUSE-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%$ocport"
    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"

    # 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
	usermod -a -G mysql nagios 2>&1| tee -a $setupdir/sine.log
	mkdir /home/nagios/.ssh 2>&1 | tee -a $setupdir/sine.log
	chown -R nagios:nagios /home/nagios/ 2>&1 | tee -a $setupdir/sine.log
	cp $cfilesdir/monitoring/nagios/sudoers.d/nagios_sudoers /etc/sudoers.d
	
	;;
    "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/monitoring/zabbix/zabbix-agentd.conf /etc/zabbix 	2>&1| tee -a $setupdir/sine.log
        cp $cfilesdir/monitoring/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"
	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"
	
    else
	msgbox "apcupsd Installation übersprungen" "$windowtitle"
    fi
    writeprepstat "groupware"
    waitbox "apcupsd" "groupware"
}

groupware() {

whichgroupware=`getconfdata "Groupware" "2"`

case "$whichgroupware" in

    "tine20" )
	cd $setupdir
	clear
	windowtitle="tine20 Installation"
	dialog --backtitle "$dialogtitle" --title "$windowtitle" --exit-label "Weiter" --textbox "$setupdir/infofiles/tine20.txt" 38 90 --and-widget --backtitle "$dialogtitle" --title "$windowtitle"  --defaultno --yesno "Möchten Sie tine20 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 tine20 2>&1 | tee -a $setupdir/sine.log | pgbox
	    zyppercheck ${PIPESTATUS[0]}

	    pgsubtitle="tine20 wird installiert."
	    # Datenbank anlegen
	    tinedbpw=`mkdbsilent tine20 tine20 a`
	    
	    # Mini-Konfiguration erstellen und anpassen
	    path="/var/lib/tine20/webroot"
	    cp $cfilesdir/tine20/config.inc.php $path
	    file="config.inc.php"
	    strings="tinedbpw%$tinedbpw"
	    changevalues $path $file "$strings"

	    # Zufallspasswort fuer Tine20 Setup-Zugang erstellen, einsetzen und anzeigen
	    t20setuppw=`pwgen -sn 10 1`
	    strings="t20setuppw%$t20setuppw"
	    changevalues $path $file "$strings"
	    msgbox "Es wurde ein Passwort für den Benutzer \"tine20setup\" erstellt.\nPasswort: $t20setuppw\n\nNotieren Sie sich bitte diese Daten. Sie werden beim Zugriff auf die Tine 2.0 Setup-Seite benötigen." "$windowtitle"

	    # Zugriffsrechte auf Config-Datei so aendern, dass Apache sie schreiben darf
	    chown wwwrun $path/$file
	    
	    # Tine 2.0 im Portal aktivieren
	    swpestat Tine-2.0 TRUE 2>&1 | tee -a $setupdir/sine.log | pgbox
	    a2enflag TINE20

	    # Original Tine20 Apache Konfiguration mit Dummy-Text ueberschreiben
	    echo "# invis-server.org: Tine20 Dummy Datei. Diese Datei verhindert Update-Probleme." > /etc/apache2/conf.d/tine20.conf
	    # Apache neu starten
	    chkservice "apache2"

	    # Gruppe fuer Tine 2.0 anlegen
	    samba-tool group add --description="Gruppe zur Beschränkung der Tine 2.0 Nutzer" tine20 2>&1| tee -a $setupdir/sine.log | pgbox
	
	    writeprepstat "erp"
	    waitbox "groupware" "erp"
	else
	    msgbox "Tine 2.0 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/
	chmod go+r /etc/zarafa/*.cfg
	
	# 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="/var/run/zarafa%/var/run/zarafad/server.sock"
	changevalues $path $file "$strings"
    
	strings="London%Berlin"

	strings="en_GB%de_DE.UTF-8"
	changevalues $path $file "$strings"
    
	# Zarafa-Schluessel erzeugen
	mkzarafakey
    
	# Rechte am Zarafa Attachement-Verzeichnis anpassen
	mkdir /srv/zarafa
	chown -R zarafa.zarafa /srv/zarafa
    
	# 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-push2.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
	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 | tee -a $setupdir/sine.log  |pgbox
	    zypper -n install -n `cat $setupdir/zypper-package-lists/kivitendo` 2>&1 | tee -a $setupdir/sine.log  |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 | tee -a $setupdir/sine.log  |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"

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

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

	# Schluesselverzeichnis erstellen und fuellen
	domain=`getconfdata "Domain" "2"`

	keydir="/etc/openvpn/keys"
	mkdir $keydir
	cp /etc/easy-rsa/$domain/dh.pem $keydir
	cp /etc/easy-rsa/$domain/crl.pem $keydir
	cp /etc/easy-rsa/$domain/ca.crt $keydir

	#msgbox "Schlüssel und Zertifikat für VPN-Server wird erzeugt." "$windowtitle"
	## Webserverschluessel übernehmen
	cp /etc/easy-rsa/$domain/private/$ddns.key $keydir
	cp /etc/easy-rsa/$domain/issued/$ddns.crt $keydir

	msgbox "Beispiel Client-Konfigurationsdateien finden Sie im cfiles Unterverzeichnis.
Um Schlüssel für einen Client zu erzeugen führen Sie inviscerts vpn 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

    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 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 2>&1 | tee -a $setupdir/sine.log | pgbox
    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| tee -a $setupdir/sine.log  |pgbox
    samba-tool group add --description="Mitglieder dürfen im Wiki schreiben" wiki-redakteure 2>&1| tee -a $setupdir/sine.log  |pgbox
    samba-tool group add --description="Mitglieder dürfen im Wiki löschen" wiki-chefredakteure 2>&1| tee -a $setupdir/sine.log  |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
	etherpaddbuserpw=`mkdbsilent etherpad etherpad a`
	strings="dbuserpassword%$etherpaddbuserpw"
	changevalues $confdir $file "$strings"
	chkservice "etherpad-lite"
	
	# 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="your.ddns-domain.net%$ddnsname"
	changevalues $path $file "$strings"

	# Original owncloud-Konfig ueberschreiben
	echo "# invis-Server Dummy File -> to prevent updates" > "/etc/apache2/conf.d/owncloud.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 -snc 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

# Zertifikate fuers Portal pruefen
getcertinfo
# 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

