diff --git a/README.md b/README.md index 0a0cdd3..3162476 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,30 @@ `gameadm` ist ein modulares System zur Verwaltung verschiedener Game Server, das das ursprüngliche `rustadm` Skript ersetzt und für zukünftige Spiele erweiterbar ist. +## Schnell-Installation + +### Eine-Zeile Installation (empfohlen) +```bash +curl -fsSL https://raw.githubusercontent.com/pp1l/gameadm-repo/main/install.sh | sudo bash +``` + +### Oder mit gameadm selbst +```bash +# Lade gameadm herunter +curl -fsSL https://raw.githubusercontent.com/pp1l/gameadm-repo/main/bin/gameadm -o gameadm +chmod +x gameadm + +# Installiere mit integrierter Funktion +sudo ./gameadm install +``` + +### Manuelle Installation +```bash +git clone https://github.com/pp1l/gameadm-repo.git +cd gameadm-repo +sudo ./install.sh +``` + ## Architektur ``` diff --git a/bin/gameadm b/bin/gameadm index 2184982..92b7d8a 100755 --- a/bin/gameadm +++ b/bin/gameadm @@ -53,7 +53,13 @@ Verfügbare Befehle (pro Spiel): update - Aktualisiert Server-Image help - Zeigt Hilfe für das Spiel +Spezielle Befehle: + install - Installiert gameadm auf dem System (erfordert root) + list - Zeigt verfügbare Spiele + version - Zeigt Version + Beispiele: + sudo gameadm install # Installation/Update gameadm rust start gameadm rust status gameadm rust logs @@ -80,6 +86,37 @@ load_game_module() { source "$module_file" } +# Install-Funktion +cmd_install() { + log "INFO" "Starte gameadm Installation..." + + # Prüfe Root-Berechtigung + if [[ $EUID -ne 0 ]]; then + log "ERROR" "Installation muss als root ausgeführt werden (sudo)." + log "INFO" "Verwenden Sie: sudo gameadm install" + exit 1 + fi + + # Installer-Skript herunterladen und ausführen + local installer_url="https://raw.githubusercontent.com/pp1l/gameadm-repo/main/install.sh" + local temp_installer="/tmp/gameadm-installer-$$.sh" + + log "INFO" "Lade Installer herunter..." + if ! curl -fsSL "$installer_url" -o "$temp_installer"; then + log "ERROR" "Fehler beim Herunterladen des Installers" + log "INFO" "URL: $installer_url" + exit 1 + fi + + chmod +x "$temp_installer" + log "INFO" "Führe Installation aus..." + "$temp_installer" "$@" + + # Aufräumen + rm -f "$temp_installer" + log "INFO" "Installation abgeschlossen." +} + # Hauptfunktion main() { # Verzeichnisse erstellen falls nicht vorhanden @@ -110,6 +147,10 @@ main() { echo "gameadm v1.0.0 - Modularer Game Server Administrator" exit 0 ;; + "install") + cmd_install "$@" + exit 0 + ;; esac # Spiel-Modul laden diff --git a/install.sh b/install.sh new file mode 100755 index 0000000..8fbe497 --- /dev/null +++ b/install.sh @@ -0,0 +1,404 @@ +#!/bin/bash +# gameadm Installer - Portable Installation für jedes Linux-System +# Automatische Installation von gameadm mit allen Abhängigkeiten + +set -euo pipefail + +# Farben für bessere Ausgabe +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' # No Color + +# Globale Variablen +GAMEADM_DIR="/etc/gameadm" +MODULES_DIR="$GAMEADM_DIR/modules" +BIN_DIR="/usr/local/bin" +INSTALL_URL_BASE="https://raw.githubusercontent.com/pp1l/gameadm-repo/main" +BACKUP_DIR="/tmp/gameadm-backup-$(date +%Y%m%d-%H%M%S)" + +# Logging-Funktion +log() { + local level="$1" + shift + local message="$*" + local timestamp=$(date '+%Y-%m-%d %H:%M:%S') + + case "$level" in + "INFO") echo -e "${GREEN}[gameadm-install]${NC} $message" ;; + "WARN") echo -e "${YELLOW}[gameadm-install]${NC} $message" ;; + "ERROR") echo -e "${RED}[gameadm-install]${NC} $message" ;; + "DEBUG") echo -e "${BLUE}[gameadm-install]${NC} $message" ;; + esac +} + +# Prüft ob als root ausgeführt +check_root() { + if [[ $EUID -ne 0 ]]; then + log "ERROR" "Dieses Skript muss als root ausgeführt werden (sudo)." + log "INFO" "Verwenden Sie: sudo $0" + exit 1 + fi +} + +# Betriebssystem erkennen +detect_os() { + if [[ -f /etc/os-release ]]; then + # shellcheck disable=SC1091 + source /etc/os-release + OS_ID="$ID" + OS_VERSION="$VERSION_ID" + log "INFO" "Erkanntes System: $PRETTY_NAME" + else + log "ERROR" "Kann Betriebssystem nicht erkennen (/etc/os-release fehlt)" + exit 1 + fi +} + +# Paketmanager erkennen und Pakete installieren +install_dependencies() { + log "INFO" "Installiere Abhängigkeiten..." + + case "$OS_ID" in + "ubuntu"|"debian") + apt-get update + apt-get install -y podman curl wget git bash coreutils + ;; + "fedora"|"centos"|"rhel"|"rocky"|"almalinux") + if command -v dnf >/dev/null 2>&1; then + dnf install -y podman curl wget git bash coreutils + else + yum install -y podman curl wget git bash coreutils + fi + ;; + "opensuse"|"opensuse-leap"|"opensuse-tumbleweed") + zypper refresh + zypper install -y podman curl wget git bash coreutils + ;; + "arch"|"manjaro") + pacman -Sy --noconfirm podman curl wget git bash coreutils + ;; + "alpine") + apk update + apk add podman curl wget git bash coreutils + ;; + *) + log "WARN" "Unbekanntes OS: $OS_ID. Versuche manuelle Installation..." + # Versuche mit verfügbaren Paketmanagern + if command -v apt-get >/dev/null 2>&1; then + apt-get update && apt-get install -y podman curl wget git bash coreutils + elif command -v dnf >/dev/null 2>&1; then + dnf install -y podman curl wget git bash coreutils + elif command -v yum >/dev/null 2>&1; then + yum install -y podman curl wget git bash coreutils + elif command -v zypper >/dev/null 2>&1; then + zypper install -y podman curl wget git bash coreutils + elif command -v pacman >/dev/null 2>&1; then + pacman -Sy --noconfirm podman curl wget git bash coreutils + elif command -v apk >/dev/null 2>&1; then + apk add podman curl wget git bash coreutils + else + log "ERROR" "Kein unterstützter Paketmanager gefunden!" + log "ERROR" "Bitte installieren Sie manuell: podman, curl, wget, git, bash, coreutils" + exit 1 + fi + ;; + esac + + log "INFO" "Abhängigkeiten erfolgreich installiert." +} + +# Prüft ob alle erforderlichen Tools verfügbar sind +check_dependencies() { + log "INFO" "Prüfe Abhängigkeiten..." + + local missing_deps=() + local required_tools=("podman" "curl" "wget" "git" "bash") + + for tool in "${required_tools[@]}"; do + if ! command -v "$tool" >/dev/null 2>&1; then + missing_deps+=("$tool") + fi + done + + if [[ ${#missing_deps[@]} -gt 0 ]]; then + log "WARN" "Fehlende Abhängigkeiten: ${missing_deps[*]}" + read -p "Sollen die Abhängigkeiten automatisch installiert werden? (y/N): " -r + if [[ $REPLY =~ ^[Yy]$ ]]; then + install_dependencies + check_dependencies # Rekursiv prüfen nach Installation + else + log "ERROR" "Installation abgebrochen. Bitte installieren Sie: ${missing_deps[*]}" + exit 1 + fi + else + log "INFO" "Alle Abhängigkeiten sind verfügbar." + fi +} + +# Backup erstellen falls gameadm bereits installiert ist +create_backup() { + if [[ -f "$BIN_DIR/gameadm" ]] || [[ -d "$GAMEADM_DIR" ]]; then + log "INFO" "Erstelle Backup der bestehenden Installation..." + mkdir -p "$BACKUP_DIR" + + if [[ -f "$BIN_DIR/gameadm" ]]; then + cp "$BIN_DIR/gameadm" "$BACKUP_DIR/" + log "INFO" "Backup: $BIN_DIR/gameadm → $BACKUP_DIR/gameadm" + fi + + if [[ -d "$GAMEADM_DIR" ]]; then + cp -r "$GAMEADM_DIR" "$BACKUP_DIR/gameadm-config" + log "INFO" "Backup: $GAMEADM_DIR → $BACKUP_DIR/gameadm-config" + fi + + log "INFO" "Backup erstellt in: $BACKUP_DIR" + fi +} + +# gameadm Dateien herunterladen (falls nicht lokal verfügbar) +download_gameadm() { + local source_dir="." + + # Temporäres Verzeichnis für Download + local temp_dir="/tmp/gameadm-download-$$" + mkdir -p "$temp_dir" + cd "$temp_dir" + + # Hauptskript herunterladen + if ! curl -fsSL "$INSTALL_URL_BASE/bin/gameadm" -o "gameadm"; then + log "ERROR" "Fehler beim Herunterladen des Hauptskripts" + exit 1 + fi + + # Module herunterladen + mkdir -p modules + for module in "rust.sh" "mc.sh"; do + if ! curl -fsSL "$INSTALL_URL_BASE/modules/$module" -o "modules/$module"; then + log "WARN" "Fehler beim Herunterladen von Modul: $module" + fi + done + + source_dir="$temp_dir" + log "INFO" "Download abgeschlossen." + + echo "$source_dir" +} + +# gameadm installieren +install_gameadm() { + local source_dir="$1" + + log "INFO" "Installiere gameadm..." + + # Verzeichnisse erstellen + mkdir -p "$GAMEADM_DIR" "$MODULES_DIR" + + # Hauptskript installieren + if [[ -f "$source_dir/bin/gameadm" ]]; then + cp "$source_dir/bin/gameadm" "$BIN_DIR/gameadm" + elif [[ -f "$source_dir/gameadm" ]]; then + cp "$source_dir/gameadm" "$BIN_DIR/gameadm" + else + log "ERROR" "gameadm Hauptskript nicht gefunden in: $source_dir" + log "DEBUG" "Verfügbare Dateien: $(ls -la "$source_dir")" + exit 1 + fi + + chmod +x "$BIN_DIR/gameadm" + log "INFO" "Hauptskript installiert: $BIN_DIR/gameadm" + + # Module installieren + if [[ -d "$source_dir/modules" ]]; then + cp -r "$source_dir/modules/"* "$MODULES_DIR/" 2>/dev/null || true + chmod +x "$MODULES_DIR/"*.sh 2>/dev/null || true + log "INFO" "Module installiert: $MODULES_DIR" + else + log "WARN" "Kein modules Verzeichnis gefunden in: $source_dir" + fi + + # README kopieren falls vorhanden + if [[ -f "$source_dir/README.md" ]]; then + cp "$source_dir/README.md" "$GAMEADM_DIR/" + log "INFO" "Dokumentation installiert: $GAMEADM_DIR/README.md" + fi +} + +# Konfigurationsbeispiele erstellen +create_sample_configs() { + log "INFO" "Erstelle Beispiel-Konfigurationen..." + + # Rust Server Konfiguration + if [[ ! -f "/etc/rust-server.conf" ]]; then + cat > "/etc/rust-server.conf" < "/etc/minecraft-server.conf" </dev/null 2>&1; then + systemctl enable --now podman.socket 2>/dev/null || true + log "INFO" "Podman Socket aktiviert" + fi + + # Registries konfigurieren + local registries_conf="/etc/containers/registries.conf" + if [[ ! -f "$registries_conf" ]]; then + mkdir -p "$(dirname "$registries_conf")" + cat > "$registries_conf" </dev/null 2>&1; then + log "ERROR" "gameadm nicht im PATH gefunden" + exit 1 + fi + + # Teste grundlegende Funktionen + if gameadm --version >/dev/null 2>&1; then + log "INFO" "Version-Check erfolgreich" + else + log "ERROR" "gameadm --version fehlgeschlagen" + exit 1 + fi + + if gameadm list >/dev/null 2>&1; then + log "INFO" "Module-Liste erfolgreich" + else + log "ERROR" "gameadm list fehlgeschlagen" + exit 1 + fi + + log "INFO" "Installation erfolgreich getestet!" +} + +# Installations-Zusammenfassung anzeigen +show_summary() { + log "INFO" "Installation abgeschlossen!" + echo + echo -e "${GREEN}gameadm erfolgreich installiert!${NC}" + echo + echo "Verfügbare Befehle:" + echo " gameadm --help - Hilfe anzeigen" + echo " gameadm list - Verfügbare Spiele auflisten" + echo " gameadm rust help - Rust Server Hilfe" + echo " gameadm rust start - Rust Server starten" + echo + echo "Konfiguration:" + echo " /etc/gameadm/ - Hauptverzeichnis" + echo " /etc/gameadm/modules/ - Spiel-Module" + echo " /etc/rust-server.conf - Rust Server Konfiguration" + echo " /etc/minecraft-server.conf - Minecraft Server Konfiguration" + echo + echo "Nächste Schritte:" + echo "1. Konfigurationsdateien anpassen" + echo "2. Secrets-Dateien erstellen (falls benötigt)" + echo "3. Game Server starten: gameadm start" + echo + if [[ -d "$BACKUP_DIR" ]]; then + echo "Backup der alten Installation: $BACKUP_DIR" + echo + fi +} + +# Aufräumen nach Installation +cleanup() { + # Temporäre Download-Verzeichnisse löschen + if [[ -n "${temp_dir:-}" && -d "$temp_dir" ]]; then + rm -rf "$temp_dir" 2>/dev/null || true + fi +} + +# Signal-Handler für sauberes Aufräumen +trap cleanup EXIT + +# Hauptfunktion +main() { + echo -e "${BLUE}gameadm Installer${NC}" + echo "Portable Installation für Linux-Systeme" + echo "========================================" + echo + + # Voraussetzungen prüfen + check_root + detect_os + + # Abhängigkeiten prüfen/installieren + check_dependencies + + # Backup erstellen + create_backup + + # gameadm herunterladen/vorbereiten + local source_dir="." + if [[ -f "./bin/gameadm" && -d "./modules" ]]; then + log "INFO" "Verwende lokale gameadm Dateien aus aktuellem Verzeichnis" + source_dir="." + else + log "INFO" "Lade gameadm Dateien herunter..." + source_dir=$(download_gameadm) + fi + + # Installation durchführen + install_gameadm "$source_dir" + create_sample_configs + configure_podman + + # Installation testen + test_installation + + # Zusammenfassung anzeigen + show_summary +} + +# Skript ausführen +main "$@"