#!/bin/bash
### MODUL-NR. 002 ###
# (c) August 2008 Stefan Schäfer / FSP Computer & Netzwerke
# (c) 2009-2019 Stefan Schäfer / invis-server.org / stefan@invis-server.org
# (c) 2013,2014 Dimitri Asarowski / invis-server.org / dimitri@invis-server.org
# (c) 2013-2017 Ingo Göppert / invis-server.org / ingo@invis-server.org

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

# Das Modul quest fragt alle wichtigen Umgebungsdaten ihres invis-Sub-Servers ab.

# This module asks for the environment data for your invis-server installation.

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

# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.

# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.

# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

# include functions
source $SINEINCLUDEDIR/functions

modulename=`basename $0`
clear

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

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

# Vorgaben ermitteln
# possible, that we don't need this anymore
vhn=`hostname -s`
vdomname=`hostname -d`
#vipaddr=`ip address show intern|tr -s " "|grep "inet "|cut -d "/" -f1 | cut -d " " -f3`
#cidrmask=`ip address show intern|tr -s " "|grep "inet "|cut -d "/" -f2 |cut -d " " -f1`
#vlongnmask=`cdr2mask $cidrmask`
country="DE"
#---#

#---# invis-Server FQDN
ok=0
while (( $ok != "1" ));do
    dialog --backtitle "$DIALOGTITLE - Modul: $modulename" --title "Hauptserver" --form "$DIALOGSHORTHELP\n\n
Geben Sie bitte den im Internet gültigen Namen Ihres zentralen invis-Serves ein." 14 74 3 \
    "FQDN invis-Server:" 2 2 "$masterfqdn" 2 22 45 0\
    2>$SINEWORKINGDIR/sine_temp2
    exitcode=${?}
    masterfqdn=`cat $SINEWORKINGDIR/sine_temp2`
    if [[ $masterfqdn =~ ^[a-zA-Z0-9_\-]{1,254}\.[a-zA-Z0-9_\-]{1,254}+\.?[a-zA-Z0-9_\-]{1,254}+\.[a-zA-Z]{1,5}$ ]];then
	ok=1
    fi
done

#---# VPN Certificate Data
ok=0
while (( $ok != "2" ));do
    dialog --backtitle "$DIALOGTITLE - Modul: $modulename" --title "VPN Zertifikat" --form "$DIALOGSHORTHELP\n\n
Geben Sie bitte den Pfad zum Zertifikatscontainer (P12) und das zugehörige Passwort ein." 14 74 3 \
    "Pfad:" 1 2 "$p12path" 1 20 45 0\
    "Passwort:" 3 2 "$p12pw" 3 20 45 0\
    2>$SINEWORKINGDIR/sine_temp2
    exitcode=${?}
    p12data=(`cat $SINEWORKINGDIR/sine_temp2`)
    if [[ -f "${p12data[0]}" ]];then
	p12path="${p12data[0]}"
	(( ok=$ok + 1 ))
    fi

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

#---# AD Domain
ok=0
while (( $ok != "1" ));do
    dialog --backtitle "$DIALOGTITLE - Modul: $modulename" --title "AD Domäne" --form "$DIALOGSHORTHELP\n\n
Geben Sie bitte die ActiveDirectory Domäne Ihres zentralen invis-Serves ein." 14 74 3 \
    "AD Domäne:" 2 2 "$addomain" 2 22 45 0\
    2>$SINEWORKINGDIR/sine_temp2
    exitcode=${?}
    addomain=`cat $SINEWORKINGDIR/sine_temp2`
    if [[ $addomain =~ ^[a-zA-Z0-9_\-]{1,254}+\.?[a-zA-Z0-9_\-]{1,254}+\.[a-zA-Z]{1,5}$ ]];then
	ok=1
    fi
done

#---# Who is the admin
ok=0
while (( $ok != "2" ));do
    dialog --backtitle "$DIALOGTITLE - Modul: $modulename" --title "IT Dienstleister" --form "$DIALOGSHORTHELP\n\n
Geben Sie bitte Kontaktdaten des für den Server verantwortlichen Administrators ein." 14 74 3 \
    "email:" 1 2 "$admail" 1 20 45 0\
    "Name:" 3 2 "$admin" 3 20 45 0\
    2>$SINEWORKINGDIR/sine_temp2
    exitcode=${?}
    admincontact=(`cat $SINEWORKINGDIR/sine_temp2`)
    if [[ ${admincontact[0]} =~ ^[a-zA-Z0-9-]+([._a-zA-Z0-9.-]+)*@[a-zA-Z0-9.-]+\.([a-zA-Z]{2,4}) ]];then
	admail="${admincontact[0]}"
	(( ok=$ok + 1 ))
    fi

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

# DNS Forwarder
ok=3
while (( $ok != "0" ));do
    dialog --backtitle "$DIALOGTITLE - Modul: $modulename" --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" 25 70 5 \
    "DNS 1:" 1 2 "${fdns[0]}" 1 10 30 0\
    "DNS 2:" 3 2 "${fdns[1]}" 3 10 30 0\
    "DNS 3:" 5 2 "${fdns[2]}" 5 10 30 0\
    2>$SINEWORKINGDIR/sine_temp2
    fdns=(`cat $SINEWORKINGDIR/sine_temp2`)

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

# Da derzeit lediglich Clamav zur Verfuegung steht, wird auf die Abfrage verzichtet.
av=clamav

#---# Monitoring
dialog --backtitle "$DIALOGTITLE - Modul: $modulename" --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" 17 80 7 \
    nagios "Nagios-Plugins (Icinga & Nagios)" on\
    zabbix "Zabbix-Agent" off\
    keine  "Keine Überwachung" off\
    2>$SINEWORKINGDIR/sine_temp2
    whichmonitoring=`cat $SINEWORKINGDIR/sine_temp2`

#---# DDNS    
yesno "Soll Ihr invis Server via Internet (SSH) 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 - Modul: $modulename" --title "Fernzugang" --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>$SINEWORKINGDIR/sine_temp2
	exitcode=${?}
	ddnshn=`cat $SINEWORKINGDIR/sine_temp2`
	
	# 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 - Modul: $modulename" --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." 20 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>$SINEWORKINGDIR/sine_temp2
	exitcode=${?}
	# Doch noch abbrechen
	if [[ $exitcode == "1" || $exitcode == "255" ]]; then
	    mailrelay="none"
	    break
	fi
	
	smtpvalues=(`cat $SINEWORKINGDIR/sine_temp2`)
	
	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 - Modul: $modulename" --title "Transferverzeichnis aufräumen" --radiolist "Wie alt dürfen Dateien und Verzeichnisse in der Transferfreigabe maximal werden?" 12 50 4\
    "21 Tage" "3 Wochen" off\
    "42 Tage" "6 Wochen" on\
    "90 Tage" "3 Monate" off\
    2>$SINEWORKINGDIR/sine_temp2
    trdays=`cat $SINEWORKINGDIR/sine_temp2|cut -d " " -f1`
fi

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

#   Ports fuer SSH, HTTPS-Portal ermitteln.
sshport=`freeports`
httpsport=`freeports`
# Doppelte Portbelegung verhindern
while [[ $sshport == $httpsport ]]; do
    httpsport=`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 (Administration): $sshport\n\n
HTTPS Port (invis-Portal): $httpsport\n\n
Aus Ihrem lokalen Netz heraus kann für SSH weiter Port 22 verwendet werden." "SSH und HTTPS Port"

# Alle Daten in Kontrolldatei Schreiben

echo "Admail:$admail" > $SINEWORKINGDIR/invis_confdata
echo "Admin:$admin" >> $SINEWORKINGDIR/invis_confdata

echo "P12Path:$p12path" >> $SINEWORKINGDIR/invis_confdata

echo "Workgroup:$addomain" >> $SINEWORKINGDIR/invis_confdata
echo "Forwarders:$forwarders"  >> $SINEWORKINGDIR/invis_confdata

echo "MonitoringSoftware:$whichmonitoring" >> $SINEWORKINGDIR/invis_confdata
echo "SSHPORT:$sshport" >> $SINEWORKINGDIR/invis_confdata
echo "HTTPSPORT:$httpsport" >> $SINEWORKINGDIR/invis_confdata

echo "AV:$av" >> $SINEWORKINGDIR/invis_confdata
if [[ $avcron == "0" ]]; then
    echo "AVCRON:j" >> $SINEWORKINGDIR/invis_confdata
else
    echo "AVCRON:n" >> $SINEWORKINGDIR/invis_confdata
fi
echo "DDNS:$ddnshn" >> $SINEWORKINGDIR/invis_confdata
    
if [[ $mailrelay == "none" ]]; then
    echo "SMTPRELAY:$mailrelay" >> $SINEWORKINGDIR/invis_confdata 
else
    echo "SMTPRELAY:$mailrelay" >> $SINEWORKINGDIR/invis_confdata 
    echo "SMTPRUN:$smtpun" >> $SINEWORKINGDIR/invis_confdata 
    echo "Relayhost Benutzer:SMTPRPW:$smtppw" > $SINEWORKINGDIR/invis_pws 
fi
if [[ $cleantr == "0" ]]; then
    echo "cleanTR:j" >> $SINEWORKINGDIR/invis_confdata
    echo "TRmaxDays:$trdays" >> $SINEWORKINGDIR/invis_confdata
else
    echo "cleanTR:n" >> $SINEWORKINGDIR/invis_confdata
fi

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

# Create passwords and write them in invis_pws
# Passwort fuer LDAP-Admin und junk erzeugen
mysqlpw=`pwgen -sBnc 10 1`

echo "Schlüsselpasswort:P12PW:$p12pw" >> $SINEWORKINGDIR/invis_pws
echo "MySQL root:MySQLPW:$mysqlpw" >> $SINEWORKINGDIR/invis_pws

chmod 0600 $SINEWORKINGDIR/invis_pws

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