#!/bin/bash #?────────────────────────────────────────────────────────────────────────────────────────── #* Informationen Kopfzeile #?────────────────────────────────────────────────────────────────────────────────────────── tput reset # Bildschirmausgabe loeschen inklusive dem Scrollbereich. SCRIPTNAME="opensimMULTITOOL II" VERSION="V25.4.42.104" echo -e "\e[36m$SCRIPTNAME\e[0m $VERSION" echo "Dies ist ein Tool welches der Verwaltung von OpenSim Servern dient." echo "Bitte beachten Sie, dass die Anwendung auf eigene Gefahr und Verantwortung erfolgt." echo -e "\e[33mZum Abbrechen bitte STRG+C oder CTRL+C drücken.\e[0m" echo " " #?────────────────────────────────────────────────────────────────────────────────────────── #* Variablen setzen #?────────────────────────────────────────────────────────────────────────────────────────── # Hauptpfad des Skripts automatisch setzen SCRIPT_DIR="$(dirname "$(realpath "$0")")" cd "$SCRIPT_DIR" || exit 1 echo "Arbeitsverzeichnis ist: $SCRIPT_DIR" system_ip=$(hostname -I | awk '{print $1}') echo "Ihre IP Adresse: $system_ip"; echo " " KOMMANDO=$1 # Eingabeauswertung fuer Funktionen. #MONEYCOPY="yes" # MoneyServer Installieren. #?────────────────────────────────────────────────────────────────────────────────────────── #* Abhängigkeiten installieren #?────────────────────────────────────────────────────────────────────────────────────────── # Fehlende Abhängigkeiten installieren function servercheck() { # Direkt kompatible Distributionen: # Debian 11+ (Bullseye, Bookworm) – Offiziell unterstützt für .NET 8 # Ubuntu 18.04, 20.04, 22.04 – Microsoft bietet direkt kompatible Pakete # Linux Mint (basierend auf Ubuntu 20.04 oder 22.04) # Pop!_OS (System76, basiert auf Ubuntu) # MX Linux (Debian-basiert, integriert Ubuntu-Funktionen) # Arch Linux – Offiziell unterstützte Pakete über pacman # Manjaro – Bietet .NET-Pakete direkt über die Arch-Repositorys # Mögliche kompatible Distributionen (mit Anpassungen): # Kali Linux (basierend auf Debian 12, Anpassungen nötig für .NET-Pakete) # Zorin OS (Ubuntu-basiert, Unterstützung abhängig von Version) # elementary OS (Ubuntu-basiert, kann .NET aus Ubuntu-Quellen beziehen) # Raspberry Pi OS (Debian-basiert, erfordert manuelle Installation für .NET) # Ermitteln der Distribution und Version os_id=$(grep '^ID=' /etc/os-release | cut -d= -f2 | tr -d '"') os_version=$(grep '^VERSION_ID=' /etc/os-release | cut -d= -f2 | tr -d '"') echo "Server läuft mit $os_id $os_version" # Prüfen, welche .NET-Version installiert werden muss if [[ "$os_id" == "ubuntu" || "$os_id" == "linuxmint" || "$os_id" == "pop_os" ]]; then if [[ "$os_version" == "22.04" || "$os_version" == "20.04" ]]; then required_dotnet="dotnet-sdk-8.0" elif [[ "$os_version" == "18.04" ]]; then required_dotnet="dotnet-sdk-6.0" fi elif [[ "$os_id" == "debian" && "$os_version" -ge "11" ]]; then required_dotnet="dotnet-sdk-8.0" elif [[ "$os_id" == "arch" || "$os_id" == "manjaro" ]]; then required_dotnet="dotnet-sdk-8.0" # Spezifiziert gezielt Version 8.0 else echo "✘ Keine unterstützte Version für .NET gefunden!" return 1 fi # Prüfen, ob die richtige .NET-Version bereits installiert ist if [[ "$os_id" == "arch" || "$os_id" == "manjaro" ]]; then if ! pacman -Qi "$required_dotnet" >/dev/null 2>&1; then echo "Installiere $required_dotnet..." sudo pacman -S --noconfirm "$required_dotnet" echo "✓ $required_dotnet wurde erfolgreich installiert." else echo "✘ $required_dotnet ist bereits installiert." fi else if ! dpkg -s "$required_dotnet" >/dev/null 2>&1; then echo "Installiere $required_dotnet..." sudo apt-get install -y "$required_dotnet" echo "✓ $required_dotnet wurde erfolgreich installiert." else echo "✘ $required_dotnet ist bereits installiert." fi fi # Fehlende Pakete prüfen und installieren required_packages=("libc6" "libgcc-s1" "libgssapi-krb5-2" "libicu70" "liblttng-ust1" "libssl3" "libstdc++6" "libunwind8" "zlib1g" "libgdiplus" "zip" "screen") echo "Überprüfe fehlende Pakete..." for package in "${required_packages[@]}"; do if [[ "$os_id" == "arch" || "$os_id" == "manjaro" ]]; then if ! pacman -Qi "$package" >/dev/null 2>&1; then echo "✓ Installiere $package..." sudo pacman -S --noconfirm "$package" fi else if ! dpkg -s "$package" >/dev/null 2>&1; then echo "✓ Installiere $package..." sudo apt-get install -y "$package" fi fi done echo "✓ Alle benötigten Pakete wurden installiert." } #?────────────────────────────────────────────────────────────────────────────────────────── #* Start Stop Standalone #?────────────────────────────────────────────────────────────────────────────────────────── function standalonestart() { cd opensim/bin || exit 1 screen -fa -S opensim -d -U -m dotnet OpenSim.dll } function standalonestop() { screen -S opensim -p 0 -X stuff "shutdown^M" } #?────────────────────────────────────────────────────────────────────────────────────────── #* Start Stop Grid #?────────────────────────────────────────────────────────────────────────────────────────── # OpenSim starten (robust → money → sim1 bis sim999) function opensimstart() { echo -e "\e[32m" # Prüfen, ob das Verzeichnis "robust/bin" existiert und Robust.dll vorhanden ist if [[ -d "robust/bin" && -f "robust/bin/Robust.dll" ]]; then echo "✓ Starte RobustServer aus robust/bin..." cd robust/bin || exit 1 screen -fa -S robustserver -d -U -m dotnet Robust.dll cd - >/dev/null 2>&1 || exit 1 # Zurück zum ursprünglichen Verzeichnis sleep 30 else echo "✘ Robust.dll wurde nicht gefunden. Überspringe RobustServer." fi # Prüfen, ob MoneyServer.dll vorhanden ist if [[ -f "robust/bin/MoneyServer.dll" ]]; then echo "✓ Starte MoneyServer aus robust/bin..." cd robust/bin || exit 1 screen -fa -S moneyserver -d -U -m dotnet MoneyServer.dll cd - >/dev/null 2>&1 || exit 1 # Zurück zum ursprünglichen Verzeichnis sleep 30 else echo "✘ MoneyServer.dll wurde nicht gefunden. Überspringe MoneyServer." fi # Alle simX-Server starten (sim1 bis sim999) for ((i=1; i<=999; i++)); do sim_dir="sim$i/bin" if [[ -d "$sim_dir" && -f "$sim_dir/OpenSim.dll" ]]; then echo "✓ Starte sim$i aus $sim_dir..." cd "$sim_dir" || continue screen -fa -S "sim$i" -d -U -m dotnet OpenSim.dll cd - >/dev/null 2>&1 || continue # Zurück zum ursprünglichen Verzeichnis sleep 20 fi done echo -e "\e[0m" } # OpenSim stoppen (sim999 bis sim1 → money → robust) function opensimstop() { echo -e "\e[35m" echo "✓ Stoppe alle sim Regionen..." for ((i=999; i>=1; i--)); do sim_dir="sim$i" if screen -list | grep -q "$sim_dir"; then screen -S "sim$i" -p 0 -X stuff "shutdown^M" echo "✓ sim$i wird heruntergefahren..." sleep 15 fi done # Prüfen, ob MoneyServer läuft, bevor er gestoppt wird if screen -list | grep -q "moneyserver"; then echo "✓ Stoppe MoneyServer..." screen -S moneyserver -p 0 -X stuff "shutdown^M" sleep 30 else echo "✘ MoneyServer läuft nicht. Überspringe Stoppvorgang." fi # Prüfen, ob RobustServer läuft, bevor er gestoppt wird if screen -list | grep -q "robust"; then echo "✓ Stoppe RobustServer..." screen -S robustserver -p 0 -X stuff "shutdown^M" sleep 30 else echo "✘ RobustServer läuft nicht. Überspringe Stoppvorgang." fi echo -e "\e[0m" } # check_screens ist eine Grid Funktion und funktioniert nicht im Standalone. function check_screens() { # echo "Überprüfung der laufenden OpenSim-Prozesse..." restart_all=false # Überprüfen, ob RobustServer läuft if [[ -d "robust/bin" && -f "robust/bin/Robust.dll" ]]; then screenRO=$(screen -ls | grep -w "robustserver") if [[ -z "$screenRO" ]]; then echo "$(date '+%Y-%m-%d %H:%M:%S') - RobustServer läuft nicht und muss neu gestartet werden." >> ProblemRestarts.log restart_all=true fi fi # Überprüfen, ob MoneyServer läuft if [[ -d "robust/bin" && -f "robust/bin/MoneyServer.dll" ]];then screenMoney=$(screen -ls | grep -w "moneyserver") if [[ -z "$screenMoney" ]]; then echo "$(date '+%Y-%m-%d %H:%M:%S') - MoneyServer läuft nicht und muss neu gestartet werden." >> ProblemRestarts.log restart_all=true fi fi # Überprüfen, ob sim1 läuft if [[ -d "sim1/bin" && -f "sim1/bin/OpenSim.dll" ]]; then screenSim1=$(screen -ls | grep -w "sim1") if [[ -z "$screenSim1" ]]; then echo "$(date '+%Y-%m-%d %H:%M:%S') - Sim1 läuft nicht und muss neu gestartet werden." >> ProblemRestarts.log restart_all=true fi fi # Falls eines der kritischen Systeme ausgefallen ist, alles neu starten if [[ "$restart_all" == true ]]; then echo "$(date '+%Y-%m-%d %H:%M:%S') - Kritische Prozesse sind ausgefallen! OpenSim wird komplett neu gestartet." >> ProblemRestarts.log # opensimstart opensimrestart return 0 fi # Überprüfen, ob andere simulierte Regionen (sim2 bis sim999) einzeln neu gestartet werden müssen for ((i=2; i<=999; i++)); do sim_dir="sim$i/bin" if [[ -d "$sim_dir" && -f "$sim_dir/OpenSim.dll" ]]; then screenSim=$(screen -ls | grep -w "sim$i") if [[ -z "$screenSim" ]]; then echo "$(date '+%Y-%m-%d %H:%M:%S') - Sim$i läuft nicht und wird einzeln neu gestartet." >> ProblemRestarts.log cd "$sim_dir" || continue screen -fa -S "sim$i" -d -U -m dotnet OpenSim.dll cd - >/dev/null 2>&1 || continue sleep 20 fi fi done } #?────────────────────────────────────────────────────────────────────────────────────────── #* Erstellen eines OpenSimulators #?────────────────────────────────────────────────────────────────────────────────────────── function opensimgit() { echo "Möchten Sie den OpenSimulator vom GitHub verwenden oder aktualisieren? ([upgrade]/new)" read -r user_choice user_choice=${user_choice:-upgrade} if [[ "$user_choice" == "new" ]]; then # Falls eine alte Version existiert, wird sie gelöscht if [[ -d "opensim" ]]; then echo "Vorhandene OpenSimulator-Version wird gelöscht..." rm -rf opensim echo "✓ Alte OpenSimulator-Version wurde erfolgreich entfernt." fi echo "OpenSimulator wird von GitHub geholt..." git clone git://opensimulator.org/git/opensim opensim echo "✓ OpenSimulator wurde erfolgreich heruntergeladen." elif [[ "$user_choice" == "upgrade" ]]; then if [[ -d "opensim/.git" ]]; then echo "✓ Repository gefunden. Aktualisiere mit 'git pull'..." cd opensim || { echo "✘ Fehler: Kann nicht ins Verzeichnis wechseln!"; return 1; } git pull origin master && echo "✅ OpenSimulator erfolgreich aktualisiert!" cd .. else echo "⚠ OpenSimulator-Verzeichnis nicht gefunden. Klone Repository neu..." git clone git://opensimulator.org/git/opensim opensim && echo "✅ OpenSimulator erfolgreich heruntergeladen!" fi else echo "✘ Abbruch: Keine Aktion durchgeführt." return 1 fi # .NET-Version auswählen echo "Möchten Sie diese Version mit .NET 6 oder .NET 8 betreiben? ([8]/6)" read -r dotnet_version dotnet_version=${dotnet_version:-8} if [[ "$dotnet_version" == "6" ]]; then echo "Wechsle zu .NET 6-Version..." cd opensim || { echo "Fehler: Verzeichnis 'opensim' nicht gefunden."; return 1; } git checkout dotnet6 echo "✓ OpenSimulator wurde für .NET 6 umgebaut." else echo "✓ Standardmäßig wird .NET 8 verwendet." fi } function moneygit() { echo "Möchten Sie den MoneyServer vom GitHub verwenden oder aktualisieren? ([upgrade]/new)" read -r user_choice user_choice=${user_choice:-upgrade} if [[ "$user_choice" == "new" ]]; then if [[ -d "opensimcurrencyserver" ]]; then echo "Vorhandene MoneyServer-Version wird gelöscht..." rm -rf opensimcurrencyserver echo "✓ Alte MoneyServer-Version wurde erfolgreich entfernt." fi echo "MONEYSERVER: MoneyServer wird vom GIT geholt..." git clone https://github.com/ManfredAabye/opensimcurrencyserver-dotnet.git opensimcurrencyserver echo "✓ MoneyServer wurde erfolgreich heruntergeladen." elif [[ "$user_choice" == "upgrade" ]]; then if [[ -d "opensimcurrencyserver/.git" ]]; then echo "✓ Repository gefunden. Aktualisiere mit 'git pull'..." cd opensimcurrencyserver || { echo "✘ Fehler: Kann nicht ins Verzeichnis wechseln!"; return 1; } # Automatische Branch-Erkennung branch_name=$(git symbolic-ref refs/remotes/origin/HEAD | sed 's@^refs/remotes/origin/@@') git pull origin "$branch_name" && echo "✅ MoneyServer erfolgreich aktualisiert!" cd .. else echo "⚠ MoneyServer-Verzeichnis nicht gefunden. Klone Repository neu..." git clone https://github.com/ManfredAabye/opensimcurrencyserver-dotnet.git opensimcurrencyserver && echo "✅ MoneyServer erfolgreich heruntergeladen!" fi else echo "✘ Abbruch: Keine Aktion durchgeführt." return 1 fi # Prüfen, ob das Verzeichnis existiert, bevor es kopiert wird if [[ -d "opensimcurrencyserver/addon-modules" ]]; then cp -r opensimcurrencyserver/addon-modules opensim/ echo "✓ MONEYSERVER: addon-modules wurde nach opensim kopiert" else echo "✘ MONEYSERVER: addon-modules existiert nicht" fi if [[ -d "opensimcurrencyserver/bin" ]]; then cp -r opensimcurrencyserver/bin opensim/ echo "✓ MONEYSERVER: bin wurde nach opensim kopiert" else echo "✘ MONEYSERVER: bin existiert nicht" fi return 0 } function opensimbuild() { echo "Möchten Sie den OpenSimulator jetzt erstellen? ([ja]/nein)" read -r user_choice user_choice=${user_choice:-ja} if [[ "$user_choice" == "ja" ]]; then if [[ -d "opensim" ]]; then cd opensim || { echo "Fehler: Verzeichnis 'opensim' nicht gefunden."; return 1; } echo "Starte Prebuild-Skript..." bash runprebuild.sh echo "Baue OpenSimulator..." dotnet build --configuration Release OpenSim.sln echo "✓ OpenSimulator wurde erfolgreich erstellt." else echo "✘ Fehler: Das Verzeichnis 'opensim' existiert nicht." return 1 fi else echo "✘ Abbruch: OpenSimulator wird nicht erstellt." fi } #?────────────────────────────────────────────────────────────────────────────────────────── #* Erstellen eines OpenSimulators Grids #?────────────────────────────────────────────────────────────────────────────────────────── function createdirectory () { echo "Möchten Sie einen Gridserver oder einen Regionsserver erstellen? ([grid]/region)" read -r server_type # Standardmäßig Gridserver wählen, falls keine Eingabe erfolgt server_type=${server_type:-grid} if [[ "$server_type" == "grid" ]]; then echo "Erstelle robust Verzeichnis..." mkdir -p robust/bin echo "✓ Robust Verzeichnis wurde erstellt." # Nach der Erstellung des Gridservers auch die Regionsserver erstellen lassen echo "Wie viele Regionsserver benötigen Sie?" read -r num_regions elif [[ "$server_type" == "region" ]]; then echo "Wie viele Regionsserver benötigen Sie?" read -r num_regions else echo "✘ Ungültige Eingabe. Bitte geben Sie 'grid' oder 'region' ein." return 1 fi # Überprüfen, ob die Anzahl der Regionsserver bis 999 geht if [[ "$num_regions" =~ ^[0-9]+$ && "$num_regions" -le 999 ]]; then for ((i=1; i<=num_regions; i++)); do dir_name="sim$i" if [[ ! -d "$dir_name" ]]; then mkdir -p "$dir_name/bin" echo "$dir_name wurde erstellt." else echo "$dir_name existiert bereits und wird übersprungen." fi done else echo "✘ Ungültige Anzahl an Regionsserver. Bitte geben Sie eine gültige Zahl zwischen 1 und 999 ein." fi } function opensimcopy () { echo -e "\e[32m" # Prüfen, ob das Verzeichnis "opensim" existiert if [[ ! -d "opensim" ]]; then echo "✘ Fehler: Das Verzeichnis 'opensim' existiert nicht." return 1 fi # Prüfen, ob das Unterverzeichnis "opensim/bin" existiert if [[ ! -d "opensim/bin" ]]; then echo "✘ Fehler: Das Verzeichnis 'opensim/bin' existiert nicht." return 1 fi # Prüfen, ob das Verzeichnis "robust" existiert und Dateien kopieren if [[ -d "robust/bin" ]]; then cp -r opensim/bin/* robust/bin echo "✓ Dateien aus 'opensim/bin' wurden nach 'robust/bin' kopiert." else echo "✘ Hinweis: 'robust' Verzeichnis nicht gefunden, keine Kopie durchgeführt." fi # Alle simX-Verzeichnisse suchen und Dateien kopieren for sim_dir in sim*; do if [[ -d "$sim_dir/bin" ]]; then cp -r opensim/bin/* "$sim_dir/bin/" echo "✓ Dateien aus 'opensim/bin' wurden nach '$sim_dir/bin' kopiert." fi done echo -e "\e[0m" } function mariasetup() { echo -e "\033[32m" # 1. Prüfen ob MariaDB installiert ist if ! command -v mariadb &> /dev/null && ! command -v mysql &> /dev/null; then echo -e "\033[33mMariaDB ist nicht installiert.\033[0m" echo "Möchten Sie MariaDB installieren? (j/n) " read -r install_choice if [[ "$install_choice" =~ ^[jJ] ]]; then echo "Installiere MariaDB..." # Distro-spezifische Installation if [[ -f /etc/debian_version ]]; then sudo apt-get update sudo apt-get install -y mariadb-server elif [[ -f /etc/redhat-release ]]; then sudo yum install -y mariadb-server sudo systemctl start mariadb sudo systemctl enable mariadb else echo "Nicht unterstütztes Betriebssystem für automatische Installation" return 1 fi # Sichere Installation durchführen sudo mysql_secure_installation else echo "Installation abgebrochen." return 0 fi else echo "MariaDB ist bereits installiert." fi # 2. Datenbanken anlegen für vorhandene Server echo "Erstelle Datenbanken für vorhandene Server..." # Für RobustServer if [[ -d "robust" ]]; then echo "Erstelle Datenbank 'robust'..." sudo mysql -e "CREATE DATABASE IF NOT EXISTS robust;" sudo mysql -e "GRANT ALL PRIVILEGES ON robust.* TO 'robustuser'@'localhost' IDENTIFIED BY 'robustpassword';" sudo mysql -e "FLUSH PRIVILEGES;" fi # Für alle simX Server for ((i=1; i<=999; i++)); do if [[ -d "sim$i" ]]; then db_name="sim$i" echo "Erstelle Datenbank '$db_name'..." sudo mysql -e "CREATE DATABASE IF NOT EXISTS $db_name;" sudo mysql -e "GRANT ALL PRIVILEGES ON $db_name.* TO 'simuser'@'localhost' IDENTIFIED BY 'simpassword';" sudo mysql -e "FLUSH PRIVILEGES;" fi done echo -e "\n\033[32mDatenbankeinrichtung abgeschlossen!\033[0m" echo -e "Zusammenfassung der erstellten Datenbanken:" sudo mysql -e "SHOW DATABASES LIKE 'robust';" sudo mysql -e "SHOW DATABASES LIKE 'sim%';" echo -e "\033[0m" } function sqlsetup() { echo -e "\033[32m" # 1. Distribution Detection detect_distro() { if [[ -f /etc/os-release ]]; then awk -F= '/^ID=/ {print $2}' /etc/os-release | tr -d '"' elif [[ -f /etc/debian_version ]]; then echo "debian" elif [[ -f /etc/centos-release ]]; then echo "centos" else echo "unknown" fi } current_distro=$(detect_distro) supported_distros=("debian" "ubuntu" "linuxmint" "pop" "mx" "kali" "zorin" "elementary" "raspbian") if ! printf '%s\n' "${supported_distros[@]}" | grep -q "^$current_distro$"; then echo -e "\033[31mNicht unterstützte Distribution: $current_distro\033[0m" return 1 fi # 2. MariaDB Installation Check if ! command -v mariadb &> /dev/null && ! command -v mysql &> /dev/null; then echo -e "\033[33mMariaDB ist nicht installiert.\033[0m" echo "Möchten Sie MariaDB installieren? (j/n) " read -r install_choice if [[ "$install_choice" =~ ^[jJ] ]]; then echo "Installiere MariaDB für $current_distro..." case $current_distro in debian|ubuntu|linuxmint|pop|zorin|elementary|kali|mx) sudo apt-get update sudo apt-get install -y mariadb-server ;; raspbian) sudo apt-get update sudo apt-get install -y mariadb-server-10.5 ;; *) echo "Automatische Installation für $current_distro nicht verfügbar" return 1 ;; esac # Secure Installation echo -e "\033[34mFühre sichere Installation durch...\033[0m" sudo mysql_secure_installation else echo "Installation abgebrochen." return 0 fi else echo "MariaDB ist bereits installiert." fi # 3. Database Setup with Secure Random Passwords echo "Erstelle Datenbanken für vorhandene Server..." generate_password() { tr -dc 'A-Za-z0-9!@#$%^&*()' < /dev/urandom | head -c 16 } # RobustServer DB if [[ -d "robust" ]]; then robust_pw=$(generate_password) echo "Erstelle Datenbank 'robust'..." sudo mysql -e "CREATE DATABASE IF NOT EXISTS robust;" sudo mysql -e "CREATE USER IF NOT EXISTS 'robustuser'@'localhost' IDENTIFIED BY '$robust_pw';" sudo mysql -e "GRANT ALL PRIVILEGES ON robust.* TO 'robustuser'@'localhost';" sudo mysql -e "FLUSH PRIVILEGES;" echo -e "\033[34mRobust DB Passwort: $robust_pw\033[0m" fi # simX Server DBs for ((i=1; i<=999; i++)); do if [[ -d "sim$i" ]]; then sim_pw=$(generate_password) db_name="sim$i" echo "Erstelle Datenbank '$db_name'..." sudo mysql -e "CREATE DATABASE IF NOT EXISTS $db_name;" sudo mysql -e "CREATE USER IF NOT EXISTS 'sim${i}user'@'localhost' IDENTIFIED BY '$sim_pw';" sudo mysql -e "GRANT ALL PRIVILEGES ON $db_name.* TO 'sim${i}user'@'localhost';" sudo mysql -e "FLUSH PRIVILEGES;" echo -e "\033[34mSim$i DB Passwort: $sim_pw\033[0m" fi done # 4. Post-Install Check echo -e "\n\033[32mDatenbankeinrichtung abgeschlossen!\033[0m" echo -e "Zusammenfassung:" sudo mysql -e "SELECT User, Host FROM mysql.user WHERE User LIKE 'robustuser' OR User LIKE 'sim%';" sudo mysql -e "SHOW DATABASES LIKE 'robust'; SHOW DATABASES LIKE 'sim%';" # Save passwords securely if [[ -d "robust" ]]; then echo "robust DB Passwort: $robust_pw" | sudo tee "$SCRIPT_DIR"/mariadb_passwords.txt >/dev/null fi for ((i=1; i<=999; i++)); do if [[ -d "sim$i" ]]; then echo "sim$i DB Passwort: $sim_pw" | sudo tee -a "$SCRIPT_DIR"/mariadb_passwords.txt >/dev/null fi done echo -e "\n\033[33mPasswörter wurden in $SCRIPT_DIR/mariadb_passwords.txt gespeichert\033[0m" echo -e "\033[0m" } setcrontab() { # Strict Mode: Fehler sofort erkennen set -euo pipefail # Sicherheitsabfrage: Nur als root/sudo ausführen if [ "$(id -u)" -ne 0 ]; then echo >&2 "FEHLER: Dieses Skript benötigt root-Rechte! (sudo verwenden)" return 1 fi # Prüfen, ob SCRIPT_DIR gesetzt und gültig ist if [ -z "${SCRIPT_DIR:-}" ]; then echo >&2 "FEHLER: 'SCRIPT_DIR' muss gesetzt sein!" return 1 fi if [ ! -d "$SCRIPT_DIR" ]; then echo >&2 "FEHLER: Verzeichnis '$SCRIPT_DIR' existiert nicht!" return 1 fi # Temporäre Datei für neue Cron-Jobs local temp_cron temp_cron=$(mktemp) || { echo >&2 "FEHLER: Temp-Datei konnte nicht erstellt werden" return 1 } # Neue Cron-Jobs schreiben (ERSETZT alle alten) cat << EOF > "$temp_cron" # === OpenSimGrid-Automatisierung === # Minute Stunde Tag Monat Jahr Befehl # Server-Neustart am 1. jedes Monats 40 4 1 * * bash '$SCRIPT_DIR/osmtool.sh' cacheclean 45 4 1 * * bash '$SCRIPT_DIR/osmtool.sh' reboot # Taegliche Wartung 55 4 * * * bash '$SCRIPT_DIR/osmtool.sh' logclean 0 5 * * * bash '$SCRIPT_DIR/osmtool.sh' autorestart # Ueberwachung alle 30 Minuten */30 * * * * bash '$SCRIPT_DIR/osmtool.sh' check_screens EOF # Cron-Jobs installieren if crontab "$temp_cron"; then rm -f "$temp_cron" echo "Cron-Jobs wurden ERFOLGREICH ersetzt:" crontab -l | grep -v '^#' | sed '/^$/d' return 0 else echo >&2 "FEHLER: Installation fehlgeschlagen. Prüfe $temp_cron manuell." return 1 fi } #?────────────────────────────────────────────────────────────────────────────────────────── #* Upgrade des OpenSimulators Grids #?────────────────────────────────────────────────────────────────────────────────────────── # Upgrade ist eigentlich nur ein entpacken eines OpenSimulator und umbenennen des Ordners in opensim. # Dann das stoppen des Grids, neues OpenSim kopieren und alles neu starten. function opensimupgrade() { echo -e "\n\033[33mDer OpenSimulator muss zuerst im Verzeichnis 'opensim' vorliegen!\033[0m" echo "Möchten Sie den OpenSimulator aktualisieren? ([no]/yes)" read -r user_choice user_choice=${user_choice:-no} # Prüfe, ob das Verzeichnis vorhanden ist if [[ ! -d "opensim" ]]; then echo -e "\033[31m❗Fehler: Das Verzeichnis 'opensim' existiert nicht\033[0m" return 1 fi # Prüfe, ob im Verzeichnis 'opensim/bin' die Dateien OpenSim.dll und Robust.dll vorhanden sind if [[ ! -f "opensim/bin/OpenSim.dll" || ! -f "opensim/bin/Robust.dll" ]]; then echo -e "\033[36m❗Fehler: Benötigte Dateien (OpenSim.dll und/oder Robust.dll) fehlen im Verzeichnis 'opensim/bin'\033[0m" echo -e "\n\033[33m❓Haben Sie vergessen den OpenSimulator zuerst zu Kompilieren\033[0m" return 1 fi if [[ "$user_choice" == "yes" ]]; then echo "OpenSimulator wird gestoppt..." opensimstop sleep 30 echo "OpenSimulator wird kopiert..." opensimcopy echo "OpenSimulator wird gestartet..." opensimstart echo "✔ Upgrade abgeschlossen." else echo "Upgrade vom Benutzer abgebrochen." fi } #?────────────────────────────────────────────────────────────────────────────────────────── #* Bereinigen des OpenSimulators Grids #?────────────────────────────────────────────────────────────────────────────────────────── function dataclean() { echo -e "\033[32m" #file_types=("*.log" "*.dll" "*.exe" "*.so" "*.xml" "*.dylib" "*.example" "*.sample" "*.txt" "*.config" "*.py" "*.old" "*.pdb") # RobustServer bereinigen if [[ -d "robust/bin" ]]; then echo "✓ Lösche Dateien im RobustServer..." find "robust/bin" -maxdepth 1 -type f \( -name "*.log" -o -name "*.dll" -o -name "*.exe" -o -name "*.so" -o -name "*.xml" -o -name "*.dylib" -o -name "*.example" -o -name "*.sample" -o -name "*.txt" -o -name "*.config" -o -name "*.py" -o -name "*.old" -o -name "*.pdb" \) -delete fi # Alle simX-Server bereinigen for ((i=1; i<=999; i++)); do sim_dir="sim$i/bin" if [[ -d "$sim_dir" ]]; then echo "✓ Lösche Dateien in $sim_dir..." find "$sim_dir" -maxdepth 1 -type f \( -name "*.log" -o -name "*.dll" -o -name "*.exe" -o -name "*.so" -o -name "*.xml" -o -name "*.dylib" -o -name "*.example" -o -name "*.sample" -o -name "*.txt" -o -name "*.config" -o -name "*.py" -o -name "*.old" -o -name "*.pdb" \) -delete fi done echo -e "\033[0m" } function pathclean() { echo -e "\033[32m" directories=("assetcache" "maptiles" "MeshCache" "j2kDecodeCache" "ScriptEngines" "bakes" "addon-modules") wildcard_dirs=("addin-db-*") # Separate Liste für Wildcard-Verzeichnisse # RobustServer bereinigen if [[ -d "robust/bin" ]]; then echo "✓ Lösche komplette Verzeichnisse im RobustServer..." # Normale Verzeichnisse for dir in "${directories[@]}"; do target="robust/bin/$dir" if [[ -d "$target" ]]; then rm -rf "$target" echo " Verzeichnis gelöscht: $target" fi done # Wildcard-Verzeichnisse for pattern in "${wildcard_dirs[@]}"; do for target in robust/bin/$pattern; do if [[ -d "$target" ]]; then rm -rf "$target" echo " Verzeichnis gelöscht: $target" fi done done fi # Alle simX-Server bereinigen for ((i=1; i<=999; i++)); do sim_dir="sim$i/bin" if [[ -d "$sim_dir" ]]; then echo "✓ Lösche komplette Verzeichnisse in $sim_dir..." # Normale Verzeichnisse for dir in "${directories[@]}"; do target="$sim_dir/$dir" if [[ -d "$target" ]]; then rm -rf "$target" echo " Verzeichnis gelöscht: $target" fi done # Wildcard-Verzeichnisse for pattern in "${wildcard_dirs[@]}"; do for target in $sim_dir/$pattern; do if [[ -d "$target" ]]; then rm -rf "$target" echo " Verzeichnis gelöscht: $target" fi done done fi done echo -e "\033[0m" } function cacheclean() { echo -e "\033[32m" cache_dirs=("assetcache" "maptiles" "MeshCache" "j2kDecodeCache" "ScriptEngines") # RobustServer bereinigen if [[ -d "robust/bin" ]]; then echo "✓ Leere Cache-Verzeichnisse im RobustServer..." for dir in "${cache_dirs[@]}"; do target="robust/bin/$dir" if [[ -d "$target" ]]; then find "$target" -mindepth 1 -delete echo " Inhalt geleert: $target" fi done fi # Alle simX-Server bereinigen for ((i=1; i<=999; i++)); do sim_dir="sim$i/bin" if [[ -d "$sim_dir" ]]; then echo "✓ Leere Cache-Verzeichnisse in $sim_dir..." for dir in "${cache_dirs[@]}"; do target="$sim_dir/$dir" if [[ -d "$target" ]]; then find "$target" -mindepth 1 -delete echo " Inhalt geleert: $target" fi done fi done echo -e "\033[0m" } function logclean() { echo -e "\033[32m" # RobustServer bereinigen if [[ -d "robust/bin" ]]; then echo "✓ Lösche Log-Dateien im RobustServer..." rm -f robust/bin/*.log fi # Alle simX-Server bereinigen (sim1 bis sim999) for ((i=1; i<=999; i++)); do sim_dir="sim$i/bin" if [[ -d "$sim_dir" ]]; then echo "✓ Lösche Log-Dateien in $sim_dir..." rm -f "$sim_dir"/*.log fi done echo -e "\033[0m" } function mapclean() { echo -e "\033[32m" # Sicherheitscheck für robust/bin/maptiles if [[ -d "robust/bin/maptiles" ]]; then rm -rf -- "robust/bin/maptiles/"* echo "✓ robust/bin/maptiles geleert" fi # Sicherheitscheck für alle simX/bin/maptiles for ((i=1; i<=999; i++)); do local sim_dir="sim$i/bin/maptiles" if [[ -d "$sim_dir" ]]; then # shellcheck disable=SC2115 rm -rf -- "${sim_dir}/"* echo "✓ ${sim_dir} geleert" fi done echo -e "mapclean abgeschlossen.\033[0m" } function autoallclean() { local confirm # Warnung in Gelb (konsistenter mit \e anstelle von \033) echo -e "\e[33m" cat >&2 <<'WARNUNG' === WARNUNG: Alle Daten-, Verzeichnis-, Cache-, Log- und Map-Daten werden bereinigt! === === DIESE OPERATION KANN NICHT RÜCKGÄNGIG GEMACHT WERDEN! === === DER OPENSIMULATOR MUSS IM ANSCHLUSS NEU INSTALLIERT WERDEN! === WARNUNG echo -e "\e[0m" # Bestätigung mit Timeout (10 Sekunden) für Sicherheit read -t 30 -r -p "Fortfahren? (ja/NEIN): " confirm || { echo -e "\n\e[31mTimeout: Keine Bestätigung erhalten. Abbruch.\e[0m" >&2 return 1 } case "${confirm,,}" in ja|j|y|yes) echo -e "\e[32mBereinigung wird gestartet...\e[0m" >&2 # Jede Clean-Funktion mit Fehlerprüfung local clean_functions=(dataclean pathclean cacheclean logclean mapclean) for func in "${clean_functions[@]}"; do if ! command -v "$func" &>/dev/null; then echo -e "\e[31mFehler: '$func' ist keine gültige Funktion!\e[0m" >&2 return 1 fi "$func" || { echo -e "\e[31mFehler bei $func!\e[0m" >&2 return 1 } done echo -e "\e[32mBereinigung abgeschlossen.\e[0m" >&2 ;; *) echo -e "\e[33mAbbruch: Bereinigung wurde nicht durchgeführt.\e[0m" >&2 return 1 ;; esac } #?────────────────────────────────────────────────────────────────────────────────────────── #* Konfigurationen #?────────────────────────────────────────────────────────────────────────────────────────── # Funktion zur Generierung von UUIDs function generate_uuid() { uuidgen | tr '[:upper:]' '[:lower:]' } # Funktion zur Generierung von Zufallsnamen function generate_name() { local adjectives=( # Mystisch & Magisch (25) "Mystic" "Arcane" "Eldritch" "Enigmatic" "Esoteric" "Occult" "Cryptic" "Celestial" "Astral" "Ethereal" "Luminous" "Radiant" "Prismatic" "Iridescent" "Phantasmal" "Spectral" "Otherworldly" "Transcendent" "Timeless" "Unearthly" "Enchanted" "Charmed" "Bewitched" "Mythic" "Legendary" # Natürlich & Elementar (25) "Verdant" "Sylvan" "Petrified" "Thundering" "Whispering" "Howling" "Roaring" "Rumbling" "Crystalline" "Obsidian" "Amber" "Jade" "Sapphire" "Emerald" "Ruby" "Topaz" "Opaline" "Pearlescent" "Gilded" "Argent" "Solar" "Lunar" "Stellar" "Nebular" "Galactic" ) local nouns=( # Natürliche Orte (25) "Forest" "Grove" "Copse" "Thicket" "Wildwood" "Jungle" "Rainforest" "Mangrove" "Taiga" "Tundra" "Mountain" "Peak" "Summit" "Cliff" "Crag" "Bluff" "Mesa" "Plateau" "Canyon" "Ravine" "Valley" "Dale" "Glen" "Hollow" "Basin" # Gewässer (15) "River" "Stream" "Brook" "Creek" "Fjord" "Lagoon" "Estuary" "Delta" "Bayou" "Wetland" "Oasis" "Geyser" "Spring" "Well" "Aquifer" # Künstliche Strukturen (10) "Observatory" "Planetarium" "Orrery" "Reflectory" "Conservatory" "Atrium" "Rotunda" "Gazebo" "Pavilion" "Terrace" ) echo "${adjectives[$RANDOM % 50]}${nouns[$RANDOM % 50]}$((RANDOM % 900 + 100))" } # Hauptfunktion function regionsconfig() { # Konstanten local center_x=4000 local center_y=4000 local base_port=9000 # Variablen local regions_per_sim local system_ip local sim_num local region_num local sim_dir local offset local pos_x local pos_y local location local port local region_name local region_uuid local config_file declare -A used_locations # Assoziatives Array für bereits verwendete Positionen # Überprüfen, ob crudini installiert ist if ! command -v crudini &> /dev/null; then echo -e "\e[31mFehler: crudini ist nicht installiert. Bitte installieren Sie es zuerst.\e[0m" >&2 return 1 fi # Benutzereingabe echo "Wie viele Zufallsregionen sollen pro Simulator erstellt werden?" read -r regions_per_sim # Eingabeprüfung if ! [[ "$regions_per_sim" =~ ^[1-9][0-9]*$ ]]; then echo -e "\e[31mUngültige Eingabe: Bitte eine positive Zahl eingeben\e[0m" >&2 return 1 fi system_ip=$(hostname -I | awk '{print $1}') echo -e "\e[33mStarte Regionserstellung...\e[0m" echo "--------------------------" # Simulatoren durchlaufen for ((sim_num=1; sim_num<=999; sim_num++)); do sim_dir="sim${sim_num}/bin/Regions" if [[ -d "$sim_dir" ]]; then echo -e "\e[33mSimulator $sim_num: Erstelle $regions_per_sim Region(en)\e[0m" >&2 # Regionen erstellen for ((region_num=1; region_num<=regions_per_sim; region_num++)); do # Position berechnen und sicherstellen, dass sie eindeutig ist local attempts=0 local max_attempts=100 while true; do # Position berechnen offset=$(( (RANDOM % 2000) - 1000 )) # Zufälliger Offset zwischen -1000 und +1000 pos_x=$((center_x + offset)) offset=$(( (RANDOM % 2000) - 1000 )) # Unabhängiger Offset für Y pos_y=$((center_y + offset)) location="$pos_x,$pos_y" # Prüfen, ob die Position bereits verwendet wurde if [[ -z "${used_locations[$location]}" ]]; then used_locations[$location]=1 break fi attempts=$((attempts + 1)) if (( attempts >= max_attempts )); then echo -e "\e[31mFehler: Konnte nach $max_attempts Versuchen keine eindeutige Position finden\e[0m" >&2 return 1 fi done port=$((base_port + sim_num * 100 + region_num)) # Eindeutige Werte region_name=$(generate_name) region_uuid=$(generate_uuid) config_file="${sim_dir}/${region_name}.ini" # Config-Datei mit crudini erstellen crudini --set "$config_file" "$region_name" "RegionUUID" "$region_uuid" crudini --set "$config_file" "$region_name" "Location" "$location" crudini --set "$config_file" "$region_name" "SizeX" "256" crudini --set "$config_file" "$region_name" "SizeY" "256" crudini --set "$config_file" "$region_name" "SizeZ" "256" crudini --set "$config_file" "$region_name" "InternalPort" "$port" crudini --set "$config_file" "$region_name" "ExternalHostName" "$system_ip" crudini --set "$config_file" "$region_name" "MaxPrims" "15000" crudini --set "$config_file" "$region_name" "MaxAgents" "40" crudini --set "$config_file" "$region_name" "MaptileStaticUUID" "$region_uuid" crudini --set "$config_file" "$region_name" "InternalAddress" "0.0.0.0" crudini --set "$config_file" "$region_name" "AllowAlternatePorts" "False" crudini --set "$config_file" "$region_name" "NonPhysicalPrimMax" "512" crudini --set "$config_file" "$region_name" "PhysicalPrimMax" "128" # Optionale Parameter als Kommentare crudini --set "$config_file" "$region_name" ";RegionType" "Estate" crudini --set "$config_file" "$region_name" ";MasterAvatarFirstName" "System" crudini --set "$config_file" "$region_name" ";MasterAvatarLastName" "Admin" crudini --set "$config_file" "$region_name" ";MasterAvatarSandboxPassword" "$(openssl rand -base64 12)" echo -e "\e[36m ✓ ${region_name} (${location}, Port ${port})\e[0m" >&2 done fi done echo "--------------------------" echo -e "\e[32mRegionserstellung abgeschlossen!\e[0m" return 0 } function regionsclean() { echo -e "\033[33mWARNUNG: Dies wird ALLE Regionskonfigurationen in allen Simulatoren löschen!\033[0m" echo "Sicher fortfahren? (j/N): " read -r confirm if [[ "$confirm" =~ ^[jJ] ]]; then echo "Starte Bereinigung..." deleted_count=0 # Durch alle Simulatoren iterieren for ((sim_num=1; sim_num<=999; sim_num++)); do sim_dir="sim${sim_num}/bin/Regions" if [[ -d "$sim_dir" ]]; then echo -e "\033[33m ✓ Überprüfe $sim_dir...\033[0m" # Lösche nur .ini-Dateien (keine anderen Dateitypen) while IFS= read -r -d $'\0' config_file; do if [[ "$config_file" == *.ini ]]; then rm -v "$config_file" ((deleted_count++)) fi done < <(find "$sim_dir" -maxdepth 1 -type f -name "*.ini" -print0) fi done echo -e "\033[32mFertig! Gelöschte Regionen: $deleted_count\033[0m" else echo "Abbruch: Keine Dateien wurden gelöscht." fi } function renamefiles() { timestamp=$(date +"%Y%m%d_%H%M%S") if [ ! -d "$SCRIPT_DIR" ]; then echo -e "${RED}Fehler: Verzeichnis $SCRIPT_DIR nicht gefunden!${RESET}" return 1 fi echo -e "${CYAN}Starte Umbenennung aller *.example Dateien in ${SCRIPT_DIR} und Unterverzeichnissen...${RESET}" # Verarbeite robust/bin zuerst find "$SCRIPT_DIR" -type f -name "*.example" 2>/dev/null | while read -r example_file; do local target_file="${example_file%.example}" # Entfernt .example if [ -f "$target_file" ]; then local backup_file="${target_file}_${timestamp}.bak" mv "$target_file" "$backup_file" echo -e "${YELLOW}Gesichert: ${target_file} → ${backup_file}${RESET}" fi mv "$example_file" "$target_file" echo -e "${GREEN}Umbenannt: ${example_file} → ${target_file}${RESET}" done # Jetzt alle simX/bin Verzeichnisse durchlaufen for ((i=999; i>=1; i--)); do sim_dir="${SCRIPT_DIR}/sim$i/bin" if [ -d "$sim_dir" ]; then echo -e "${CYAN}Verarbeite: $sim_dir ${RESET}" find "$sim_dir" -type f -name "*.example" 2>/dev/null | while read -r example_file; do local target_file="${example_file%.example}" if [ -f "$target_file" ]; then local backup_file="${target_file}_${timestamp}.bak" mv "$target_file" "$backup_file" echo -e "${YELLOW}Gesichert: ${target_file} → ${backup_file}${RESET}" fi mv "$example_file" "$target_file" echo -e "${GREEN}Umbenannt: ${example_file} → ${target_file}${RESET}" done fi done echo -e "${GREEN}Alle *.example Dateien wurden erfolgreich verarbeitet.${RESET}" return 0 } # Standalone ist die erste Funktion, die funktioniert. function standalone() { echo -e "\e[33m[Standalone] Setup wird durchgeführt...\e[0m" # Prüfen ob SCRIPT_DIR gesetzt ist if [ -z "${SCRIPT_DIR}" ]; then echo -e "\e[31mFehler: SCRIPT_DIR ist nicht gesetzt!\e[0m" return 1 fi local opensim_bin="${SCRIPT_DIR}/opensim/bin" local renamed=0 local skipped=0 # Sicherstellen, dass das Verzeichnis existiert if [ ! -d "${opensim_bin}" ]; then echo -e "\e[31mFehler: Verzeichnis ${opensim_bin} nicht gefunden!\e[0m" return 1 fi # Verarbeite alle .example Dateien while IFS= read -r -d '' file; do target="${file%.example}" if [ -e "${target}" ]; then echo -e "\e[33mÜbersprungen: ${target} existiert bereits\e[0m" ((skipped++)) else if mv "${file}" "${target}"; then echo -e "\e[32mUmbenannt: ${file} → ${target}\e[0m" ((renamed++)) else echo -e "\e[31mFehler beim Umbenennen von ${file}\e[0m" ((skipped++)) fi fi done < <(find "${opensim_bin}" -type f -name "*.example" -print0) echo -e "\n\e[36mZusammenfassung:\e[0m" echo -e "\e[32mUmbenannte Dateien: ${renamed}\e[0m" echo -e "\e[33mÜbersprungene Dateien: ${skipped}\e[0m" echo -e "\e[32mStandalone-Konfiguration abgeschlossen!\e[0m" } # Helper to clean config files (remove leading spaces/tabs) clean_config() { local file=$1 sed -i 's/^[ \t]*//' "$file" } function setrobusthg() { local robust_ini="${SCRIPT_DIR}/robust/bin/Robust.HG.ini.example" local target_ini="${SCRIPT_DIR}/robust/bin/Robust.ini" local backup_file="${SCRIPT_DIR}/robust/bin/Robust.ini.bak" # Prüfe, ob Robust.ini existiert und erstelle ein Backup if [ -f "$target_ini" ]; then echo "Sichere bestehende Datei: $target_ini -> $backup_file" mv "$target_ini" "$backup_file" fi # Kopiere Robust.HG.ini nach Robust.ini if [ -f "$robust_ini" ]; then cp "$robust_ini" "$target_ini" echo "$robust_ini wurde nach $target_ini kopiert." else echo "Warnung: $robust_ini nicht gefunden!" return 1 fi # Bereinige die Datei, damit crudini korrekt arbeitet clean_config "$target_ini" # Basis-Konfiguration crudini --set "$target_ini" Const BaseHostname "\"$system_ip\"" crudini --set "$target_ini" Const BaseURL "\"http://\${Const|BaseHostname}\"" crudini --set "$target_ini" Const PublicPort "\"8002\"" crudini --set "$target_ini" Const PrivatePort "\"8003\"" # Dienste aktivieren (ServiceList) services=( "OfflineIMServiceConnector" "GroupsServiceConnector" "BakedTextureService" "UserProfilesServiceConnector" "HGGroupsServiceConnector" ) for service in "${services[@]}"; do sed -i "/^; *$service/s/^;//" "$target_ini" done # Hypergrid Konfiguration crudini --set "$target_ini" Hypergrid HomeURI "\"\${Const|BaseURL}:\${Const|PublicPort}\"" crudini --set "$target_ini" Hypergrid GatekeeperURI "\"\${Const|BaseURL}:\${Const|PublicPort}\"" # Access Control - Verbotene Clients crudini --set "$target_ini" AccessControl DeniedClients "\"Imprudence|CopyBot|Twisted|Crawler|Cryolife|darkstorm|DarkStorm|Darkstorm|hydrastorm viewer|kinggoon copybot|goon squad copybot|copybot pro|darkstorm viewer|copybot club|darkstorm second life|copybot download|HydraStorm Copybot Viewer|Copybot|Firestorm Pro|DarkStorm v3|DarkStorm v2|ShoopedStorm|HydraStorm|hydrastorm|kinggoon|goon squad|goon|copybot|Shooped|ShoopedStorm|Triforce|Triforce Viewer|Firestorm Professional|ShoopedLife|Sombrero|Sombrero Firestorm|GoonSquad|Solar|SolarStorm\"" # Datenbank-Konfiguration crudini --set "$target_ini" DatabaseService ConnectionString "\"Data Source=localhost;Database=opensim;User ID=opensim;Password=$DB_PASSWORD;Old Guids=true;SslMode=None;\"" # Grid-Dienste crudini --set "$target_ini" GridService MapTileDirectory "\"./maptiles\"" crudini --set "$target_ini" GridService Region_Welcome_Area "\"DefaultRegion, DefaultHGRegion\"" # Login-Service crudini --set "$target_ini" LoginService DestinationGuide "\"\${Const|BaseURL}/guide.php\"" crudini --set "$target_ini" LoginService GridSearch "\"\${Const|BaseURL}/searchservice.php\"" # Map-Bild-Service crudini --set "$target_ini" MapImageService TilesStoragePath "\"maptiles\"" crudini --set "$target_ini" MapImageService GridService "\"OpenSim.Services.GridService.dll:GridService\"" # Grid-Info-Service crudini --set "$target_ini" GridInfoService welcome "\${Const|BaseURL}/welcomesplashpage.php" crudini --set "$target_ini" GridInfoService economy "\${Const|BaseURL}:8008/" crudini --set "$target_ini" GridInfoService about "\${Const|BaseURL}/aboutinformation.php" crudini --set "$target_ini" GridInfoService register "\${Const|BaseURL}/createavatar.php" crudini --set "$target_ini" GridInfoService help "\${Const|BaseURL}/help.php" crudini --set "$target_ini" GridInfoService password "\${Const|BaseURL}/passwordreset.php" crudini --set "$target_ini" GridInfoService partner "\${Const|BaseURL}/partner.php" crudini --set "$target_ini" GridInfoService GridStatus "\${Const|BaseURL}:\${Const|PublicPort}/gridstatus.php" crudini --set "$target_ini" GridInfoService GridStatusRSS "\${Const|BaseURL}:\${Const|PublicPort}/gridstatusrss.php" # User-Agent-Service crudini --set "$target_ini" UserAgentService LevelOutsideContacts "0" crudini --set "$target_ini" UserAgentService ShowUserDetailsInHGProfile "True" # Bereinige die Datei (entferne führende Leerzeichen) clean_config "$target_ini" echo "Konfiguration von Robust.ini erfolgreich abgeschlossen." } function setopensim() { local base_dir="${SCRIPT_DIR}/" # Durchsuche alle vorhandenen simX-Ordner (sim1 bis sim999) for i in {1..999}; do local sim_dir="${base_dir}sim$i/bin" local opensim_example="$sim_dir/OpenSim.ini.example" local opensim_ini="$sim_dir/OpenSim.ini" local backup_ini="$sim_dir/OpenSim.ini.bak" # Prüfen, ob das Verzeichnis existiert if [ -d "$sim_dir" ]; then echo "Konfiguriere OpenSim.ini für $sim_dir" # Falls OpenSim.ini existiert, sichere sie zuerst if [ -f "$opensim_ini" ]; then echo "Sichere bestehende Datei: $opensim_ini -> $backup_ini" mv "$opensim_ini" "$backup_ini" fi # Kopiere OpenSim.ini.example nach OpenSim.ini if [ -f "$opensim_example" ]; then cp "$opensim_example" "$opensim_ini" echo "$opensim_example wurde nach $opensim_ini kopiert." else echo "Warnung: $opensim_example nicht gefunden! Überspringe sim$i." continue fi # Bereinige die Datei, damit crudini korrekt arbeitet clean_config "$opensim_ini" # Konfiguration mit crudini setzen #Const-Konfiguration crudini --set "$opensim_ini" Const BaseHostname "\"$system_ip\"" crudini --set "$opensim_ini" Const BaseURL "\"http://\${Const|BaseHostname}\"" #crudini --set "$opensim_ini" Const PublicPort "\"9000\"" crudini --set "$opensim_ini" Const PublicPort "\"8002\"" crudini --set "$opensim_ini" Const PrivURL "\"\${Const|BaseURL}\"" crudini --set "$opensim_ini" Const PrivatePort "\"8003\"" # Startup-Einstellungen crudini --set "$opensim_ini" Startup async_call_method "SmartThreadPool" crudini --set "$opensim_ini" Startup MaxPoolThreads "300" crudini --set "$opensim_ini" Startup MinPoolThreads "32" crudini --set "$opensim_ini" Startup CacheSculptMaps "false" crudini --set "$opensim_ini" Startup DefaultScriptEngine "\"YEngine\"" # Map-Konfiguration crudini --set "$opensim_ini" Map MaptileStaticUUID "\"00000000-0000-0000-0000-000000000000\"" # Berechtigungen crudini --set "$opensim_ini" Permissions automatic_gods "false" crudini --set "$opensim_ini" Permissions implicit_gods "false" crudini --set "$opensim_ini" Permissions allow_grid_gods "true" # Netzwerk-Konfiguration crudini --set "$opensim_ini" Network http_listener_port "9010" crudini --set "$opensim_ini" Network shard "\"OpenSim\"" crudini --set "$opensim_ini" Network user_agent "\"OpenSim LSL (Mozilla Compatible)\"" # BulletSim-Einstellungen crudini --set "$opensim_ini" BulletSim AvatarToAvatarCollisionsByDefault "true" crudini --set "$opensim_ini" BulletSim UseSeparatePhysicsThread "true" crudini --set "$opensim_ini" BulletSim TerrainImplementation "0" # Materialeinstellungen crudini --set "$opensim_ini" Materials MaxMaterialsPerTransaction "250" # Benutzerprofile crudini --set "$opensim_ini" UserProfiles ProfileServiceURL "\"http://services.osgrid.org\"" # Skript-Engines crudini --set "$opensim_ini" YEngine Enabled "true" crudini --set "$opensim_ini" XEngine Enabled "false" # OSSL-Einstellungen crudini --set "$opensim_ini" OSSL Include-osslDefaultEnable "\"config-include/osslDefaultEnable.ini\"" # NPC-Einstellungen crudini --set "$opensim_ini" NPC Enabled "true" # Terrain-Konfiguration crudini --set "$opensim_ini" Terrain InitialTerrain "\"flat\"" # XBakes-Konfiguration crudini --set "$opensim_ini" XBakes URL "\"\${Const|PrivURL}:\${Const|PrivatePort}\"" # Architektur crudini --set "$opensim_ini" Architecture Include-Architecture "\"config-include/GridHypergrid.ini\"" echo "Konfiguration von OpenSim.ini erfolgreich abgeschlossen." fi done } function setgridcommon() { local base_dir="${SCRIPT_DIR}/" for i in {1..999}; do local sim_dir="${base_dir}sim$i/bin/config-include" local gridcommon_example="$sim_dir/GridCommon.ini.example" local gridcommon_ini="$sim_dir/GridCommon.ini" local backup_ini="$sim_dir/GridCommon.ini.bak" if [ -d "$sim_dir" ]; then echo "Konfiguriere GridCommon.ini für $sim_dir" if [ -f "$gridcommon_ini" ]; then echo "Sichere bestehende Datei: $gridcommon_ini -> $backup_ini" mv "$gridcommon_ini" "$backup_ini" fi if [ -f "$gridcommon_example" ]; then # 1. Erstelle neue GridCommon.ini mit Const-Bereich echo "[Const]" > "$gridcommon_ini" crudini --set "$gridcommon_ini" Const BaseHostname "\"$system_ip\"" crudini --set "$gridcommon_ini" Const BaseURL "\"http://\${Const|BaseHostname}\"" crudini --set "$gridcommon_ini" Const PublicPort "\"8002\"" crudini --set "$gridcommon_ini" Const PrivatePort "\"8003\"" # 2. Füge eine Leerzeile ein für bessere Lesbarkeit echo "" >> "$gridcommon_ini" # 3. Füge den kompletten Inhalt der Beispiel-Datei hinzu cat "$gridcommon_example" >> "$gridcommon_ini" echo "GridCommon.ini wurde erstellt mit Const-Bereich und Inhalt von $gridcommon_example." else echo "Warnung: $gridcommon_example nicht gefunden! Überspringe sim$i." continue fi clean_config "$gridcommon_ini" echo "Konfiguration von GridCommon.ini für $sim_dir erfolgreich abgeschlossen." fi done } function setflotsamcache() { local base_dir="${SCRIPT_DIR}/" # Durchsuche alle existierenden simX-Ordner (sim1 bis sim999) for i in {1..999}; do local sim_dir="${base_dir}sim$i/bin/config-include" local flotsam_ini="$sim_dir/FlotsamCache.ini" local backup_ini="$sim_dir/FlotsamCache.ini.bak" # Prüfe, ob das Sim-Verzeichnis existiert if [ -d "$sim_dir" ]; then echo "Erstelle FlotsamCache.ini für $sim_dir" # Falls die Datei existiert, sichere sie zuerst if [ -f "$flotsam_ini" ]; then echo "Sichere bestehende Datei: $flotsam_ini -> $backup_ini" mv "$flotsam_ini" "$backup_ini" fi # Ersetze den kompletten Inhalt mit der neuen Konfiguration cat > "$flotsam_ini" << EOF [AssetCache] CacheDirectory = ./assetcache LogLevel = 0 HitRateDisplay = 100 MemoryCacheEnabled = false UpdateFileTimeOnCacheHit = false NegativeCacheEnabled = true NegativeCacheTimeout = 120 NegativeCacheSliding = false FileCacheEnabled = true MemoryCacheTimeout = .016 FileCacheTimeout = 48 FileCleanupTimer = 1.0 EOF # Bereinige die Datei clean_config "$flotsam_ini" echo "Konfiguration von FlotsamCache.ini für $sim_dir abgeschlossen." fi done } # setwelcome - Sets the Welcome_Area.ini function setwelcome() { local welcome_ini="${SCRIPT_DIR}/sim1/bin/Regions/Welcome_Area.ini" region_uuid=$(uuidgen) cat > "$welcome_ini" << EOF [Welcome Area] RegionUUID = $region_uuid Location = 3000,3000 SizeX = 256 SizeY = 256 SizeZ = 256 InternalPort = 9010 ExternalHostName = "$system_ip" MaxPrims = 15000 MaxAgents = 40 MaptileStaticUUID = $region_uuid InternalAddress = 0.0.0.0 AllowAlternatePorts = False ;NonPhysicalPrimMax = 512 ;PhysicalPrimMax = 128 ;MasterAvatarSandboxPassword = "$(openssl rand -base64 12)" ;MasterAvatarLastName = Admin ;MasterAvatarFirstName = System ;RegionType = Estate EOF clean_config "$welcome_ini" echo "Welcome_Area.ini configuration completed" } function setosslenable() { local base_dir="${SCRIPT_DIR}/" for i in {1..999}; do local sim_dir="${base_dir}sim$i/bin/config-include" local osslenable_ini="$sim_dir/osslEnable.ini" local backup_ini="$sim_dir/osslEnable.ini.bak" # Prüfen, ob das Sim-Verzeichnis existiert if [ -d "$sim_dir" ]; then echo "Erstelle osslEnable.ini für $sim_dir" # Falls die Datei existiert, sichere sie zuerst if [ -f "$osslenable_ini" ]; then echo "Sichere bestehende Datei: $osslenable_ini -> $backup_ini" mv "$osslenable_ini" "$backup_ini" fi # Ersetze den kompletten Inhalt mit der neuen Konfiguration cat > "$osslenable_ini" << EOF [OSSL] AllowOSFunctions = true AllowMODFunctions = true AllowLightShareFunctions = true PermissionErrorToOwner = false OSFunctionThreatLevel = High osslParcelO = "PARCEL_OWNER," osslParcelOG = "PARCEL_GROUP_MEMBER,PARCEL_OWNER," osslNPC = \${OSSL|osslParcelOG}ESTATE_MANAGER,ESTATE_OWNER EOF echo "Konfiguration von osslEnable.ini für $sim_dir abgeschlossen." fi done } function clean_comments_and_empty_lines() { echo -e "\e[33mBereinige Kommentare und Leerzeilen in allen Konfigurationsdateien...\e[0m" # Durch alle simX-Verzeichnisse iterieren for ((i=999; i>=1; i--)); do sim_dir="sim$i" if [ -d "$sim_dir" ]; then echo -e "\e[36mVerarbeite $sim_dir...\e[0m" # Liste aller relevanten Konfigurationsdateien config_files=( "${sim_dir}/bin/Robust.ini.example" "${sim_dir}/bin/Robust.HG.ini.example" "${sim_dir}/bin/OpenSim.ini.example" "${sim_dir}/bin/config-include/FlotsamCache.ini.example" "${sim_dir}/bin/config-include/GridCommon.ini.example" "${sim_dir}/bin/config-include/osslEnable.ini.example" "${sim_dir}/bin/config-include/StandaloneCommon.ini.example" ) # Jede Konfigurationsdatei bearbeiten for config_file in "${config_files[@]}"; do if [[ -f "$config_file" ]]; then echo -e "\e[34mBearbeite $config_file\e[0m" # Vorher-Nachher-Vergleich original_lines=$(wc -l < "$config_file") # 1. Behalte nur Zeilen mit = oder gültigen Sektionen # 2. Entferne führende/trailing Whitespace # 3. Lösche leere Zeilen perl -i.bak -ne ' if (/^\s*\[.+\]\s*$/ || /=/) { s/^\s+//; # Entferne führende Leerzeichen/Tabs s/\s+$//; # Entferne trailing Leerzeichen print "$_\n"; } ' "$config_file" # Nachher-Zeilenanzahl cleaned_lines=$(wc -l < "$config_file") # Veränderungen anzeigen removed=$((original_lines - cleaned_lines)) if [[ $removed -gt 0 ]]; then echo -e "\e[32m✓ Entfernt $removed Zeilen aus $config_file\e[0m" echo -e "\e[37mVorher/Nachher Beispiel:\e[0m" diff --unchanged-line-format= --old-line-format='- %L' --new-line-format='+ %L' \ "${config_file}.bak" "$config_file" | head -5 else echo -e "\e[35mℹ Keine Änderungen in $config_file\e[0m" fi fi done fi done echo -e "\e[32mBereinigung abgeschlossen!\e[0m" } function cleandoublecomments() { echo -e "\e[33mBereinige doppelt kommentierte Zeilen in allen Konfigurationsdateien...\e[0m" # Durch alle simX-Verzeichnisse iterieren for ((i=999; i>=1; i--)); do sim_dir="sim$i" if [ -d "$sim_dir" ]; then echo -e "\e[36mVerarbeite $sim_dir...\e[0m" # Liste aller relevanten Konfigurationsdateien config_files=( "${sim_dir}/bin/Robust.ini" "${sim_dir}/bin/Robust.HG.ini" "${sim_dir}/bin/OpenSim.ini" ) # Jede Konfigurationsdatei bearbeiten for config_file in "${config_files[@]}"; do if [[ -f "$config_file" ]]; then echo -e "\e[34mBearbeite $config_file\e[0m" # Vorher-Nachher-Vergleich original_lines=$(wc -l < "$config_file") # Doppelt kommentierte Zeilen mit führenden Leerzeichen/Tabs entfernen perl -i.bak -ne 'print unless /^\s*;;|^\s*;#/' "$config_file" # Nachher-Zeilenanzahl cleaned_lines=$(wc -l < "$config_file") # Veränderungen anzeigen removed=$((original_lines - cleaned_lines)) if [[ $removed -gt 0 ]]; then echo -e "\e[32m✓ Entfernt $removed Zeilen aus $config_file\e[0m" echo -e "\e[37mErste entfernte Zeile:\e[0m" diff "${config_file}.bak" "$config_file" | grep '^<' | head -1 else echo -e "\e[35mℹ Keine doppelt kommentierten Zeilen in $config_file gefunden\e[0m" # Debug-Ausgabe echo -e "\e[37mBeispielzeilen:\e[0m" grep -m 2 '^\s*[;#]' "$config_file" || echo "Keine kommentierten Zeilen gefunden" fi fi done fi done echo -e "\e[32mBereinigung abgeschlossen!\e[0m" } function cleanall() { echo "Möchtest du OpenSim komplett mit Konfigurationen entfernen? (ja/nein)" read -r answer if [ "$answer" = "ja" ]; then echo "Lösche OpenSim vollständig..." # robust/bin Verzeichnis leeren, falls vorhanden if [ -d "robust/bin" ]; then rm -rf robust/bin/* fi # Überprüfen, welche simX/bin Verzeichnisse existieren und leeren for i in {1..999}; do dir="sim$i/bin" if [ -d "$dir" ]; then rm -rf "${dir:?}/"* fi done echo "Alle bin-Verzeichnisse wurden geleert." elif [ "$answer" = "nein" ]; then echo "OpenSim bleibt erhalten." else echo "Ungültige Eingabe. Bitte 'ja' oder 'nein' eingeben." fi } #?────────────────────────────────────────────────────────────────────────────────────────── #* ZUSAMMENFASSUNG DER FUNKTIONEN NACH PAKETGRUPPEN #?────────────────────────────────────────────────────────────────────────────────────────── #! Jede Gruppe kapselt logisch zusammenhängende Aufgaben. #! Aufrufreihenfolge ist teilweise kritisch (z.B. muss 'opensimbuild' vor 'opensimcopy'). #?────────────────────────────────────────────────────────────────────────────────────────── #! ┌─────────────────────────────────────────────────────────────────┐ #! │ [1] SYSTEMVORBEREITUNG │ #! └─────────────────────────────────────────────────────────────────┘ # ├── servercheck : Prüft Systemvoraussetzungen (RAM, CPU, Distro) # ├── createdirectory : Legt Basisverzeichnisstruktur an # └── sqlsetup : Konfiguriert Datenbank (MySQL/PostgreSQL) #! ┌─────────────────────────────────────────────────────────────────┐ #! │ [2] QUELLCODE-MANAGEMENT │ #! └─────────────────────────────────────────────────────────────────┘ # ├── opensimgit : Klont OpenSimulator-Quellcode (Git) # └── moneygit : Klont Währungssystem-Plugin (falls benötigt) #! ┌─────────────────────────────────────────────────────────────────┐ #! │ [3] BUILD-PROZESS │ #! └─────────────────────────────────────────────────────────────────┘ # └── opensimbuild : Kompiliert OpenSimulator (Mono/XBuild) #! ┌─────────────────────────────────────────────────────────────────┐ #! │ [4] KONFIGURATION │ #! └─────────────────────────────────────────────────────────────────┘ # ├── regionsconfig : Erstellt Basis-Regionenkonfiguration # ├── setwelcome : Setzt Willkommensnachricht # ├── setrobusthg : Konfiguriert Robust-Service für HG # ├── setopensim : Server-Port-Konfiguration (TODO: pro Sim) # ├── setgridcommon : Grid-Kernparameter (TODO: DB-Separierung) # ├── setflotsamcache : Cache-Einstellungen # └── setosslenable : Aktiviert OSSL (TODO: Grundeinstellungen) #! ┌─────────────────────────────────────────────────────────────────┐ #! │ [5] DEPLOYMENT │ #! └─────────────────────────────────────────────────────────────────┘ # └── opensimcopy : Kopiert Binaries an Zielorte #! ┌─────────────────────────────────────────────────────────────────┐ #! │ [6] AUTOMATISIERUNG │ #! └─────────────────────────────────────────────────────────────────┘ # └── setcrontab : Richtet Auto-Start ein (Cronjob) #?────────────────────────────────────────────────────────────────────────────────────────── #* NUTZUNGSHINWEISE: #! 1. Einzelaufruf : bash osmtool.sh –funktion [FUNKTIONSNAME] #! 2. Komplettlauf : bash osmtool.sh autosetinstall (fragt Bestätigung ab) #?────────────────────────────────────────────────────────────────────────────────────────── function standalonerestart() { standalonestart sleep 30 standalonestop } # OpenSim neu starten function opensimrestart() { opensimstop sleep 30 # Kurze Pause, um sicherzustellen, dass alles gestoppt wurde logclean sleep 15 # Kurze Pause, um sicherzustellen, dass alles gelöscht wurde opensimstart echo "Welche sim Regionen sind gestartet?:" screen -ls } function configall() { setrobusthg setopensim setgridcommon setflotsamcache setosslenable setwelcome } function autosetinstall() { # Komplette Server Installation echo -e "\033[1;33mWARNUNG: Dies wird den gesamten OpenSimulator-Server installieren und konfigurieren.\033[0m" echo "Möchten Sie fortfahren? [j/N] " read -r antwort # Fallback für Leerzeichen/Leerstring (Standard: Nein) if [[ "${antwort,,}" != "j" ]]; then echo -e "\033[31mAbbruch: Installation wurde nicht bestätigt.\033[0m" return 1 fi echo -e "\033[32mStarte Installation...\033[0m" servercheck ## Bestandteile des OpenSimulators herunterladen. opensimgit moneygit ## Das eigentliche Bauen des OpenSimulators. opensimbuild ## Verzeichnisse füllen. createdirectory sqlsetup opensimcopy ## Konfigurieren der Voreinstellungen regionsconfig setwelcome setrobusthg setopensim # todo: Jede Sim benötigt ihren eigenen Port. setgridcommon # todo: Jede Sim benötigt eine eigene Datenbank. setflotsamcache setosslenable # todo: Grundeinstellungen fehlen. ## Automatischer Betrieb des OpenSimulators. setcrontab echo -e "\033[1;32mFertig! Der Server startet spätestens nach 30 Minuten vollautomatisch.\033[0m" } function reboot() { echo "Server wird jetzt heruntergefahren und neu gestartet!" # Stoppen des ganzen OpenSim Grids. opensimstop sleep 30 # Starte den Server neu. shutdown -r now } #?────────────────────────────────────────────────────────────────────────────────────────── #* Hilfefunktionen #?────────────────────────────────────────────────────────────────────────────────────────── function help () { echo -e "\e[36mOpenSim Grid Starten Stoppen und Restarten:\e[0m" echo -e "\e[32mopensimstart\e[0m # OpenSim starten.\e[0m" echo -e "\e[32mopensimstop\e[0m # OpenSim stoppen.\e[0m" echo -e "\e[32mopensimrestart\e[0m # OpenSim neu starten.\e[0m" echo -e "\e[32mcheck_screens\e[0m # Laufende OpenSim Prozesse prüfen und restarten.\e[0m" echo " " # Das folgende ist implementiert aber ich bin am überlegen ob es wirklich gebraucht wird? # echo -e "\e[36mOpenSim Standalone Starten Stoppen und Restarten:\e[0m" # echo -e "\e[32mstandalonestart\e[0m # OpenSim starten.\e[0m" # echo -e "\e[32mstandalonestop\e[0m # OpenSim stoppen.\e[0m" # echo -e "\e[32mstandalonerestart\e[0m # OpenSim neu starten.\e[0m" # echo " " echo -e "\e[36mEin OpenSim Grid erstellen oder aktualisieren:\e[0m" echo -e "\e[32mservercheck\e[0m # Zuerst nachsehen ob der Server bereit für OpenSim ist." echo -e "\e[32mcreatedirectory\e[0m # Verzeichnisse erstellen." echo -e "\e[32mmariasetup\e[0m # MariaDB Datenbanken erstellen." echo -e "\e[32msqlsetup\e[0m # SQL Datenbanken erstellen." echo -e "\e[32msetcrontab\e[0m # set crontab automatisierungen." echo -e "\e[32mopensimgitcopy\e[0m # OpenSim aus dem Git herunterladen." echo -e "\e[32mmoneygitcopy\e[0m # MoneyServer aus dem Git herunterladen." echo -e "\e[32mopensimbuild\e[0m # OpenSim kompilieren." echo -e "\e[32mconfigall\e[0m # Vorkonfigurieren des OpenSimulators Gid Test.\e[0m" # Die automatische konfiguration zu testzwecken. echo -e "\e[32mopensimcopy\e[0m # OpenSim kopieren (in alle Verzeichnisse)." echo -e "\e[35mopensimconfig # Eine funktionsfähige konfiguration fehlt noch.\e[0m" echo -e "\e[32mregionsconfig\e[0m # OpenSim Regionen konfigurieren." echo " " echo -e "\e[36mOpenSim Grid Bereinigen von alten Dateien, Verzeichnissen und Cache:\e[0m" echo -e "\e[32mdataclean\e[0m # Robust und simX von alten Dateien befreien (Neuinstallation erforderlich).\e[0m" echo -e "\e[32mpathclean\e[0m # Robust und simX von alten Verzeichnissen befreien (Neuinstallation erforderlich).\e[0m" echo -e "\e[32mcacheclean\e[0m # Robust und simX Cache bereinigen.\e[0m" echo -e "\e[32mlogclean\e[0m # Robust und simX von alten Logs befreien.\e[0m" echo -e "\e[32mmapclean\e[0m # Robust und simX von alten Maptile Karten befreien.\e[0m" echo -e "\e[32mautoallclean\e[0m # Robust und simX von alten Dateien und Verzeichnissen befreien (Neuinstallation erforderlich).\e[0m" echo -e "\e[32mregionsclean\e[0m # Löscht alle konfigurierten Regionen aus allen Simulatoren.\e[0m" echo " " } function colortest(){ echo -e "\033[32m Symbole für Statusanzeigen\033[0m" echo -e "Pfeile: → ← ↑ ↓ ➔ ➜ ➤ ➣ ➢ ➠" echo -e "Kreise: ○ ● ⭘ ◯ ◎ ⚪ ⚫" echo -e "Quadrate: ■ □ ▪ ▫ ⬛ ⬜" echo -e "Sterne: ★ ☆ ✦ ✧ ✪ ✩ ✫ ✯ ✰" echo -e "Haken & Kreuze: ✓ ✕ ✘ ❌ ✅ ❎" echo -e "Uhren & Zeit: ⏳ ⌛ ⏰ 🕒 🕔 🕗" echo -e "Zahlen in Kreisen: ➀ ➁ ➂ ➃ ➄ ➅ ➆ ➇ ➈ ➉" echo -e "Punkte & Marker: • ◦ ∙ ☐ ☒" echo -e "Wetter/Status (optional): ⚡ ☔" echo -e "Fortschritt (Balken-Stil): ▄ █" echo -e "Linien/Trenner: ─ ━ │ ┃ ┄ ┅ ┆ ┇ ┈ ┉ ┊ ┋" echo " " echo -e "✓ \033[32mErfolgreich abgeschlossen!\033[0m" echo -e "✘ \033[31mFehler aufgetreten.\033[0m" echo -e "⏳ \033[33mBitte warten...\033[0m" echo " " echo -e "\033[1m Textfarben \033[0m" echo -e "\033[30m Schwarz\033[0m" echo -e "\033[31m Rot\033[0m" echo -e "\033[32m Grün\033[0m" echo -e "\033[33m Gelb\033[0m" echo -e "\033[34m Blau\033[0m" echo -e "\033[35m Magenta\033[0m" echo -e "\033[36m Cyan\033[0m" echo -e "\033[37m Weiß\033[0m" echo " " echo -e "\033[1m Hintergrundfarben \033[0m" echo -e "\033[40m Schwarzer Hintergrund\033[0m" echo -e "\033[41m Roter Hintergrund\033[0m" echo -e "\033[42m Grüner Hintergrund\033[0m" echo -e "\033[43m Gelber Hintergrund\033[0m" echo -e "\033[44m Blauer Hintergrund\033[0m" echo -e "\033[45m Magenta Hintergrund\033[0m" echo -e "\033[46m Cyan Hintergrund\033[0m" echo -e "\033[47m Weißer Hintergrund\033[0m" echo " " echo -e "\033[1m Formatierungen \033[0m" echo -e "\033[1m Fett (bold)\033[0m" echo -e "\033[2m Schwach (dim)\033[0m" echo -e "\033[3m Kursiv (italic, nicht überall unterstützt)\033[0m" echo -e "\033[4m Unterstrichen (underline)\033[0m" echo -e "\033[7m Negativ (invert colors)\033[0m" echo -e "\033[0m Zurücksetzen (reset)" echo " " echo -e "\033[1m Textfarben \033[0m" echo -e "\033[30m Schwarz\033[0m \033[90m Hellgrau (Bright-Schwarz)\033[0m" echo -e "\033[31m Rot\033[0m \033[91m Hellrot (Bright-Rot)\033[0m" echo -e "\033[32m Grün\033[0m \033[92m Hellgrün (Bright-Grün)\033[0m" echo -e "\033[33m Gelb\033[0m \033[93m Hellgelb (Bright-Gelb)\033[0m" echo -e "\033[34m Blau\033[0m \033[94m Hellblau (Bright-Blau)\033[0m" echo -e "\033[35m Magenta\033[0m \033[95m Hellmagenta (Bright-Magenta)\033[0m" echo -e "\033[36m Cyan\033[0m \033[96m Hellcyan (Bright-Cyan)\033[0m" echo -e "\033[37m Weiß\033[0m \033[97m Hellweiß (Bright-Weiß)\033[0m" echo " " echo -e "\n\033[1m Hintergrundfarben \033[0m" echo -e "\033[40m Schwarzer Hintergrund\033[0m \033[100m Heller schwarzer Hintergrund\033[0m" echo -e "\033[41m Roter Hintergrund\033[0m \033[101m Heller roter Hintergrund\033[0m" echo -e "\033[42m Grüner Hintergrund\033[0m \033[102m Heller grüner Hintergrund\033[0m" echo -e "\033[43m Gelber Hintergrund\033[0m \033[103m Heller gelber Hintergrund\033[0m" echo -e "\033[44m Blauer Hintergrund\033[0m \033[104m Heller blauer Hintergrund\033[0m" echo -e "\033[45m Magenta Hintergrund\033[0m \033[105m Heller magenta Hintergrund\033[0m" echo -e "\033[46m Cyan Hintergrund\033[0m \033[106m Heller cyan Hintergrund\033[0m" echo -e "\033[47m Weißer Hintergrund\033[0m \033[107m Heller weißer Hintergrund\033[0m" echo " " echo -e "\n\033[1m Kombinationen \033[0m" echo -e "\033[1;91;44m HELLROTER TEXT AUF BLAUEM HINTERGRUND \033[0m" echo -e "\033[4;93;105m UNTERSTRICHEN + HELLGELB AUF HELLMAGENTA \033[0m" echo " " } #?────────────────────────────────────────────────────────────────────────────────────────── #* Eingabeauswertung #?────────────────────────────────────────────────────────────────────────────────────────── case $KOMMANDO in servercheck) servercheck ;; createdirectory) createdirectory ;; mariasetup) mariasetup ;; sqlsetup) sqlsetup ;; setcrontab) setcrontab ;; opensimgitcopy|opensimgit) opensimgit ;; moneygitcopy|moneygit) moneygit ;; opensimbuild) opensimbuild ;; opensimcopy) opensimcopy ;; opensimupgrade) opensimupgrade ;; config_menu|configure|configureopensim) config_menu ;; # Die automatische konfiguration zu testzwecken. cleandoublecomments) cleandoublecomments ;; configclean|clean_comments_and_empty_lines) clean_comments_and_empty_lines ;; regionsconfig) regionsconfig ;; generatename|generate_name) generate_name ;; cleanconfig) clean_config "$2" ;; setrobusthg) setrobusthg ;; # Die automatische konfiguration zu testzwecken. setopensim) setopensim ;; # Die automatische konfiguration zu testzwecken. setgridcommon) setgridcommon ;; # Die automatische konfiguration zu testzwecken. setflotsamcache) setflotsamcache ;; # Die automatische konfiguration zu testzwecken. setosslenable) setosslenable ;; # Die automatische konfiguration zu testzwecken. setwelcome) setwelcome ;; # Die automatische konfiguration zu testzwecken. configall) configall ;; # Die automatische konfiguration zu testzwecken. autosetinstall) autosetinstall ;; start|opensimstart) opensimstart ;; stop|opensimstop) opensimstop ;; osrestart|autorestart|restart|opensimrestart) opensimrestart ;; standalone) standalone ;; standalonestart) standalonestart ;; standalonestop) standalonestop ;; standalonerestart) standalonerestart ;; reboot) reboot ;; check_screens) check_screens ;; dataclean) dataclean ;; pathclean) pathclean ;; cacheclean) cacheclean ;; logclean) logclean ;; mapclean) mapclean ;; autoallclean) autoallclean ;; regionsclean) regionsclean ;; cleanall) cleanall ;; renamefiles) renamefiles ;; # Die automatische konfiguration zu testzwecken. colortest) colortest ;; h|help|hilfe|*) help ;; esac # Programm Ende echo -e "\e[36m${SCRIPTNAME}\e[0m ${VERSION} wurde beendet $(date +'%Y-%m-%d %H:%M:%S')" >&2 exit 0