second alpha (v0.2)

This commit is contained in:
Rainer 2025-06-21 15:58:52 +02:00
parent 7a343254e2
commit 7a1094c733
22 changed files with 2343 additions and 1511 deletions

View file

@ -9,11 +9,15 @@ else
exit 1
fi
# Welt-Schlüssel (Verzeichnisname) aus Argument oder Standardwert
WORLD_KEY="${1:-$DEFAULT_WORLD_NAME_KEY}" # Nutzt DEFAULT_WORLD_NAME_KEY aus config.sh
# Prüfe Abhängigkeiten, bevor irgendetwas anderes passiert
# Annahme: check_dependencies.sh wurde um 'vips' erweitert
/opt/luweb/check_dependencies.sh || exit 1
# Pfad zum Verzeichnis der aktuellen Welt (verwendet jetzt MINETESTMAPPER_WORLD_DATA_BASE_PATH)
CURRENT_MINETEST_WORLD_DATA_PATH="${MINETESTMAPPER_WORLD_DATA_BASE_PATH}${WORLD_KEY}/" # Für -i Option und world.mt/web.conf
# Welt-Schlüssel (Verzeichnisname) aus Argument oder Standardwert
WORLD_KEY="${1:-$DEFAULT_WORLD_NAME_KEY}"
# Pfad zum Verzeichnis der aktuellen Welt
CURRENT_MINETEST_WORLD_DATA_PATH="${MINETESTMAPPER_WORLD_DATA_BASE_PATH}${WORLD_KEY}/"
if [ ! -d "$CURRENT_MINETEST_WORLD_DATA_PATH" ]; then
echo "$(date '+%Y-%m-%d %H:%M:%S') - [${WORLD_KEY}] - FEHLER: Das Welt-Datenverzeichnis '${CURRENT_MINETEST_WORLD_DATA_PATH}' wurde nicht gefunden!"
@ -48,12 +52,10 @@ MINETESTMAPPER_PATH="${BASE_SCRIPT_DIR}/${MINETESTMAPPER_EXEC_NAME}"
LOG_FILE="${LOG_DIR_BASE}/${SCRIPT_BASENAME}_${WORLD_KEY}.log"
LOCK_FILE="${LOCK_FILE_BASE_DIR}/${SCRIPT_BASENAME}_${WORLD_KEY}.lock"
if [ -z "$RAW_MAP_BASE_SUBDIR" ]; then echo "FEHLER: RAW_MAP_BASE_SUBDIR ist in config.sh nicht gesetzt oder leer!"; exit 1; fi
if [ -z "$RAW_MAP_FILENAME" ]; then echo "FEHLER: RAW_MAP_FILENAME ist in config.sh nicht gesetzt oder leer!"; exit 1; fi
RAW_MAP_OUTPUT_DIR_ABSOLUTE="${BASE_SCRIPT_DIR}/${RAW_MAP_BASE_SUBDIR}/${WORLD_KEY}"
RAW_MAP_ABSOLUTE_PATH="${RAW_MAP_OUTPUT_DIR_ABSOLUTE}/${RAW_MAP_FILENAME}"
UNKNOWN_NODES_FILE_ABSOLUTE_PATH="${RAW_MAP_OUTPUT_DIR_ABSOLUTE}/unknown_nodes.txt"
MAP_INFO_FILE_ABSOLUTE_PATH="${RAW_MAP_OUTPUT_DIR_ABSOLUTE}/map_info.txt"
WEB_CURRENT_WORLD_DIR="${WEB_ROOT_PATH}/${WEB_MAPS_BASE_SUBDIR}/${WORLD_KEY}"
TILES_FULL_OUTPUT_PATH="${WEB_CURRENT_WORLD_DIR}/${TILES_SUBDIR_NAME}"
@ -66,7 +68,7 @@ log_message() {
echo "${message_to_log}" | tee -a "$LOG_FILE"
}
# === Funktion zur Archivbereinigung (unverändert) ===
# === Funktion zur Archivbereinigung ===
prune_archives() {
log_message "Starte Archivbereinigung für Welt '${WORLD_KEY}' im Pfad '${ARCHIVE_BASE_WEB_PATH}'..."
if [ ! -d "$ARCHIVE_BASE_WEB_PATH" ]; then log_message "Archiv-Basispfad ${ARCHIVE_BASE_WEB_PATH} nicht gefunden."; return; fi
@ -110,29 +112,40 @@ MM_ALL_OPTIONS_STR="${MM_ALL_OPTIONS_STR} --scalecolor '${MM_OPT_SCALECOLOR}'";
MM_ALL_OPTIONS_STR="${MM_ALL_OPTIONS_STR} --min-y ${MM_OPT_MIN_Y}"
MAP_GENERATION_COMMAND_TO_EVAL="'${MINETESTMAPPER_PATH}' -i '${CURRENT_MINETEST_WORLD_DATA_PATH}' -o '${RAW_MAP_ABSOLUTE_PATH}' ${MM_ALL_OPTIONS_STR}"
log_message "Starte minetestmapper (Optionen: ${MM_ALL_OPTIONS_STR}). Ausgaben folgen:"
log_message "Starte minetestmapper zur Kartengenerierung (Optionen: ${MM_ALL_OPTIONS_STR})."
MAPPER_RUN_OUTPUT_CAPTURE_FILE=$(mktemp); MAPPER_EXIT_STATUS=0
(set -o pipefail; eval "${MAP_GENERATION_COMMAND_TO_EVAL}" 2>&1 | tee -a "$LOG_FILE" > "$MAPPER_RUN_OUTPUT_CAPTURE_FILE"); MAPPER_EXIT_STATUS=$?
if [ ${MAPPER_EXIT_STATUS} -ne 0 ]; then log_message "FEHLER: minetestmapper (Status: ${MAPPER_EXIT_STATUS})."; tail -n 15 "$MAPPER_RUN_OUTPUT_CAPTURE_FILE" | while IFS= read -r line; do log_message " ${line}"; done; rm -f "$MAPPER_RUN_OUTPUT_CAPTURE_FILE"; exit 1; fi
if [ ${MAPPER_EXIT_STATUS} -ne 0 ]; then log_message "FEHLER: minetestmapper Kartengenerierung (Status: ${MAPPER_EXIT_STATUS})."; tail -n 15 "$MAPPER_RUN_OUTPUT_CAPTURE_FILE" | while IFS= read -r line; do log_message " ${line}"; done; rm -f "$MAPPER_RUN_OUTPUT_CAPTURE_FILE"; exit 1; fi
if [ ! -f "$RAW_MAP_ABSOLUTE_PATH" ]; then log_message "FEHLER: ${RAW_MAP_ABSOLUTE_PATH} nicht gefunden (minetestmapper Status ${MAPPER_EXIT_STATUS})."; rm -f "$MAPPER_RUN_OUTPUT_CAPTURE_FILE"; exit 1; fi
log_message "${RAW_MAP_FILENAME} erfolgreich generiert nach ${RAW_MAP_ABSOLUTE_PATH}."
# === Karten-Dimensionen auslesen und in map_info.txt speichern ===
log_message "Ermittle Dimensionen von ${RAW_MAP_ABSOLUTE_PATH}..."
log_message "Erstelle map_info.txt..."
MAP_DIMENSIONS=""; MAP_EXTENT=""
if ! command -v identify &> /dev/null; then
log_message "WARNUNG: 'identify' (Teil von ImageMagick) nicht gefunden. map_info.txt kann nicht erstellt werden."
log_message "WARNUNG: 'identify' (Teil von ImageMagick) nicht gefunden. map_dimension kann nicht ermittelt werden."
else
dimensions=$(identify -format "%wx%h" "$RAW_MAP_ABSOLUTE_PATH" 2>/dev/null)
if [ -n "$dimensions" ]; then
map_info_file="${RAW_MAP_OUTPUT_DIR_ABSOLUTE}/map_info.txt"
echo "$dimensions" > "$map_info_file"
log_message "Dimensionen (${dimensions}) erfolgreich in ${map_info_file} gespeichert."
else
log_message "FEHLER: Konnte Dimensionen von ${RAW_MAP_ABSOLUTE_PATH} nicht ermitteln."
fi
MAP_DIMENSIONS=$(identify -format "%wx%h" "$RAW_MAP_ABSOLUTE_PATH" 2>/dev/null)
fi
EXTENT_COMMAND_TO_EVAL="'${MINETESTMAPPER_PATH}' -i '${CURRENT_MINETEST_WORLD_DATA_PATH}' --extent ${MM_ALL_OPTIONS_STR}"
log_message "Ermittle Map Extent mit: --extent"
MAP_EXTENT_OUTPUT=$(eval "${EXTENT_COMMAND_TO_EVAL}" 2>/dev/null)
if [ -n "$MAP_EXTENT_OUTPUT" ]; then
MAP_EXTENT=$(echo "$MAP_EXTENT_OUTPUT" | sed 's/Map extent: //')
fi
if [ -n "$MAP_DIMENSIONS" ] && [ -n "$MAP_EXTENT" ]; then
{
echo "map_dimension=${MAP_DIMENSIONS}"
echo "map_extent=${MAP_EXTENT}"
} > "$MAP_INFO_FILE_ABSOLUTE_PATH"
log_message "map_info.txt erfolgreich erstellt: Dimension=${MAP_DIMENSIONS}, Extent=${MAP_EXTENT}"
else
log_message "FEHLER: map_info.txt konnte nicht erstellt werden, da Informationen fehlen!"
[ -z "$MAP_DIMENSIONS" ] && log_message "-> Bild-Dimensionen konnten nicht ermittelt werden."
[ -z "$MAP_EXTENT" ] && log_message "-> Karten-Extent konnte nicht ermittelt werden."
fi
# Unknown Nodes Verarbeitung
if [ -f "$MAPPER_RUN_OUTPUT_CAPTURE_FILE" ]; then
TEMP_NEW_UNKNOWN_NODES_FILE="${UNKNOWN_NODES_FILE_ABSOLUTE_PATH}.new_found"
awk ' /Unknown nodes:/ {b=1;next} b&&NF==0 {b=0} b&&!/^[ \t]/ {b=0} b{n=$0;sub(/^[ \t]+/,"",n);sub(/[ \t]+$/,"",n);if(n~/:/&&n!="")print n} ' "$MAPPER_RUN_OUTPUT_CAPTURE_FILE" > "$TEMP_NEW_UNKNOWN_NODES_FILE"
@ -141,25 +154,28 @@ if [ -f "$MAPPER_RUN_OUTPUT_CAPTURE_FILE" ]; then
else log_message "WARNUNG: minetestmapper-Ausgabe nicht verarbeitbar."; fi
rm -f "$MAPPER_RUN_OUTPUT_CAPTURE_FILE"
# 2. Web-Vorschaukarte (verkleinert) erstellen
log_message "Erzeuge Web-Version von ${RAW_MAP_FILENAME} (max ${RESIZED_MAX_DIMENSION}px) nach ${WEB_MAP_PNG_FULL_PATH}..."
# === Web-Vorschaukarte (verkleinert) erstellen mit VIPS ===
log_message "Erzeuge Web-Version von ${RAW_MAP_FILENAME} (max ${RESIZED_MAX_DIMENSION}px) mit 'vips' nach ${WEB_MAP_PNG_FULL_PATH}..."
mkdir -p "$(dirname "$WEB_MAP_PNG_FULL_PATH")"
if [ ! -f "$RAW_MAP_ABSOLUTE_PATH" ]; then log_message "FEHLER: Quelldatei ${RAW_MAP_ABSOLUTE_PATH} für Web-Vorschau nicht gefunden!"; else
if ! command -v convert &> /dev/null; then log_message "WARNUNG: convert nicht gefunden. Kopiere Karte."
(set -o pipefail; cp "$RAW_MAP_ABSOLUTE_PATH" "$WEB_MAP_PNG_FULL_PATH" 2>&1 | tee -a "$LOG_FILE" )
if [ $? -ne 0 ]; then log_message "FEHLER: Kopieren fehlgeschlagen."; else log_message "Rohkarte kopiert."; fi
else log_message "Führe convert aus..."
(set -o pipefail; convert "$RAW_MAP_ABSOLUTE_PATH" -resize "${RESIZED_MAX_DIMENSION}x${RESIZED_MAX_DIMENSION}>" "$WEB_MAP_PNG_FULL_PATH" 2>&1 | tee -a "$LOG_FILE")
if [ $? -ne 0 ]; then log_message "FEHLER: Verkleinern fehlgeschlagen."; else log_message "Verkleinerte Web-map.png erstellt."; fi
if [ ! -f "$RAW_MAP_ABSOLUTE_PATH" ]; then
log_message "FEHLER: Quelldatei ${RAW_MAP_ABSOLUTE_PATH} für Web-Vorschau nicht gefunden!"
else
# KORREKTUR: --size "down" statt ">"
(set -o pipefail; vips thumbnail "$RAW_MAP_ABSOLUTE_PATH" "$WEB_MAP_PNG_FULL_PATH" "${RESIZED_MAX_DIMENSION}" --height "${RESIZED_MAX_DIMENSION}" --size "down" 2>&1 | tee -a "$LOG_FILE")
if [ $? -ne 0 ]; then
log_message "FEHLER: Skalierung mit 'vips' fehlgeschlagen."
else
log_message "Verkleinerte Web-map.png mit 'vips' erfolgreich erstellt."
fi
fi
# 3. Tiles generieren
# === Tiles generieren ===
log_message "Generiere Kacheln (Zoom: ${GDAL2TILES_ZOOM_LEVELS}) nach ${TILES_FULL_OUTPUT_PATH}..."
if [ ! -f "$RAW_MAP_ABSOLUTE_PATH" ]; then log_message "FEHLER: Quelldatei ${RAW_MAP_ABSOLUTE_PATH} für Tiling nicht gefunden!"; else
TEMP_TILES_DIR="${TILES_FULL_OUTPUT_PATH}_temp_$(date +%s)"; rm -rf "$TEMP_TILES_DIR"; mkdir -p "$(dirname "$TILES_FULL_OUTPUT_PATH")"
log_message "Führe gdal2tiles.py aus..."
(set -o pipefail; gdal2tiles.py --profile=raster --xyz --zoom="${GDAL2TILES_ZOOM_LEVELS}" "${RAW_MAP_ABSOLUTE_PATH}" "${TEMP_TILES_DIR}" 2>&1 | tee -a "$LOG_FILE")
# KORREKTUR: -r "near" statt "nearest"
(set -o pipefail; gdal2tiles.py --profile=raster --xyz --zoom="${GDAL2TILES_ZOOM_LEVELS}" -r near "${RAW_MAP_ABSOLUTE_PATH}" "${TEMP_TILES_DIR}" 2>&1 | tee -a "$LOG_FILE")
if [ $? -ne 0 ]; then log_message "FEHLER: gdal2tiles.py fehlgeschlagen."; rm -rf "$TEMP_TILES_DIR"; exit 1; fi
log_message "Kacheln in ${TEMP_TILES_DIR} generiert."
log_message "Entferne altes Kachel-Verzeichnis: ${TILES_FULL_OUTPUT_PATH}"; rm -rf "$TILES_FULL_OUTPUT_PATH"
@ -171,29 +187,36 @@ fi
# === Archivbereinigung ===
prune_archives
# 4. Tägliches Archivbild
# === Tägliches Archivbild ===
ARCHIVE_YEAR=$(date '+%Y'); ARCHIVE_MONTH=$(date '+%m'); ARCHIVE_DAY=$(date '+%d')
ARCHIVE_DAILY_TARGET_DIR="${ARCHIVE_BASE_WEB_PATH}/${ARCHIVE_YEAR}/${ARCHIVE_MONTH}"
ARCHIVE_DAILY_FILE_PATH="${ARCHIVE_DAILY_TARGET_DIR}/${ARCHIVE_DAY}.png"
log_message "Prüfe Notwendigkeit für Archivbild für ${ARCHIVE_YEAR}-${ARCHIVE_MONTH}-${ARCHIVE_DAY}..."
if [ ! -f "$ARCHIVE_DAILY_FILE_PATH" ]; then
log_message "Archivbild ${ARCHIVE_DAILY_FILE_PATH} existiert noch nicht. Versuche Erstellung..."
if [ ! -f "$RAW_MAP_ABSOLUTE_PATH" ]; then log_message "FEHLER: Quelldatei (${RAW_MAP_ABSOLUTE_PATH}) nicht gefunden! Archiv nicht erstellt.";
if [ ! -f "$RAW_MAP_ABSOLUTE_PATH" ]; then
log_message "FEHLER: Quelldatei (${RAW_MAP_ABSOLUTE_PATH}) nicht gefunden! Archiv nicht erstellt."
else
mkdir -p "$ARCHIVE_DAILY_TARGET_DIR"
if [ ! -d "$ARCHIVE_DAILY_TARGET_DIR" ]; then log_message "FEHLER: Archiv-Zielverzeichnis ${ARCHIVE_DAILY_TARGET_DIR} nicht erstellt.";
if [ ! -d "$ARCHIVE_DAILY_TARGET_DIR" ]; then
log_message "FEHLER: Archiv-Zielverzeichnis ${ARCHIVE_DAILY_TARGET_DIR} nicht erstellt."
else
log_message "Erzeuge Archivbild (max ${RESIZED_MAX_DIMENSION}px) für ${ARCHIVE_DAILY_FILE_PATH}..."
if ! command -v convert &> /dev/null; then log_message "WARNUNG: convert nicht gefunden. Kopiere Originalgröße."
if cp "$RAW_MAP_ABSOLUTE_PATH" "$ARCHIVE_DAILY_FILE_PATH"; then log_message "Archivbild (Originalgröße) erstellt."; else log_message "FEHLER: Archivbild (cp) nicht erstellt.";fi
else
(set -o pipefail; convert "$RAW_MAP_ABSOLUTE_PATH" -resize "${RESIZED_MAX_DIMENSION}x${RESIZED_MAX_DIMENSION}>" "$ARCHIVE_DAILY_FILE_PATH" 2>&1 | tee -a "$LOG_FILE")
if [ $? -eq 0 ]; then log_message "Verkleinertes Archivbild erstellt."; if [ ! -s "$ARCHIVE_DAILY_FILE_PATH" ]; then log_message "WARNUNG: Archivbild ${ARCHIVE_DAILY_FILE_PATH} ist leer.";fi
else log_message "FEHLER: Verkleinertes Archivbild nicht erstellt (convert).";fi
fi; fi; fi
else log_message "Archivbild ${ARCHIVE_DAILY_FILE_PATH} existiert bereits."; fi
log_message "Erzeuge Archivbild (max ${RESIZED_MAX_DIMENSION}px) mit 'vips' für ${ARCHIVE_DAILY_FILE_PATH}..."
# KORREKTUR: --size "down" statt ">"
(set -o pipefail; vips thumbnail "$RAW_MAP_ABSOLUTE_PATH" "$ARCHIVE_DAILY_FILE_PATH" "${RESIZED_MAX_DIMENSION}" --height "${RESIZED_MAX_DIMENSION}" --size "down" 2>&1 | tee -a "$LOG_FILE")
if [ $? -eq 0 ]; then
log_message "Verkleinertes Archivbild erstellt."
if [ ! -s "$ARCHIVE_DAILY_FILE_PATH" ]; then log_message "WARNUNG: Archivbild ${ARCHIVE_DAILY_FILE_PATH} ist leer."; fi
else
log_message "FEHLER: Verkleinertes Archivbild nicht erstellt (vips)."
fi
fi
fi
else
log_message "Archivbild ${ARCHIVE_DAILY_FILE_PATH} existiert bereits."
fi
# 5. Status- und Info-Dateien im Webverzeichnis
# === Status- und Info-Dateien im Webverzeichnis ===
log_message "Erstelle Status- und Info-Dateien im Webverzeichnis ${WEB_CURRENT_WORLD_DIR}..."
mkdir -p "$WEB_CURRENT_WORLD_DIR"
echo "$(date '+%Y-%m-%d %H:%M:%S %Z')" > "${WEB_CURRENT_WORLD_DIR}/last_update.txt" && log_message "last_update.txt erstellt." || log_message "FEHLER: last_update.txt nicht erstellt."
@ -201,9 +224,8 @@ if [ -f "$UNKNOWN_NODES_FILE_ABSOLUTE_PATH" ]; then
if cp "$UNKNOWN_NODES_FILE_ABSOLUTE_PATH" "${WEB_CURRENT_WORLD_DIR}/unknown_nodes.txt"; then log_message "unknown_nodes.txt nach Web kopiert."; else log_message "FEHLER: unknown_nodes.txt nicht nach Web kopiert."; fi
else log_message "WARNUNG: ${UNKNOWN_NODES_FILE_ABSOLUTE_PATH} für Web-Kopie nicht gefunden."; fi
# NEU: Kopiere map_info.txt in das Web-Verzeichnis
if [ -f "${RAW_MAP_OUTPUT_DIR_ABSOLUTE}/map_info.txt" ]; then
if cp "${RAW_MAP_OUTPUT_DIR_ABSOLUTE}/map_info.txt" "${WEB_CURRENT_WORLD_DIR}/map_info.txt"; then
if [ -f "$MAP_INFO_FILE_ABSOLUTE_PATH" ]; then
if cp "$MAP_INFO_FILE_ABSOLUTE_PATH" "${WEB_CURRENT_WORLD_DIR}/map_info.txt"; then
log_message "map_info.txt nach Web kopiert."
else
log_message "FEHLER: map_info.txt konnte nicht nach Web kopiert werden."