#!/bin/bash
#set -x
PRG_Version="2025.09.31-01"
SCRIPT_Name="lmz-opsi-patch-00017"
# 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="00017"
PATCH_VERSION="$PRG_Version"
#PATCH_Titel="opsi-configed Server-Konsole einrichten ."
PATCH_Titel="Opsi-Linux-Bootimage Spracheinstellung."
PATCH_DESCRIPTION="Die Konfiguration des Opsi-Linux-Bootimages wird angepasst.\
\nTastaturlayout und Sprache\
\n- opsi-linux-bootimage aelter als Version 20250924-1:\
\n  - Der Parameter 'lang=de' wird aus allen Bootimage-append-Parameter entfernt.\
\n- opsi-linux-bootimage ab Version 20250924-1:\
\n  - Der Parameter 'lang=de_DE' wird in den Host-Parametern (Opsi-Depot) gesetzt.\
\n  - Die Einstellungen in der Server-Konfiguration bleiben unangetastet."
### PATCH *** Ende

# Aufruf
# -a apply      Rückgabewert 0 = OK, 1 = Fehler
# -c chech      Rückgabewert 0 = OK, 1 = needs to be installed
SCRIPT_VERBOSE_LEVEL="8"
do_install() {
	local install_result
	local retval
	local command_output

	install_result=0
	echo "Installiere '${SCRIPT_Name}' (${PRG_Version})..."
	schreibe_log "Installiere '${SCRIPT_Name}' (${PRG_Version})..."
	# -a apply      Rückgabewert 0 = OK, 1 = Fehler

	case "${opsi_version}" in
		4.1) 	
				# opsi 4.1
				schreibe "OK: Der Patch '${SCRIPT_Name}' wird auf opsi 4.1 nicht benoetigt.\n"
				do_install="nein"
				;;
		4.2)	
				# opsi 4.2
				# Ermittle Version von opsi-utils
				debian_paket_version=$(dpkg -s opsi-linux-bootimage | grep -i version | awk '{print $2}')
				# Wert vergleichen
				dpkg --compare-versions "${debian_paket_version}" "ge" "20231204-1"
				retval=$?
				if [ $retval -eq 0 ]; then
					# installieren
						schreibe "Bereinige Backend..."
						"/etc/paedML/patches/bin/files/00017/fix_host_parameter_default__opsi-linux-bootimage.append__remove_lang_de.py" | tee -a "${LOG_Datei}"
						schreibe "${YELLOW}Warnung:${NC} Anpassung des grub-Menues muss manuell vorgenommen werden.\n"
				else
					schreibe "${YELLOW}Warnung:${NC} Das Debian-Paket 'opsi-linux-bootimage-Version '${debian_paket_version}' ist nicht aktuell. Keine Installation moeglich.\n"
				fi
				;;
		4.3)	
				# opsi 4.3
				# 24.09.2025 Neues Konfiguration in Hostparametern ab opsi-linux-bootimage_20250924-1
				#            Daher ist eine Fallunterscheidung noetig.
				WERT=$((dpkg -s opsi-linux-bootimage >/dev/null 2>&1 && dpkg -s opsi-linux-bootimage | grep Version | cut -d " " -f2) || echo "0.0.0")
				dpkg --compare-versions "${WERT}" "ge" "20250924-1"
				retval=$?
				if [ $retval -eq 0 ]; then
					# opsi-linux-bootimage_20250924-1 oder neuer
					schreibe "Setze Sprache auf Deutsch...\n"
					opsi-cli bootimage --host opsi01.musterschule.schule.paedml set-boot-parameter lang de_DE
					#
					#   Diese Änderungen beschreibe ich im opsi-Handbuch fuer opsi 4.3
					#	opsi-cli bootimage --host opsi01.musterschule.schule.paedml set-boot-parameter opsi_ui tui
					#	opsi-cli bootimage --host opsi01.musterschule.schule.paedml set-boot-parameter tz Europe/Berlin
					#	opsi-cli bootimage --host opsi01.musterschule.schule.paedml set-boot-parameter splash false
					#	opsi-cli bootimage --host opsi01.musterschule.schule.paedml set-boot-parameter ssh true
				else
					# opsi-linux-bootimage aelter als 20250924-1
					schreibe "Bereinige Backend..."
					"/etc/paedML/patches/bin/files/00017/fix_host_parameter_default__opsi-linux-bootimage.append__remove_lang_de.py" | tee -a "${LOG_Datei}"
					schreibe "${YELLOW}Warnung:${NC} Anpassung des grub-Menues muss manuell vorgenommen werden.\n"
				fi
				;;
		*)
			schreibe "Diese opsi-Version kennt das Skript nicht. Keine Installation moeglich.\n"
			;;
	esac
	# fertig
	if [[ "${install_result}" == "0" ]]; then
		return 0
	else
		return 1
	fi
}

do_check() {
	local check_result
	local command_output
	local retval
	local bootmenu_file
	
	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
	case "${opsi_version}" in
		4.1) 	
				# opsi 4.1
				schreibe "OK: Der Patch '${SCRIPT_Name}' wird auf opsi 4.1 nicht benoetigt.\n"
				;;
		4.2)	
				# opsi 4.2
				# Ermittle Version von opsi-linux-bootimage
				debian_paket_version=$(dpkg -s opsi-linux-bootimage | grep -i version | awk '{print $2}')
				# Wert vergleichen
				dpkg --compare-versions "${debian_paket_version}" "ge" "20231204-1"
				retval=$?
				if [ $retval -eq 0 ]; then
					# true - pruefen
					# check Datenbank
					opsi-cli --output-format json jsonrpc execute config_getObjects [] '{"id":"opsi-linux-bootimage.append"}' | jq '.[] | .defaultValues[]' | grep -q 'lang=de'
					retval=$?
					if [ $retval -eq 0 ]; then
						# install!
						schreibe "NTBI: Konfiguration entspricht nicht dem gewuenschten Stand (Host-Parameter opsi-linux-bootimage.append enthaelt 'lang=de').\n      Sie muss angepasst werden.\n"
						check_result="1"
					else
						# alles ok
						schreibe "OK: Host-Parameter 'opsi-linux-bootimage.append' enthaelt nicht den Eintrag 'lang=de'.\n"
					fi
					# check PXE-Menue
					cat /tftpboot/grub/grub.cfg | grep -q 'lang=de'
					retval=$?
					if [ $retval -eq 0 ]; then
						# alles ok
						schreibe "OK: PXE-Boot-Datei enthaelt 'lang=de'. Keine Aktion noetig.\n"
					else
						schreibe "NTBI: Konfiguration entspricht nicht dem gewuenschten Stand (PXE-Boot-Datei enthaelt nicht 'lang=de').\n      Sie muss angepasst werden.\n"
						check_result="1"
					fi
				else
					schreibe "${YELLOW}Warnung:${NC} Das Debian-Paket 'opsi-linux-bootimage-Version '${debian_paket_version}' ist nicht aktuell. Keine PruefungInstallation moeglich.\n"
				fi
				;;
		4.3)	
				# opsi 4.3
				# 24.09.2025 Neues Konfiguration in Hostparametern ab opsi-linux-bootimage_20250924-1
				#            Daher ist eine Fallunterscheidung noetig.
				WERT=$((dpkg -s opsi-linux-bootimage >/dev/null 2>&1 && dpkg -s opsi-linux-bootimage | grep Version | cut -d " " -f2) || echo "0.0.0")
				dpkg --compare-versions "${WERT}" "ge" "20250924-1"
				retval=$?
				if [ $retval -eq 0 ]; then
					# opsi-linux-bootimage_20250924-1 oder neuer
					opsi-cli --output-format json jsonrpc execute configState_getObjects [] '{"configId":"netboot.linux-bootimage.cmdline.lang","objectId":"opsi01.musterschule.schule.paedml"}' | jq '.[] | .values[]' | grep -q 'de_DE'
					retval=$?
					# 0 = gefunden , 1 = nicht gefunden
					if [ $retval -ne 0 ]; then
						# Handlungsbedarf!
						schreibe "NTBI: Depot-Konfiguration 'netboot.linux-bootimage.cmdline.lang' enthaelt nicht den Eintrag 'de_DE'.\n"
						check_result="1"
					else
						schreibe "OK: Depot-Konfiguration 'netboot.linux-bootimage.cmdline.lang' enthaelt den Eintrag 'de_DE'.\n"
					fi
				else
					# opsi-linux-bootimage aelter als 20250924-1
					# Check 1 - config-Server
						opsi-cli --output-format json jsonrpc execute config_getObjects [] '{"id":"opsi-linux-bootimage.append"}' | jq '.[] | .defaultValues[]' | grep -q 'lang=de'
						retval=$?
						# 0 = gefunden , 1 = nicht gefunden
						if [ $retval -eq 0 ]; then
							# Handlungsbedarf!
							schreibe "NTBI: Server-Konfiguration 'opsi-linux-bootimage.append' enthaelt den Eintrag 'lang=de'.\n"
							check_result="1"
						else
							schreibe "OK: Server-Konfiguration 'opsi-linux-bootimage.append' enthaelt nicht den Eintrag 'lang=de'.\n"
						fi
					# Check 2 - Depot & Clients
						opsi-cli --output-format json jsonrpc execute configState_getObjects [] '{"configId":"opsi-linux-bootimage.append"}' | jq '.[] | .values[]' | grep -q 'lang=de'
						retval=$?
						# 0 = gefunden , 1 = nicht gefunden
						if [ $retval -eq 0 ]; then
							# Handlungsbedarf!
							schreibe "NTBI: Host-Parameter (vom Depot oder mindestens einem Client) 'opsi-linux-bootimage.append' enthaelt den Eintrag 'lang=de'.\n"
							check_result="1"
						else
							schreibe "OK: Host-Parameter 'opsi-linux-bootimage.append' enthaelt nicht den Eintrag 'lang=de'.\n"
						fi
					# Check 3a - PXE-Menue - neue Version
						bootmenu_file="/tftpboot/opsi/opsi-linux-bootimage/cfg/grub-settings.cfg"
						if [ -e "${bootmenu_file}" ]; then
							# schreibe "OK: Bootmenue gefunden.\n"
							crudini --get /tftpboot/opsi/opsi-linux-bootimage/cfg/grub-settings.cfg "" "set language" | grep -q "de"
							retval=$?
							if [ $retval -eq 0 ]; then
								# alles ok
								schreibe "OK: PXE-Boot-Menue-Settings-Datei enthaelt 'set language=de'.\n"
							else
								schreibe "NTBI: Konfiguration entspricht nicht dem gewuenschten Stand (PXE-Boot-Menue-Settings-Datei enthaelt nicht 'set language=de').\n      Sie muss angepasst werden.\n"
								check_result="1"
							fi
							# check 3a - PXE-Menue - neue Version - ENDE
						else
							# check 3b - PXE-Menue - alte Version
							schreibe_log "Achtung: Datei 'grub-settings.cfg' nicht gefunden, opsi-linux-bootimage ist offenbar veraltet (aelter als 20241024-1)."
							bootmenu_file="/tftpboot/opsi/opsi-linux-bootimage/cfg/grub-menu.cfg"						
							if [ -e "${bootmenu_file}" ]; then
								# schreibe "OK: Bootmenue gefunden.\n"
								cat "${bootmenu_file}" | grep -q 'lang=de'
								retval=$?
								if [ $retval -eq 0 ]; then
									# alles ok
									schreibe "OK: PXE-Boot-Menue-Datei 'grub-menu.cfg' enthaelt 'lang=de'.\n"
								else
									schreibe "NTBI: Konfiguration entspricht nicht dem gewuenschten Stand (PXE-Boot-Menue-Datei enthaelt nicht 'lang=de').\n      Sie muss angepasst werden.\n"
									check_result="1"
								fi
							else
								schreibe "${RED}Fehler:${NC} Da stimmt etwas nicht! Das PXE-Boot-Menue (Datei '${bootmenu_file}') konnte nicht gefunden werden.\n"
							fi
							# check 3b - PXE-Menue - alte Version - ENDE
						fi	
				fi
				;;
		*)
			schreibe "Diese opsi-Version kennt das Skript nicht. Keine Pruefung moeglich.\n"
			;;
    esac
	# 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


