#!/bin/bash
#set -x
PRG_Version="2024.01.26-01"
SCRIPT_Name="lmz-opsi-patch-00013"
# 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="00013"
PATCH_VERSION="$PRG_Version"
#PATCH_Titel="opsi-configed Server-Konsole einrichten ."
PATCH_Titel="TFTP Konfiguration anpassen."
PATCH_DESCRIPTION="Die Konfiguration des opsi (nur 4.2) wird angepasst.\
\nDie PXE-Bootmenues fuer Legacy und UEFI wurden von Juli 2022 bis Dezember 2023 durch LMZ-Tools ersetzt.\
\nDies ist nun nicht mehr noetig, da die Bootmenues vom Hersteller uib passend gepflegt werden.\
\n Dieser Patch raeumt bei Bedarf auf:\
\n  - /tftpboot/grub/grub-custom.cfg.backup loeschen, falls vorhanden\
\n  - /tftpboot/grub/grub-custom.cfg umbenennen in /tftpboot/grub/grub-custom.cfg.backup\
\n  - /tftpboot/grub/grub-custom.cfg.opsi umbenennen in /tftpboot/grub/grub-custom.cfg\
\n  - /tftpboot/grub/opsi-linux-bootimage.password loeschen, falls vorhanden\
\n  - Kennwort auf Default setzen: linux123\
\n  - Sprache auf Deutsch setzen.\
\n  - Aenderungen uebernehmen.\
\n Im worst-case koennen Sie die uib-PXE-Templates und das opsi-linux-bootimage folgendermassen reparieren:\
\n - Backup der opsi-vm erstellen (opsi-backup reicht nicht!)\
\n - Datei '/tftpboot/grub/grub-custom.cfg' sichern, falls kundenseitig Anpassungen vorgenommen wurden.\
\n - Ordner '/tftpboot/grub' komplett leeren.\
\n - Ordner '/tftpboot/linux/pxelinux.cfg' komplett leeren.\
\n - Opsi-Linux-Bootimage neu installieren mit...\
\n   apt-get install --reinstall opsi-linux-bootimage\
\n - Kennwort neu setzen mit...\
\n   lmz-opsi-tool --set bootimage_pw 'kennwort'\
\n - Bei Bedarf die neue Datei '/tftpboot/grub/grub-custom.cfg' anpassen.\
\n   Auf keinen Fall die alte Datei wieder zurueck kopieren!"
### 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 CONFIG_PASSWORD
	local CONFIG_PASSWORD_CLEAN
	local CONFIG_PASSWORD_LEGACY
	local CONFIG_PASSWORD_UEFI
	local CONFIG_Datei
	local TMP_STR
	local do_install
	do_install="ja"
	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 opsi-Version
        case "${opsi_version}" in
            4.1) 	# opsi 4.1
					schreibe "${GREEN}Fazit:${NC} 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
						# true - pruefen
						schreibe "Opsi-Version '${opsi_version}' und opsi-linux-bootimage-Version '${debian_paket_version}'. Pruefe...'\n"
						# 002 pwh=${opsi_pwh} in Datei /tftpboot/grub/grub-custom.cfg enthalten?
							if [ -e "/tftpboot/grub/grub-custom.cfg" ]; then
								# Achtung: grep mit einfachen Hochkommata verwenden, um eine "Expansion" der Variable zu verhinden.
								cat "/tftpboot/grub/grub-custom.cfg" | grep -q 'pwh=${opsi_pwh}'
								if [ $? -eq 0 ]; then
									schreibe_log "Pretest-OK: Datei '/tftpboot/grub/grub-custom.cfg' enthaelt die Variable 'opsi_pwh'."
								else
									schreibe "OK: Datei '/tftpboot/grub/grub-custom.cfg' enthaelt nicht die Variable 'opsi_pwh'.\n"
									do_install="nein"
								fi
							fi
						# 003 Datei /tftpboot/grub/opsi-linux-bootimage.password existiert?
							if [ -e "/tftpboot/grub/opsi-linux-bootimage.password" ]; then
								# Achtung: grep mit einfachen Hochkommata verwenden, um eine "Expansion" der Variable zu verhinden.
								cat "/tftpboot/grub/opsi-linux-bootimage.password" | grep -q 'set opsi_pwh='
								if [ $? -eq 0 ]; then
									schreibe_log "Pretest-OK: Datei '/tftpboot/grub/opsi-linux-bootimage.password' enthaelt ein Bootimage-Kennwort."
								else
									schreibe "OK: Datei '/tftpboot/grub/opsi-linux-bootimage.password' enthaelt kein Bootimage-Kennwort.\n"
									do_install="nein"
								fi
							fi
						# 004 Datei /tftpboot/grub/grub-custom.cfg.opsi existiert?
							if [ -e "/tftpboot/grub/grub-custom.cfg.opsi" ]; then
								schreibe_log "Pretest-OK: Datei '/tftpboot/grub/grub-custom.cfg.opsi' existiert."
							else
								schreibe "OK: Datei '/tftpboot/grub/grub-custom.cfg.opsi' existiert nicht.\n"
								do_install="nein"
							fi
						# Jetzt Patch ausfuehren...
						if [ "${do_install}" = "ja" ]; then
							# INSTALL
							schreibe "Loesche Datei '/tftpboot/grub/grub-custom.cfg.backup'...\n"
							rm -f "/tftpboot/grub/grub-custom.cfg.backup"
							#
							schreibe "Benenne Datei '/tftpboot/grub/grub-custom.cfg' um in '/tftpboot/grub/grub-custom.cfg.backup'...\n"
							mv "/tftpboot/grub/grub-custom.cfg" "/tftpboot/grub/grub-custom.cfg.backup"
							#
							schreibe "Benenne Datei '/tftpboot/grub/grub-custom.cfg.opsi' um in '/tftpboot/grub/grub-custom.cfg'...\n"
							mv "/tftpboot/grub/grub-custom.cfg.opsi" "/tftpboot/grub/grub-custom.cfg"
							#
							schreibe "Benenne Datei '/tftpboot/grub/opsi-linux-bootimage.password' um in '/tftpboot/grub/opsi-linux-bootimage.password.backup'...\n"
							mv "/tftpboot/grub/opsi-linux-bootimage.password" "/tftpboot/grub/opsi-linux-bootimage.password.backup"
							#
							#schreibe "Setze Sprache auf Deutsch...\n"
							#opsi-cli bootimage set-boot-parameter lang de
							#
							schreibe "Setze Standard-Kennwort 'linux123'...\n"
							opsi-cli bootimage set-boot-password linux123
							#
							schreibe "Uebernehme Aenderungen...\n"
							opsi-setup --init-current-config
						else
							# DO NOT INSTALL
							# 24.01.2024 - ggfs. Passwort-Datei entfernen, falls vorhanden.
								if [ -e "/tftpboot/grub/opsi-linux-bootimage.password" ]; then
									schreibe "Benenne Datei '/tftpboot/grub/opsi-linux-bootimage.password' um in '/tftpboot/grub/opsi-linux-bootimage.password.backup'...\n"
									mv "/tftpboot/grub/opsi-linux-bootimage.password" "/tftpboot/grub/opsi-linux-bootimage.password.backup"
								else
									schreibe "${YELLOW}Hinweis:${NC} Der Patch braucht nicht installiert zu werden.\n"
									schreibe "Falls es dennoch Probleme mit dem Bootmenue geben sollte, lesen Sie die Hinweise von 'lmz-opsi-patches --info 00013'."
								fi
						fi
					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
					schreibe "${GREEN}Fazit:${NC} Der Patch '${SCRIPT_Name}' wird auf opsi 4.3 nicht benoetigt.\n"
                	;;
            *)
                schreibe "Diese opsi-Version kennt das Skript nicht. Keine Installation moeglich.\n"
                ;;
        esac
	# 010 fertig
	if [[ "${install_result}" == "0" ]]; then
		return 0
	else
		return 1
	fi
}

do_check() {
	local check_result
	local debian_paket_version
	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 opsi-Version
        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-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
						# true - pruefen
						schreibe "Opsi-Version '${opsi_version}' und opsi-linux-bootimage-Version '${debian_paket_version}'. Pruefe...'\n"
						# 002 pwh=${opsi_pwh} in Datei /tftpboot/grub/grub-custom.cfg enthalten?
							if [ -e "/tftpboot/grub/grub-custom.cfg" ]; then
								# Achtung: grep mit einfachen Hochkommata verwenden, um eine "Expansion" der Variable zu verhinden.
								cat "/tftpboot/grub/grub-custom.cfg" | grep -q 'pwh=${opsi_pwh}'
								if [ $? -eq 0 ]; then
									# Bingo! Treffer!
									schreibe "NTBI: Datei '/tftpboot/grub/grub-custom.cfg' enthält die Variable 'opsi_pwh'.\n"
									check_result="1"
								fi
							fi
						# 003 Datei /tftpboot/grub/opsi-linux-bootimage.password existiert?
							if [ -e "/tftpboot/grub/opsi-linux-bootimage.password" ]; then
								# Achtung: grep mit einfachen Hochkommata verwenden, um eine "Expansion" der Variable zu verhinden.
								cat "/tftpboot/grub/opsi-linux-bootimage.password" | grep -q 'set opsi_pwh='
								if [ $? -eq 0 ]; then
									# Bingo! Treffer!
									schreibe "NTBI: Datei '/tftpboot/grub/opsi-linux-bootimage.password' enthält ein Bootimage-Kennwort.\n"
									check_result="1"
								fi
							fi
					else
						schreibe "${YELLOW}Warnung:${NC} Das Debian-Paket 'opsi-linux-bootimage-Version '${debian_paket_version}' ist nicht aktuell. Kein Check moeglich.\n"
					fi
	                ;;
            4.3)	# opsi 4.3
					schreibe "OK: Der Patch '${SCRIPT_Name}' wird auf opsi 4.3 nicht benoetigt.\n"
                	;;
            *)
                schreibe "Diese opsi-Version kennt das Skript nicht. Kein check 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


