#!/bin/bash
#set -x
PRG_Version="2025.12.02-01"
SCRIPT_Name="lmz-opsi-patch-00006"
# 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="00006"
PATCH_VERSION="$PRG_Version"
#PATCH_Titel="Automatischen AD-Abgleich (opsi-directory connector) einrichten ."
PATCH_Titel="Automatischen AD-Abgleich (lmz-tool) einrichten ."
PATCH_DESCRIPTION="Es werden zwei Systemd-Units hinzugefügt:\n- opsi-directory-connector.service und \n- opsi-directory-connector.timer\nEventuell vorhandene Units werden ausgetauscht.\nDer Abgleich erfolgt im Stundentakt."
### PATCH *** Ende

# Definitionen
ADCONN_CONFIG_FILE="/etc/opsi/paedML/.opsidirectoryconnector-paedML.conf"


# 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() {
	if [ -e /usr/bin/opsi-python ]; then
		# Python 3 - opsi 4.2 or later
		do_install42
		retval=$?
	else
		# opsi 4.1
		do_install41
		retval=$?
	fi
	return $retval
}
do_install42() {
	local install_result
	local command_output
	local command_output2
	local retval
	local file_line
	local temp_password
	local tmp_error
	local tmp_errorcount
	local jq_cmd_str
	local test_error
	local temp_adminuser_password	
	local do_not_test_opsi
	local do_not_test_directory
	
	install_result=0
	do_not_test_opsi=0
	do_not_test_directory=0
	
	echo "Installiere '${SCRIPT_Name}' (${PRG_Version})..."
	schreibe_log "Installiere '${SCRIPT_Name}' (${PRG_Version})..."
	# -a apply      Rückgabewert 0 = OK, 1 = Fehler
	
	# /etc/opsi/opsidirectoryconnector-paedML.conf
	
	# 001 - opsi-directory-connector bei Bedarf installieren
	output_result=$(dpkg -s opsi-directory-connector 2> /dev/null | grep Status:)
	if [[ $output_result =~ ok|installed ]]; then
		schreibe "${GREEN}OK:${NC} opsi-directory-connector ist bereits installiert.\n"
	else
		schreibe "${YELLOW}Hinweis:${NC} opsi-directory-connector ist noch nicht installiert.\n"
		schreibe "         Installation wird eingeleitet...\n"
		# installieren
		apt-get install opsi-directory-connector --assume-yes
		# erneut prüfen
		output_result=$(dpkg -s opsi-directory-connector 2> /dev/null | grep Status:)
		if [[ $output_result =~ ok|installed ]]; then
			schreibe "${GREEN}OK:${NC} opsi-directory-connector wurde erfolgreich installiert.\n"
		else
			schreibe 3 "${RED}Fehler:${NC} opsi-directory-connector konnte nicht installiert werden.\n"
			return 1
		fi
	fi	
	# 002 DEL /etc/systemd/system/opsi-directory-connector.timer
	if [ -e "/etc/systemd/system/opsi-directory-connector.timer" ]; then
		systemctl stop --quiet opsi-directory-connector.timer
		command_output=$(systemctl disable --quiet opsi-directory-connector.timer)
		retval=$?
		if [[ $retval -ne 0 ]]; then
			# Fehler
			schreibe_log "Systemd-Unit 'opsi-directory-connector.timer' konnte nicht deaktiviert werden."
			schreibe_log "Fehlercode: ${retval}"
			schreibe_log "Fehlertext: ${command_output}"
			install_result=1
		else
			schreibe "${GREEN}OK:${NC} Systemd-Unit 'opsi-directory-connector.timer' wurde deaktiviert.\n"
			# Datei löschen
			sudo rm -f "/etc/systemd/system/opsi-directory-connector.timer"
			if [ -e "/etc/systemd/system/opsi-directory-connector.timer" ]; then
				# Fehler
				schreibe_log "Systemd-Unit-Datei 'opsi-directory-connector.timer' konnte nicht gelöscht werden."
			else
				schreibe "${GREEN}OK:${NC} Systemd-Unit-Datei 'opsi-directory-connector.timer' wurde gelöscht.\n"
			fi
		fi
	else
		schreibe "${GREEN}OK:${NC} Datei '/etc/systemd/system/opsi-directory-connector.timer' ist nicht (mehr) vorhanden.\n"
	fi
	# 003 DEL /etc/systemd/system/opsi-directory-connector.service
	if [ -e "/etc/systemd/system/opsi-directory-connector.service" ]; then
		systemctl stop --quiet opsi-directory-connector.service
		command_output=$(systemctl disable --quiet opsi-directory-connector.service)
		retval=$?
		if [[ $retval -ne 0 ]]; then
			# Fehler
			schreibe_log "Systemd-Unit 'opsi-directory-connector.service' konnte nicht deaktiviert werden."
			schreibe_log "Fehlercode: ${retval}"
			schreibe_log "Fehlertext: ${command_output}"
			install_result=1
		else
			schreibe "${GREEN}OK:${NC} Systemd-Unit 'opsi-directory-connector.service' wurde deaktiviert.\n"
			# Datei löschen
			sudo rm -f "/etc/systemd/system/opsi-directory-connector.service"
			if [ -e "/etc/systemd/system/opsi-directory-connector.service" ]; then
				# Fehler
				schreibe_log "Systemd-Unit-Datei 'opsi-directory-connector.service' konnte nicht gelöscht werden."
			else
				schreibe "${GREEN}OK:${NC} Systemd-Unit-Datei 'opsi-directory-connector.service' wurde gelöscht.\n"
			fi
		fi
	else
		schreibe "${GREEN}OK:${NC} Datei '/etc/systemd/system/opsi-directory-connector.service' ist nicht (mehr) vorhanden.\n"
	fi
	# 004 Konfigurationsdatei kopieren
	#     Quelle: /etc/paedML/patches/bin/files/00006/opsi42/opsidirectoryconnector-template.conf
	#     Ziel:   $ADCONN_CONFIG_FILE
	if [ ! -e "/etc/paedML/patches/bin/files/00006/opsi42/opsidirectoryconnector-template.conf" ]; then
		schreibe 3 "${RED}Fehler:${NC} Datei '/etc/paedML/patches/bin/files/00006/opsi42/opsidirectoryconnector-template.conf' fehlt.\n"
		return 1		
	else
		sudo cp -f "/etc/paedML/patches/bin/files/00006/opsi42/opsidirectoryconnector-template.conf" "$ADCONN_CONFIG_FILE"
		sudo chown opsiconfd:opsiadmin "$ADCONN_CONFIG_FILE"
		sudo chmod 660 "$ADCONN_CONFIG_FILE"
		schreibe "${GREEN}OK:${NC} Datei '$ADCONN_CONFIG_FILE' wurde kopiert.\n"
	fi
	# 005 Passwort fuer domjoin in Datei hinterlegen
	#     Ziel:   /etc/opsi/paedML/.opsi01_domjoin.pw
	# lesen
	if [ ! -e "/etc/opsi/paedML/.opsi01_domjoin.pw" ]; then
		# Passwort aus ProductProperty holen
		sudo opsi-admin -d method productPropertyState_getObjects '' '{"productId": "windomain"}' > "$WORKING_DIR\windomain.json"
		jq -r '.[] | .propertyId + "=" + .values[]' "$WORKING_DIR\windomain.json" > "$WORKING_DIR\windomain2.json"
		temp_password=$( grep "password=" "$WORKING_DIR\windomain2.json" )
		retval=$?
		if [[ $retval -ne 0 ]]; then
			schreibe "${YELLOW}Hinweis:${NC} Das Passwort fuer den Benutzer 'domjoin' konnte nicht\n"
			schreibe "         ermittelt werden. Bitte setzen Sie das Passwort neu!\n"
			schreibe "         Befehl: ${YELLOW}lmz-opsi-tool --set domjoin_pw 'passwort'${NC}\n"
			temp_password="paedML 4.0"
			do_not_test_opsi=1
		fi
		temp_password="${temp_password#password=}"
		# Datei "/etc/opsi/paedML/.opsi01_domjoin.pw" erstmals anlegen
		# 22.01.2022 echo -n statt echo
		sudo echo -n "${temp_password}" > "/etc/opsi/paedML/.opsi01_domjoin.pw"
		retval=$?
		sudo chown opsiconfd:opsiadmin "/etc/opsi/paedML/.opsi01_domjoin.pw"
		sudo chmod 660 "/etc/opsi/paedML/.opsi01_domjoin.pw"
		if [[ $retval -ne 0 ]]; then
			schreibe 3 "${YELLOW}Warnung:${NC} Datei '/etc/opsi/paedML/.opsi01_domjoin.pw' konnte nicht angelegt werden."
			do_not_test_opsi=1
		else
			schreibe_log "Datei '/etc/opsi/paedML/.opsi01_domjoin.pw' wurde erstmals angelegt."
		fi
	else
		# 22.01.2022 Newline bereinigen 
		tr -d '\n' < "/etc/opsi/paedML/.opsi01_domjoin.pw" > "/etc/opsi/paedML/.opsi01_domjoin.pw.tmp" && mv "/etc/opsi/paedML/.opsi01_domjoin.pw.tmp" "/etc/opsi/paedML/.opsi01_domjoin.pw"
		schreibe "${GREEN}OK:${NC} Passwortdatei fuer Benutzer 'domjoin' ist bereits vorhanden.\n"
		# Passwort aus Datei auslesen
		#temp_password=$(<"/etc/opsi/paedML/.opsi01_domjoin.pw")
	fi

	# 006 Passwort fuer adminuser pruefen
	#     Ziel:   /etc/opsi/paedML/.opsi01_adminuser.pw
	if [ ! -e "/etc/opsi/paedML/.opsi01_adminuser.pw" ]; then
		schreibe "${YELLOW}Hinweis:${NC} Passwortdatei fuer Benutzer 'adminuser' fehlt.\n"
		do_not_test_directory=1
		# 22.01.2022 echo -n statt echo
		sudo echo -n "paedML 4.0" > "/etc/opsi/paedML/.opsi01_adminuser.pw"
		retval=$?
		sudo chown opsiconfd:opsiadmin "/etc/opsi/paedML/.opsi01_adminuser.pw"
		sudo chmod 660 "/etc/opsi/paedML/.opsi01_adminuser.pw"
		if [[ $retval -ne 0 ]]; then
			schreibe 3 "${YELLOW}Warnung:${NC} Datei '/etc/opsi/paedML/.opsi01_adminuser.pw' konnte nicht angelegt werden."
		else
			schreibe_log "Datei '/etc/opsi/paedML/.opsi01_adminuser.pw' wurde erstmals (mit Standardpasswort) angelegt."
			schreibe "${YELLOW}Hinweis:${NC} Das Passwort fuer den Benutzer 'adminuser' konnte nicht\n"
			schreibe "         ermittelt werden. Bitte setzen Sie das Passwort neu!\n"
			schreibe "         Befehl: ${YELLOW}lmz-opsi-tool --set adminuser_pw 'passwort'${NC}\n"
		fi
	else
		# 22.01.2022 Newline bereinigen
		tr -d '\n' < "/etc/opsi/paedML/.opsi01_adminuser.pw" > "/etc/opsi/paedML/.opsi01_adminuser.pw.tmp" && mv "/etc/opsi/paedML/.opsi01_adminuser.pw.tmp" "/etc/opsi/paedML/.opsi01_adminuser.pw"
		schreibe "${GREEN}OK:${NC} Passwortdatei fuer Benutzer 'adminuser' ist bereits vorhanden.\n"
	fi
	# 007 Teste Verbindung: DC01
	#
	if [[ $do_not_test_directory -eq 0 ]]; then
		test_error="false"
		echo "Teste Verbindung zu DC01..."
		opsidirectoryconnector --check-directory --config $ADCONN_CONFIG_FILE 2> "$WORKING_DIR/out2.txt" 1> "$WORKING_DIR/out1.txt"
		retval=$?
		tmp_errorcount=$(cat "$WORKING_DIR/out1.txt" | grep -c "CRITICAL")
		# Logeintrag für Fehlersuche
		schreibe_log "ANFANG - Log vom Opsi-Directory-Connector (Achten Sie auf 'CRITICAL'):"
		while read TMP_LINE; do 
			schreibe_log "${TMP_LINE}"
		done < "$WORKING_DIR/out1.txt"
		schreibe_log "ENDE - Log vom Opsi-Directory-Connector"
		if [ "${SCRIPT_DEBUG}" == "true" ]; then
			tmp_error=$(cat "$WORKING_DIR/out1.txt" | grep "CRITICAL" | tail -1)
			echo "* 1 ***********************************************************"
			cat "$WORKING_DIR/out1.txt"
			echo "* 2 ***********************************************************"
			cat "$WORKING_DIR/out2.txt"
			echo "************************************************************"
			printf "tmp_error= ${tmp_error}\n"
			printf "tmp_errorcount= ${tmp_errorcount}\n"
			printf "retval= ${retval}\n"
		fi	
		if [[ $retval -ne 0 ]] || [[ $tmp_errorcount -ne 0 ]]; then
			schreibe 3 "${RED}Fehler:${NC} Verbindung zu DC01 konnte nicht hergestellt werden.\n"
			schreibe "${YELLOW}Hinweis:${NC} Bitte setzen Sie das Passwort für den 'domjoin' neu!\n"
			schreibe "         Befehl: ${YELLOW}lmz-opsi-tool --set domjoin_pw 'passwort'${NC}\n"
			test_error="true"
		else
			schreibe "${GREEN}OK:${NC} Verbindung zu DC01 konnte erfolgreich hergestellt werden.\n"
		fi
	else
		schreibe "${YELLOW}Hinweis:${NC} Der Verbindungstest zum DC01 entfaellt.\n"
	fi
	# 008 Teste Verbindung: opsi01
	#
	if [[ $do_not_test_opsi -eq 0 ]]; then
		echo "Teste Verbindung zu opsi01..."
		opsidirectoryconnector --check-opsi --config "$ADCONN_CONFIG_FILE" 2> "$WORKING_DIR/out2.txt" 1> "$WORKING_DIR/out1.txt"
		retval=$?
		tmp_errorcount=$(cat "$WORKING_DIR/out2.txt" | grep -c "RuntimeError:")
		# Logeintrag für Fehlersuche
		schreibe_log "ANFANG - Log vom Opsi-Directory-Connector (Achten Sie auf 'RuntimeError:'):"
		while read TMP_LINE; do 
			schreibe_log "${TMP_LINE}"
		done < "$WORKING_DIR/out2.txt"
		schreibe_log "ENDE - Log vom Opsi-Directory-Connector"	
		if [ "${SCRIPT_DEBUG}" == "true" ]; then
			tmp_error=$(cat "$WORKING_DIR/out1.txt" | grep "RuntimeError:" | tail -1)
			echo "* 1 ***********************************************************"
			cat "$WORKING_DIR/out1.txt"
			echo "* 2 ***********************************************************"
			cat "$WORKING_DIR/out2.txt"
			echo "************************************************************"
			printf "tmp_error= ${tmp_error}\n"
			printf "tmp_errorcount= ${tmp_errorcount}\n"
			printf "retval= ${retval}\n"
		fi
		if [[ $retval -ne 0 ]]; then
			schreibe 3 "${RED}Fehler:${NC} Verbindung zu opsi01 konnte nicht hergestellt werden.\n"
			schreibe "${YELLOW}Hinweis:${NC} Bitte setzen Sie das Passwort für den 'adminuser' neu!\n"
			schreibe "         Befehl: ${YELLOW}lmz-opsi-tool --set adminuser_pw 'passwort'${NC}\n"
			test_error="true"
		else
			schreibe "${GREEN}OK:${NC} Verbindung zu opsi01 konnte erfolgreich hergestellt werden.\n"
		fi
	else
		schreibe "${YELLOW}Hinweis:${NC} Der Verbindungstest zum opsi01 entfaellt.\n"
	fi
	# 009 - Execute-Datei erstellen!
	echo "#!/bin/bash" > "/etc/opsi/paedML/.call_lmz_ad_sync.sh"
	#echo "opsi-admin -u 'adminuser' -p '${temp_adminuser_password}' method lmz_syncAD" >> "/etc/opsi/paedML/.call_lmz_ad_sync.sh"
	# 02.12.2025 Fix fuer fehlende Gruppe clientdirectory
	echo '# Fix (02.12.2025): Gruppe "clientdirectory" bei Bedarf anlegen.' >> "/etc/opsi/paedML/.call_lmz_ad_sync.sh"
	echo 'opsi-admin -d method group_getIdents | grep -q "clientdirectory" || sudo opsi-admin -d method group_createHostGroup "clientdirectory" "root of directory" "" null' >> "/etc/opsi/paedML/.call_lmz_ad_sync.sh"
	echo ' # opsi-Directory-Connector mit paedML-Konfiguration aufrufen' >> "/etc/opsi/paedML/.call_lmz_ad_sync.sh"
	# 22.01.2022 tatsaechlich opsi-directory-connector aufrufen
	echo "opsidirectoryconnector --config /etc/opsi/paedML/.opsidirectoryconnector-paedML.conf" >> "/etc/opsi/paedML/.call_lmz_ad_sync.sh"
	sudo chown opsiconfd:opsiadmin "/etc/opsi/paedML/.call_lmz_ad_sync.sh"
	sudo chmod 771 "/etc/opsi/paedML/.call_lmz_ad_sync.sh"	
	# 010 opsi-directory-connector.service hinzufügen
	sudo cp -f "/etc/paedML/patches/bin/files/00006/opsi42/opsi-directory-connector.service" "/etc/systemd/system"
	sudo chown root:root "/etc/systemd/system/opsi-directory-connector.service"
	sudo chmod 644 "/etc/systemd/system/opsi-directory-connector.service"
	if [ -e "/etc/systemd/system/opsi-directory-connector.service" ]; then
		schreibe "${GREEN}OK:${NC} Datei '/etc/systemd/system/opsi-directory-connector.service' wurde neu angelegt.\n"
	else
		schreibe "${YELLOW}Warnung:${NC} Datei '/etc/systemd/system/opsi-directory-connector.service' konnte nicht neu angelegt werden.\n"
		test_error="true"
	fi
	# 011 opsi-directory-connector.timer hinzufügen
	sudo cp -f "/etc/paedML/patches/bin/files/00006/opsi42/opsi-directory-connector.timer" "/etc/systemd/system"
	sudo chown root:root "/etc/systemd/system/opsi-directory-connector.timer"
	sudo chmod 644 "/etc/systemd/system/opsi-directory-connector.timer"
	if [ -e "/etc/systemd/system/opsi-backup.timer" ]; then
		schreibe "${GREEN}OK:${NC} Datei '/etc/systemd/system/opsi-directory-connector.timer' wurde neu angelegt.\n"
	else
		schreibe "${YELLOW}Warnung:${NC} Datei '/etc/systemd/system/opsi-directory-connector.timer' konnte nicht neu angelegt werden.\n"
		test_error="true"
	fi
	# 012 Systemd-Unit aktivieren
	systemctl daemon-reload
	command_output=$(systemctl enable opsi-directory-connector.timer)
	retval=$?
	if [[ $retval -ne 0 ]]; then
		# Fehler
		schreibe "${YELLOW}Warnung:${NC} Systemd-Unit 'opsi-directory-connector.timer' konnte nicht aktiviert werden.\n"
		schreibe_log "Fehlercode: ${retval}"
		schreibe_log "Fehlertext: ${command_output}"
		install_result=1
		test_error="true"
	else
		schreibe "${GREEN}OK:${NC} Systemd-Unit 'opsi-directory-connector.timer' wurde aktiviert.\n"
	fi
	# 013 Systemd-Unit starten
	command_output=$(systemctl start opsi-directory-connector.timer)
	retval=$?
	if [[ $retval -ne 0 ]]; then
		# Fehler
		schreibe "${YELLOW}Warnung:${NC} Systemd-Unit 'opsi-directory-connector.timer' konnte nicht gestartet werden.\n"
		schreibe_log "Fehlercode: ${retval}"
		schreibe_log "Fehlertext: ${command_output}"
		install_result=1
		test_error="true"
	else
		schreibe "${GREEN}OK:${NC} Systemd-Unit 'opsi-directory-connector.timer' wurde gestartet.\n"
	fi
	# 014 Sync now!
	#
	if [[ "${test_error}" == "false" ]] && [[ "${install_result}" == "0" ]]; then
		echo "Fuehre jetzt AD-Sync aus..."
		systemctl start opsi-directory-connector.service
		echo "Fertig."
	fi
	# 015 fertig
	if [[ "${install_result}" == "0" ]]; then
		return 0
	else
		return 1
	fi
}
do_install41() {
	local install_result
	local command_output
	local command_output2
	local retval
	local file_line
	local temp_password
	local tmp_error
	local tmp_errorcount
	local jq_cmd_str
	local test_error
	local temp_adminuser_password	
	
	install_result=0
	echo "Installiere '${SCRIPT_Name}' (${PRG_Version})..."
	schreibe_log "Installiere '${SCRIPT_Name}' (${PRG_Version})..."
	# -a apply      Rückgabewert 0 = OK, 1 = Fehler
	
	# /etc/opsi/opsidirectoryconnector-paedML.conf
	
	# 001 - opsi-directory-connector bei Bedarf installieren
	output_result=$(dpkg -s opsi-directory-connector 2> /dev/null | grep Status:)
	if [[ $output_result =~ ok|installed ]]; then
		schreibe "${GREEN}OK:${NC} opsi-directory-connector ist bereits installiert.\n"
	else
		schreibe "${YELLOW}Hinweis:${NC} opsi-directory-connector ist noch nicht installiert.\n"
		schreibe "         Installation wird eingeleitet...\n"
		# installieren
		apt-get install opsi-directory-connector --assume-yes
		# erneut prüfen
		output_result=$(dpkg -s opsi-directory-connector 2> /dev/null | grep Status:)
		if [[ $output_result =~ ok|installed ]]; then
			schreibe "${GREEN}OK:${NC} opsi-directory-connector wurde erfolgreich installiert.\n"
		else
			schreibe 3 "${RED}Fehler:${NC} opsi-directory-connector konnte nicht installiert werden.\n"
			return 1
		fi
	fi	
	# 002 DEL /etc/systemd/system/opsi-directory-connector.timer
	if [ -e "/etc/systemd/system/opsi-directory-connector.timer" ]; then
		systemctl stop --quiet opsi-directory-connector.timer
		command_output=$(systemctl disable --quiet opsi-directory-connector.timer)
		retval=$?
		if [[ $retval -ne 0 ]]; then
			# Fehler
			schreibe_log "Systemd-Unit 'opsi-directory-connector.timer' konnte nicht deaktiviert werden."
			schreibe_log "Fehlercode: ${retval}"
			schreibe_log "Fehlertext: ${command_output}"
			install_result=1
		else
			schreibe "${GREEN}OK:${NC} Systemd-Unit 'opsi-directory-connector.timer' wurde deaktiviert.\n"
			# Datei löschen
			sudo rm -f "/etc/systemd/system/opsi-directory-connector.timer"
			if [ -e "/etc/systemd/system/opsi-directory-connector.timer" ]; then
				# Fehler
				schreibe_log "Systemd-Unit-Datei 'opsi-directory-connector.timer' konnte nicht gelöscht werden."
			else
				schreibe "${GREEN}OK:${NC} Systemd-Unit-Datei 'opsi-directory-connector.timer' wurde gelöscht.\n"
			fi
		fi
	else
		schreibe "${GREEN}OK:${NC} Datei '/etc/systemd/system/opsi-directory-connector.timer' ist nicht (mehr) vorhanden.\n"
	fi
	# 003 DEL /etc/systemd/system/opsi-directory-connector.service
	if [ -e "/etc/systemd/system/opsi-directory-connector.service" ]; then
		systemctl stop --quiet opsi-directory-connector.service
		command_output=$(systemctl disable --quiet opsi-directory-connector.service)
		retval=$?
		if [[ $retval -ne 0 ]]; then
			# Fehler
			schreibe_log "Systemd-Unit 'opsi-directory-connector.service' konnte nicht deaktiviert werden."
			schreibe_log "Fehlercode: ${retval}"
			schreibe_log "Fehlertext: ${command_output}"
			install_result=1
		else
			schreibe "${GREEN}OK:${NC} Systemd-Unit 'opsi-directory-connector.service' wurde deaktiviert.\n"
			# Datei löschen
			sudo rm -f "/etc/systemd/system/opsi-directory-connector.service"
			if [ -e "/etc/systemd/system/opsi-directory-connector.service" ]; then
				# Fehler
				schreibe_log "Systemd-Unit-Datei 'opsi-directory-connector.service' konnte nicht gelöscht werden."
			else
				schreibe "${GREEN}OK:${NC} Systemd-Unit-Datei 'opsi-directory-connector.service' wurde gelöscht.\n"
			fi
		fi
	else
		schreibe "${GREEN}OK:${NC} Datei '/etc/systemd/system/opsi-directory-connector.service' ist nicht (mehr) vorhanden.\n"
	fi
	# 004 Konfigurationsdatei kopieren
	#     Quelle: /etc/paedML/patches/bin/files/00006/opsi41/opsidirectoryconnector-template.conf
	#     Ziel:   $ADCONN_CONFIG_FILE
	if [ ! -e "/etc/paedML/patches/bin/files/00006/opsi41/opsidirectoryconnector-template.conf" ]; then
		schreibe 3 "${RED}Fehler:${NC} Datei '/etc/paedML/patches/bin/files/00006/opsi41/opsidirectoryconnector-template.conf' fehlt.\n"
		return 1		
	else
		sudo cp -f "/etc/paedML/patches/bin/files/00006/opsi41/opsidirectoryconnector-template.conf" "$ADCONN_CONFIG_FILE"
		sudo chown opsiconfd:opsiadmin "$ADCONN_CONFIG_FILE"
		sudo chmod 660 "$ADCONN_CONFIG_FILE"
		schreibe "${GREEN}OK:${NC} Datei '$ADCONN_CONFIG_FILE' wurde kopiert.\n"
	fi
	# 005 Passwort fuer domjoin eintragen
	#     Ziel:   $ADCONN_CONFIG_FILE
	# lesen
	if [ ! -e "/etc/opsi/paedML/.opsi01_domjoin.pw" ]; then
		# Passwort aus ProductProperty holen
		sudo opsi-admin -d method productPropertyState_getObjects '' '{"productId": "windomain"}' > "$WORKING_DIR\windomain.json"
		jq -r '.[] | .propertyId + "=" + .values[]' "$WORKING_DIR\windomain.json" > "$WORKING_DIR\windomain2.json"
		temp_password=$( grep "password=" "$WORKING_DIR\windomain2.json" )
		retval=$?
		if [[ $retval -ne 0 ]]; then
			schreibe "${YELLOW}Hinweis:${NC} Das Passwort fuer den Benutzer 'domjoin' konnte nicht\n"
			schreibe "         ermittelt werden. Bitte setzen Sie das Passwort neu!\n"
			schreibe "         Befehl: ${YELLOW}lmz-opsi-tool --set domjoin_pw 'passwort'${NC}\n"
			temp_password="paedML 4.0"
		else
			# ok
			temp_password="${temp_password#password=}"
			# Datei "/etc/opsi/paedML/.opsi01_domjoin.pw" erstmals anlegen
			# 22.01.2022 echo -n statt echo
			sudo echo -n "${temp_password}" > "/etc/opsi/paedML/.opsi01_domjoin.pw"
			retval=$?
			sudo chown opsiconfd:opsiadmin "/etc/opsi/paedML/.opsi01_domjoin.pw"
			sudo chmod 660 "/etc/opsi/paedML/.opsi01_domjoin.pw"
			if [[ $retval -ne 0 ]]; then
				schreibe 3 "${YELLOW}Warnung:${NC} Datei '/etc/opsi/paedML/.opsi01_domjoin.pw' konnte nicht angelegt werden."
			else
				schreibe_log "Datei '/etc/opsi/paedML/.opsi01_domjoin.pw' wurde erstmals angelegt."
			fi
		fi
	else
		# 22.01.2022 Newline bereinigen 
		tr -d '\n' < "/etc/opsi/paedML/.opsi01_domjoin.pw" > "/etc/opsi/paedML/.opsi01_domjoin.pw.tmp" && mv "/etc/opsi/paedML/.opsi01_domjoin.pw.tmp" "/etc/opsi/paedML/.opsi01_domjoin.pw"
		# Passwort aus Datei auslesen
		temp_password=$(<"/etc/opsi/paedML/.opsi01_domjoin.pw")
	fi
	# 006 Passwort fuer adminuser pruefen
	#     Ziel:   /etc/opsi/paedML/.opsi01_adminuser.pw
	if [ ! -e "/etc/opsi/paedML/.opsi01_adminuser.pw" ]; then
		schreibe "${YELLOW}Hinweis:${NC} Passwortdatei fuer Benutzer 'adminuser' fehlt.\n"
		# 22.01.2022 echo -n statt echo
		sudo echo -n "paedML 4.0" > "/etc/opsi/paedML/.opsi01_adminuser.pw"
		retval=$?
		sudo chown opsiconfd:opsiadmin "/etc/opsi/paedML/.opsi01_adminuser.pw"
		sudo chmod 660 "/etc/opsi/paedML/.opsi01_adminuser.pw"
		if [[ $retval -ne 0 ]]; then
			schreibe 3 "${YELLOW}Warnung:${NC} Datei '/etc/opsi/paedML/.opsi01_adminuser.pw' konnte nicht angelegt werden."
		else
			schreibe_log "Datei '/etc/opsi/paedML/.opsi01_adminuser.pw' wurde erstmals (mit Standardpasswort) angelegt."
		fi
	else
		# 22.01.2022 Newline bereinigen
		tr -d '\n' < "/etc/opsi/paedML/.opsi01_adminuser.pw" > "/etc/opsi/paedML/.opsi01_adminuser.pw.tmp" && mv "/etc/opsi/paedML/.opsi01_adminuser.pw.tmp" "/etc/opsi/paedML/.opsi01_adminuser.pw"
		schreibe "${GREEN}OK:${NC} Passwortdatei fuer Benutzer 'adminuser' ist vorhanden.\n"
	fi
	# 007 - python-ldap bei Bedarf installieren
	#
	output_result=$(dpkg -s python-ldap 2> /dev/null | grep Status:)
	if [[ $output_result =~ ok|installed ]]; then
		schreibe "${GREEN}OK:${NC} python-ldap ist bereits installiert.\n"
	else
		schreibe "${YELLOW}Hinweis:${NC} python-ldap ist noch nicht installiert.\n"
		schreibe "         Installation wird eingeleitet...\n"
		# installieren
		apt-get install python-ldap --assume-yes
		# erneut prüfen
		output_result=$(dpkg -s python-ldap 2> /dev/null | grep Status:)
		if [[ $output_result =~ ok|installed ]]; then
			schreibe "${GREEN}OK:${NC} python-ldap wurde erfolgreich installiert.\n"
		else
			schreibe 3 "${RED}Fehler:${NC} python-ldap konnte nicht installiert werden.\n"
			return 1
		fi
	fi
	# 008 - Execute-Datei erstellen!
	#
	temp_adminuser_password=$(<"/etc/opsi/paedML/.opsi01_adminuser.pw")
	echo "#!/bin/bash" > "/etc/opsi/paedML/.call_lmz_ad_sync.sh"
	echo "opsi-admin -u 'adminuser' -p '${temp_adminuser_password}' method lmz_syncAD" >> "/etc/opsi/paedML/.call_lmz_ad_sync.sh"
	sudo chown opsiconfd:opsiadmin "/etc/opsi/paedML/.call_lmz_ad_sync.sh"
	sudo chmod 771 "/etc/opsi/paedML/.call_lmz_ad_sync.sh"	

	# 009 opsi-directory-connector.service hinzufügen
	sudo cp -f "/etc/paedML/patches/bin/files/00006/opsi41/opsi-directory-connector.service" "/etc/systemd/system"
	sudo chown root:root "/etc/systemd/system/opsi-directory-connector.service"
	sudo chmod 644 "/etc/systemd/system/opsi-directory-connector.service"
	if [ -e "/etc/systemd/system/opsi-directory-connector.service" ]; then
		schreibe "${GREEN}OK:${NC} Datei '/etc/systemd/system/opsi-directory-connector.service' wurde neu angelegt.\n"
	else
		schreibe "${YELLOW}Warnung:${NC} Datei '/etc/systemd/system/opsi-directory-connector.service' konnte nicht neu angelegt werden.\n"
		test_error="true"
	fi
	# 010 opsi-directory-connector.timer hinzufügen
	sudo cp -f "/etc/paedML/patches/bin/files/00006/opsi41/opsi-directory-connector.timer" "/etc/systemd/system"
	sudo chown root:root "/etc/systemd/system/opsi-directory-connector.timer"
	sudo chmod 644 "/etc/systemd/system/opsi-directory-connector.timer"
	if [ -e "/etc/systemd/system/opsi-backup.timer" ]; then
		schreibe "${GREEN}OK:${NC} Datei '/etc/systemd/system/opsi-directory-connector.timer' wurde neu angelegt.\n"
	else
		schreibe "${YELLOW}Warnung:${NC} Datei '/etc/systemd/system/opsi-directory-connector.timer' konnte nicht neu angelegt werden.\n"
		test_error="true"
	fi
	# 011 Systemd-Unit aktivieren
	systemctl daemon-reload
	command_output=$(systemctl enable opsi-directory-connector.timer)
	retval=$?
	if [[ $retval -ne 0 ]]; then
		# Fehler
		schreibe "${YELLOW}Warnung:${NC} Systemd-Unit 'opsi-directory-connector.timer' konnte nicht aktiviert werden.\n"
		schreibe_log "Fehlercode: ${retval}"
		schreibe_log "Fehlertext: ${command_output}"
		install_result=1
		test_error="true"
	else
		schreibe "${GREEN}OK:${NC} Systemd-Unit 'opsi-directory-connector.timer' wurde aktiviert.\n"
	fi
	# 012 Systemd-Unit starten
	command_output=$(systemctl start opsi-directory-connector.timer)
	retval=$?
	if [[ $retval -ne 0 ]]; then
		# Fehler
		schreibe "${YELLOW}Warnung:${NC} Systemd-Unit 'opsi-directory-connector.timer' konnte nicht gestartet werden.\n"
		schreibe_log "Fehlercode: ${retval}"
		schreibe_log "Fehlertext: ${command_output}"
		install_result=1
		test_error="true"
	else
		schreibe "${GREEN}OK:${NC} Systemd-Unit 'opsi-directory-connector.timer' wurde gestartet.\n"
	fi
	# 013 Sync now!
	#
	if [[ "${test_error}" == "false" ]] && [[ "${install_result}" == "0" ]]; then
		echo "Fuehre jetzt AD-Sync aus..."
		systemctl start opsi-directory-connector.service
		#opsidirectoryconnector --config "$ADCONN_CONFIG_FILE" 2> "$WORKING_DIR/out2.txt" 1> "$WORKING_DIR/out1.txt"
		# opsidirectoryconnector --config "/etc/opsi/paedML/.opsidirectoryconnector-paedML.conf"
		echo "Fertig."
	fi
	# 014 fertig
	if [[ "${install_result}" == "0" ]]; then
		return 0
	else
		return 1
	fi
}

do_check() {
	local check_result
	local retval
	local opsi_version
	if [ -e /usr/bin/opsi-python ]; then
	# Python 3 - opsi 4.2 or later
		opsi_version="42"
	else
		opsi_version="41"
	fi
	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/opsi-directory-connector.timer
	if [ -e "/etc/systemd/system/opsi-directory-connector.timer" ]; then
		# Dateien vergleichen
		cmp --silent "/etc/systemd/system/opsi-directory-connector.timer" "/etc/paedML/patches/bin/files/00006/opsi${opsi_version}/opsi-directory-connector.timer"
		retval=$?
		if [[ $retval -ne 0 ]]; then
			schreibe "NTBI: Datei '/etc/systemd/system/opsi-directory-connector.timer' ist nicht mit der Vorlage identisch. Sie muss ausgetauscht werden.\n"
			check_result="1"
		else
			schreibe "OK: Datei '/etc/systemd/system/opsi-directory-connector.timer' ist mit der Vorlage identisch.\n"
		fi
	else
		schreibe "NTBI: Datei '/etc/systemd/system/opsi-directory-connector.timer' fehlt.\n"
		check_result="1"
	fi
	# 002 /etc/systemd/system/opsi-directory-connector.service
	if [ -e "/etc/systemd/system/opsi-directory-connector.service" ]; then
		# Dateien vergleichen
		cmp --silent "/etc/systemd/system/opsi-directory-connector.service" "/etc/paedML/patches/bin/files/00006/opsi${opsi_version}/opsi-directory-connector.service"
		retval=$?
		if [[ $retval -ne 0 ]]; then
			schreibe "NTBI: Datei '/etc/systemd/system/opsi-directory-connector.service' ist nicht mit der Vorlage identisch. Sie muss ausgetauscht werden.\n"
			check_result="1"
		else
			schreibe "OK: Datei '/etc/systemd/system/opsi-directory-connector.service' ist mit der Vorlage identisch.\n"
		fi
	else
		schreibe "NTBI: Datei '/etc/systemd/system/opsi-directory-connector.service' fehlt.\n"
		check_result="1"
	fi
	# 003 systemctl is-active --quiet opsi-directory-connector.timer
		systemctl is-active --quiet opsi-directory-connector.timer
		retval=$?
		if [[ $retval -ne 0 ]]; then
			schreibe "NTBI: Der Systemd-Unit 'opsi-directory-connector.timer' ist nicht aktiv.\n"
			check_result="1"
		else
			schreibe "OK: Der Systemd-Unit 'opsi-directory-connector.timer' 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


