#!/bin/bash
#set -x
PRG_Version="2023.07.22-01"
SCRIPT_Name="lmz-opsi-fixit-repair-opsi-package-windows11-upgrade"
# DEBUG 
SCRIPT_DEBUG="false"
#SCRIPT_DEBUG="true"
### ***************************************
###   Wichtige Operationen ganz am Anfang
### ***************************************
# Kommandozeilenparameter sichern
ARGS_ARRAY=("$@")
ARGS_NUM_ITEMS="$#"
#
# Farben
BLACK=$(tput setaf 0)
RED=$(tput setaf 1)
GREEN=$(tput setaf 2)
YELLOW=$(tput setaf 3)
BLUE=$(tput setaf 4)
MAGENTA=$(tput setaf 5)
CYAN=$(tput setaf 6)
WHITE=$(tput setaf 7)
#
LIME_YELLOW=$(tput setaf 190)
POWDER_BLUE=$(tput setaf 153)


#
BRIGHT=$(tput bold)
NORMAL=$(tput sgr0)
BLINK=$(tput blink)
REVERSE=$(tput smso)
UNDERLINE=$(tput smul)
#
NC=
STD='\033[0;0;39m'
RED='\033[1;31m'
GREEN='\033[1;32m'
YELLOW='\033[1;33m'
BLUE='\033[1;34m'
#MAGENTA='\033[1;35m'
MAGENTA=$(tput setaf 5)
CYAN='\033[1;36m'
WHITE='\033[1;97m'
#NC='\033[0m' # No Color
NC=$(tput sgr0)
#
# *****************************************************************************
OPSI_PRODUCT="windows11-upgrade"
OPSI_DEPOT="/var/lib/opsi/depot"
# *****************************************************************************

entferne_Link(){
	# Neu 17.05.2023
	# Nur auf umgeleitete ORDNER anwenden, nicht auf Dateien.
	if [ $# -ne "1" ]; then
		echo "Fehler: Funktion 'entferne_Link' wurde nicht mit 1 Parameter aufgerufen."
	else
		readlink "${1}" &>/dev/null
		retval=$?
		if [ "$retval" -eq "0" ]; then
			# ist Symlink
			# Symlink entfernen
			rm "${1}"
		fi
	fi
}
Uninstall_Package() {
	printf "${YELLOW}Hinweis:${NC} Das opsi-Produkt '${OPSI_PRODUCT}' wird nun deinstalliert.\n"
	opsi-set-rights /var/lib/opsi/depot
	# remove
	if [ -d "/var/lib/opsi/depot/${OPSI_PRODUCT}.tmp" ]; then
			printf "${YELLOW}Hinweis:${NC} Der Ordner '/var/lib/opsi/depot/${OPSI_PRODUCT}.tmp' wird gelöscht.\n"
			rm -rf /var/lib/opsi/depot/${OPSI_PRODUCT}.tmp
	fi
	opsi-package-manager -r --force "${OPSI_PRODUCT}"
}
Install_Package() {
	# reinstall
	printf "${YELLOW}Hinweis:${NC} Das opsi-Produkt '${OPSI_PRODUCT}' wird nun neu heruntergeladen und installiert.\n"
	opsi-package-updater download "${OPSI_PRODUCT}"
	PRODUCT_FILE=$(ls -1 /var/lib/opsi/repository/${OPSI_PRODUCT}_*.opsi)
	opsi-package-manager --install "${PRODUCT_FILE}"
}
Create_Symlinks() {
	# sollte vor der (Re-)Installation erfolgen, damit das property install_dir befuellt wird
	# Fix - Symlinks an falscher Stelle (27.07.2022)
		#entferne_Link "/var/lib/opsi/depot/${OPSI_PRODUCT}/installfiles1909"
		#entferne_Link "/var/lib/opsi/depot/${OPSI_PRODUCT}/installfiles21h2"
	# Alte Symlinks entfernen
		#entferne_Link "/var/lib/opsi/depot/${OPSI_PRODUCT}/localsetup/installfiles1909"
		#entferne_Link "/var/lib/opsi/depot/${OPSI_PRODUCT}/localsetup/installfiles21h2"
	# Neu anlegen
		mkdir -p /var/lib/opsi/depot/${OPSI_PRODUCT}/localsetup
		# 17.05.2023
		if [ -d "/var/lib/opsi/depot/opsi-local-image-win11-22h2-x64/installfiles" ]; then
			printf "${YELLOW}Hinweis:${NC} Erstelle Symlink zu den Installationsdateien fuer Windows 11 22h2.\n"
			printf "         Diese liegen im opsi-Produkt 'opsi-local-image-win11-22h2-x64'.\n"
			ln -s ../../opsi-local-image-win11-22h2-x64/installfiles /var/lib/opsi/depot/${OPSI_PRODUCT}/localsetup/installfiles-22h2 &> /dev/null
		else
			printf "${YELLOW}Hinweis:${NC} Keine Installationsdateien fuer Windows 11 22h2 gefunden.\n"
		fi
		# 22.07.2024
		if [ -d "/var/lib/opsi/depot/opsi-local-image-win11-23h2-x64/installfiles" ]; then
			printf "${YELLOW}Hinweis:${NC} Erstelle Symlink zu den Installationsdateien fuer Windows 11 23h2.\n"
			printf "         Diese liegen im opsi-Produkt 'opsi-local-image-win11-23h2-x64'.\n"
			ln -s ../../opsi-local-image-win11-23h2-x64/installfiles /var/lib/opsi/depot/${OPSI_PRODUCT}/localsetup/installfiles-23h2 &> /dev/null
		else
			printf "${YELLOW}Hinweis:${NC} Keine Installationsdateien fuer Windows 11 23h2 gefunden.\n"
		fi
		if [ -d "/var/lib/opsi/depot/opsi-local-image-win11-24h2-x64/installfiles" ]; then
			printf "${YELLOW}Hinweis:${NC} Erstelle Symlink zu den Installationsdateien fuer Windows 11 24h2.\n"
			printf "         Diese liegen im opsi-Produkt 'opsi-local-image-win11-24h2-x64'.\n"
			ln -s ../../opsi-local-image-win11-24h2-x64/installfiles /var/lib/opsi/depot/${OPSI_PRODUCT}/localsetup/installfiles-24h2 &> /dev/null
		else
			printf "${YELLOW}Hinweis:${NC} Keine Installationsdateien fuer Windows 11 24h2 gefunden.\n"
		fi
		opsi-set-rights /var/lib/opsi/depot/${OPSI_PRODUCT}
}
printf "${MAGENTA}**********************************************************************${NC}\n"
printf "${WHITE} LMZ-opsi-FixIt: ${OPSI_PRODUCT}                     %s${NC}\n" "${PRG_Version}"
printf "${MAGENTA}**********************************************************************${NC}\n"
# Pruefe Installation
result_count=$(sudo opsi-admin -d method productOnDepot_getIdents  | grep "${OPSI_PRODUCT}" | wc -l)
if [ $result_count -eq "0" ]; then
	# nicht installiert
	printf "${YELLOW}Hinweis:${NC} Das Produkt '${OPSI_PRODUCT}' ist nicht installiert.\n\n"
	read -r -p "${1:-Möchten Sie das Produkt jetzt installieren? [Ja/Nein]} " response
	case $response in
		[jJ][aA]) Create_Symlinks; Install_Package ;;
		[jJ])     Create_Symlinks; Install_Package ;;
		*)        echo; echo "Nein."; echo ;;
	esac
else
	# installiert
	# Pruefe Sperre
	result_count=$(sudo opsi-admin -dS method getProductLocks_hash | grep "${OPSI_PRODUCT}" | wc -l)
	if [ $result_count -ne "0" ]; then
		# locked
		printf "${YELLOW}Hinweis:${NC} Das Produkt '${OPSI_PRODUCT}' ist gesperrt.\n"
		printf "${RED}Warnung:${NC} Die Reparatur löscht das opsi-Produkt.\n"
		printf "         Die Einstellungen der individuellen Produkt-Properties gehen verloren.\n\n"
		printf "         Die Vorgaben der Produkt-Defaultproperties gehen verloren und sollten\n"
		printf "         anschließend mit dem Befehl 'lmz-opsi-config' neu gesetzt werden.\n\n"
		read -r -p "${1:-Moechten Sie das Produkt jetzt reparieren? [Ja/Nein]} " response
		case $response in
			[jJ][aA]) Uninstall_Package; Create_Symlinks; Install_Package ;;
			[jJ])     Uninstall_Package; Create_Symlinks; Install_Package ;;
			*)        echo; echo "Nein."; echo ;;
		esac
	else
		printf "${GREEN}Hinweis:${NC} Das Produkt '${OPSI_PRODUCT}' ist nicht gesperrt.\n"
		printf "         Durch Setzen der Symlinks und Neuinstallation wird das Property\n"
		printf "         'installfiles_dir' passend befüllt.\n\n"
		read -r -p "${1:-Moechten Sie diese Anpassungen jetzt vornehmen? [Ja/Nein]} " response
		case $response in
			[jJ][aA]) Create_Symlinks; Install_Package ;;
			[jJ])     Create_Symlinks; Install_Package ;;
			*)        echo; echo "Nein."; echo ;;
		esac		
	fi
fi
exit 0
