#!/bin/bash # Prüfe Abhängigkeiten, bevor irgendetwas anderes passiert ./check_dependencies.sh || exit 1 # Lade globale Konfiguration # Annahme: config.sh liegt im selben Verzeichnis wie dieses Skript CONFIG_FILE_PATH="$(dirname "$0")/config.sh" if [ -f "$CONFIG_FILE_PATH" ]; then source "$CONFIG_FILE_PATH" else # Minimales Logging, falls Haupt-Log-Funktion nicht verfügbar oder config nicht geladen werden kann echo "$(date '+%Y-%m-%d %H:%M:%S') - FEHLER: Globale config.sh nicht unter ${CONFIG_FILE_PATH} gefunden! Status-Skript kann nicht laufen." >> "/tmp/check_server_status_bootstrap_error.log" exit 1 fi # === Abgeleitete Variablen für dieses Skript === SCRIPT_BASENAME=$(basename "$0" .sh) LOG_FILE="${LOG_DIR_BASE}/${SCRIPT_BASENAME}.log" # Eigene Log-Datei (z.B. /var/log/luweb/check_server_status.log) LOCK_FILE="${LOCK_FILE_BASE_DIR}/${SCRIPT_BASENAME}.lock" # Eigene Lock-Datei # === Logging Funktion === log_message() { local message_to_log message_to_log="$(date '+%Y-%m-%d %H:%M:%S') - $1" # Weltname nicht im Prefix, da es alle Welten prüft if [ -t 1 ]; then # Prüft, ob stdout ein Terminal ist echo "${message_to_log}" | tee -a "$LOG_FILE" else echo "${message_to_log}" >> "$LOG_FILE" fi } # === Hauptlogik === exec 200>"$LOCK_FILE" flock -n 200 || { log_message "Script ${SCRIPT_BASENAME}.sh ist bereits aktiv (Lock: ${LOCK_FILE}). Beende."; exit 1; } trap 'rm -f "$LOCK_FILE"; log_message "Script ${SCRIPT_BASENAME}.sh beendet."' EXIT mkdir -p "$LOG_DIR_BASE" # Sicherstellen, dass Log-Verzeichnis existiert log_message "Script ${SCRIPT_BASENAME}.sh gestartet." if ! command -v ss &> /dev/null; then log_message "FEHLER: 'ss' (Socket Statistics) nicht gefunden. Port-Status kann nicht geprüft werden." exit 1 fi # === NEU: Welt-Entdeckung aus dem Minetest-Datenverzeichnis === log_message "Suche nach Welten in ${MINETESTMAPPER_WORLD_DATA_BASE_PATH}..." shopt -s nullglob world_key_dirs=("${MINETESTMAPPER_WORLD_DATA_BASE_PATH}"/*/) # Scannt Unterverzeichnisse shopt -u nullglob if [ ${#world_key_dirs[@]} -eq 0 ]; then log_message "Keine Welt-Verzeichnisse in ${MINETESTMAPPER_WORLD_DATA_BASE_PATH} gefunden. Beende." exit 0 fi for world_data_dir in "${world_key_dirs[@]}"; do current_world_key=$(basename "$world_data_dir") world_mt_file="${world_data_dir}world.mt" web_conf_file="${world_data_dir}web.conf" # Eine Welt wird nur geprüft, wenn sie eine world.mt und eine web.conf hat if [ ! -f "$world_mt_file" ] || [ ! -f "$web_conf_file" ]; then log_message "WARNUNG: Für Welt-Schlüssel '${current_world_key}' fehlt world.mt oder web.conf. Überspringe Status-Check." continue fi # Lade Standardwerte und überschreibe mit welt-spezifischer web.conf # Für dieses Skript sind nur SERVER_ADDRESS und SERVER_PORT relevant SERVER_ADDRESS="$DEFAULT_SERVER_ADDRESS" SERVER_PORT="$DEFAULT_SERVER_PORT" source "$web_conf_file" # Lädt u.a. SERVER_ADDRESS und SERVER_PORT if [ -z "$SERVER_PORT" ] || [ -z "$SERVER_ADDRESS" ]; then log_message "WARNUNG: Port ('${SERVER_PORT}') oder Adresse ('${SERVER_ADDRESS}') für Welt '${current_world_key}' nicht konfiguriert. Überspringe." continue fi # Pfad zur online_status.txt Datei im Webverzeichnis der Welt status_file_dir="${WEB_ROOT_PATH}/${WEB_MAPS_BASE_SUBDIR}/${current_world_key}" status_file_path="${status_file_dir}/online_status.txt" mkdir -p "$status_file_dir" # Stelle sicher, dass das Verzeichnis existiert if [ ! -d "$status_file_dir" ]; then log_message "FEHLER: Konnte Verzeichnis ${status_file_dir} nicht erstellen. Überspringe Welt ${current_world_key}." continue fi log_message "Prüfe lokalen Port für Welt '${current_world_key}': ${SERVER_PORT}" current_status="offline" # Standardmäßig offline setzen # Prüfe mit 'ss -tulpn', ob der Port in der Ausgabe der lauschenden Sockets vorkommt. # Dies prüft, ob ein Dienst (TCP oder UDP) auf dem Port auf dem lokalen System lauscht. if ss -tulpn | grep -qE ":${SERVER_PORT}([[:space:]]|$)"; then current_status="online" fi last_update_time=$(date '+%Y-%m-%d %H:%M:%S %Z') echo "${current_status} - ${last_update_time}" > "$status_file_path" log_message "Status für ${current_world_key} (Port ${SERVER_PORT}): ${current_status}. Datei aktualisiert: ${status_file_path}" done log_message "Alle konfigurierten Welten geprüft." exit 0