#!/bin/bash
#set -x
PRG_Version="2022.07.27-02"
SCRIPT_Name="lmz-opsi-patch-00010"
# 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="00010"
PATCH_VERSION="$PRG_Version"
#PATCH_Titel="opsi-configed Server-Konsole einrichten ."
PATCH_Titel="Samba Konfiguration anpassen."
PATCH_DESCRIPTION="Die Konfiguration der Datei '/etc/samba/smb.conf' wird angepasst.\nDer Gaeste-Benutzer wird deaktiviert (map to guest = never)\nDie Gruppe @pcpatch wird auf opsi 4.2 durch @opsifileadmins ersetzt.\nWeitere Infos: https://docs.opsi.org/opsi-docs-de/4.2/releasenotes/releasenotes.html#_datei_admin_gruppe_pcpatch_opsifileadmins"
### 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 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 opsi_version
	local smb_config_file
	local smb_backup_file
	
	smb_config_file="/etc/samba/smb.conf"
	smb_backup_file="${smb_config_file}.$(date +%Y-%m-%d_%H:%M)"
	#date +%Y-%m-%d_%H:%M
	echo "${smb_config_file}"
	echo "${smb_backup_file}"

	if [ -e /usr/bin/opsi-python ]; then
	# Python 3 - opsi 4.2 or later
		opsi_version="4.2"
	else
		opsi_version="4.1"
	fi
	install_result=0
	echo "Installiere '${SCRIPT_Name}' (${PRG_Version})..."
	schreibe_log "Installiere '${SCRIPT_Name}' (${PRG_Version})..."
	# -a apply      Rückgabewert 0 = OK, 1 = Fehler
	
	if [ -e "${smb_config_file}" ]; then
		# Sicherheitskopie erstellen
		schreibe "Erstelle Sicherheitskopie: '${smb_backup_file}'\n"
		cp "${smb_config_file}" "${smb_backup_file}"
		# 002 /etc/samba/smb.conf [global] map to guest = never
		sed -i 's/^.*map to guest.*$/   map to guest = never/' "${smb_config_file}"
		# 003 /etc/samba/smb.conf @opsifileadmins statt @pcpatch
		if [[ "${opsi_version}" == "4.2" ]]; then
			# opsi 4.2
			sed -i 's/@pcpatch/@opsifileadmins/' "${smb_config_file}"
		fi
		schreibe "Anpassungen in der Datei '${smb_config_file}':\n"
		diff --expand-tabs --suppress-common-lines --side-by-side "${smb_config_file}" "${smb_backup_file}"
		schreibe "Starte Samba-Dienste neu.\n"
		systemctl restart smbd.service
		systemctl restart nmbd.service
	else
		schreibe 3 "${RED}Fehler:${NC} Datei '${smb_config_file}' fehlt.\n"
		return 1
	fi
	# 004 fertig
	if [[ "${install_result}" == "0" ]]; then
		return 0
	else
		return 1
	fi
}

do_check() {
	local check_result
	local command_output
	local retval
	local opsi_version
	local smb_config_file
	local ofa_number
	
	smb_config_file="/etc/samba/smb.conf"

	if [ -e /usr/bin/opsi-python ]; then
	# Python 3 - opsi 4.2 or later
		opsi_version="4.2"
	else
		opsi_version="4.1"
	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/samba/smb.conf exists
	if [ -e "${smb_config_file}" ]; then
		# 002 /etc/samba/smb.conf [global] map to guest = never
		cat "${smb_config_file}" | grep -E "map to guest" | grep -E "never"
		retval=$?
		if [[ $retval -ne 0 ]]; then
			schreibe "NTBI: 'map to guest = never' ist nicht gesetzt. Das muss angepasst werden.\n"
			check_result="1"
		else
			schreibe "OK: 'map to guest = never' ist bereits gesetzt.\n"
		fi
		# 003 /etc/samba/smb.conf @opsifileadmins statt @pcpatch
		if [[ "${opsi_version}" == "4.2" ]]; then
			# opsi 4.2
			# cat "${smb_config_file}" | grep -E "@opsifileadmins"
			cat "${smb_config_file}" | grep -E "@pcpatch"
			retval=$?
			if [[ $retval -eq 0 ]]; then
				schreibe "NTBI: Die Gruppe '@pcpatch' wird noch verwendet.\n"
				schreibe "      In opsi 4.2 wird diese Gruppe durch '@opsifileadmins' ersetzt.\n"
				schreibe "      Das muss angepasst werden.\n"
				check_result="1"
			else
				schreibe "OK: Die Gruppe '@pcpatch' wird nicht (mehr) verwendet.\n"
			fi
		else
			# opsi 4.1
			schreibe_log "Fuer opsi 4.1 ist keine weitere Pruefung der smb.conf noetig."
		fi
	else
		schreibe "NTBI: Datei '${smb_config_file}' fehlt.\n"
		check_result="1"
	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


