103 lines
4.4 KiB
Bash
Executable file
103 lines
4.4 KiB
Bash
Executable file
#!/bin/bash
|
|
|
|
# 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
|