luanti-web/check_server_status.sh
2025-06-21 15:58:52 +02:00

106 lines
4.5 KiB
Bash
Executable file

#!/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