253 lines
7.6 KiB
Bash
Executable File
253 lines
7.6 KiB
Bash
Executable File
#!/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 <<EOF
|
|
Rust Game Server Verwaltung
|
|
|
|
Verwendung:
|
|
gameadm rust <befehl>
|
|
|
|
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
|
|
}
|