This major update introduces a complete system for visualizing protected areas on the OpenLayers map. It adds a new sync script to process area data and heavily modifies the frontend to support interactive, multi-layer display with custom popups. Additionally, data-sync scripts were refactored to run globally on all configured worlds, simplifying cron automation.
99 lines
3.8 KiB
Bash
Executable file
99 lines
3.8 KiB
Bash
Executable file
#!/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
|