#!/bin/bash
# Mit diesem Skript kann auf einem Proxmoxnode ein SVWS-Server ueber den linuxinstaller des SVWS-Servers installiert werden. 
# Hiebei werden alle noetigen Einstellungen fuer den SVWS-Server in der .env Datei gespeichert (siehe [.env])
#
#
##
## [Variablen]
##
#
VERSIONSNR=0.8.15							# Download dieser Version des SVWS-Servers
SCHILD_VERSIONSNR=3.0.88						# Download dieser Version der zum SVWS-Servers passenden (bitte pruefen) SCHILD3 Oberflaeche
#
NODE=pve 								# Name des Proxmoxnode, auf dem der SVWS-Server betrieben wird
LXC_TEMPLATE=locale:vztmpl/debian-12-standard_12.0-1_amd64.tar.zst 	# Pfad zum LCX Template auf dem o.g. Proxmox
IPSNM=10.1.0.100/24								# Der Container erhaelt per Default per dhcp seine IP - kann aber auch im Script uebergeben werden
GATEWAY=10.1.0.1							# Gateway in dem Netzwerk des SVWS-Servers
VSWITCH=vmbr0								# virtueller Switch in dem Netzwerk des SVWS-Servers
# weitere Einstellungen der LXC-Containers unter [LXC-Container] moeglich
#
REVERSEPROXY_LXCNR=102							# Zur Konfiguration des Reverseproxy und Einrichtung des Zertifikats benoetigte Nummer des ReverseProxy
##
##
# [README]
# moegliche Installationsvoraussetzungen: 
# Sie haben auf der IP 10.1.0.2 eine Firewall, die per dnsmasq einen DHCP-Server betreibt. Hier wird die IP eingetragen und im Netzwerk bekanntgegeben. 
# Dieser Server dient auch als Reverse Proxy, der den Port 80 auf 443 umleitet bzw. auf 8443 intern.  Die FQD-Names mussen beim zustaendigen DNS Dienst auf die IP zeigen. Hier empfehelen sich sub-Domains
# schule1.testdomain.de, schule2.testdomain.de, ...
#
# !!! Das Root Password kann entweder bei Aufruf des Scripts gesetzt werden oder es ist per default: ROOTPWD=admin$SNR, Bsp: admin112233 es empfiehlt sich das Passwort bei der Installation zu setzen. 
# !!! Dieses Passwort wird (nur) in diesem LXC Container fuer den Mariadb Zugang, den root-shell-login und den Keystore verwendet. Wer dies auftrennen moechte sollte dies dann im Skript anpassen.
#
# !!! ACHTRUNG: die Locales auf den Prommoxhost muessen ordentlich installiert sein. Hier ggf noch einmal "dpkg-reconfigure locales" ausfuehren und einmal aus der Konsole ausloggen. 
# Dies koennte sonst zu boesen Fehlermeldungen bei der Installation von
#
#
##
## [Argumente auslesen]
##
#
if [ -z "$4" ]
then

    echo ""
    echo "Geben Sie bitte Schulnummer, Domaine, IP und Passwort an! "
    echo ""
    echo "Syntax: bash pve_create_svws-server.sh LinuxContainerNR FQDN IP ROOTPW"
    echo ""
    echo "Example:"
    echo "bash pve_create_svws-server.sh 112233 testschule1.testdomain.de 10.1.1.1 Hier_das_Passwort"
    echo ""
    echo ""

else

    SNR=$1


	if [ "$2" ]
	then
		FQDN=$2
	else
		FQDN=$1
	fi

	if [ "$3" ]
        then
                IPSNM=$3/16
                IP=$3
        else
                IPSNM=dhcp
        fi

	if [ "$4" ]
        then
                ROOTPWD=$4
        else
                ROOTPWD=admin$SNR
        fi



    echo ""
    echo "creating SVWS-Server: $SNR"
    echo "URL: $FQDN"
    echo "rootpasswd: $ROOTPWD"
    echo "SVWS-Version: $VERSIONSNR"
    echo "IP: $IPSNM"
    echo ""
##
## [LCX-Container]
##
#
# Ggf. Koennen hier noch Anpassungen zum verwendeten Storage, Speicher, CPU etc. gemacht werden.
#
pct create $SNR \
$LXC_TEMPLATE \
--hostname $FQDN \
--memory 4096 \
--cores 2 \
--net0 name=eth0,bridge=$VSWITCH,firewall=1,gw=$GATEWAY,ip=$IPSNM \
--storage local \
--rootfs local:8 \
--unprivileged 1 \
--pool Schulungsumgebung \
--ignore-unpack-errors  \
--ostype debian \
--password=$ROOTPWD \
--start 1
# more options:
# --ssh-public-keys /root/.ssh/authorized_keys
# --onboot 1
# --cpuunits $cpuunits
# --net name=eth0,ip4=dhcp
# Zeit einplanen, falls der DHCP oder andere Prozesse diese brauchen.
sleep 10
##
## [Softwaredownload]
##
pct exec $SNR -- tee -a /etc/locale.gen <<EOF
 de_DE.UTF-8 UTF-8
EOF
pct exec $SNR -- locale-gen
# Zur Sicherheit die Variablen derr Locales nochmal temporaer in dem Proxmoxterminal setzen.
export LANGUAGE=de_DE.UTF-8
export LANG=de_DE.UTF-8
export LC_ALL=de_DE.UTF-8

pct exec $SNR -- locale
#
pct exec $SNR -- apt update && apt upgrade -y
pct exec $SNR -- apt autoremove -y
# Jenach Anwendung oder Bedarf benoetigt man nicht alle Softwarepakete.
pct exec $SNR -- apt install net-tools dnsutils nmap samba ufw zip git fail2ban ssh nginx -y
pct exec $SNR -- ufw allow ssh
pct exec $SNR -- ufw allow samba
pct exec $SNR -- ufw allow http
pct exec $SNR -- ufw allow https
pct exec $SNR -- ufw allow 8443
pct exec $SNR -- ufw enable
# Download SVWS-Server
pct exec $SNR -- wget https://github.com/SVWS-NRW/SVWS-Server/releases/download/v$VERSIONSNR/install-$VERSIONSNR.sh
# Wahrscheinlich verhindert ein Bug den Dowload -- daher eun Workaround:
pct exec $SNR -- wget https://github.com/SVWS-NRW/SVWS-Server/releases/download/v$VERSIONSNR/linux-installer-$VERSIONSNR.tar.gz
#
##
## [SVWS Konfiguration]
##
# Ggf koennen hier noch Anpassungen fuer den Betrieb des SVWS-Severs gemacht werden. Zum Beispiel zur Migration der Datenbank, verwendetem Keystore etc.
pct exec $SNR -- tee -a /root/.env  <<EOF
CREATE_MariaDB=j
CREATE_KEYSTORE=j
CREATE_TESTDATA=j
MariaDB_ROOT_PASSWORD=$ROOTPWD
MariaDB_DATABASE=svwsdb
MariaDB_HOST=localhost
MariaDB_USER=svwsadmin
MariaDB_PASSWORD=$ROOTPWD
APP_PATH=/opt/app/svws
CONF_PATH=/etc/app/svws/conf
APP_PORT=8443
SVWS_TLS_KEYSTORE_PATH=/etc/app/svws/conf/keystore
SVWS_TLS_KEYSTORE_PASSWORD=$ROOTPWD
SVWS_TLS_KEY_ALIAS=
INPUT_common_name=svws-server
INPUT_organizational_unit=$SNR
INPUT_organization=$FQDN
INPUT_locality=NRW
INPUT_state=DE
INPUT_country=DE
validity_days=7000
TMP_DIR=/tmp/svws
#
# Hier kann ggf. Ihre Schuldatenbank hinterlegtr werden und ggf auch automatisch migriert werden.
# Des Weiteren gibt es noch die Moeglichkein per CURL ein Backup einzuspielen oder eine Migration zu starten.
# Dazu bitte die naechsten beiden Zeilen benutzen und die dritte natuerlich loeschen.
#MDBFILE=/tmp/svws/databases/YourSchoolDatabase.mdb
#INIT_EMPTY_DB=N
INIT_EMPTY_DB=J
#
EOF
##
##
# [Installation SVWS-Server]
pct exec $SNR -- bash install-$VERSIONSNR.sh
##
## [Installation Schild3]
##
# Samba einrichten
pct exec $SNR -- mkdir /netzlaufwerk/
pct exec $SNR -- mkdir /netzlaufwerk/Schild_3
pct exec $SNR -- mkdir /netzlaufwerk/Schild_3_Arbeitsverzeichnis
pct exec $SNR -- mkdir /netzlaufwerk/Schild_3/Connection-Files
pct exec $SNR -- mkdir /netzlaufwerk/installationfiles
pct exec $SNR -- wget https://github.com/SVWS-NRW/Schild3-BetaTest/releases/download/v$SCHILD_VERSIONSNR/Setup_SchILD3_v$SCHILD_VERSIONSNR.zip
pct exec $SNR -- mv /root/Setup_SchILD3_v$SCHILD_VERSIONSNR.zip /netzlaufwerk/installationfiles/
#pct exec $SNR -- mv Schild-Reports.zip /netzlaufwerk/installationfiles
pct exec $SNR -- unzip /netzlaufwerk/installationfiles/Setup_SchILD3_v$SCHILD_VERSIONSNR.zip -d /netzlaufwerk/Schild_3/
pct exec $SNR -- git clone https://github.com/SVWS-NRW/SVWS-TestMDBs /netzlaufwerk/installationfiles/SVWS-TestMDBs/
pct exec $SNR -- tee -a /etc/samba/smb.conf <<EOF

[netzlaufwerk]
path = /netzlaufwerk
public = yes
writable = yes
comment = SVWS Freigabe
printable = no
guest ok = yes
EOF
#
#
# Schild 3 Connection Files
pct exec $SNR -- tee -a /netzlaufwerk/Schild_3/Connection-Files/server.con.example <<EOF
[SchILDconnection]
ProviderName=MYSQL
ProviderType=MARIADB
server=$IP
Port=3306
Database=svwsdb
Username=svwsadmin
Password=AAjcM0WrUSlfbBR5EtcPSyTzso2858zMPOY0Ih3nUlm31S3aD3Fs/LwxUHYCFjs8iLU=
Direct=0
SVWSServerURL=$IP
EOF
#
pct exec $SNR -- cp /netzlaufwerk/Schild_3/Connection-Files/server.con.example /netzlaufwerk/Schild_3/Connection-Files/$FQDN.con
#
pct exec $SNR -- chmod -R 777 /netzlaufwerk/
#
pct exec $SNR -- systemctl restart smbd.service
#
##
## [Reverse Proxy einrichten]
##
#
pct exec $SNR tee /etc/nginx/sites-available/$FQDN.conf <<EOF
	server{

	   listen 80 $FQND;
           listen [::]:80 $FQND;

	   server_name $FQDN;
        	location / {
                	proxy_pass      https://$IP:8443;
        	}

	}
EOF

pct exec $SNR ln -s /etc/nginx/sites-available/$FQDN.conf /etc/nginx/sites-enabled/$FQDN.conf
#
pct exec $SNR nginx -s reload
#
##
## [Zertifikat einrichten]
##
#
# Dies kann nur bei Weiterleitung von Port80 und 443 ueber den Hauseigenen Router konfiguriert werden.
# Ebenso muss die DNS Adresse beim Hoster bekannt und richtig eingerichtet sein.
#
# pct exec $SNR certbot -d $FQDN
#
fi