#!/bin/bash # Lade globale Konfiguration CONFIG_FILE_PATH="$(dirname "$0")/config.sh" if [ -f "$CONFIG_FILE_PATH" ]; then source "$CONFIG_FILE_PATH" else echo "FEHLER: Globale config.sh nicht unter ${CONFIG_FILE_PATH} gefunden!" exit 1 fi # === Logging Funktion (früh definieren für Wrapper-Logik) === LOG_FILE_BASE="${LOG_DIR_BASE}/$(basename "$0" .sh)" log_message() { local key="${1:-main}" local msg="$2" local log_target="${LOG_FILE_BASE}.log" [ "$key" != "main" ] && log_target="${LOG_FILE_BASE}_${key}.log" local message_to_log; message_to_log="$(date '+%Y-%m-%d %H:%M:%S') - [${key}] - ${msg}" echo "${message_to_log}" | tee -a "$log_target" } # --- Wrapper-Logik zur Verarbeitung aller Welten, wenn kein Argument übergeben wird --- if [ -z "$1" ]; then log_message "main" "Kein spezifischer Welt-Schlüssel angegeben. Verarbeite alle Welten mit web.conf..." shopt -s nullglob for world_dir in "${MINETESTMAPPER_WORLD_DATA_BASE_PATH}"/*/; do if [ -f "${world_dir}web.conf" ]; then world_key_to_process=$(basename "$world_dir") log_message "main" "--- Starte Durchlauf für '${world_key_to_process}' ---" # Rufe das Skript für die gefundene Welt rekursiv auf bash "$0" "$world_key_to_process" fi done shopt -u nullglob log_message "main" "Alle Welten verarbeitet." exit 0 fi # ############################################################################# # Ab hier beginnt die Logik für eine EINZELNE Welt # ############################################################################# # Prüfe Abhängigkeiten, bevor irgendetwas anderes passiert /opt/luweb/check_dependencies.sh || exit 1 WORLD_KEY=$1 CURRENT_MINETEST_WORLD_DATA_PATH="${MINETESTMAPPER_WORLD_DATA_BASE_PATH}${WORLD_KEY}/" # === Abgeleitete Variablen === SCRIPT_BASENAME=$(basename "$0" .sh) LOG_FILE="${LOG_DIR_BASE}/${SCRIPT_BASENAME}_${WORLD_KEY}.log" LOCK_FILE="${LOCK_FILE_BASE_DIR}/${SCRIPT_BASENAME}_${WORLD_KEY}.lock" # Pfade zu den Quell- und Zieldateien AREAS_DAT_SOURCE_PATH="${CURRENT_MINETEST_WORLD_DATA_PATH}areas.dat" AREAS_JSON_TARGET_DIR="${WEB_ROOT_PATH}/${WEB_MAPS_BASE_SUBDIR}/${WORLD_KEY}" AREAS_JSON_FILE_PATH="${AREAS_JSON_TARGET_DIR}/areas.json" AREAS_JSON_TMP_FILE_PATH="${AREAS_JSON_FILE_PATH}.tmp" # === Hauptlogik für eine einzelne Welt === exec 200>"$LOCK_FILE" flock -n 200 || { log_message "${WORLD_KEY}" "Script ${SCRIPT_BASENAME}.sh ist bereits für diese Welt aktiv (Lock: ${LOCK_FILE}). Beende."; exit 1; } trap 'rm -f "$LOCK_FILE"; log_message "${WORLD_KEY}" "Skript beendet."' EXIT log_message "${WORLD_KEY}" "Script gestartet." # Prüfen, ob die Quelldatei existiert if [ ! -f "$AREAS_DAT_SOURCE_PATH" ]; then log_message "${WORLD_KEY}" "INFO: Quelldatei ${AREAS_DAT_SOURCE_PATH} nicht gefunden. Erstelle leere areas.json." mkdir -p "$AREAS_JSON_TARGET_DIR" echo "{}" > "$AREAS_JSON_FILE_PATH" exit 0 fi log_message "${WORLD_KEY}" "Lese ${AREAS_DAT_SOURCE_PATH} und transformiere zu hierarchischem JSON..." jq ' (map(select(.id != null)) | map(.sub_areas = []) | INDEX(.id | tostring)) as $parents | (map(select(.parent != null)) | group_by(.parent)) as $children_grouped | reduce $children_grouped[] as $group ( $parents; .[($group[0].parent|tostring)].sub_areas = $group ) ' "$AREAS_DAT_SOURCE_PATH" > "$AREAS_JSON_TMP_FILE_PATH" if [ $? -ne 0 ]; then log_message "${WORLD_KEY}" "FEHLER: jq-Transformation fehlgeschlagen. Prüfen Sie die JSON-Struktur in areas.dat." rm -f "$AREAS_JSON_TMP_FILE_PATH" exit 1 fi # Temporäre Datei an den Zielort verschieben mkdir -p "$AREAS_JSON_TARGET_DIR" mv "$AREAS_JSON_TMP_FILE_PATH" "$AREAS_JSON_FILE_PATH" log_message "${WORLD_KEY}" "areas.json erfolgreich synchronisiert nach ${AREAS_JSON_FILE_PATH}" exit 0