#!/bin/bash
#set -x
PRG_Version="2019.06.27-01"
SCRIPT_Name="lmz-opsi-patch-00001"
# DEBUG 
#SCRIPT_DEBUG="false"
SCRIPT_DEBUG="true"
### ***************************************
###   Wichtige Operationen ganz am Anfang
### ***************************************
# Kommandozeilenparameter sichern
ARGS_ARRAY=("$@")
ARGS_NUM_ITEMS="$#"
# Zeile 15 - ab hier Bibliothek einbinden oder Code kopieren
lmz_bib_file="/etc/paedML/base/bin/lmz_funktionsbibliothek.sh"
source "${lmz_bib_file}" &>/dev/null
if [ $? -ne 0 ]; then
	printf "Es ist ein Fehler aufgetreten. Das Skript kann nicht ausgefuehrt werden.\n" 
	printf "Fehlernummer: 99990003\n"
	printf "Fehlertext:   Funktionsbibliothek konnte nicht geladen werden.\n"
	printf "Details:      \n"
	printf "  Dateiname:  '"${lmz_bib_file}"'\n"
	printf "  Skript:     '"${SCRIPT_Name}"'\n"
	printf "  Version:    '"${PRG_Version}"'\n"
	exit 14
fi
#
#
# Zeile 30 - ab hier fängt das eigentliche Patch-Programm an...

### PATCH *** Anfang
PATCH_Nummer="00001"
PATCH_VERSION="$PRG_Version"
PATCH_Titel="Automatisches Verbinden mit Freigabe //sp01/opsi einrichten."
PATCH_DESCRIPTION="Es werden zwei Systemd-Units hinzugefügt:\n- var-lib-sp01_opsi.mount und \n- var-lib-sp01_opsi.automount\nEventuell vorhandene Units werden entfernt:\n- var-lib-opsi-backup.mount und\n- var-lib-opsi-backup.automount\nDie Zugangsdaten werden dem opsi-Produkt 'windomain' entnommen."
### PATCH *** Ende

# Aufruf
# -a apply      Rückgabewert 0 = OK, 1 = Fehler
# -c chech      Rückgabewert 0 = OK, 1 = needs to be installed

do_install() {
	local install_result
	local command_output
	local command_output2
	local retval
	local file_line
	install_result=0
	echo "Installiere '${SCRIPT_Name}' (${PRG_Version})..."
	schreibe_log "Installiere '${SCRIPT_Name}' (${PRG_Version})..."
	# -a apply      Rückgabewert 0 = OK, 1 = Fehler
	# 001 /etc/systemd/system/var-lib-opsi-backup.automount
	if [ -e "/etc/systemd/system/var-lib-opsi-backup.automount" ]; then
		systemctl stop --quiet var-lib-opsi-backup.automount
		command_output=$(systemctl disable --quiet var-lib-opsi-backup.automount)
		retval=$?
		if [[ $retval -ne 0 ]]; then
			# Fehler
			schreibe_log "Systemd-Unit 'var-lib-opsi-backup.automount' konnte nicht deaktiviert werden."
			schreibe_log "Fehlercode: ${retval}"
			schreibe_log "Fehlertext: ${command_output}"
			install_result=1
		else
			schreibe_log "Systemd-Unit 'var-lib-opsi-backup.automount' wurde deaktiviert."
			# Datei löschen
			sudo rm -f "/etc/systemd/system/var-lib-opsi-backup.automount"
			if [ -e "/etc/systemd/system/var-lib-opsi-backup.automount" ]; then
				# Fehler
				schreibe_log "Systemd-Unit-Datei 'var-lib-opsi-backup.automount' konnte nicht gelöscht werden."
			else
				schreibe_log "Systemd-Unit-Datei 'var-lib-opsi-backup.automount' wurde gelöscht."
			fi
		fi
	else
		schreibe_log "Datei '/etc/systemd/system/var-lib-opsi-backup.automount' ist nicht (mehr) vorhanden."
	fi
	# 002 /etc/systemd/system/var-lib-opsi-backup.mount
	if [ -e "/etc/systemd/system/var-lib-opsi-backup.mount" ]; then
		systemctl stop --quiet var-lib-opsi-backup.mount
		command_output=$(systemctl disable --quiet var-lib-opsi-backup.mount)
		retval=$?
		if [[ $retval -ne 0 ]]; then
			# Fehler
			schreibe_log "Systemd-Unit 'var-lib-opsi-backup.mount' konnte nicht deaktiviert werden."
			schreibe_log "Fehlercode: ${retval}"
			schreibe_log "Fehlertext: ${command_output}"
			install_result=1
		else
			schreibe_log "Systemd-Unit 'var-lib-opsi-backup.mount' wurde deaktiviert."
			# Datei löschen
			sudo rm -f "/etc/systemd/system/var-lib-opsi-backup.mount"
			if [ -e "/etc/systemd/system/var-lib-opsi-backup.mount" ]; then
				# Fehler
				schreibe_log "Systemd-Unit-Datei 'var-lib-opsi-backup.mount' konnte nicht gelöscht werden."
			else
				schreibe_log "Systemd-Unit-Datei 'var-lib-opsi-backup.mount' wurde gelöscht."
			fi
		fi
	else
		schreibe_log "Datei '/etc/systemd/system/var-lib-opsi-backup.mount' ist nicht (mehr) vorhanden."
	fi	
	# 003 Mountpunkt /var/lib/opsi/backup
	mount -l | grep -q "/var/lib/opsi/backup"
	retval=$?
	if [ $retval -eq 0 ]; then
		command_output=$(umount /var/lib/opsi/backup)
		retval=$?
		if [[ $retval -ne 0 ]]; then
			# Fehler
			schreibe_log "Mountpunkt '/var/lib/opsi/backup' konnte nicht getrennt werden."
			schreibe_log "Fehlercode: ${retval}"
			schreibe_log "Fehlertext: ${command_output}"
			install_result=1
		else
			schreibe_log "Mountpunkt '/var/lib/opsi/backup' wurde getrennt."
		fi
	else
		schreibe_log "Mountpunkt '/var/lib/opsi/backup' ist nicht (mehr) verbunden."
	fi		
	# 004 Ordner /var/lib/opsi/backup
	if [ -e "/var/lib/opsi/backup" ]; then		
		# Ordner löschen
		sudo rm -rf "/var/lib/opsi/backup"
		if [ -e "/var/lib/opsi/backup" ]; then
			# Fehler
			schreibe_log "Ordner '/var/lib/opsi/backup' konnte nicht gelöscht werden."
		else
			schreibe_log "Ordner '/var/lib/opsi/backup' wurde gelöscht."
		fi
	else
		schreibe_log "Ordner '/var/lib/opsi/backup' ist nicht (mehr) vorhanden."
	fi	
	# 005 var-lib-sp01_opsi.automount entfernen
	if [ -e "/etc/systemd/system/var-lib-sp01_opsi.automount" ]; then
		systemctl stop --quiet var-lib-sp01_opsi.automount
		command_output=$(systemctl disable --quiet var-lib-sp01_opsi.automount)
		retval=$?
		if [[ $retval -ne 0 ]]; then
			# Fehler
			schreibe_log "Systemd-Unit 'var-lib-sp01_opsi.automount' konnte nicht deaktiviert werden."
			schreibe_log "Fehlercode: ${retval}"
			schreibe_log "Fehlertext: ${command_output}"
			install_result=1
		else
			schreibe_log "Systemd-Unit 'var-lib-sp01_opsi.automount' wurde deaktiviert."
			# Datei löschen
			sudo rm -f "/etc/systemd/system/var-lib-sp01_opsi.automount"
			if [ -e "/etc/systemd/system/var-lib-sp01_opsi.automount" ]; then
				# Fehler
				schreibe_log "Systemd-Unit-Datei 'var-lib-sp01_opsi.automount' konnte nicht gelöscht werden."
			else
				schreibe_log "Systemd-Unit-Datei 'var-lib-sp01_opsi.automount' wurde gelöscht."
			fi
		fi
	else
		schreibe_log "Datei '/etc/systemd/system/var-lib-sp01_opsi.automount' ist nicht (mehr) vorhanden."
	fi	
	# 006 var-lib-sp01_opsi.mount entfernen
	if [ -e "/etc/systemd/system/var-lib-sp01_opsi.mount" ]; then
		systemctl stop --quiet var-lib-sp01_opsi.mount
		command_output=$(systemctl disable --quiet var-lib-sp01_opsi.mount)
		retval=$?
		if [[ $retval -ne 0 ]]; then
			# Fehler
			schreibe_log "Systemd-Unit 'var-lib-sp01_opsi.mount' konnte nicht deaktiviert werden."
			schreibe_log "Fehlercode: ${retval}"
			schreibe_log "Fehlertext: ${command_output}"
			install_result=1
		else
			schreibe_log "Systemd-Unit 'var-lib-sp01_opsi.mount' wurde deaktiviert."
			# Datei löschen
			sudo rm -f "/etc/systemd/system/var-lib-sp01_opsi.mount"
			if [ -e "/etc/systemd/system/var-lib-sp01_opsi.mount" ]; then
				# Fehler
				schreibe_log "Systemd-Unit-Datei 'var-lib-sp01_opsi.mount' konnte nicht gelöscht werden."
			else
				schreibe_log "Systemd-Unit-Datei 'var-lib-sp01_opsi.mount' wurde gelöscht."
			fi
		fi
	else
		schreibe_log "Datei '/etc/systemd/system/var-lib-sp01_opsi.mount' ist nicht (mehr) vorhanden."
	fi
	# 007 /etc/opsi/paedML/.sp01_opsi.cred bei Bedarf kopieren
	if [ -e "/etc/opsi/paedML/.sp01_opsi.cred" ]; then
		schreibe_log "Datei '/etc/opsi/paedML/.sp01_opsi.cred' ist bereits vorhanden."
	else
		schreibe_log "Datei '/etc/opsi/paedML/.sp01_opsi.cred' ist nicht vorhanden."
		sudo cp -f "/etc/paedML/patches/bin/files/00001/.sp01_opsi.cred" "/etc/opsi/paedML"
		sudo chown root:root "/etc/opsi/paedML/.sp01_opsi.cred"
		sudo chmod 644 "/etc/opsi/paedML/.sp01_opsi.cred"
		if [ -e "/etc/opsi/paedML/.sp01_opsi.cred" ]; then
			schreibe_log "Datei '/etc/opsi/paedML/.sp01_opsi.cred' wurde neu angelegt."
		else
			schreibe_log "Datei '/etc/opsi/paedML/.sp01_opsi.cred' konnte nicht neu angelegt werden."
		fi
	fi
	# 008 /etc/opsi/paedML/.sp01_opsi.cred mit Werte aus Properties von windomain betanken
	# 007 wäre dann teilweise überflüssig
	schreibe_log "Betanke Datei '/etc/opsi/paedML/.sp01_opsi.cred' mit gueltigen Werten aus dem opsi-Produkt 'windomain'."
	command_output=$(sudo opsi-admin -d method productPropertyState_getHashes '[]' '{"productId":"windomain"}')
	# username
		command_output2=$(echo $command_output |  jq '.[] | select(.propertyId == "username") | "username=\(.values[0])"')
		file_line=${command_output2:-"username=domjoin"}
		echo "${file_line//\"}" > "/etc/opsi/paedML/.sp01_opsi.cred"
		schreibe_log "Zeile 1: '${file_line//\"}'"
	# password
		command_output2=$(echo $command_output |  jq '.[] | select(.propertyId == "password") | "password=\(.values[0])"')
		file_line=${command_output2:-"password=paedML 4.0"}
		echo "${file_line//\"}" >> "/etc/opsi/paedML/.sp01_opsi.cred"
		schreibe_log "Zeile 2: '${file_line//\"}'"		
	# domain
		command_output2=$(echo $command_output |  jq '.[] | select(.propertyId == "domain") | "domain=\(.values[0])"')
		file_line=${command_output2:-"domain=musterschule.schule.paedml"}
		echo "${file_line//\"}" >> "/etc/opsi/paedML/.sp01_opsi.cred"
		schreibe_log "Zeile 3: '${file_line//\"}'"
	# 009 var-lib-sp01_opsi.mount hinzufügen
	sudo cp -f "/etc/paedML/patches/bin/files/00001/var-lib-sp01_opsi.mount" "/etc/systemd/system"
	sudo chown root:root "/etc/systemd/system/var-lib-sp01_opsi.mount"
	sudo chmod 644 "/etc/systemd/system/var-lib-sp01_opsi.mount"
	if [ -e "/etc/systemd/system/var-lib-sp01_opsi.mount" ]; then
		schreibe_log "Datei '/etc/systemd/system/var-lib-sp01_opsi.mount' wurde neu angelegt."
	else
		schreibe_log "Datei '/etc/systemd/system/var-lib-sp01_opsi.mount' konnte nicht neu angelegt werden."
	fi
	# 010 var-lib-sp01_opsi.automount hinzufügen
	sudo cp -f "/etc/paedML/patches/bin/files/00001/var-lib-sp01_opsi.automount" "/etc/systemd/system"
	sudo chown root:root "/etc/systemd/system/var-lib-sp01_opsi.automount"
	sudo chmod 644 "/etc/systemd/system/var-lib-sp01_opsi.automount"
	if [ -e "/etc/systemd/system/var-lib-sp01_opsi.automount" ]; then
		schreibe_log "Datei '/etc/systemd/system/var-lib-sp01_opsi.automount' wurde neu angelegt."
	else
		schreibe_log "Datei '/etc/systemd/system/var-lib-sp01_opsi.automount' konnte nicht neu angelegt werden."
	fi
	# 011 Systemd-Unit aktivieren
	systemctl daemon-reload
	command_output=$(systemctl enable var-lib-sp01_opsi.automount)
	retval=$?
	if [[ $retval -ne 0 ]]; then
		# Fehler
		schreibe_log "Systemd-Unit 'var-lib-sp01_opsi.automount' konnte nicht aktiviert werden."
		schreibe_log "Fehlercode: ${retval}"
		schreibe_log "Fehlertext: ${command_output}"
		install_result=1
	else
		schreibe_log "Systemd-Unit 'var-lib-sp01_opsi.automount' wurde aktiviert."
	fi
	# 012 Systemd-Unit starten
	command_output=$(systemctl start var-lib-sp01_opsi.automount)
	retval=$?
	if [[ $retval -ne 0 ]]; then
		# Fehler
		schreibe_log "Systemd-Unit 'var-lib-sp01_opsi.automount' konnte nicht gestartet werden."
		schreibe_log "Fehlercode: ${retval}"
		schreibe_log "Fehlertext: ${command_output}"
		install_result=1
	else
		schreibe_log "Systemd-Unit 'var-lib-sp01_opsi.automount' wurde gestartet."
	fi	
	# 013 fertig
	if [[ "${install_result}" == "0" ]]; then
		return 0
	else
		return 1
	fi
}

do_check() {
	local check_result
	check_result="0"
	echo "Pruefe '${SCRIPT_Name}' (${PRG_Version})..."
	schreibe_log "Pruefe '${SCRIPT_Name}' (${PRG_Version})..."
	# -c check      Rückgabewert 0 = OK, 1 = needs to be installed
	# 001 /etc/systemd/system/var-lib-opsi-backup.mount
	if [ -e "/etc/systemd/system/var-lib-opsi-backup.mount" ]; then
		schreibe "NTBI: Datei '/etc/systemd/system/var-lib-opsi-backup.mount' ist (noch) vorhanden. Sie muss entfernt werden.\n"
		check_result="1"
	else
		schreibe "OK: Datei '/etc/systemd/system/var-lib-opsi-backup.mount' ist nicht vorhanden.\n"
	fi
	# 002 /etc/systemd/system/var-lib-opsi-backup.automount
	if [ -e "/etc/systemd/system/var-lib-opsi-backup.automount" ]; then
		schreibe "NTBI: Datei '/etc/systemd/system/var-lib-opsi-backup.automount' ist (noch) vorhanden. Sie muss entfernt werden.\n"
		check_result="1"
	else
		schreibe "OK: Datei '/etc/systemd/system/var-lib-opsi-backup.automount' ist nicht vorhanden.\n"
	fi
	# 003 /etc/systemd/system/var-lib-sp01_opsi.mount
	if [ -e "/etc/systemd/system/var-lib-sp01_opsi.mount" ]; then
		# Dateien vergleichen
		cmp --silent "/etc/systemd/system/var-lib-sp01_opsi.mount" "/etc/paedML/patches/bin/files/00001/var-lib-sp01_opsi.mount"
		retval=$?
		if [[ $retval -ne 0 ]]; then
			schreibe "NTBI: Datei '/etc/systemd/system/var-lib-sp01_opsi.mount' ist nicht mit der Vorlage identisch. Sie muss ausgetauscht werden.\n"
			check_result="1"
		else
			schreibe "OK: Datei '/etc/systemd/system/var-lib-sp01_opsi.mount' ist mit der Vorlage identisch.\n"
		fi
	else
		schreibe "NTBI: Datei '/etc/systemd/system/var-lib-sp01_opsi.mount' fehlt.\n"
		check_result="1"
	fi	
	# 004 /etc/systemd/system/var-lib-sp01_opsi.automount
	if [ -e "/etc/systemd/system/var-lib-sp01_opsi.automount" ]; then
		# Dateien vergleichen
		cmp --silent "/etc/systemd/system/var-lib-sp01_opsi.automount" "/etc/paedML/patches/bin/files/00001/var-lib-sp01_opsi.automount"
		retval=$?
		if [[ $retval -ne 0 ]]; then
			schreibe "NTBI: Datei '/etc/systemd/system/var-lib-sp01_opsi.automount' ist nicht mit der Vorlage identisch. Sie muss ausgetauscht werden.\n"
			check_result="1"
		else
			schreibe "OK: Datei '/etc/systemd/system/var-lib-sp01_opsi.automount' ist mit der Vorlage identisch.\n"
		fi
	else
		schreibe "NTBI: Datei '/etc/systemd/system/var-lib-sp01_opsi.automount' fehlt.\n"
		check_result="1"
	fi
	# 005 /etc/opsi/paedML/.sp01_opsi.cred
	if [ ! -e "/etc/opsi/paedML/.sp01_opsi.cred" ]; then
		schreibe "NTBI: Datei '/etc/opsi/paedML/.sp01_opsi.cred' fehlt.\n"
		check_result="1"
	else
		schreibe "OK: Datei '/etc/opsi/paedML/.sp01_opsi.cred' ist bereits vorhanden.\n"
	fi
	# 006 systemctl is-active --quiet var-lib-sp01_opsi.automount
	systemctl is-active --quiet var-lib-sp01_opsi.automount
	retval=$?
	if [[ $retval -ne 0 ]]; then
		schreibe "NTBI: Der Systemd-Unit 'var-lib-sp01_opsi.automount' ist nicht aktiv.\n"
		check_result="1"
	else
		schreibe "OK: Der Systemd-Unit 'var-lib-sp01_opsi.automount' ist aktiv.\n"
	fi	
	# fertig
	if [[ "${check_result}" == "0" ]]; then
		schreibe "${GREEN}Fazit:${NC} Der Patch '${SCRIPT_Name}' wird nicht benoetigt bzw. wurde bereits installiert.\n"
		return 0
	else
		schreibe "${YELLOW}Fazit:${NC} Der Patch '${SCRIPT_Name}' sollte installiert werden.\n"
		return 1
	fi	
}

parseParameters() {
# Analyse der Kommandozeilenparameter
# Quelle: https://dzone.com/articles/bash-snippet-parsing-command-line-arguments-and-as
#         angepasst.
	local key
	local temp_pds
	local retval
	if [[ $# -eq 1 ]]; then
		# Argument(e) vorhanden
		key="${1}"
		#echo $key
		case "${key}" in
		-a|--apply)
			do_install
			retval=$?
			exit $retval
			;;
		-c|--check)
			do_check
			retval=$?
			exit $retval
			;;
		-h|--help)
			echo "lmz-opsi-patch: '${PATCH_Nummer}'  (Version ${PRG_Version})."		
			echo "Kommandos:"
			echo "  -a, --apply                               Diesen Patch manuell installieren."
			echo "  -c, --check                               Diesen Patch manuell überprüfen."
			echo "  -i, --info                                Gibt Informationen aus."
			echo ""
			echo "Bitte wenden Sie das Tool 'lmz-opsi-patches' an, um Patches zu installieren."
			echo " lmz-opsi-patches --apply '${PATCH_Nummer}'           ...installiert diesen Patch."
			echo " lmz-opsi-patches --info '${PATCH_Nummer}'            ...gibt weitere Informationen"
			echo "                                               zu diesem Patch aus."
			echo ""
			echo ""
			;;
		-i|--info)
			printf "Patchnummer:  ${PATCH_Nummer}\n"
			printf "Titel:        ${PATCH_Titel}\n"
			printf "Version:      ${PRG_Version}\n"
			# description
			temp_pds="${PATCH_DESCRIPTION//\"}"
			temp_pds="${temp_pds//\\n/\\n              }"
			printf "Beschreibung: ${temp_pds}\n"
			;;
		*) # unknown option
			echo "No valid parameters given."
			exit 55
			;;
		esac
	else
		# keine Argumente uebergeben
		echo "No parameters given."
		exit 55 
	fi
}

# MAIN

parseParameters $*

exit 0


