diff --git a/assets/bin/RunTrackmaniaServer.sh b/assets/bin/RunTrackmaniaServer.sh index 7d545f3..335018e 100644 --- a/assets/bin/RunTrackmaniaServer.sh +++ b/assets/bin/RunTrackmaniaServer.sh @@ -1206,5 +1206,167 @@ graceful_shutdown() { trap graceful_shutdown SIGTERM SIGINT echo "==> Signal-Handler registriert (SIGTERM/SIGINT -> Graceful Shutdown)" +# ============================================================ +# Startup-Zusammenfassung +# ============================================================ +# Gibt am Ende des Startprozesses eine uebersichtliche Box mit +# allen wichtigen Server-Informationen aus. Die Box-Breite passt +# sich automatisch an den laengsten Inhalt an. +# Bei bestehenden Installationen ist dieses Feature nach einem +# Image-Update automatisch aktiv (keine manuellen Schritte noetig). +# ============================================================ +print_startup_summary() { + _SUMMARY_TMP=$(mktemp /tmp/startup_summary.XXXXXX) + + # Map-Anzahl aus aktiver MatchSettings-Datei zaehlen + _ACTIVE_MS_FULL="$GAMEDATA_DIR/Tracks/${GAME_SETTINGS_PATH}" + _MAP_COUNT="0" + if [ -f "$_ACTIVE_MS_FULL" ]; then + _MAP_COUNT=$(grep -c '' "$_ACTIVE_MS_FULL" 2>/dev/null) + _MAP_COUNT=${_MAP_COUNT:-0} + fi + + # MatchSettings-Dateiname extrahieren + _MS_FILENAME=$(basename "$GAME_SETTINGS_PATH") + + # XAseco-Status ermitteln + if [ "${XASECO_ENABLED:-true}" != "true" ]; then + _XASECO_STATUS="Deaktiviert" + elif [ -n "${XASECO_PID:-}" ] && kill -0 "$XASECO_PID" 2>/dev/null; then + _XASECO_STATUS="Aktiv (PID ${XASECO_PID})" + else + _XASECO_STATUS="Nicht gestartet" + fi + + # Healthcheck-Status ermitteln + if [ "${XASECO_ENABLED:-true}" != "true" ]; then + _HC_STATUS="—" + elif [ "${XASECO_HEALTHCHECK:-true}" = "true" ] && [ -n "${HEALTHCHECK_PID:-}" ]; then + _HC_STATUS="Aktiv (PID ${HEALTHCHECK_PID})" + elif [ "${XASECO_HEALTHCHECK:-true}" != "true" ]; then + _HC_STATUS="Deaktiviert" + else + _HC_STATUS="Nicht gestartet" + fi + + # Forced Mods zaehlen + _MOD_COUNT=0 + for _ENV_NAME in FORCE_MOD_STADIUM FORCE_MOD_ISLAND FORCE_MOD_BAY FORCE_MOD_COAST FORCE_MOD_SPEED FORCE_MOD_ALPINE FORCE_MOD_RALLY; do + eval "_MOD_VAL=\${$_ENV_NAME:-}" + [ -n "$_MOD_VAL" ] && _MOD_COUNT=$((_MOD_COUNT + 1)) + done + if [ "$_MOD_COUNT" -gt 0 ]; then + _MODS_STATUS="${_MOD_COUNT} Mod(s) aktiv" + else + _MODS_STATUS="Keine" + fi + + # Shuffle-Status + if [ "${SHUFFLE_MAPLIST:-false}" = "true" ]; then + _SHUFFLE_STATUS="Aktiviert" + else + _SHUFFLE_STATUS="Deaktiviert" + fi + + # Server-Modus-Anzeige + case "${SERVER_MODE:-internet}" in + internet) _MODE_DISPLAY="Internet" ;; + lan) _MODE_DISPLAY="LAN" ;; + *) _MODE_DISPLAY="${SERVER_MODE}" ;; + esac + + # PHP-Debug-Status + if [ "${PHP_DISPLAY_ERRORS:-false}" = "true" ]; then + _PHP_DEBUG="Aktiviert" + else + _PHP_DEBUG="Deaktiviert" + fi + + # Max-Players und Max-Spectators aus Config lesen (falls verfuegbar) + _MAX_PLAYERS="" + _MAX_SPECS="" + if [ -f "$CONFIG" ]; then + _MAX_PLAYERS=$(grep -oP '(?<=)[^<]+' "$CONFIG" 2>/dev/null | head -1) + _MAX_SPECS=$(grep -oP '(?<=)[^<]+' "$CONFIG" 2>/dev/null | head -1) + fi + _MAX_PLAYERS=${_MAX_PLAYERS:-${SERVER_MAX_PLAYERS:-32}} + _MAX_SPECS=${_MAX_SPECS:-${SERVER_MAX_SPECTATORS:-32}} + + # --- Zeilen in Temp-Datei schreiben ('---' = Trennlinie) --- + cat > "$_SUMMARY_TMP" </ +RemoteCP: http:///remotecp/ +--- +Log-Rotation: Aktiv (stuendlich, max. 10 MB) +PHP-Debug: ${_PHP_DEBUG} +TM-Server: PID ${TM_PID} +EOSUMMARY + + # --- Maximale Zeilenlaenge ermitteln --- + _MAX_LEN=0 + while IFS= read -r _line; do + if [ "$_line" != "---" ]; then + _cur_len=${#_line} + [ "$_cur_len" -gt "$_MAX_LEN" ] && _MAX_LEN=$_cur_len + fi + done < "$_SUMMARY_TMP" + + # Box-Breite: Inhalt + je 2 Zeichen Padding (links/rechts) + _BOX_INNER=$((_MAX_LEN + 4)) + + # --- Horizontale Linie erzeugen --- + _HLINE="" + _i=0 + while [ "$_i" -lt "$_BOX_INNER" ]; do + _HLINE="${_HLINE}═" + _i=$((_i + 1)) + done + + # --- Box ausgeben --- + echo "" + printf '╔%s╗\n' "$_HLINE" + + _is_title=true + while IFS= read -r _line; do + if [ "$_line" = "---" ]; then + printf '╠%s╣\n' "$_HLINE" + elif [ "$_is_title" = "true" ]; then + # Titelzeile zentriert ausgeben + _title_len=${#_line} + _pad_total=$((_MAX_LEN - _title_len)) + _pad_left=$((_pad_total / 2)) + _pad_right=$((_pad_total - _pad_left)) + printf '║ %*s%s%*s ║\n' "$_pad_left" "" "$_line" "$_pad_right" "" + _is_title=false + else + printf '║ %-*s ║\n' "$_MAX_LEN" "$_line" + fi + done < "$_SUMMARY_TMP" + + printf '╚%s╝\n' "$_HLINE" + echo "" + + # Aufraeumen + rm -f "$_SUMMARY_TMP" +} + +print_startup_summary + # Auf TrackmaniaServer warten (Hauptprozess) wait $TM_PID diff --git a/docs/konfiguration.md b/docs/konfiguration.md index b257c10..7044a40 100644 --- a/docs/konfiguration.md +++ b/docs/konfiguration.md @@ -153,6 +153,54 @@ Die logrotate-Konfiguration liegt im Image unter `/etc/logrotate.d/tmserver` (Qu > **Hinweis:** Die Log-Rotation ist nach einem Image-Update automatisch aktiv – auch bei bestehenden Installationen. Es sind keine manuellen Schritte nötig. +## Startup-Zusammenfassung + +Nach Abschluss des gesamten Startprozesses wird automatisch eine übersichtliche Zusammenfassung aller wichtigen Server-Informationen als formatierte Box in der Konsole ausgegeben. Die Box-Breite passt sich dynamisch an den längsten Inhalt an. + +**Angezeigte Informationen:** + +| Bereich | Details | +|---------|---------| +| **Server** | Servername, Modus (Internet/LAN), Ladder, Spieler-/Zuschauerlimit | +| **Netzwerk** | Server-Port, P2P-Port, XMLRPC-Port | +| **Maps** | Aktive MatchSettings-Datei, Anzahl geladener Maps, Shuffle-Status | +| **Dienste** | XAseco-Status (mit PID), Healthcheck, Forced Mods | +| **Web-Interfaces** | AdminServ- und RemoteCP-URLs | +| **System** | Log-Rotation, PHP-Debug-Modus, TM-Server-PID | + +**Beispielausgabe:** + +``` +╔════════════════════════════════════════════════════════════════╗ +║ TrackMania Nations Forever - Server gestartet ║ +╠════════════════════════════════════════════════════════════════╣ +║ Servername: Mein Trackmania Server ║ +║ Modus: Internet (Ladder: forced) ║ +║ Spieler: max. 32 Spieler / 32 Zuschauer ║ +║ Server-Port: 2350 (TCP/UDP) | P2P: 3450 (TCP) ║ +║ XMLRPC-Port: 5000 ║ +╠════════════════════════════════════════════════════════════════╣ +║ MatchSettings: custom_game_settings.txt ║ +║ Maps: 24 Maps geladen ║ +║ Map-Shuffle: Deaktiviert ║ +╠════════════════════════════════════════════════════════════════╣ +║ XAseco: Aktiv (PID 1234) ║ +║ Healthcheck: Aktiv (PID 5678) ║ +║ Forced Mods: Keine ║ +╠════════════════════════════════════════════════════════════════╣ +║ AdminServ: http:/// ║ +║ RemoteCP: http:///remotecp/ ║ +╠════════════════════════════════════════════════════════════════╣ +║ Log-Rotation: Aktiv (stuendlich, max. 10 MB) ║ +║ PHP-Debug: Deaktiviert ║ +║ TM-Server: PID 42 ║ +╚════════════════════════════════════════════════════════════════╝ +``` + +Die Zusammenfassung kann jederzeit mit `docker logs tmserver` erneut eingesehen werden. + +> **Hinweis:** Die Startup-Zusammenfassung ist nach einem Image-Update automatisch aktiv – auch bei bestehenden Installationen. Es sind keine manuellen Schritte nötig. + ## AdminServ ServerOptions-Import Wenn über AdminServ Änderungen an den Server-Optionen vorgenommen und als Export gespeichert werden (z.B. Servername, Beschreibung, Spielerzahl), werden diese beim nächsten Container-Start **automatisch** in die `dedicated_cfg.txt` übernommen.