#!/bin/bash # Rust Game Server Modul für gameadm # Ersetzt die Funktionalität von rustadm # Konfigurationsdatei CONFIG_FILE="/etc/rust-server.conf" # Installation/Konfiguration für Rust Server cmd_install() { local force_install="$1" log "INFO" "Rust Server Installation/Konfiguration gestartet" # Prüfe ob bereits konfiguriert if [[ -f "$CONFIG_FILE" ]]; then log "WARN" "Rust bereits konfiguriert in: $CONFIG_FILE" # Force-Installation oder interaktive Abfrage if [[ "$force_install" == "--force" ]] || [[ "$force_install" == "-f" ]]; then log "INFO" "Force-Installation: Überschreibe Konfiguration" else read -p "Überschreiben? [y/N]: " -n 1 -r echo if [[ ! $REPLY =~ ^[Yy]$ ]]; then log "INFO" "Installation abgebrochen." return 0 fi fi fi # Erstelle Konfiguration log "INFO" "Erstelle Rust Server Konfiguration..." mkdir -p "$(dirname "$CONFIG_FILE")" cat > "$CONFIG_FILE" << 'EOF' # Rust Game Server Konfiguration für gameadm # Automatisch erstellt - kann angepasst werden # Container Einstellungen CONTAINER_NAME="rust-game" IMAGE="docker.io/didstopia/rust-server:latest" DATA_DIR="/srv/rust" PORT="28015" RCON_PORT="28016" # Server Einstellungen MAXPLAYERS="4" RUST_SERVER_NAME="PP1L Rust Server - Powered by gameadm" EXTRA_ARGS="-batchmode -load -nographics +server.secure 1" MEMORY_LIMIT="" # Sicherheit (Pfade zu Secret-Dateien) SERVER_SECRET_FILE="/root/secrets/rust_server_password" RCON_SECRET_FILE="/root/secrets/rust_rcon_password" EOF log "INFO" "Konfiguration erstellt: $CONFIG_FILE" # Erstelle Datenverzeichnis mkdir -p "/srv/rust" log "INFO" "Datenverzeichnis erstellt: /srv/rust" # Erstelle Secret-Verzeichnis und Passwörter mkdir -p "/root/secrets" # Server-Passwort generieren if [[ ! -f "/root/secrets/rust_server_password" ]]; then openssl rand -base64 16 2>/dev/null > "/root/secrets/rust_server_password" || echo "rust$(date +%s)" > "/root/secrets/rust_server_password" chmod 600 "/root/secrets/rust_server_password" log "INFO" "Server-Passwort generiert: /root/secrets/rust_server_password" fi # RCON-Passwort generieren if [[ ! -f "/root/secrets/rust_rcon_password" ]]; then openssl rand -base64 16 2>/dev/null > "/root/secrets/rust_rcon_password" || echo "rcon$(date +%s)" > "/root/secrets/rust_rcon_password" chmod 600 "/root/secrets/rust_rcon_password" log "INFO" "RCON-Passwort generiert: /root/secrets/rust_rcon_password" fi log "INFO" "Rust Server erfolgreich konfiguriert!" log "INFO" "" log "INFO" "Nächste Schritte:" log "INFO" " 1. Konfiguration anpassen: $CONFIG_FILE" log "INFO" " 2. Server starten: gameadm rust start" log "INFO" " 3. Status prüfen: gameadm rust status" log "INFO" " 4. Logs anzeigen: gameadm rust logs" log "INFO" "" log "INFO" "Server läuft auf Port 28015 (Game) und 28016 (RCON)" log "INFO" "Daten gespeichert in: /srv/rust" log "INFO" "Passwörter in: /root/secrets/" return 0 } # Konfiguration laden (nur wenn Datei existiert) if [[ -f "$CONFIG_FILE" ]]; then # shellcheck disable=SC1090 source "$CONFIG_FILE" else # Fallback-Werte für andere Befehle wenn keine Konfiguration existiert CONTAINER_NAME="rust-game" IMAGE="docker.io/didstopia/rust-server:latest" DATA_DIR="/srv/rust" PORT="28015" RCON_PORT="28016" MAXPLAYERS="4" RUST_SERVER_NAME="PP1L Rust Server" SERVER_SECRET_FILE="/root/secrets/rust_server_password" RCON_SECRET_FILE="/root/secrets/rust_rcon_password" EXTRA_ARGS="-batchmode -load -nographics +server.secure 1" MEMORY_LIMIT="" fi # Standardwerte (können durch Konfig überschrieben werden) CONTAINER_NAME=${CONTAINER_NAME:-rust-game} IMAGE=${IMAGE:-docker.io/didstopia/rust-server:latest} DATA_DIR=${DATA_DIR:-/srv/rust} PORT=${PORT:-28015} RCON_PORT=${RCON_PORT:-28016} MAXPLAYERS=${MAXPLAYERS:-4} RUST_SERVER_NAME=${RUST_SERVER_NAME:-"PurePowerPh1L's Rust Server"} SERVER_SECRET_FILE=${SERVER_SECRET_FILE:-/root/secrets/rust_server_password} RCON_SECRET_FILE=${RCON_SECRET_FILE:-/root/secrets/rust_rcon_password} EXTRA_ARGS=${EXTRA_ARGS:-"-batchmode -load -nographics +server.secure 1"} MEMORY_LIMIT=${MEMORY_LIMIT:-""} # Hilfsfunktionen ensure_prereqs() { mkdir -p "$DATA_DIR" if [[ ! -s "$SERVER_SECRET_FILE" ]]; then log "ERROR" "Server-Passwortdatei fehlt oder ist leer: $SERVER_SECRET_FILE" exit 1 fi if [[ ! -s "$RCON_SECRET_FILE" ]]; then log "ERROR" "RCON-Passwortdatei fehlt oder ist leer: $RCON_SECRET_FILE" exit 1 fi } is_running() { podman inspect -f '{{.State.Running}}' "$CONTAINER_NAME" 2>/dev/null | grep -q true } # Befehle cmd_start() { ensure_prereqs if is_running; then log "INFO" "Bereits gestartet: $CONTAINER_NAME" exit 0 fi # Beendeten Container entfernen falls vorhanden if podman inspect "$CONTAINER_NAME" >/dev/null 2>&1; then podman rm -f "$CONTAINER_NAME" >/dev/null 2>&1 || true fi log "INFO" "Starte $CONTAINER_NAME ..." podman run -d \ --name "$CONTAINER_NAME" \ --restart=always \ ${MEMORY_LIMIT:+--memory="$MEMORY_LIMIT"} \ -p ${PORT}:${PORT}/udp \ -p ${PORT}:${PORT}/tcp \ -p ${RCON_PORT}:${RCON_PORT}/tcp \ -v "$DATA_DIR:/steamcmd" \ -e RUST_SERVER_NAME="$RUST_SERVER_NAME" \ -e RUST_SERVER_MAXPLAYERS="$MAXPLAYERS" \ -e RUST_SERVER_PORT="$PORT" \ -e RUST_RCON_PORT="$RCON_PORT" \ -e RUST_RCON_PASSWORD="$(cat "$RCON_SECRET_FILE")" \ -e RUST_SERVER_STARTUP_ARGUMENTS="$EXTRA_ARGS +server.password $(cat "$SERVER_SECRET_FILE")" \ "$IMAGE" >/dev/null log "INFO" "Rust Server gestartet." } cmd_stop() { if ! podman inspect "$CONTAINER_NAME" >/dev/null 2>&1; then log "INFO" "Container existiert nicht: $CONTAINER_NAME" exit 0 fi log "INFO" "Stoppe $CONTAINER_NAME ..." podman stop -t 45 "$CONTAINER_NAME" >/dev/null 2>&1 || true podman rm "$CONTAINER_NAME" >/dev/null 2>&1 || true log "INFO" "Rust Server gestoppt." } cmd_restart() { cmd_stop || true cmd_start } cmd_status() { if is_running; then echo "RUNNING" podman ps --filter name="^${CONTAINER_NAME}$" --format '{{.Names}}\t{{.Status}}\t{{.Ports}}' else if podman inspect "$CONTAINER_NAME" >/dev/null 2>&1; then echo "EXITED" else echo "NOT FOUND" fi fi } cmd_logs() { if ! podman inspect "$CONTAINER_NAME" >/dev/null 2>&1; then log "ERROR" "Container $CONTAINER_NAME existiert nicht" exit 1 fi podman logs --tail=200 "$CONTAINER_NAME" } cmd_follow() { if ! podman inspect "$CONTAINER_NAME" >/dev/null 2>&1; then log "ERROR" "Container $CONTAINER_NAME existiert nicht" exit 1 fi podman logs -f "$CONTAINER_NAME" } cmd_update() { log "INFO" "Pull $IMAGE ..." podman pull "$IMAGE" log "INFO" "Rust Server Image aktualisiert." } cmd_help() { cat < Verfügbare Befehle: start - Startet Rust Game Server stop - Stoppt Rust Game Server restart - Startet Server neu status - Zeigt Server-Status logs - Zeigt Server-Logs (letzte 200 Zeilen) follow - Folgt Logs in Echtzeit update - Aktualisiert Server-Image help - Zeigt diese Hilfe Konfiguration: $CONFIG_FILE Container: $CONTAINER_NAME Port: $PORT (UDP/TCP) RCON: $RCON_PORT (TCP) Daten: $DATA_DIR EOF }