Skript zum Minecraft Server Erstellen (create_server.sh)

#!/bin/bash

# Funktion zur Behandlung von Fehlern
handle_error() {
  echo "Ein Fehler ist aufgetreten: $1" >&2
  exit 1
}

# Funktion zur Prüfung des letzten Befehls auf Fehler
check_error() {
  if [[ "$?" -ne 0 ]]; then
    handle_error "Der vorherige Befehl war nicht erfolgreich."
  fi
}

# Ladebildschirm starten für Paketinstallation
(
  # Paketmanager aktualisieren und benötigte Pakete installieren
  echo "10"; sleep 1
  sudo apt update > /dev/null 2>&1 || handle_error "Aktualisierung des Paketmanagers fehlgeschlagen."
  echo "30"; sleep 1
  sudo apt install -y wget curl jq screen net-tools openjdk-17-jdk openjdk-21-jdk openjdk-8-jdk whiptail > /dev/null 2>&1 || handle_error "Paketinstallation fehlgeschlagen."
  echo "70"; sleep 1
  check_error
  echo "100"; sleep 1
) | whiptail --gauge "Paketinstallation läuft..." 6 60 0

# Startzeitpunkt erfassen
start_time=$(date +%s)

# Liste der Minecraft-Versionen, sortiert von klein zu groß
versions=(
  "1.21" "1.20.6" "1.20.4" "1.20.2" "1.20.1" "1.20" "1.19.4"
  "1.19.3" "1.19.2" "1.19.1" "1.19" "1.18.2" "1.18.1" "1.18"
  "1.17.1" "1.17" "1.16.5" "1.16.4" "1.16.3" "1.16.2" "1.16.1"
  "1.15.2" "1.15.1" "1.15" "1.14.4" "1.14.3" "1.14.2" "1.14.1"
  "1.14" "1.13.2" "1.13.1" "1.13" "1.13-pre7" "1.12.2" "1.12.1"
  "1.12" "1.11.2" "1.10.2" "1.9.4" "1.8.8"
)

# Basis-URL für den Download von Paper, Spigot, Bukkit und Mojang
paper_base_url="https://papermc.io/api/v2/projects/paper/versions"
spigot_base_url="https://download.getbukkit.org/spigot"
bukkit_base_url="https://download.getbukkit.org/craftbukkit"
mojang_base_url="https://launcher.mojang.com/v1/objects"

# Abfrage des Servertyps (Paper, Spigot, Bukkit oder Mojang)
server_type=$(whiptail --title "Servertyp auswählen" --menu "Wählen Sie den Servertyp aus:" 20 78 10 \
  "1" "Paper" \
  "2" "Spigot" \
  "3" "Bukkit" \
  "4" "Mojang" 3>&1 1>&2 2>&3)
check_error

# Erzeugen der Optionsliste für das Menü
options=()
for i in "${!versions[@]}"; do
  options+=("$i" "${versions[$i]}")
done

# Anzeigen des Menüs und Erfassen der Auswahl
version_index=$(whiptail --title "Minecraft-Version auswählen" --menu "Wählen Sie eine Minecraft-Version aus:" 20 78 10 "${options[@]}" 3>&1 1>&2 2>&3)
check_error
version=${versions[$version_index]}

# Abfrage der Anzahl der zu erstellenden Server
server_count=$(whiptail --title "Anzahl der Server" --inputbox "Geben Sie die Anzahl der zu erstellenden Server ein:" 10 60 3>&1 1>&2 2>&3)
check_error

# Abfrage der Menge des zuzuweisenden RAMs
ram=$(whiptail --title "RAM zuweisen" --inputbox "Geben Sie die Menge des zuzuweisenden RAMs in GB ein (z.B. 2G):" 10 60 3>&1 1>&2 2>&3)
check_error

# Abfrage des Ports
port=$(whiptail --title "Port auswählen" --inputbox "Geben Sie den Port ein, den Sie für den Server verwenden möchten:" 10 60 3>&1 1>&2 2>&3)
check_error

# Basisport für den ersten Server
base_port=25565

# Ordnerzähler für nummerierte Ordner
folder_counter=1

# Funktion zum Herunterladen der Mojang JAR-Datei
download_mojang_jar() {
  local version=$1
  local folder=$2

  # Abfragen der URL der JAR-Datei
  local mojang_meta_url="https://launchermeta.mojang.com/mc/game/version_manifest.json"
  local version_json=$(curl -s "$mojang_meta_url" | jq -r --arg version "$version" '.versions[] | select(.id == $version) | .url')
  check_error

  local jar_url=$(curl -s "$version_json" | jq -r '.downloads.server.url')
  check_error

  wget -P "$folder" "$jar_url" -O "$folder/server.jar" > /dev/null 2>&1
  check_error
}

# Ladebildschirm starten für Servererstellung
(
  for ((i=1; i<=server_count; i++)); do
    # Ordnername basierend auf dem Servertyp
    if [[ "$server_type" -eq 1 ]]; then
      server_type_name="Paper"
    elif [[ "$server_type" -eq 2 ]]; then
      server_type_name="Spigot"
    elif [[ "$server_type" -eq 3 ]]; then
      server_type_name="Bukkit"
    else
      server_type_name="Mojang"
    fi

    folder="/home/server_${folder_counter}_${server_type_name}"
    while [ -d "$folder" ]; do
      folder_counter=$((folder_counter+1))
      folder="/home/server_${folder_counter}_${server_type_name}"
    done
    mkdir -p "$folder"
    check_error

    # URL für den Download des Servers
    if [[ "$server_type" -eq 1 ]]; then
      # Paper-Download
      build=$(curl -s "$paper_base_url/$version" | jq -r '.builds[-1]')
      check_error
      download_url="$paper_base_url/$version/builds/$build/downloads/paper-$version-$build.jar"
    elif [[ "$server_type" -eq 2 ]]; then
      # Spigot-Download
      download_url="$spigot_base_url/spigot-$version.jar"
    elif [[ "$server_type" -eq 3 ]]; then
      # Bukkit-Download
      download_url="$bukkit_base_url/craftbukkit-$version.jar"
    else
      # Mojang-Download
      download_mojang_jar "$version" "$folder"
      download_url="$folder/server.jar"
    fi

    # Herunterladen des Servers, falls nicht Mojang
    if [[ "$server_type" -ne 4 ]]; then
      wget -P "$folder" "$download_url" > /dev/null 2>&1
      check_error
    fi

    # Akzeptieren der EULA
    echo "eula=true" > "$folder/eula.txt"

    # Berechnen des Ports für diesen Server
    server_port=$((port + folder_counter - 1))

    # Erstellen des Startskripts
    cat << EOF > "$folder/start.sh"
#!/bin/bash
cd "$folder"
screen -dmS server_${folder_counter}_${server_type_name} java -Xmx$ram -Xms$ram -jar $(basename "$download_url") --port $server_port nogui
EOF
    chmod +x "$folder/start.sh"

    # Starten des Servers
    bash "$folder/start.sh" &
    check_error
    echo "Der Server ${folder_counter}_${server_type_name} wurde erfolgreich erstellt und gestartet."

    folder_counter=$((folder_counter + 1)) # Erhöhe den Zähler für den nächsten Ordner

    # Fortschrittsanzeige aktualisieren
    progress=$((i * 100 / server_count))
    echo $progress
  done
) | whiptail --gauge "Server werden erstellt..." 6 60 0

# Erfolgsmeldung
echo "Alle Server wurden erfolgreich erstellt und gestartet."

# Erstellen und Installieren des allstop.sh-Skripts
cat << 'EOF' > /root/allstop.sh
#!/bin/bash

# Alle Screen-Sitzungen auflisten
screen_list=$(screen -ls | grep -o '[0-9]*\.server_[0-9]*')

# Überprüfen ob Screen-Sitzungen vorhanden sind
if [ -z "$screen_list" ]; then
  echo "Keine Screen-Sitzungen gefunden."
  exit 0
fi

# Alle Screen-Sitzungen schließen
for session in $screen_list; do
  echo "Schließe Screen-Sitzung: $session"
  screen -S "$session" -X quit
done

echo "Alle Screen-Sitzungen wurden geschlossen."
EOF
check_error

# Machen des allstop.sh-Skripts ausführbar
sudo chmod +x /root/allstop.sh
check_error

# Erfolgsmeldung
echo "Das allstop.sh-Skript wurde erfolgreich erstellt und installiert."

# Erstellen und Installieren des allstart.sh-Skripts
cat << 'EOF' > /root/allstart.sh
#!/bin/bash

# Funktion zur Behandlung von Fehlern
handle_error() {
  echo "Ein Fehler ist aufgetreten: $1" >&2
  exit 1
}

# Überprüfen, ob Verzeichnisse existieren und Startskripte darin vorhanden sind
for dir in /home/server_*; do
  if [ -d "$dir" ]; then
    if [ -f "$dir/start.sh" ]; then
      # Ausführen des Startskripts
      bash "$dir/start.sh" &
      if [ "$?" -eq 0 ]; then
        echo "Der Server im Verzeichnis $dir wurde erfolgreich gestartet."
      else
        echo "Fehler beim Starten des Servers im Verzeichnis $dir."
      fi
    else
      echo "Startskript nicht gefunden im Verzeichnis $dir. Der Server wird übersprungen."
    fi
  else
    echo "Verzeichnis $dir nicht gefunden."
  fi
done

echo "Alle verfügbaren Server wurden gestartet."
EOF
check_error

# Machen des allstart.sh-Skripts ausführbar
sudo chmod +x /root/allstart.sh
check_error

# Erfolgsmeldung
echo "Das allstart.sh-Skript wurde erfolgreich erstellt und installiert."

# Erstellen und Installieren des delete_servers.sh-Skripts
cat << 'EOF' > /root/delete_servers.sh
#!/bin/bash

# Funktion zur Behandlung von Fehlern
handle_error() {
  echo "Ein Fehler ist aufgetreten: $1" >&2
  exit 1
}

# Funktion zur Prüfung des letzten Befehls auf Fehler
check_error() {
  if [[ "$?" -ne 0 ]]; then
    handle_error "Der vorherige Befehl war nicht erfolgreich."
  fi
}

# Bestätigung vor dem Löschen
if ! whiptail --title "Bestätigung" --yesno "Möchten Sie wirklich alle Server löschen? Dieser Vorgang kann nicht rückgängig gemacht werden." 10 60; then
  echo "Löschvorgang abgebrochen."
  exit 0
fi

# Ladebildschirm starten für Serverlöschung
(
  echo "10"; sleep 1

  # Verzeichnisse löschen
  server_dirs=$(ls -d /home/server_* 2>/dev/null)
  if [ -z "$server_dirs" ]; then
    echo "100"; sleep 1
    whiptail --title "Fertig" --msgbox "Keine Server gefunden zum Löschen." 10 60
    exit 0
  fi

  total_dirs=$(echo "$server_dirs" | wc -l)
  current_dir=0

  for dir in $server_dirs; do
    rm -rf "$dir"
    check_error
    current_dir=$((current_dir + 1))
    progress=$((current_dir * 100 / total_dirs))
    echo $progress
  done

  echo "100"; sleep 1
) | whiptail --gauge "Server werden gelöscht..." 6 60 0

# Erfolgsmeldung
whiptail --title "Fertig" --msgbox "Alle Server wurden erfolgreich gelöscht." 10 60
EOF
check_error

# Machen des delete_servers.sh-Skripts ausführbar
sudo chmod +x /root/delete_servers.sh
check_error

# Erfolgsmeldung
echo "Das delete_servers.sh-Skript wurde erfolgreich erstellt und installiert."

# Erfolgsmeldung
echo "Alle Server wurden installiert."