mirror of
https://github.com/ManfredAabye/opensimMULTITOOLS-II.git
synced 2026-07-30 02:32:22 +00:00
3740 lines
169 KiB
Bash
3740 lines
169 KiB
Bash
#!/bin/bash
|
||
# todo: PID Dateien vereinheitlichen für OpenSim.dll, Robust.dll und MoneyServer.dll.
|
||
# todo: Anfängergerechter machen wenn Parameter übergeben wurden abfrage übergehen.
|
||
#?──────────────────────────────────────────────────────────────────────────────────────────
|
||
#* Informationen Kopfzeile
|
||
#?──────────────────────────────────────────────────────────────────────────────────────────
|
||
# https://github.com/ManfredAabye/opensimMULTITOOLS-II/blob/main/osmtool.sh
|
||
|
||
tput reset # Bildschirmausgabe loeschen inklusive dem Scrollbereich.
|
||
SCRIPTNAME="opensimMULTITOOL II"
|
||
# Versionsnummer besteht aus: Jahr.Monat.Funktionsanzahl.Eigentliche_Version
|
||
VERSION="V25.4.70.265"
|
||
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
|
||
#?──────────────────────────────────────────────────────────────────────────────────────────
|
||
|
||
#* FARBDEFINITIONEN
|
||
COLOR_OK='\e[32m' # Grün (Haken)
|
||
COLOR_BAD='\e[31m' # Rot (Kreuz)
|
||
COLOR_HEADING='\e[97m' # Weiß (Überschriften)
|
||
COLOR_START='\e[92m' # Hellgrün (Startaktionen)
|
||
COLOR_STOP='\e[91m' # Hellrot (Stopaktionen)
|
||
COLOR_SERVER='\e[36m' # Cyan (Server/Verzeichnisse/IPs)
|
||
COLOR_DIR='\e[90m' # Grau (Pfade)
|
||
COLOR_LABEL='\e[97m' # Weiß (Beschriftungen)
|
||
COLOR_WARNING='\e[33m' # Gelb (Warnungen)
|
||
COLOR_VALUE='\e[36m' # Cyan für Werte
|
||
COLOR_ACTION='\e[92m' # Hellgrün für Aktionen
|
||
COLOR_RESET='\e[0m' # Farbreset
|
||
|
||
#* SYMBOLDEFINITIONEN
|
||
SYM_OK="${COLOR_OK}✓${COLOR_RESET}"
|
||
SYM_BAD="${COLOR_BAD}✗${COLOR_RESET}"
|
||
SYM_INFO="${COLOR_VALUE}☛${COLOR_RESET}" # Alternative: ▲ ● ◆ ☛ ⚑ ⓘ
|
||
SYM_WAIT="${COLOR_VALUE}⏳${COLOR_RESET}"
|
||
SYM_LOG="${COLOR_VALUE}📋${COLOR_RESET}"
|
||
COLOR_SECTION='\e[0;35m' # Magenta für Sektionsnamen
|
||
COLOR_FILE='\e[0;33m' # Gelb für Dateipfade
|
||
|
||
SYM_SYNC="${COLOR_VALUE}🔄${COLOR_RESET}" # Synchronisieren, Aktualisieren
|
||
SYM_TOOLS="${COLOR_VALUE}🛠️${COLOR_RESET}" # Werkzeuge, Einstellungen, Reparatur
|
||
SYM_FOLDER="${COLOR_VALUE}📂${COLOR_RESET}" # Verzeichnis, Dateien, Dokumente
|
||
SYM_CONFIG="${COLOR_VALUE}⚙️${COLOR_RESET}" # Einstellungen, System, Konfiguration
|
||
SYM_SCRIPT="${COLOR_VALUE}📜${COLOR_RESET}" # Skript, Dokument, Notizen
|
||
# shellcheck disable=SC2034
|
||
SYM_FILE="${COLOR_VALUE}📄${COLOR_RESET}" # Datei, Bericht
|
||
SYM_SERVER="${COLOR_VALUE}🖥️${COLOR_RESET}" # Server, Computer
|
||
SYM_CLEAN="${COLOR_VALUE}🧹${COLOR_RESET}" # Bereinigung, Aufräumen, Löschen
|
||
# shellcheck disable=SC2034
|
||
SYM_WARNING="${COLOR_VALUE}⚠${COLOR_RESET}" # Achtung, Gefahr, Hinweis
|
||
|
||
#* WARTEZEITEN muessen leider sein damit der Server nicht überfordert wird.
|
||
Simulator_Start_wait=15 # Sekunden
|
||
MoneyServer_Start_wait=30 # Sekunden
|
||
RobustServer_Start_wait=30 # Sekunden
|
||
Simulator_Stop_wait=15 # Sekunden
|
||
MoneyServer_Stop_wait=30 # Sekunden
|
||
RobustServer_Stop_wait=30 # Sekunden
|
||
|
||
function blankline() { echo " ";}
|
||
|
||
# Hauptpfad des Skripts automatisch setzen
|
||
SCRIPT_DIR="$(dirname "$(realpath "$0")")"
|
||
cd "$SCRIPT_DIR" || exit 1
|
||
system_ip=$(hostname -I | awk '{print $1}')
|
||
echo -e "${COLOR_LABEL}Das Arbeitsverzeichnis ist:${COLOR_RESET} ${COLOR_VALUE}$SCRIPT_DIR${COLOR_RESET}"
|
||
echo -e "${COLOR_LABEL}Ihre IP Adresse ist:${COLOR_RESET} ${COLOR_VALUE}$system_ip${COLOR_RESET}"
|
||
blankline
|
||
|
||
# Soll im Hypergrid Modus gearbeitet werden oder in einem Geschlossenen Grid?
|
||
function hypergrid() {
|
||
local modus="$1"
|
||
local robust_dir="$SCRIPT_DIR/robust/bin" # Korrekter Pfad zu Robust-Dateien
|
||
|
||
echo "Modus Einstellung"
|
||
|
||
if [[ "$modus" == "hypergrid" ]]; then
|
||
echo "Hypergrid Modus aktiviert."
|
||
|
||
# Prüfen ob Robust.HG.ini existiert
|
||
if [[ ! -f "$robust_dir/Robust.HG.ini" ]]; then
|
||
echo -e "${COLOR_BAD}FEHLER: Robust.HG.ini nicht gefunden in $robust_dir${COLOR_RESET}" >&2
|
||
return 1
|
||
fi
|
||
|
||
cp "$robust_dir/Robust.HG.ini" "$robust_dir/Robust.ini" || {
|
||
echo -e "${COLOR_BAD}FEHLER: Konnte Robust.HG.ini nicht kopieren${COLOR_RESET}" >&2
|
||
return 1
|
||
}
|
||
|
||
else
|
||
echo "Geschlossener Grid Modus aktiviert."
|
||
|
||
# Prüfen ob Robust.local.ini existiert
|
||
if [[ ! -f "$robust_dir/Robust.local.ini" ]]; then
|
||
echo -e "${COLOR_BAD}FEHLER: Robust.local.ini nicht gefunden in $robust_dir${COLOR_RESET}" >&2
|
||
return 1
|
||
fi
|
||
|
||
cp "$robust_dir/Robust.local.ini" "$robust_dir/Robust.ini" || {
|
||
echo -e "${COLOR_BAD}FEHLER: Konnte Robust.local.ini nicht kopieren${COLOR_RESET}" >&2
|
||
return 1
|
||
}
|
||
fi
|
||
|
||
echo -e "${COLOR_OK}Modus erfolgreich auf $modus gesetzt${COLOR_RESET}"
|
||
return 0
|
||
}
|
||
|
||
|
||
KOMMANDO=$1 # Eingabeauswertung fuer Funktionen.
|
||
|
||
#?──────────────────────────────────────────────────────────────────────────────────────────
|
||
#* 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)
|
||
|
||
echo -e "${COLOR_HEADING}🔍 Server-Kompatibilitätscheck wird durchgeführt...${COLOR_RESET}"
|
||
|
||
# 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 -e "${COLOR_LABEL}Server läuft mit:${COLOR_RESET} ${COLOR_SERVER}$os_id $os_version${COLOR_RESET}"
|
||
|
||
# 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"
|
||
else
|
||
echo -e "${SYM_BAD} ${COLOR_WARNING}Keine unterstützte Version für .NET gefunden!${COLOR_RESET}"
|
||
return 1
|
||
fi
|
||
|
||
# .NET-Installationsstatus prüfen
|
||
echo -e "${COLOR_HEADING}🔄 .NET Runtime-Überprüfung:${COLOR_RESET}"
|
||
|
||
if [[ "$os_id" == "arch" || "$os_id" == "manjaro" ]]; then
|
||
if ! pacman -Qi "$required_dotnet" >/dev/null 2>&1; then
|
||
echo -e "${SYM_OK} ${COLOR_ACTION}Installiere ${COLOR_SERVER}$required_dotnet${COLOR_RESET}..."
|
||
sudo pacman -S --noconfirm "$required_dotnet"
|
||
echo -e "${SYM_OK} ${COLOR_SERVER}$required_dotnet${COLOR_RESET} ${COLOR_ACTION}wurde erfolgreich installiert.${COLOR_RESET}"
|
||
else
|
||
echo -e "${SYM_OK} ${COLOR_SERVER}$required_dotnet${COLOR_RESET} ${COLOR_ACTION}ist bereits installiert.${COLOR_RESET}"
|
||
fi
|
||
else
|
||
if ! dpkg -s "$required_dotnet" >/dev/null 2>&1; then
|
||
echo -e "${SYM_OK} ${COLOR_ACTION}Installiere ${COLOR_SERVER}$required_dotnet${COLOR_RESET}..."
|
||
sudo apt-get install -y "$required_dotnet"
|
||
echo -e "${SYM_OK} ${COLOR_SERVER}$required_dotnet${COLOR_RESET} ${COLOR_ACTION}wurde erfolgreich installiert.${COLOR_RESET}"
|
||
else
|
||
echo -e "${SYM_OK} ${COLOR_SERVER}$required_dotnet${COLOR_RESET} ${COLOR_ACTION}ist bereits installiert.${COLOR_RESET}"
|
||
fi
|
||
fi
|
||
|
||
# Fehlende Pakete prüfen und installieren
|
||
required_packages=("git" "libc6" "libgcc-s1" "libgssapi-krb5-2" "libicu70" "liblttng-ust1" "libssl3" "libstdc++6" "libunwind8" "zlib1g" "libgdiplus" "zip" "screen")
|
||
|
||
echo -e "${COLOR_HEADING}📦 Überprüfe fehlende Pakete...${COLOR_RESET}"
|
||
for package in "${required_packages[@]}"; do
|
||
if [[ "$os_id" == "arch" || "$os_id" == "manjaro" ]]; then
|
||
if ! pacman -Qi "$package" >/dev/null 2>&1; then
|
||
echo -e "${SYM_OK} ${COLOR_ACTION}Installiere ${COLOR_SERVER}$package${COLOR_RESET}..."
|
||
sudo pacman -S --noconfirm "$package"
|
||
fi
|
||
else
|
||
if ! dpkg -s "$package" >/dev/null 2>&1; then
|
||
echo -e "${SYM_OK} ${COLOR_ACTION}Installiere ${COLOR_SERVER}$package${COLOR_RESET}..."
|
||
sudo apt-get install -y "$package"
|
||
fi
|
||
fi
|
||
done
|
||
|
||
echo -e "${SYM_OK} ${COLOR_HEADING}Alle benötigten Pakete wurden installiert.${COLOR_RESET}"
|
||
blankline
|
||
}
|
||
|
||
#?──────────────────────────────────────────────────────────────────────────────────────────
|
||
#* Start Stop Standalone
|
||
#?──────────────────────────────────────────────────────────────────────────────────────────
|
||
|
||
function standalonestart() {
|
||
cd opensim/bin || exit 1
|
||
screen -fa -S opensim -d -U -m dotnet OpenSim.dll
|
||
blankline
|
||
}
|
||
|
||
function standalonestop() {
|
||
screen -S opensim -p 0 -X stuff "shutdown^M"
|
||
blankline
|
||
}
|
||
|
||
#?──────────────────────────────────────────────────────────────────────────────────────────
|
||
#* Start Stop Grid
|
||
#?──────────────────────────────────────────────────────────────────────────────────────────
|
||
|
||
#* OpenSim starten (robust → money → sim1 bis sim999)
|
||
function opensimstart() {
|
||
echo -e "${SYM_WAIT} ${COLOR_START}Starte das Grid!${COLOR_RESET}"
|
||
|
||
# RobustServer starten
|
||
if [[ -d "robust/bin" && -f "robust/bin/Robust.dll" ]]; then
|
||
echo -e "${SYM_OK} ${COLOR_START}Starte ${COLOR_SERVER}RobustServer ${COLOR_RESET} ${COLOR_START}aus ${COLOR_DIR}robust/bin...${COLOR_RESET}"
|
||
cd robust/bin || exit 1
|
||
# -inifile=Robust.HG.ini
|
||
|
||
screen -fa -S robustserver -d -U -m dotnet Robust.dll
|
||
cd - >/dev/null 2>&1 || exit 1
|
||
sleep $RobustServer_Start_wait
|
||
else
|
||
echo -e "${SYM_BAD} ${COLOR_SERVER}RobustServer: ${COLOR_BAD}Robust.dll nicht gefunden.${COLOR_RESET} ${COLOR_START}Überspringe Start.${COLOR_RESET}"
|
||
fi
|
||
|
||
# MoneyServer starten
|
||
if [[ -f "robust/bin/MoneyServer.dll" ]]; then
|
||
echo -e "${SYM_OK} ${COLOR_START}Starte ${COLOR_SERVER}MoneyServer${COLOR_RESET} ${COLOR_START}aus ${COLOR_DIR}robust/bin...${COLOR_RESET}"
|
||
cd robust/bin || exit 1
|
||
screen -fa -S moneyserver -d -U -m dotnet MoneyServer.dll
|
||
cd - >/dev/null 2>&1 || exit 1
|
||
sleep $MoneyServer_Start_wait
|
||
else
|
||
echo -e "${SYM_BAD} ${COLOR_SERVER}MoneyServer: ${COLOR_BAD}MoneyServer.dll nicht gefunden.${COLOR_RESET} ${COLOR_START}Überspringe Start.${COLOR_RESET}"
|
||
fi
|
||
|
||
# Sim-Regionen starten
|
||
for ((i=1; i<=999; i++)); do
|
||
sim_dir="sim$i/bin"
|
||
if [[ -d "$sim_dir" && -f "$sim_dir/OpenSim.dll" ]]; then
|
||
echo -e "${SYM_OK} ${COLOR_START}Starte ${COLOR_SERVER}sim$i${COLOR_RESET} ${COLOR_START}aus ${COLOR_DIR}$sim_dir...${COLOR_RESET}"
|
||
cd "$sim_dir" || continue
|
||
screen -fa -S "sim$i" -d -U -m dotnet OpenSim.dll
|
||
cd - >/dev/null 2>&1 || continue
|
||
sleep $Simulator_Start_wait
|
||
fi
|
||
done
|
||
echo "OpenSim starten abgeschlossen."
|
||
blankline
|
||
}
|
||
|
||
#* OpenSim stoppen (sim999 bis sim1 → money → robust)
|
||
function opensimstop() {
|
||
echo -e "${SYM_WAIT} ${COLOR_STOP}Stoppe das Grid!${COLOR_RESET}"
|
||
|
||
# Sim-Regionen stoppen
|
||
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 -e "${SYM_OK} ${COLOR_STOP}Stoppe ${COLOR_SERVER}sim$i${COLOR_RESET} ${COLOR_STOP}...${COLOR_RESET}"
|
||
sleep $Simulator_Stop_wait
|
||
fi
|
||
done
|
||
|
||
# MoneyServer stoppen
|
||
if screen -list | grep -q "moneyserver"; then
|
||
echo -e "${SYM_OK} ${COLOR_STOP}Stoppe ${COLOR_SERVER}MoneyServer${COLOR_RESET} ${COLOR_STOP}...${COLOR_RESET}"
|
||
screen -S moneyserver -p 0 -X stuff "shutdown^M"
|
||
sleep $MoneyServer_Stop_wait
|
||
else
|
||
echo -e "${SYM_BAD} ${COLOR_SERVER}MoneyServer: ${COLOR_BAD}Läuft nicht.${COLOR_RESET} ${COLOR_STOP}Überspringe Stopp.${COLOR_RESET}"
|
||
fi
|
||
|
||
# RobustServer stoppen
|
||
if screen -list | grep -q "robust"; then
|
||
echo -e "${SYM_OK} ${COLOR_STOP}Stoppe ${COLOR_SERVER}RobustServer${COLOR_RESET} ${COLOR_STOP}...${COLOR_RESET}"
|
||
screen -S robustserver -p 0 -X stuff "shutdown^M"
|
||
sleep $RobustServer_Stop_wait
|
||
else
|
||
echo -e "${SYM_BAD} ${COLOR_SERVER}RobustServer: ${COLOR_BAD}Läuft nicht.${COLOR_RESET} ${COLOR_STOP}Überspringe Stopp.${COLOR_RESET}"
|
||
fi
|
||
echo "OpenSim stoppen abgeschlossen."
|
||
blankline
|
||
}
|
||
|
||
# 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 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 $Simulator_Start_wait
|
||
fi
|
||
fi
|
||
done
|
||
blankline
|
||
}
|
||
|
||
#?──────────────────────────────────────────────────────────────────────────────────────────
|
||
#* Erstellen eines OpenSimulators
|
||
#?──────────────────────────────────────────────────────────────────────────────────────────
|
||
|
||
function opensimgitcopy() {
|
||
echo -e "${COLOR_HEADING}🔄 OpenSimulator GitHub-Verwaltung${COLOR_RESET}"
|
||
|
||
echo -e "${COLOR_LABEL}Möchten Sie den OpenSimulator vom GitHub verwenden oder aktualisieren? (${COLOR_OK}[upgrade]${COLOR_LABEL}/new)${COLOR_RESET}"
|
||
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 -e "${COLOR_ACTION}Vorhandene OpenSimulator-Version wird gelöscht...${COLOR_RESET}"
|
||
rm -rf opensim
|
||
echo -e "${SYM_OK} ${COLOR_ACTION}Alte OpenSimulator-Version wurde erfolgreich entfernt.${COLOR_RESET}"
|
||
fi
|
||
|
||
echo -e "${COLOR_ACTION}OpenSimulator wird von GitHub geholt...${COLOR_RESET}"
|
||
git clone git://opensimulator.org/git/opensim opensim
|
||
echo -e "${SYM_OK} ${COLOR_ACTION}OpenSimulator wurde erfolgreich heruntergeladen.${COLOR_RESET}"
|
||
|
||
elif [[ "$user_choice" == "upgrade" ]]; then
|
||
if [[ -d "opensim/.git" ]]; then
|
||
echo -e "${SYM_OK} ${COLOR_ACTION}Repository gefunden. Aktualisiere mit 'git pull'...${COLOR_RESET}"
|
||
cd opensim || { echo -e "${SYM_BAD} ${COLOR_ERROR}Fehler: Kann nicht ins Verzeichnis wechseln!${COLOR_RESET}"; return 1; }
|
||
git pull origin master && echo -e "${COLOR_OK}✅ ${COLOR_ACTION}OpenSimulator erfolgreich aktualisiert!${COLOR_RESET}"
|
||
cd ..
|
||
else
|
||
echo -e "${COLOR_WARNING}⚠ ${COLOR_ACTION}OpenSimulator-Verzeichnis nicht gefunden. Klone Repository neu...${COLOR_RESET}"
|
||
git clone git://opensimulator.org/git/opensim opensim && echo -e "${COLOR_OK}✅ ${COLOR_ACTION}OpenSimulator erfolgreich heruntergeladen!${COLOR_RESET}"
|
||
fi
|
||
else
|
||
echo -e "${SYM_BAD} ${COLOR_ERROR}Abbruch: Keine Aktion durchgeführt.${COLOR_RESET}"
|
||
return 1
|
||
fi
|
||
|
||
# .NET-Version auswählen
|
||
echo -e "${COLOR_LABEL}Möchten Sie diese Version mit .NET 6 oder .NET 8 betreiben? (${COLOR_OK}[8]${COLOR_LABEL}/6)${COLOR_RESET}"
|
||
read -r dotnet_version
|
||
dotnet_version=${dotnet_version:-8}
|
||
|
||
if [[ "$dotnet_version" == "6" ]]; then
|
||
echo -e "${COLOR_ACTION}Wechsle zu .NET 6-Version...${COLOR_RESET}"
|
||
cd opensim || { echo -e "${SYM_BAD} ${COLOR_ERROR}Fehler: Verzeichnis 'opensim' nicht gefunden.${COLOR_RESET}"; return 1; }
|
||
git checkout dotnet6
|
||
echo -e "${SYM_OK} ${COLOR_ACTION}OpenSimulator wurde für .NET 6 umgebaut.${COLOR_RESET}"
|
||
else
|
||
echo -e "${SYM_OK} ${COLOR_ACTION}Standardmäßig wird .NET 8 verwendet.${COLOR_RESET}"
|
||
fi
|
||
blankline
|
||
}
|
||
|
||
function moneygitcopy() {
|
||
echo -e "${COLOR_HEADING}💰 MoneyServer GitHub-Verwaltung${COLOR_RESET}"
|
||
|
||
echo -e "${COLOR_LABEL}Möchten Sie den MoneyServer vom GitHub verwenden oder aktualisieren? (${COLOR_OK}[upgrade]${COLOR_LABEL}/new)${COLOR_RESET}"
|
||
read -r user_choice
|
||
user_choice=${user_choice:-upgrade}
|
||
|
||
if [[ "$user_choice" == "new" ]]; then
|
||
if [[ -d "opensimcurrencyserver" ]]; then
|
||
echo -e "${COLOR_ACTION}Vorhandene MoneyServer-Version wird gelöscht...${COLOR_RESET}"
|
||
rm -rf opensimcurrencyserver
|
||
echo -e "${SYM_OK} ${COLOR_ACTION}Alte MoneyServer-Version wurde erfolgreich entfernt.${COLOR_RESET}"
|
||
fi
|
||
echo -e "${COLOR_ACTION}MONEYSERVER: MoneyServer wird vom GIT geholt...${COLOR_RESET}"
|
||
git clone https://github.com/ManfredAabye/opensimcurrencyserver-dotnet.git opensimcurrencyserver
|
||
echo -e "${SYM_OK} ${COLOR_ACTION}MoneyServer wurde erfolgreich heruntergeladen.${COLOR_RESET}"
|
||
elif [[ "$user_choice" == "upgrade" ]]; then
|
||
if [[ -d "opensimcurrencyserver/.git" ]]; then
|
||
echo -e "${SYM_OK} ${COLOR_ACTION}Repository gefunden. Aktualisiere mit 'git pull'...${COLOR_RESET}"
|
||
cd opensimcurrencyserver || { echo -e "${SYM_BAD} ${COLOR_ERROR}Fehler: Kann nicht ins Verzeichnis wechseln!${COLOR_RESET}"; 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 -e "${COLOR_OK}✅ ${COLOR_ACTION}MoneyServer erfolgreich aktualisiert!${COLOR_RESET}"
|
||
|
||
cd ..
|
||
else
|
||
echo -e "${COLOR_WARNING}⚠ ${COLOR_ACTION}MoneyServer-Verzeichnis nicht gefunden. Klone Repository neu...${COLOR_RESET}"
|
||
git clone https://github.com/ManfredAabye/opensimcurrencyserver-dotnet.git opensimcurrencyserver && echo -e "${COLOR_OK}✅ ${COLOR_ACTION}MoneyServer erfolgreich heruntergeladen!${COLOR_RESET}"
|
||
fi
|
||
else
|
||
echo -e "${SYM_BAD} ${COLOR_ERROR}Abbruch: Keine Aktion durchgeführt.${COLOR_RESET}"
|
||
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 -e "${SYM_OK} ${COLOR_ACTION}MONEYSERVER: addon-modules wurde nach opensim kopiert${COLOR_RESET}"
|
||
else
|
||
echo -e "${SYM_BAD} ${COLOR_ERROR}MONEYSERVER: addon-modules existiert nicht${COLOR_RESET}"
|
||
fi
|
||
|
||
if [[ -d "opensimcurrencyserver/bin" ]]; then
|
||
cp -r opensimcurrencyserver/bin opensim/
|
||
echo -e "${SYM_OK} ${COLOR_ACTION}MONEYSERVER: bin wurde nach opensim kopiert${COLOR_RESET}"
|
||
else
|
||
echo -e "${SYM_BAD} ${COLOR_ERROR}MONEYSERVER: bin existiert nicht${COLOR_RESET}"
|
||
fi
|
||
|
||
blankline
|
||
return 0
|
||
}
|
||
|
||
#* Das ist erst halb fertig.
|
||
function ruthrothgit() {
|
||
# Schritt 1 das bereitstellen der Pakete zur weiteren bearbeitung.
|
||
echo -e "${COLOR_HEADING}👥 Ruth & Roth Avatar-Assets Vorbereitung${COLOR_RESET}"
|
||
|
||
base_dir="ruthroth"
|
||
mkdir -p "$base_dir"
|
||
|
||
declare -A repos=(
|
||
["Ruth2"]="https://github.com/ManfredAabye/Ruth2.git"
|
||
["Roth2"]="https://github.com/ManfredAabye/Roth2.git"
|
||
)
|
||
|
||
for avatar in "${!repos[@]}"; do
|
||
repo_url="${repos[$avatar]}"
|
||
target_dir="$avatar"
|
||
|
||
if [[ ! -d "$target_dir" ]]; then
|
||
echo -e " ${COLOR_ACTION}➜ Klone ${COLOR_SERVER}$avatar${COLOR_ACTION} von GitHub...${COLOR_RESET}"
|
||
git clone "$repo_url" "$target_dir" && echo -e " ${COLOR_OK}✅ ${COLOR_SERVER}$avatar${COLOR_RESET} ${COLOR_ACTION}wurde heruntergeladen.${COLOR_RESET}"
|
||
else
|
||
echo -e " ${COLOR_OK}✅ ${COLOR_SERVER}$avatar${COLOR_RESET} ${COLOR_ACTION}ist bereits vorhanden, überspringe Download.${COLOR_RESET}"
|
||
fi
|
||
|
||
# Kopiere nur die relevanten IAR-Dateien direkt nach ruthroth
|
||
echo -e " ${COLOR_ACTION}➜ Kopiere benötigte IAR-Dateien nach ${COLOR_DIR}$base_dir${COLOR_ACTION}...${COLOR_RESET}"
|
||
cp "$target_dir/Artifacts/IAR/"*.iar "$base_dir/" 2>/dev/null && echo -e " ${SYM_OK} IAR-Dateien von ${COLOR_SERVER}$avatar${COLOR_RESET} kopiert.${COLOR_RESET}"
|
||
done
|
||
|
||
# Kopiere das updatelibrary.py-Skript ins Hauptverzeichnis ruthroth
|
||
echo -e " ${COLOR_ACTION}➜ Kopiere updatelibrary.py nach ${COLOR_DIR}$base_dir${COLOR_ACTION}...${COLOR_RESET}"
|
||
cp "updatelibrary.py" "$base_dir/" && echo -e " ${SYM_OK} updatelibrary.py wurde kopiert.${COLOR_RESET}"
|
||
|
||
echo "Verzeichniswechsel in $base_dir"
|
||
|
||
# Wechsel ins ruthroth-Verzeichnis
|
||
cd "$base_dir" || { echo -e "${SYM_BAD} Fehler beim Wechsel ins Verzeichnis ${COLOR_DIR}$base_dir${COLOR_RESET}"; return 1; }
|
||
|
||
# Entpacke die IAR-Dateien direkt in ruthroth
|
||
echo -e " ${COLOR_ACTION}➜ Entpacke IAR-Pakete in ${COLOR_DIR}$base_dir${COLOR_ACTION}...${COLOR_RESET}"
|
||
for iar_file in *.iar; do
|
||
if [[ -f "$iar_file" ]]; then
|
||
target_dir="${iar_file%.iar}" # Erstellt Verzeichnisname basierend auf Dateiname ohne .iar
|
||
mkdir -p "$target_dir"
|
||
tar -xzf "$iar_file" -C "$target_dir/" && echo -e " ✓ ${iar_file} entpackt nach ${target_dir}"
|
||
else
|
||
echo -e " ⚠ IAR-Datei ${iar_file} nicht gefunden. Überspringe..."
|
||
fi
|
||
done
|
||
|
||
echo -e "${COLOR_OK}✅ ${COLOR_ACTION}Grundlage für die OpenSimulator-Pakete wurde erfolgreich erstellt!${COLOR_RESET}"
|
||
|
||
# Schritt 2 die verwendung von updatelibrary.py.
|
||
cd ruthroth
|
||
python3 updatelibrary.py -n "Roth2-v1" -s "Roth2-v1" -a Roth2-v1 -i Roth2-v1
|
||
python3 updatelibrary.py -n "Roth2-v2" -s "Roth2-v2" -a Roth2-v2 -i Roth2-v2
|
||
python3 updatelibrary.py -n "Ruth2-v3" -s "Ruth2-v3" -a Ruth2-v3 -i Ruth2-v3
|
||
python3 updatelibrary.py -n "Ruth2-v4" -s "Ruth2-v4" -a Ruth2-v4 -i Ruth2-v4
|
||
cd ..
|
||
# Schritt 3 das kopieren der Daten. Das einfügen der Daten in den Dateien ähnlich wie bei PBR.
|
||
|
||
}
|
||
|
||
|
||
function osslscriptsgit() {
|
||
echo -e "${COLOR_HEADING}📜 OSSL Beispiel-Skripte GitHub-Verwaltung${COLOR_RESET}"
|
||
|
||
echo -e "${COLOR_LABEL}Möchten Sie die OpenSim OSSL Beispiel-Skripte vom GitHub verwenden oder aktualisieren? (${COLOR_OK}[upgrade]${COLOR_LABEL}/new)${COLOR_RESET}"
|
||
read -r user_choice
|
||
user_choice=${user_choice:-upgrade}
|
||
|
||
repo_name="opensim-ossl-example-scripts"
|
||
repo_url="https://github.com/ManfredAabye/opensim-ossl-example-scripts.git"
|
||
|
||
if [[ "$user_choice" == "new" ]]; then
|
||
if [[ -d "$repo_name" ]]; then
|
||
echo -e "${COLOR_ACTION}Vorhandene Version wird gelöscht...${COLOR_RESET}"
|
||
rm -rf "$repo_name"
|
||
echo -e "${SYM_OK} ${COLOR_ACTION}Alte Version wurde erfolgreich entfernt.${COLOR_RESET}"
|
||
fi
|
||
echo -e "${COLOR_ACTION}Beispiel-Skripte werden vom GitHub heruntergeladen...${COLOR_RESET}"
|
||
git clone "$repo_url" "$repo_name" && echo -e "${SYM_OK} ${COLOR_ACTION}Repository wurde erfolgreich heruntergeladen.${COLOR_RESET}"
|
||
elif [[ "$user_choice" == "upgrade" ]]; then
|
||
if [[ -d "$repo_name/.git" ]]; then
|
||
echo -e "${SYM_OK} ${COLOR_ACTION}Repository gefunden. Aktualisiere mit 'git pull'...${COLOR_RESET}"
|
||
cd "$repo_name" || { echo -e "${SYM_BAD} ${COLOR_ERROR}Fehler beim Wechsel ins Verzeichnis!${COLOR_RESET}"; return 1; }
|
||
branch_name=$(git symbolic-ref refs/remotes/origin/HEAD | sed 's@^refs/remotes/origin/@@')
|
||
git pull origin "$branch_name" && echo -e "${COLOR_OK}✅ ${COLOR_ACTION}Repository erfolgreich aktualisiert.${COLOR_RESET}"
|
||
cd ..
|
||
else
|
||
echo -e "${COLOR_WARNING}⚠ ${COLOR_ACTION}Verzeichnis nicht gefunden oder kein Git-Repo. Klone Repository neu...${COLOR_RESET}"
|
||
git clone "$repo_url" "$repo_name" && echo -e "${COLOR_OK}✅ ${COLOR_ACTION}Repository wurde erfolgreich heruntergeladen.${COLOR_RESET}"
|
||
fi
|
||
else
|
||
echo -e "${SYM_BAD} ${COLOR_ERROR}Abbruch: Keine Aktion durchgeführt.${COLOR_RESET}"
|
||
return 1
|
||
fi
|
||
|
||
# Zielverzeichnisse erstellen falls nicht vorhanden
|
||
mkdir -p opensim/bin/assets/
|
||
mkdir -p opensim/bin/inventory/
|
||
|
||
# Kopieren der Verzeichnisse
|
||
if [[ -d "$repo_name/ScriptsAssetSet" ]]; then
|
||
cp -r "$repo_name/ScriptsAssetSet" opensim/bin/assets/
|
||
echo -e "${SYM_OK} ${COLOR_ACTION}ScriptsAssetSet wurde nach opensim/bin/assets kopiert.${COLOR_RESET}"
|
||
else
|
||
echo -e "${SYM_BAD} ${COLOR_ERROR}ScriptsAssetSet Verzeichnis nicht gefunden!${COLOR_RESET}"
|
||
fi
|
||
|
||
if [[ -d "$repo_name/inventory/ScriptsLibrary" ]]; then
|
||
cp -r "$repo_name/inventory/ScriptsLibrary" opensim/bin/inventory/
|
||
echo -e "${SYM_OK} ${COLOR_ACTION}ScriptsLibrary wurde nach opensim/bin/inventory kopiert.${COLOR_RESET}"
|
||
else
|
||
echo -e "${SYM_BAD} ${COLOR_ERROR}ScriptsLibrary Verzeichnis nicht gefunden!${COLOR_RESET}"
|
||
fi
|
||
|
||
blankline
|
||
return 0
|
||
}
|
||
|
||
# Es werden die Konfiguartionen jetzt auch geändert.
|
||
function pbrtexturesgit() {
|
||
echo -e "${COLOR_HEADING}🎨 PBR Texturen Installation${COLOR_RESET}"
|
||
|
||
textures_zip_url="https://github.com/ManfredAabye/OpenSim_PBR_Textures/releases/download/PBR/OpenSim_PBR_Textures.zip"
|
||
zip_file="OpenSim_PBR_Textures.zip"
|
||
unpacked_dir="OpenSim_PBR_Textures"
|
||
target_dir="opensim"
|
||
|
||
# ZIP herunterladen, wenn nicht vorhanden
|
||
if [[ ! -f "$zip_file" ]]; then
|
||
echo -e "${COLOR_ACTION}Lade OpenSim PBR Texturen herunter...${COLOR_RESET}"
|
||
if ! wget -q --show-progress -O "$zip_file" "$textures_zip_url"; then
|
||
echo -e "${SYM_BAD} ${COLOR_ERROR}Fehler beim Herunterladen der Texturen!${COLOR_RESET}"
|
||
return 1
|
||
fi
|
||
echo -e "${SYM_OK} ${COLOR_ACTION}Download abgeschlossen: ${COLOR_DIR}$zip_file${COLOR_RESET}"
|
||
else
|
||
echo -e "${SYM_OK} ${COLOR_ACTION}ZIP-Datei bereits vorhanden: ${COLOR_DIR}$zip_file${COLOR_RESET}"
|
||
fi
|
||
|
||
# Entpacken, wenn Verzeichnis noch nicht existiert
|
||
if [[ ! -d "$unpacked_dir" ]]; then
|
||
echo -e "${COLOR_ACTION}Entpacke Texturen nach ${COLOR_DIR}$unpacked_dir${COLOR_ACTION}...${COLOR_RESET}"
|
||
unzip -q "$zip_file" -d .
|
||
echo -e "${SYM_OK} ${COLOR_ACTION}Entpackt.${COLOR_RESET}"
|
||
else
|
||
echo -e "${SYM_OK} ${COLOR_ACTION}Verzeichnis ${COLOR_DIR}$unpacked_dir${COLOR_ACTION} existiert bereits – überspringe Entpacken.${COLOR_RESET}"
|
||
fi
|
||
|
||
# Kopieren nach opensim/bin
|
||
if [[ -d "$unpacked_dir/bin" ]]; then
|
||
echo -e "${COLOR_ACTION}Kopiere Texturen nach ${COLOR_DIR}$target_dir${COLOR_ACTION}...${COLOR_RESET}"
|
||
cp -r "$unpacked_dir/bin" "$target_dir"
|
||
echo -e "${SYM_OK} ${COLOR_ACTION}Texturen erfolgreich installiert in ${COLOR_DIR}$target_dir${COLOR_RESET}"
|
||
else
|
||
echo -e "${SYM_BAD} ${COLOR_ERROR}Verzeichnis ${COLOR_DIR}$unpacked_dir/bin${COLOR_ERROR} nicht gefunden!${COLOR_RESET}"
|
||
return 1
|
||
fi
|
||
|
||
local asset_sets_file="opensim/bin/assets/AssetSets.xml"
|
||
local libraries_file="opensim/bin/inventory/Libraries.xml"
|
||
|
||
# Funktion zur Überprüfung und Hinzufügung eines Eintrags
|
||
add_xml_section() {
|
||
local file="$1"
|
||
local section_name="$2"
|
||
local content="$3"
|
||
|
||
# Überprüfen ob der Abschnitt bereits existiert
|
||
if ! grep -q "<Section Name=\"$section_name\">" "$file"; then
|
||
# Abschnitt vor </Nini> einfügen
|
||
sed -i "s|</Nini>| <Section Name=\"$section_name\">\n$content\n </Section>\n</Nini>|" "$file"
|
||
echo "Added $section_name to $file"
|
||
else
|
||
echo "$section_name already exists in $file - no changes made"
|
||
fi
|
||
}
|
||
|
||
# AssetSets.xml bearbeiten
|
||
add_xml_section "$asset_sets_file" "PBR Textures AssetSet" \
|
||
" <Key Name=\"file\" Value=\"PBRTexturesAssetSet/PBRTexturesAssetSet.xml\"/>"
|
||
|
||
# Libraries.xml bearbeiten
|
||
add_xml_section "$libraries_file" "PBRTextures Library" \
|
||
" <Key Name=\"foldersFile\" Value=\"PBRTexturesLibrary/PBRTexturesLibraryFolders.xml\"/>\n <Key Name=\"itemsFile\" Value=\"PBRTexturesLibrary/PBRTexturesLibraryItems.xml\"/>"
|
||
|
||
blankline
|
||
return 0
|
||
}
|
||
|
||
function versionrevision() {
|
||
file="opensim/OpenSim/Framework/VersionInfo.cs"
|
||
|
||
if [[ ! -f "$file" ]]; then
|
||
echo -e "${SYM_BAD} ${COLOR_ERROR}Datei nicht gefunden: ${COLOR_DIR}$file${COLOR_RESET}"
|
||
return 1
|
||
fi
|
||
|
||
echo -e "${SYM_OK} ${COLOR_ACTION}Bearbeite Datei: ${COLOR_DIR}$file${COLOR_RESET}"
|
||
|
||
# Ändere Flavour.Dev zu Flavour.Extended
|
||
sed -i 's/public const Flavour VERSION_FLAVOUR = Flavour\.Dev;/public const Flavour VERSION_FLAVOUR = Flavour.Extended;/' "$file"
|
||
|
||
# Entferne "Nessie" aus dem Versions-String
|
||
sed -i 's/OpenSim {versionNumber} Nessie {flavour}/OpenSim {versionNumber} {flavour}/' "$file"
|
||
|
||
echo -e "${SYM_OK} ${COLOR_ACTION}Änderungen wurden erfolgreich vorgenommen.${COLOR_RESET}"
|
||
blankline
|
||
return 0
|
||
}
|
||
|
||
# Funktion zur Generierung von UUIDs
|
||
function generate_uuid() {
|
||
uuidgen | tr '[:upper:]' '[:lower:]'
|
||
}
|
||
|
||
function generate_all_name() {
|
||
# Arrays mit Namensbestandteilen (alle einzigartig)
|
||
local firstnames=(
|
||
# Vornamen
|
||
"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"
|
||
"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"
|
||
"Aether" "Runeweaver" "Dragonheart" "Moonshadow" "Spellbinder" "Witchbloom" "Grimoire" "Shadowalker" "Starborn" "Voidwhisper"
|
||
"Dreamwalker" "Fatesender" "Glyphborn" "Hollowveil" "Ivyroot" "Jadewhisper" "Kindlespark" "Lorekeeper" "Netherflame" "Oathbound"
|
||
"Pixieglen" "Quicksilver" "Ravenoak" "Silvershade" "Twilightthorn"
|
||
"Aerendyl" "Beltharion" "Celeborn" "Diorath" "Elrondar" "Faelivrin" "Galadhor" "Haldirion" "Ithilwen" "Jarathmel"
|
||
"Kelebrind" "Lothmiriel" "Melianthar" "Nimlothiel" "Oropherion" "Pelenor" "Quelamar" "Rivendell" "Silmarion" "Thranduvar"
|
||
"Ulmoen" "Vanyarion" "Windathar" "Xylanthir" "Yavanniel"
|
||
"Andromeda" "Beowulf" "Cybernova" "Deusex" "Eclipse" "Frostbyte" "Gigawatt" "Hyperion" "Io" "Jupiter"
|
||
"Krypton" "Lunarc" "Megatron" "Nebula" "Orion" "Pulsar" "Quantum" "Robodoc" "Starbuck" "Titan"
|
||
"Uranus" "Vortex" "Warpcore" "Xenon" "Zenith"
|
||
)
|
||
|
||
local lastnames=(
|
||
# Nachnamen
|
||
"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"
|
||
"River" "Stream" "Brook" "Creek" "Fjord" "Lagoon" "Estuary" "Delta" "Bayou" "Wetland"
|
||
"Oasis" "Geyser" "Spring" "Well" "Aquifer"
|
||
"Observatory" "Planetarium" "Orrery" "Reflectory" "Conservatory" "Atrium" "Rotunda" "Gazebo" "Pavilion" "Terrace"
|
||
"Ashenwood" "Bramblethorn" "Cliffhaven" "Dewspark" "Emberglade" "Frostvein" "Goldleaf" "Hailstone" "Ironbark" "Jasperridge"
|
||
"Kelpstrand" "Lavafall" "Mossgrip" "Nettlebrook" "Oakenshield" "Pinecrest" "Quartzpeak" "Rimefrost" "Stormbreak" "Tidepool"
|
||
"Umbravale" "Vinecreep" "Willowshade" "Xylem" "Yewroot"
|
||
"Aranel" "Beleriand" "Cirdan" "Doriath" "Eregion" "Fangorn" "Gondolin" "Hithlum" "Imladris" "Jarngard"
|
||
"Kementari" "Lorien" "Mirkwood" "Nargothrond" "Osgiliath" "Pelargir" "Quendi" "Rhosgobel" "Sindar" "Tirion"
|
||
"Undomiel" "Valinor" "Westfold" "Xandoria" "Yavanna"
|
||
"Axiom" "Borg" "Coruscant" "Dyson" "Expanse" "Federation" "Genesis" "Horizon" "Infinity" "Jovian"
|
||
"Kessel" "Lazarus" "Matrix" "Nostromo" "Outland" "Prometheus" "Quadrant" "Rapture" "Serenity" "Trifid"
|
||
"Umbra" "Voyager" "Weyland" "Xenomorph" "Zodiac"
|
||
)
|
||
|
||
# Namen für die Installation erstellen
|
||
# Benutzername Vorname Nachname
|
||
genFirstname="${firstnames[$RANDOM % ${#firstnames[@]}]}"
|
||
genLastname="${lastnames[$RANDOM % ${#lastnames[@]}]}"
|
||
# database_setup
|
||
genDatabaseUserName="${firstnames[$RANDOM % ${#firstnames[@]}]}${lastnames[$RANDOM % ${#lastnames[@]}]}$((RANDOM % 900 + 100))"
|
||
# Neue Region
|
||
genRegionName="${firstnames[$RANDOM % ${#firstnames[@]}]}${lastnames[$RANDOM % ${#lastnames[@]}]}$((RANDOM % 900 + 100))"
|
||
genGridName="${lastnames[$RANDOM % ${#lastnames[@]}]}Grid"
|
||
|
||
# Test Ausgabe der Variablen
|
||
#echo "genFirstname='${genFirstname}'"
|
||
#echo "genLastname='${genLastname}'"
|
||
#echo "genDatabaseUserName='${genDatabaseUserName}'"
|
||
#echo "genRegionName='${genRegionName}'"
|
||
#echo "genGridName='${genGridName}'"
|
||
}
|
||
generate_all_name
|
||
|
||
function opensimbuild() {
|
||
echo -e "${COLOR_HEADING}🏗️ OpenSimulator Build-Prozess${COLOR_RESET}"
|
||
|
||
echo -e "${COLOR_LABEL}Möchten Sie den OpenSimulator jetzt erstellen? (${COLOR_OK}[ja]${COLOR_LABEL}/nein)${COLOR_RESET}"
|
||
read -r user_choice
|
||
|
||
user_choice=${user_choice:-ja}
|
||
|
||
if [[ "$user_choice" == "ja" ]]; then
|
||
if [[ -d "opensim" ]]; then
|
||
cd opensim || { echo -e "${SYM_BAD} ${COLOR_ERROR}Fehler: Verzeichnis 'opensim' nicht gefunden.${COLOR_RESET}"; return 1; }
|
||
echo -e "${COLOR_ACTION}Starte Prebuild-Skript...${COLOR_RESET}"
|
||
bash runprebuild.sh
|
||
echo -e "${COLOR_ACTION}Baue OpenSimulator...${COLOR_RESET}"
|
||
dotnet build --configuration Release OpenSim.sln
|
||
echo -e "${SYM_OK} ${COLOR_ACTION}OpenSimulator wurde erfolgreich erstellt.${COLOR_RESET}"
|
||
else
|
||
echo -e "${SYM_BAD} ${COLOR_ERROR}OpenSim Build Fehler: Das Verzeichnis 'opensim' existiert nicht.${COLOR_RESET}"
|
||
return 1
|
||
fi
|
||
else
|
||
echo -e "${SYM_BAD} ${COLOR_ERROR}Abbruch: OpenSimulator wird nicht erstellt.${COLOR_RESET}"
|
||
fi
|
||
# Wer in ein Verzeichnis wechselt sollte auch wieder zur vorherigen Verzeichnis wechseln!
|
||
cd ..
|
||
blankline
|
||
}
|
||
|
||
#?──────────────────────────────────────────────────────────────────────────────────────────
|
||
#* Erstellen eines OpenSimulators Grids
|
||
#?──────────────────────────────────────────────────────────────────────────────────────────
|
||
|
||
function createdirectory() {
|
||
echo -e "${COLOR_HEADING}📂 Verzeichniserstellung${COLOR_RESET}"
|
||
|
||
echo -e "${COLOR_LABEL}Möchten Sie einen Gridserver oder einen Regionsserver erstellen? (${COLOR_OK}[grid]${COLOR_LABEL}/region)${COLOR_RESET}"
|
||
read -r server_type
|
||
|
||
# Standardmäßig Gridserver wählen, falls keine Eingabe erfolgt
|
||
server_type=${server_type:-grid}
|
||
|
||
if [[ "$server_type" == "grid" ]]; then
|
||
echo -e "${COLOR_ACTION}Erstelle robust Verzeichnis...${COLOR_RESET}"
|
||
mkdir -p robust/bin
|
||
echo -e "${SYM_OK} ${COLOR_ACTION}Robust Verzeichnis wurde erstellt.${COLOR_RESET}"
|
||
|
||
# Nach der Erstellung des Gridservers auch die Regionsserver erstellen lassen
|
||
echo -e "${COLOR_LABEL}Wie viele Regionsserver benötigen Sie? (${COLOR_OK}[1]${COLOR_RESET})"
|
||
read -r num_regions
|
||
# Standardmäßig 1 Region wählen, falls keine Eingabe erfolgt
|
||
num_regions=${num_regions:-1}
|
||
|
||
elif [[ "$server_type" == "region" ]]; then
|
||
echo -e "${COLOR_LABEL}Wie viele Regionsserver benötigen Sie?${COLOR_RESET}"
|
||
read -r num_regions
|
||
else
|
||
echo -e "${SYM_BAD} ${COLOR_ERROR}Ungültige Eingabe. Bitte geben Sie 'grid' oder 'region' ein.${COLOR_RESET}"
|
||
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 -e "${SYM_OK} ${COLOR_DIR}$dir_name${COLOR_RESET} ${COLOR_ACTION}wurde erstellt.${COLOR_RESET}"
|
||
else
|
||
echo -e "${SYM_OK} ${COLOR_DIR}$dir_name${COLOR_RESET} ${COLOR_WARNING}existiert bereits und wird übersprungen.${COLOR_RESET}"
|
||
fi
|
||
done
|
||
else
|
||
echo -e "${SYM_BAD} ${COLOR_ERROR}Ungültige Anzahl an Regionsserver. Bitte geben Sie eine gültige Zahl zwischen 1 und 999 ein.${COLOR_RESET}"
|
||
fi
|
||
blankline
|
||
}
|
||
|
||
function opensimcopy() {
|
||
echo -e "${COLOR_HEADING}📦 OpenSim Dateikopie${COLOR_RESET}"
|
||
|
||
# Prüfen, ob das Verzeichnis "opensim" existiert
|
||
if [[ ! -d "opensim" ]]; then
|
||
echo -e "${SYM_BAD} ${COLOR_ERROR}OpenSim Copy Fehler: Das Verzeichnis 'opensim' existiert nicht.${COLOR_RESET}"
|
||
return 1
|
||
fi
|
||
|
||
# Prüfen, ob das Unterverzeichnis "opensim/bin" existiert
|
||
if [[ ! -d "opensim/bin" ]]; then
|
||
echo -e "${SYM_BAD} ${COLOR_ERROR}OpenSim Copy Fehler: Das Verzeichnis 'opensim/bin' existiert nicht.${COLOR_RESET}"
|
||
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 -e "${SYM_OK} ${COLOR_ACTION}Dateien aus ${COLOR_DIR}opensim/bin${COLOR_RESET} ${COLOR_ACTION}wurden nach ${COLOR_DIR}robust/bin${COLOR_RESET} ${COLOR_ACTION}kopiert.${COLOR_RESET}"
|
||
else
|
||
echo -e "${COLOR_WARNING}⚠ ${COLOR_ACTION}Hinweis: 'robust' Verzeichnis nicht gefunden, keine Kopie durchgeführt.${COLOR_RESET}"
|
||
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 -e "${SYM_OK} ${COLOR_ACTION}Dateien aus ${COLOR_DIR}opensim/bin${COLOR_RESET} ${COLOR_ACTION}wurden nach ${COLOR_DIR}$sim_dir/bin${COLOR_RESET} ${COLOR_ACTION}kopiert.${COLOR_RESET}"
|
||
fi
|
||
done
|
||
|
||
blankline
|
||
}
|
||
|
||
function database_setup() {
|
||
echo -e "${COLOR_SECTION}=== MariaDB/MySQL Datenbank-Setup ===${COLOR_RESET}"
|
||
|
||
# 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" "centos" "fedora")
|
||
|
||
# 2. Support-Check
|
||
if ! printf '%s\n' "${supported_distros[@]}" | grep -q "^${current_distro}$"; then
|
||
echo -e "${SYM_BAD} ${COLOR_BAD}Nicht unterstützte Distribution: '${current_distro}'${COLOR_RESET}"
|
||
echo -e "${SYM_INFO} Unterstützt: ${supported_distros[*]}"
|
||
return 1
|
||
fi
|
||
|
||
# 3. Installation Check
|
||
if ! command -v mariadb &> /dev/null && ! command -v mysql &> /dev/null; then
|
||
echo -e "${SYM_WAIT} ${COLOR_WARNING}MariaDB/MySQL ist nicht installiert${COLOR_RESET}"
|
||
echo -ne "${COLOR_ACTION}MariaDB installieren? (j/n) [j] ${COLOR_RESET}"
|
||
read -r install_choice
|
||
install_choice=${install_choice:-j}
|
||
[[ "$install_choice" =~ ^[jJ] ]] || { echo -e "${SYM_BAD} Installation abgebrochen"; return 0; }
|
||
|
||
case $current_distro in
|
||
debian|ubuntu|*mint|pop|zorin|elementary|kali|mx|raspbian)
|
||
echo -e "${SYM_INFO} ${COLOR_ACTION}Installiere MariaDB...${COLOR_RESET}"
|
||
sudo apt-get update && sudo apt-get install -y mariadb-server ;;
|
||
centos|fedora)
|
||
echo -e "${SYM_INFO} ${COLOR_ACTION}Installiere MariaDB...${COLOR_RESET}"
|
||
sudo yum install -y mariadb-server
|
||
sudo systemctl start mariadb
|
||
sudo systemctl enable mariadb ;;
|
||
*) echo -e "${SYM_BAD} ${COLOR_BAD}Automatische Installation nicht verfügbar${COLOR_RESET}"; return 1 ;;
|
||
esac
|
||
sudo mysql_secure_installation
|
||
else
|
||
echo -e "${SYM_OK} ${COLOR_OK}MariaDB/MySQL ist bereits installiert${COLOR_RESET}"
|
||
fi
|
||
|
||
# 4. Benutzeranmeldedaten
|
||
echo -e "\n${COLOR_SECTION}=== Datenbank-Zugangsdaten ===${COLOR_RESET}"
|
||
echo -ne "${COLOR_ACTION}Zufallszugangsdaten verwenden? (j/n) [j] ${COLOR_RESET}"
|
||
read -r default_cred_choice
|
||
default_cred_choice=${default_cred_choice:-j}
|
||
|
||
if [[ "$default_cred_choice" =~ ^[jJ] ]]; then
|
||
# todo: Zufallsnamen erzeugen
|
||
#generate_all_name
|
||
db_user="${genDatabaseUserName}"
|
||
db_pass=$(tr -dc 'A-Za-z0-9!@#$%^&*()' < /dev/urandom | head -c 16)
|
||
echo -e "${SYM_INFO} ${COLOR_LABEL}Generiertes Passwort: ${COLOR_VALUE}${db_pass}${COLOR_RESET}"
|
||
else
|
||
echo -ne "${COLOR_ACTION}Benutzername: ${COLOR_RESET}"
|
||
read -r db_user
|
||
echo -ne "${COLOR_ACTION}Passwort: ${COLOR_RESET}"
|
||
read -rs db_pass
|
||
echo
|
||
fi
|
||
|
||
# 5. Datenbankeinrichtung
|
||
echo -e "\n${COLOR_SECTION}=== Datenbank-Konfiguration ===${COLOR_RESET}"
|
||
|
||
# RobustServer DB
|
||
if [[ -d "robust" ]]; then
|
||
if ! sudo mysql -e "USE robust" &> /dev/null; then
|
||
sudo mysql -e "CREATE DATABASE robust CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci"
|
||
echo -e "${SYM_OK} ${COLOR_VALUE}robust${COLOR_RESET} Datenbank angelegt"
|
||
else
|
||
echo -e "${SYM_INFO} ${COLOR_WARNING}robust-Datenbank existiert bereits${COLOR_RESET}"
|
||
fi
|
||
fi
|
||
|
||
# simX Server DBs
|
||
for ((i=1; i<=1000; i++)); do
|
||
if [[ -d "sim${i}" ]]; then
|
||
db_name="sim${i}"
|
||
if ! sudo mysql -e "USE ${db_name}" &> /dev/null; then
|
||
sudo mysql -e "CREATE DATABASE ${db_name} CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci"
|
||
echo -e "${SYM_OK} ${COLOR_VALUE}${db_name}${COLOR_RESET} Datenbank angelegt"
|
||
else
|
||
echo -e "${SYM_INFO} ${COLOR_WARNING}${db_name}-Datenbank existiert bereits${COLOR_RESET}"
|
||
fi
|
||
fi
|
||
done
|
||
|
||
# Benutzerverwaltung
|
||
if ! sudo mysql -e "SELECT user FROM mysql.user WHERE user='${db_user}' AND host='localhost'" | grep -q "${db_user}"; then
|
||
sudo mysql -e "CREATE USER '${db_user}'@'localhost' IDENTIFIED BY '${db_pass}'"
|
||
echo -e "${SYM_OK} ${COLOR_VALUE}${db_user}${COLOR_RESET} Benutzer angelegt"
|
||
else
|
||
echo -e "${SYM_INFO} ${COLOR_WARNING}Benutzer ${db_user} existiert bereits${COLOR_RESET}"
|
||
fi
|
||
|
||
# Rechte vergeben
|
||
[[ -d "robust" ]] && sudo mysql -e "GRANT ALL PRIVILEGES ON robust.* TO '${db_user}'@'localhost'"
|
||
for ((i=1; i<=1000; i++)); do
|
||
[[ -d "sim${i}" ]] && sudo mysql -e "GRANT ALL PRIVILEGES ON sim${i}.* TO '${db_user}'@'localhost'"
|
||
done
|
||
sudo mysql -e "FLUSH PRIVILEGES"
|
||
|
||
# 6. Zusammenfassung
|
||
echo -e "\n${COLOR_SECTION}=== Zusammenfassung ===${COLOR_RESET}"
|
||
echo -e "${COLOR_LABEL}Benutzername: ${COLOR_VALUE}${db_user}${COLOR_RESET}"
|
||
echo -e "${COLOR_LABEL}Passwort: ${COLOR_VALUE}${db_pass}${COLOR_RESET}"
|
||
|
||
if sudo mysql -e "SELECT user FROM mysql.user WHERE user='${db_user}' AND host='localhost'" | grep -q "${db_user}"; then
|
||
echo -e "${COLOR_LABEL}Berechtigungen:${COLOR_RESET}"
|
||
sudo mysql -e "SHOW GRANTS FOR '${db_user}'@'localhost'"
|
||
else
|
||
echo -e "${SYM_BAD} ${COLOR_WARNING}Benutzerberechtigungen nicht verfügbar${COLOR_RESET}"
|
||
fi
|
||
|
||
# Zugangsdaten speichern
|
||
echo -e "\n${SYM_LOG} ${COLOR_LABEL}Zugangsdaten gespeichert in: ${COLOR_FILE}${SCRIPT_DIR}/mariadb_passwords.txt${COLOR_RESET}"
|
||
echo "Benutzername: ${db_user} Passwort: ${db_pass}" | sudo tee "${SCRIPT_DIR}/mariadb_passwords.txt" >/dev/null
|
||
}
|
||
|
||
# bash osmtool.sh createmasteruser
|
||
function createmasteruser() {
|
||
# 24.04.2025 Master Avatar MasterAvatar
|
||
|
||
genPasswort=$(tr -dc 'A-Za-z0-9!@#$%^&*()' < /dev/urandom | head -c 16)
|
||
genUserid="${input:-$(uuidgen)}"
|
||
# Der Master User ist die zweithöchste Person nach System im Grid.
|
||
local VORNAME="${genFirstname}" # John → ${genFirstname}
|
||
local NACHNAME="${genLastname}" # Doe → ${genLastname}
|
||
local PASSWORT="${genPasswort}"
|
||
local EMAIL="${4:-${genFirstname}@${genLastname}.com}" # john@doe.com → ${genFirstname}@${genLastname}.com
|
||
local userid="${5:-$(uuidgen)}"
|
||
|
||
# Interaktive Benutzerabfrage mit Fallback auf generierte Werte
|
||
echo -e "${COLOR_INFO}Master User Erstellung (Enter für generierte Werte)${COLOR_RESET}"
|
||
|
||
echo -n "Vorname [${VORNAME}]: "
|
||
read -r input
|
||
VORNAME="${input:-$VORNAME}" # Fallback auf ${genFirstname}, wenn Eingabe leer
|
||
|
||
echo -n "Nachname [${NACHNAME}]: "
|
||
read -r input
|
||
NACHNAME="${input:-$NACHNAME}" # Fallback auf ${genLastname}, wenn Eingabe leer
|
||
|
||
echo -n "Passwort [${PASSWORT}]: "
|
||
read -r input
|
||
PASSWORT="${input:-$PASSWORT}" # Fallback auf ${genPasswort}, wenn Eingabe leer
|
||
|
||
echo -n "E-Mail [${EMAIL}]: " # Fallback Fantasiename
|
||
read -r input
|
||
EMAIL="${input:-$EMAIL}"
|
||
|
||
echo -n "UserID [${genUserid}]: " # Fallback Generierte UserID.
|
||
read -r input
|
||
userid="${input:-$genUserid}"
|
||
|
||
# Überprüfe ob Robust läuft
|
||
if ! screen -list | grep -q "robustserver"; then
|
||
echo -e "${COLOR_BAD}CREATEUSER: Robust existiert nicht oder läuft nicht${COLOR_RESET}"
|
||
return 1
|
||
fi
|
||
|
||
# Bestätigungsabfrage
|
||
echo -e "\n${COLOR_INFO}Zusammenfassung:${COLOR_RESET}"
|
||
echo "Vorname: $VORNAME"
|
||
echo "Nachname: $NACHNAME"
|
||
echo "Passwort: $PASSWORT"
|
||
echo "E-Mail: $EMAIL"
|
||
echo "UserID: $userid"
|
||
echo -e "${COLOR_WARNING}Wollen Sie den Benutzer wirklich anlegen? [J/n]${COLOR_RESET}"
|
||
read -r -n 1 confirmation
|
||
echo ""
|
||
|
||
if [[ "$confirmation" =~ [nN] ]]; then
|
||
echo -e "${COLOR_INFO}Abgebrochen${COLOR_RESET}"
|
||
return 0
|
||
fi
|
||
|
||
# create user [<first> [<last> [<pass> [<email> [<user id> [<model>]]]]]]
|
||
# Create a new user
|
||
# Befehlskette zur Benutzererstellung:
|
||
screen -S robustserver -p 0 -X eval "stuff 'create user'^M"
|
||
screen -S robustserver -p 0 -X eval "stuff '$VORNAME'^M" # Vorname
|
||
screen -S robustserver -p 0 -X eval "stuff '$NACHNAME'^M" # Nachname
|
||
screen -S robustserver -p 0 -X eval "stuff '$PASSWORT'^M" # Passwort
|
||
#screen -S robustserver -p 0 -X eval "stuff '128'^M" # locationX - Robust Fehler
|
||
#screen -S robustserver -p 0 -X eval "stuff '128'^M" # locationY - Robust Fehler
|
||
screen -S robustserver -p 0 -X eval "stuff '$EMAIL'^M" # E-Mail
|
||
screen -S robustserver -p 0 -X eval "stuff '$userid'^M" # User ID
|
||
screen -S robustserver -p 0 -X eval "stuff 'Ruth'^M" # Model name Ruth - Robust Fehler
|
||
#screen -S robustserver -p 0 -X eval "stuff 'set home'^M" # Home setzen - Robust Fehler
|
||
|
||
# [Estates]
|
||
#set_ini_key "$file" "Estates" "DefaultEstateName" "$gridname Estate"
|
||
#set_ini_key "$file" "Estates" "DefaultEstateOwnerName" "$VORNAME $NACHNAME"
|
||
#set_ini_key "$file" "Estates" "DefaultEstateOwnerUUID" "00000000-0000-0000-0000-000000000000"
|
||
#set_ini_key "$file" "Estates" "DefaultEstateOwnerEMail" "owner@domain.com"
|
||
#set_ini_key "$file" "Estates" "DefaultEstateOwnerPassword" "password"
|
||
|
||
# Setze DefaultEstateName, DefaultEstateOwnerName, DefaultEstateOwnerUUID, DefaultEstateOwnerEMail und DefaultEstateOwnerPassword in allen Simulatoren.
|
||
for ((i=1; i<=99; i++)); do
|
||
sim_dir="$SCRIPT_DIR/sim$i"
|
||
if [[ -d "$sim_dir/bin" ]]; then
|
||
local dir="$sim_dir/bin"
|
||
local file="$dir/OpenSim.ini"
|
||
|
||
if [[ -f "$file" ]]; then
|
||
# [Estates]
|
||
set_ini_key "$file" "Estates" "DefaultEstateName" "$gridname Estate"
|
||
set_ini_key "$file" "Estates" "DefaultEstateOwnerName" "$VORNAME $NACHNAME"
|
||
set_ini_key "$file" "Estates" "DefaultEstateOwnerUUID" "$userid"
|
||
set_ini_key "$file" "Estates" "DefaultEstateOwnerEMail" "$EMAIL"
|
||
set_ini_key "$file" "Estates" "DefaultEstateOwnerPassword" "$PASSWORT"
|
||
else
|
||
echo "Warnung: $file nicht gefunden!" >&2
|
||
fi
|
||
fi
|
||
done
|
||
|
||
echo -e "${COLOR_OK}Masteruser $VORNAME $NACHNAME wurde erstellt${COLOR_RESET}"
|
||
echo -e "${COLOR_INFO}UserID: $userid${COLOR_RESET}"
|
||
|
||
echo -e "\n${SYM_LOG} ${COLOR_LABEL}Benutzerdaten gespeichert in: ${COLOR_FILE}${SCRIPT_DIR}/userinfo.txt${COLOR_RESET}"
|
||
echo "Vorname: ${VORNAME} Nachname: ${NACHNAME} Passwort: ${PASSWORT} E-Mail: ${EMAIL} UserID: ${userid}" | sudo tee "${SCRIPT_DIR}/userinfo.txt" >/dev/null
|
||
|
||
echo " Der Fehler: Unable to set home for account - Ist ein Fehler in Robust der innerhalb des C# Sourcecode behoben werden muss."
|
||
echo "Das was wir machen müssen um diesen Fehler zu beheben ist im Viewer bei der Anmeldung eine Regionsnamen eingeben einer vorhandenen Region und Inworld dann Hier als zuhause auswählen."
|
||
blankline
|
||
}
|
||
|
||
function firststart() {
|
||
|
||
# RobustServer starten
|
||
if [[ -d "robust/bin" && -f "robust/bin/Robust.dll" ]]; then
|
||
echo -e "${SYM_OK} ${COLOR_START}Starte ${COLOR_SERVER}RobustServer ${COLOR_RESET} ${COLOR_START}aus ${COLOR_DIR}robust/bin...${COLOR_RESET}"
|
||
cd robust/bin || exit 1
|
||
# -inifile=Robust.HG.ini
|
||
|
||
screen -fa -S robustserver -d -U -m dotnet Robust.dll
|
||
cd - >/dev/null 2>&1 || exit 1
|
||
sleep $RobustServer_Start_wait
|
||
else
|
||
echo -e "${SYM_BAD} ${COLOR_SERVER}RobustServer: ${COLOR_BAD}Robust.dll nicht gefunden.${COLOR_RESET} ${COLOR_START}Überspringe Start.${COLOR_RESET}"
|
||
fi
|
||
|
||
# Master Avatar Registrieren.
|
||
createmasteruser
|
||
|
||
# Robust Starten
|
||
screen -S moneyserver -p 0 -X stuff "shutdown^M"
|
||
sleep $MoneyServer_Stop_wait
|
||
killall screen
|
||
|
||
blankline
|
||
#opensimrestart
|
||
#blankline
|
||
|
||
}
|
||
|
||
# bash osmtool.sh setcrontab
|
||
function setcrontab() {
|
||
# Strict Mode: Fehler sofort erkennen
|
||
set -euo pipefail
|
||
|
||
echo -e "${COLOR_HEADING}⏰ Cron-Job-Einrichtung (Interaktiv)${COLOR_RESET}"
|
||
|
||
# Sicherheitsabfrage: Nur als root/sudo ausführen
|
||
if [ "$(id -u)" -ne 0 ]; then
|
||
echo -e "${SYM_BAD} ${COLOR_ERROR}FEHLER: Dieses Skript benötigt root-Rechte! (sudo verwenden)${COLOR_RESET}" >&2
|
||
return 1
|
||
fi
|
||
|
||
# Prüfen, ob SCRIPT_DIR gesetzt und gültig ist
|
||
if [ -z "${SCRIPT_DIR:-}" ]; then
|
||
echo -e "${SYM_BAD} ${COLOR_ERROR}FEHLER: 'SCRIPT_DIR' muss gesetzt sein!${COLOR_RESET}" >&2
|
||
return 1
|
||
fi
|
||
|
||
if [ ! -d "$SCRIPT_DIR" ]; then
|
||
echo -e "${SYM_BAD} ${COLOR_ERROR}FEHLER: Verzeichnis '${COLOR_DIR}$SCRIPT_DIR${COLOR_ERROR}' existiert nicht!${COLOR_RESET}" >&2
|
||
return 1
|
||
fi
|
||
|
||
# Temporäre Datei für neue Cron-Jobs
|
||
local temp_cron
|
||
temp_cron=$(mktemp) || {
|
||
echo -e "${SYM_BAD} ${COLOR_ERROR}FEHLER: Temp-Datei konnte nicht erstellt werden.${COLOR_RESET}" >&2
|
||
return 1
|
||
}
|
||
|
||
### Interaktive Abfragen ###
|
||
echo -e "\n${COLOR_VALUE}=== Wartung am 1. des Monats ===${COLOR_RESET}"
|
||
echo -e "Welche Aktionen sollen ausgeführt werden? (Mehrfachauswahl möglich)"
|
||
echo -e " ${SYM_INFO} 1) Nichts (deaktivieren)"
|
||
echo -e " ${SYM_INFO} 2) cacheclean (inkl. automatischem stop vorher)"
|
||
echo -e " ${SYM_INFO} 3) mapclean (inkl. automatischem stop vorher)"
|
||
echo -e " ${SYM_INFO} 4) logclean (inkl. automatischem stop vorher)"
|
||
echo -e " ${SYM_INFO} 5) Vollständiger Neustart (stop → cacheclean → mapclean → logclean → reboot)"
|
||
echo -e " ${SYM_INFO} 6) Nur Server neustarten (reboot)"
|
||
read -r -p "Auswahl (z.B. '2 3' oder '5'): " -a monthly_actions
|
||
|
||
# Abfrage ob nach clean-Operationen ein reboot erfolgen soll
|
||
local needs_reboot=false
|
||
if [[ " ${monthly_actions[*]} " =~ [234] ]]; then
|
||
read -r -p "Soll nach den Clean-Operationen ein Neustart erfolgen? (j/n) " add_reboot
|
||
[[ "$add_reboot" =~ [jJ] ]] && needs_reboot=true
|
||
fi
|
||
|
||
echo -e "\n${COLOR_VALUE}=== Tägliche Wartung ===${COLOR_RESET}"
|
||
read -r -p "Soll ein täglicher Restart durchgeführt werden? (j/n) " daily_restart
|
||
if [[ "$daily_restart" =~ [jJ] ]]; then
|
||
read -r -p "Uhrzeit (Stunde, 0-23): " daily_hour
|
||
daily_hour=${daily_hour:-5} # Default: 5 Uhr
|
||
fi
|
||
|
||
echo -e "\n${COLOR_VALUE}=== Überwachung ===${COLOR_RESET}"
|
||
read -r -p "Soll die Überwachung aktiviert werden? (j/n) " enable_monitoring
|
||
if [[ "$enable_monitoring" =~ [jJ] ]]; then
|
||
read -r -p "Intervall in Minuten (Standard: 30): " monitor_interval
|
||
monitor_interval=${monitor_interval:-30}
|
||
fi
|
||
|
||
### Cron-Job-Generierung ###
|
||
{
|
||
echo "# === OpenSimGrid-Automatisierung ==="
|
||
echo "# Bedeutung: Minute Stunde Tag Monat Jahr Befehlskette"
|
||
echo ""
|
||
|
||
# Monatliche Wartung (1. des Monats)
|
||
if [[ " ${monthly_actions[*]} " =~ "1" ]]; then
|
||
echo "# Deaktiviert: Monatliche Wartung"
|
||
else
|
||
echo "# Monatliche Wartung am 1. des Monats"
|
||
|
||
# Berechnung der Minuten relativ zum täglichen Restart
|
||
local restart_hour=${daily_hour:-5}
|
||
local restart_minute=0
|
||
|
||
# Stop 30 Minuten vor täglichem Restart
|
||
if [[ " ${monthly_actions[*]} " =~ [2345] ]]; then
|
||
stop_time=$(calculate_relative_time "$restart_hour" $restart_minute -30)
|
||
echo "$stop_time 1 * * bash '$SCRIPT_DIR/osmtool.sh' stop"
|
||
fi
|
||
|
||
# Cacheclean 25 Minuten vor täglichem Restart (Option 2 oder 5)
|
||
if [[ " ${monthly_actions[*]} " =~ [25] ]]; then
|
||
cacheclean_time=$(calculate_relative_time "$restart_hour" $restart_minute -25)
|
||
echo "$cacheclean_time 1 * * bash '$SCRIPT_DIR/osmtool.sh' cacheclean"
|
||
fi
|
||
|
||
# Mapclean 20 Minuten vor täglichem Restart (Option 3 oder 5)
|
||
if [[ " ${monthly_actions[*]} " =~ [35] ]]; then
|
||
mapclean_time=$(calculate_relative_time "$restart_hour" $restart_minute -20)
|
||
echo "$mapclean_time 1 * * bash '$SCRIPT_DIR/osmtool.sh' mapclean"
|
||
fi
|
||
|
||
# Logclean 15 Minuten vor täglichem Restart (Option 4 oder 5)
|
||
if [[ " ${monthly_actions[*]} " =~ [45] ]]; then
|
||
logclean_time=$(calculate_relative_time "$restart_hour" $restart_minute -15)
|
||
echo "$logclean_time 1 * * bash '$SCRIPT_DIR/osmtool.sh' logclean"
|
||
fi
|
||
|
||
# Reboot 10 Minuten vor täglichem Restart (Option 5 oder 6 oder manuelle Bestätigung)
|
||
if [[ " ${monthly_actions[*]} " =~ [56] ]] || $needs_reboot; then
|
||
reboot_time=$(calculate_relative_time "$restart_hour" $restart_minute -10)
|
||
echo "$reboot_time 1 * * bash '$SCRIPT_DIR/osmtool.sh' reboot"
|
||
fi
|
||
fi
|
||
|
||
# Tägliche Wartung
|
||
if [[ "$daily_restart" =~ [jJ] ]]; then
|
||
echo -e "\n# Täglicher Restart"
|
||
echo "0 ${daily_hour} * * * bash '$SCRIPT_DIR/osmtool.sh' restart"
|
||
else
|
||
echo -e "\n# Deaktiviert: Täglicher Restart"
|
||
fi
|
||
|
||
# Überwachung
|
||
if [[ "$enable_monitoring" =~ [jJ] ]]; then
|
||
echo -e "\n# Überwachung"
|
||
echo "*/${monitor_interval} * * * * bash '$SCRIPT_DIR/osmtool.sh' check_screens"
|
||
else
|
||
echo -e "\n# Deaktiviert: Überwachung"
|
||
fi
|
||
} > "$temp_cron"
|
||
|
||
# Cron-Jobs installieren
|
||
if crontab "$temp_cron"; then
|
||
rm -f "$temp_cron"
|
||
echo -e "\n${SYM_OK} ${COLOR_OK}Cron-Jobs wurden aktualisiert:${COLOR_RESET}"
|
||
crontab -l | grep -v '^#' | sed '/^$/d' | while read -r line; do
|
||
echo -e "${COLOR_DIR}$line${COLOR_RESET}"
|
||
done
|
||
return 0
|
||
else
|
||
echo -e "${SYM_BAD} ${COLOR_ERROR}FEHLER: Installation fehlgeschlagen. Prüfe $temp_cron manuell.${COLOR_RESET}" >&2
|
||
return 1
|
||
fi
|
||
}
|
||
|
||
# Hilfsfunktion zur Berechnung relativer Zeiten
|
||
calculate_relative_time() {
|
||
local hour=$1
|
||
local minute=$2
|
||
local offset=$3 # in Minuten (kann negativ sein)
|
||
|
||
# Gesamtminuten berechnen
|
||
local total_minutes=$((hour * 60 + minute + offset))
|
||
|
||
# Handle negative Zeiten (vor Mitternacht)
|
||
while (( total_minutes < 0 )); do
|
||
total_minutes=$((total_minutes + 1440)) # 24 Stunden in Minuten
|
||
done
|
||
|
||
# Zurück in Stunden und Minuten umrechnen
|
||
local new_hour=$((total_minutes / 60 % 24))
|
||
local new_minute=$((total_minutes % 60))
|
||
|
||
echo "$new_minute $new_hour"
|
||
}
|
||
|
||
#?──────────────────────────────────────────────────────────────────────────────────────────
|
||
#* Upgrade des OpenSimulators Grids
|
||
#?──────────────────────────────────────────────────────────────────────────────────────────
|
||
|
||
function opensimupgrade() {
|
||
echo -e "\n${COLOR_WARNING}⚠ Der OpenSimulator muss zuerst im Verzeichnis 'opensim' vorliegen!${COLOR_RESET}"
|
||
echo -e "${COLOR_LABEL}Möchten Sie den OpenSimulator aktualisieren? (${COLOR_BAD}[no]${COLOR_LABEL}/yes)${COLOR_RESET}"
|
||
read -r user_choice
|
||
user_choice=${user_choice:-no}
|
||
|
||
# Prüfe, ob das Verzeichnis vorhanden ist
|
||
if [[ ! -d "opensim" ]]; then
|
||
echo -e "${SYM_BAD} ${COLOR_ERROR}Fehler: Das Verzeichnis '${COLOR_DIR}opensim${COLOR_ERROR}' existiert nicht${COLOR_RESET}"
|
||
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 "${SYM_BAD} ${COLOR_ERROR}Fehler: Benötigte Dateien (OpenSim.dll und/oder Robust.dll) fehlen im Verzeichnis '${COLOR_DIR}opensim/bin${COLOR_ERROR}'${COLOR_RESET}"
|
||
echo -e "\n${COLOR_WARNING}❓ Haben Sie vergessen den OpenSimulator zuerst zu Kompilieren?${COLOR_RESET}"
|
||
return 1
|
||
fi
|
||
|
||
if [[ "$user_choice" == "yes" ]]; then
|
||
echo -e "${COLOR_ACTION}OpenSimulator wird gestoppt...${COLOR_RESET}"
|
||
opensimstop
|
||
sleep $Simulator_Stop_wait
|
||
|
||
echo -e "${COLOR_ACTION}OpenSimulator wird kopiert...${COLOR_RESET}"
|
||
opensimcopy
|
||
|
||
echo -e "${COLOR_ACTION}OpenSimulator wird gestartet...${COLOR_RESET}"
|
||
opensimstart
|
||
|
||
echo -e "${COLOR_OK}✔ ${COLOR_ACTION}Upgrade abgeschlossen.${COLOR_RESET}"
|
||
else
|
||
echo -e "${COLOR_WARNING}Upgrade vom Benutzer abgebrochen.${COLOR_RESET}"
|
||
fi
|
||
blankline
|
||
}
|
||
|
||
#?──────────────────────────────────────────────────────────────────────────────────────────
|
||
#* Bereinigen des OpenSimulators Grids
|
||
#?──────────────────────────────────────────────────────────────────────────────────────────
|
||
|
||
function dataclean() {
|
||
echo -e "${COLOR_HEADING}🧹 Datenbereinigung wird durchgeführt...${COLOR_RESET}"
|
||
|
||
# RobustServer bereinigen
|
||
if [[ -d "robust/bin" ]]; then
|
||
echo -e "${SYM_OK} ${COLOR_ACTION}Lösche Dateien im RobustServer...${COLOR_RESET}"
|
||
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 -e "${SYM_OK} ${COLOR_ACTION}Lösche Dateien in ${COLOR_DIR}$sim_dir...${COLOR_RESET}"
|
||
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 "${COLOR_HEADING}✅ Datenbereinigung abgeschlossen${COLOR_RESET}"
|
||
blankline
|
||
}
|
||
|
||
function pathclean() {
|
||
directories=("assetcache" "maptiles" "MeshCache" "j2kDecodeCache" "ScriptEngines" "bakes" "addon-modules")
|
||
wildcard_dirs=("addin-db-*") # Separate Liste für Wildcard-Verzeichnisse
|
||
|
||
echo -e "${COLOR_HEADING}🗂️ Verzeichnisbereinigung wird durchgeführt...${COLOR_RESET}"
|
||
|
||
# RobustServer bereinigen
|
||
if [[ -d "robust/bin" ]]; then
|
||
echo -e "${SYM_OK} ${COLOR_ACTION}Lösche komplette Verzeichnisse im RobustServer...${COLOR_RESET}"
|
||
|
||
# Normale Verzeichnisse
|
||
for dir in "${directories[@]}"; do
|
||
target="robust/bin/$dir"
|
||
if [[ -d "$target" ]]; then
|
||
rm -rf "$target"
|
||
echo -e " ${COLOR_ACTION}Verzeichnis gelöscht: ${COLOR_DIR}$target${COLOR_RESET}"
|
||
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 -e " ${COLOR_WARNING}Verzeichnis gelöscht: ${COLOR_DIR}$target${COLOR_RESET}"
|
||
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 -e "${SYM_OK} ${COLOR_ACTION}Lösche komplette Verzeichnisse in ${COLOR_DIR}$sim_dir...${COLOR_RESET}"
|
||
|
||
# Normale Verzeichnisse
|
||
for dir in "${directories[@]}"; do
|
||
target="$sim_dir/$dir"
|
||
if [[ -d "$target" ]]; then
|
||
rm -rf "$target"
|
||
echo -e " ${COLOR_ACTION}Verzeichnis gelöscht: ${COLOR_DIR}$target${COLOR_RESET}"
|
||
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 -e " ${COLOR_WARNING}Verzeichnis gelöscht: ${COLOR_DIR}$target${COLOR_RESET}"
|
||
fi
|
||
done
|
||
done
|
||
fi
|
||
done
|
||
echo -e "${COLOR_HEADING}✅ Verzeichnisbereinigung abgeschlossen${COLOR_RESET}"
|
||
blankline
|
||
}
|
||
|
||
function cacheclean() {
|
||
#cache_dirs=("assetcache" "maptiles" "MeshCache" "j2kDecodeCache" "ScriptEngines")
|
||
cache_dirs=("assetcache" "MeshCache" "j2kDecodeCache" "ScriptEngines")
|
||
|
||
echo -e "${COLOR_HEADING}♻️ Cache-Bereinigung wird durchgeführt...${COLOR_RESET}"
|
||
|
||
# RobustServer bereinigen
|
||
if [[ -d "robust/bin" ]]; then
|
||
echo -e "${SYM_OK} ${COLOR_ACTION}Leere Cache-Verzeichnisse im RobustServer...${COLOR_RESET}"
|
||
for dir in "${cache_dirs[@]}"; do
|
||
target="robust/bin/$dir"
|
||
if [[ -d "$target" ]]; then
|
||
find "$target" -mindepth 1 -delete
|
||
echo -e " ${COLOR_ACTION}Inhalt geleert: ${COLOR_DIR}$target${COLOR_RESET}"
|
||
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 -e "${SYM_OK} ${COLOR_ACTION}Leere Cache-Verzeichnisse in ${COLOR_DIR}$sim_dir...${COLOR_RESET}"
|
||
for dir in "${cache_dirs[@]}"; do
|
||
target="$sim_dir/$dir"
|
||
if [[ -d "$target" ]]; then
|
||
find "$target" -mindepth 1 -delete
|
||
echo -e " ${COLOR_ACTION}Inhalt geleert: ${COLOR_DIR}$target${COLOR_RESET}"
|
||
fi
|
||
done
|
||
fi
|
||
done
|
||
echo -e "${COLOR_HEADING}✅ Cache-Bereinigung abgeschlossen${COLOR_RESET}"
|
||
blankline
|
||
}
|
||
|
||
function logclean() {
|
||
echo -e "${SYM_LOG}${COLOR_HEADING} Log-Bereinigung wird durchgeführt...${COLOR_RESET}"
|
||
|
||
# RobustServer bereinigen
|
||
if [[ -d "robust/bin" ]]; then
|
||
echo -e "${SYM_OK} ${COLOR_ACTION}Lösche Log-Dateien in ${COLOR_DIR}robust/bin...${COLOR_RESET}"
|
||
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 -e "${SYM_OK} ${COLOR_ACTION}Lösche Log-Dateien in ${COLOR_DIR}$sim_dir...${COLOR_RESET}"
|
||
rm -f "$sim_dir"/*.log
|
||
fi
|
||
done
|
||
|
||
echo -e "${COLOR_HEADING}Log-Bereinigung abgeschlossen${COLOR_RESET}"
|
||
blankline
|
||
}
|
||
|
||
function mapclean() {
|
||
echo -e "${COLOR_HEADING}🗺️ Map-Tile-Bereinigung wird durchgeführt...${COLOR_RESET}"
|
||
|
||
# Sicherheitscheck für robust/bin/maptiles
|
||
if [[ -d "robust/bin/maptiles" ]]; then
|
||
rm -rf -- "robust/bin/maptiles/"*
|
||
echo -e "${SYM_OK} ${COLOR_ACTION}robust/bin/maptiles geleert${COLOR_RESET}"
|
||
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 -e "${SYM_OK} ${COLOR_ACTION}${COLOR_DIR}$sim_dir${COLOR_RESET} ${COLOR_ACTION}geleert${COLOR_RESET}"
|
||
fi
|
||
done
|
||
|
||
echo -e "${COLOR_HEADING}✅ Map-Tile-Bereinigung abgeschlossen${COLOR_RESET}"
|
||
blankline
|
||
}
|
||
|
||
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
|
||
blankline
|
||
}
|
||
|
||
function clean_linux_logs() {
|
||
local log_files=()
|
||
echo -e "${COLOR_SECTION}${SYM_LOG} Suche nach alten Log-Dateien...${COLOR_RESET}"
|
||
|
||
# Find and list files to be deleted
|
||
while IFS= read -r -d $'\0' file; do
|
||
log_files+=("$file")
|
||
echo -e "${COLOR_FILE}${SYM_INFO} ${COLOR_LABEL}Gelöscht wird:${COLOR_RESET} ${COLOR_VALUE}$file${COLOR_RESET}"
|
||
done < <(find "/var/log" -name "*.log" -type f -mtime +7 -print0)
|
||
|
||
if [ ${#log_files[@]} -eq 0 ]; then
|
||
echo -e "${SYM_OK} ${COLOR_LABEL}Keine alten Log-Dateien gefunden.${COLOR_RESET}"
|
||
return 0
|
||
fi
|
||
|
||
echo -e "${COLOR_WARNING}${#log_files[@]} Log-Dateien werden gelöscht. Fortfahren? (j/N) ${COLOR_RESET}"
|
||
read -r confirm
|
||
case "${confirm,,}" in
|
||
j|ja|y|yes)
|
||
find "/var/log" -name "*.log" -type f -mtime +7 -delete
|
||
echo -e "${SYM_OK} ${COLOR_OK}${#log_files[@]} Log-Dateien wurden gelöscht.${COLOR_RESET}"
|
||
;;
|
||
*)
|
||
echo -e "${SYM_BAD} ${COLOR_BAD}Bereinigung abgebrochen.${COLOR_RESET}"
|
||
return 1
|
||
;;
|
||
esac
|
||
}
|
||
|
||
function delete_opensim() {
|
||
echo -e "${COLOR_HEADING}🗺️ Das komplette löschen vom OpenSimulator wird durchgeführt...${COLOR_RESET}"
|
||
|
||
# Sicherheitsabfrage hinzufügen
|
||
read -rp "Sind Sie sicher, dass Sie ALLE OpenSimulator-Daten löschen möchten? (ja/N) " answer
|
||
[[ ${answer,,} != "ja" ]] && { echo "Abbruch."; return 1; }
|
||
|
||
# Robust-Verzeichnis sicher löschen
|
||
if [[ -d "robust" ]]; then
|
||
rm -rf -- "robust" # Keine Wildcard mehr
|
||
echo -e "${SYM_OK} ${COLOR_ACTION}robust komplett entfernt${COLOR_RESET}"
|
||
fi
|
||
|
||
# Simulator-Verzeichnisse sicher löschen
|
||
for ((i=1; i<=999; i++)); do
|
||
local sim_dir="sim$i"
|
||
if [[ -d "$sim_dir" ]]; then
|
||
rm -rf -- "$sim_dir" # Keine Wildcard mehr
|
||
echo -e "${SYM_OK} ${COLOR_ACTION}${COLOR_DIR}$sim_dir${COLOR_RESET} ${COLOR_ACTION}komplett entfernt${COLOR_RESET}"
|
||
fi
|
||
done
|
||
|
||
echo -e "${COLOR_HEADING}✅ Das komplette löschen vom OpenSimulator abgeschlossen${COLOR_RESET}"
|
||
blankline
|
||
}
|
||
|
||
#?──────────────────────────────────────────────────────────────────────────────────────────
|
||
#* Konfigurationen
|
||
#?──────────────────────────────────────────────────────────────────────────────────────────
|
||
|
||
# [Abschnitt]
|
||
# Schlüssel = Wert
|
||
# ; Kommentar
|
||
# [Section]
|
||
# Key = Value
|
||
# ; Comment
|
||
|
||
# Überprüft, ob ein bestimmter Abschnitt (Section) in einer INI-Datei existiert, und gibt das Ergebnis als Exit-Code zurück.
|
||
# Aufruf: bash osmtool.sh verify_ini_section "test.ini" "Const"
|
||
# Letzte Prüfung am: 24.04.2025
|
||
function verify_ini_section() {
|
||
local file="$1"
|
||
local section="$2"
|
||
|
||
if [ ! -f "$file" ]; then
|
||
echo -e "${SYM_BAD} Error: File ${file} does not exist" >&2
|
||
return 2
|
||
fi
|
||
|
||
if grep -q "^\[${section}\]" "$file"; then
|
||
echo -e "${SYM_OK} Section [${section}] exists in ${file}"
|
||
return 0
|
||
else
|
||
echo -e "${SYM_BAD} Section [${section}] not found in ${file}"
|
||
return 1
|
||
fi
|
||
}
|
||
|
||
# Überprüft, ob ein bestimmten Wert (key) im Abschnitt (Section) in einer INI-Datei existiert, und gibt das Ergebnis als Exit-Code zurück.
|
||
# Aufruf: bash osmtool.sh verify_ini_key "test.ini" "DatabaseService" "Include-Storage"
|
||
# Letzte Prüfung am: 24.04.2025 Repariert: 24.04.2025
|
||
function verify_ini_key() {
|
||
local file="$1"
|
||
local section="$2"
|
||
local key="$3"
|
||
|
||
if [ ! -f "$file" ]; then
|
||
echo -e "${SYM_BAD} Error: File ${file} does not exist" >&2
|
||
return 2
|
||
fi
|
||
|
||
# Einfacher grep-Befehl, der Leerzeichen & Kommentare ignoriert
|
||
if grep -Eq "^[[:space:]]*\[${section}\][[:space:]]*$" "$file" && \
|
||
grep -Eq "^[[:space:]]*${key}[[:space:]]*=" "$file"; then
|
||
echo -e "${SYM_OK} Key '${key}' exists in section [${section}]"
|
||
return 0
|
||
else
|
||
echo -e "${SYM_BAD} Key '${key}' NOT FOUND in section [${section}]" >&2
|
||
return 1
|
||
fi
|
||
}
|
||
|
||
# Fügt einene Abschnitt hinzu, wenn es noch nicht vorhanden ist am ende der Datei.
|
||
# Aufruf: bash osmtool.sh add_ini_section "test.ini" "Const"
|
||
# Letzte Prüfung am: 24.04.2025
|
||
function add_ini_section() {
|
||
local file="$1"
|
||
local section="$2"
|
||
|
||
if verify_ini_section "$file" "$section" >/dev/null; then
|
||
return 0
|
||
fi
|
||
|
||
echo -e "${SYM_INFO} Adding section [${section}] to ${file}"
|
||
|
||
# Abschnitt am Ende der Datei hinzufügen
|
||
if printf "\n[%s]\n" "$section" >> "$file"; then
|
||
echo -e "${SYM_OK} Successfully added section [${section}] to ${file}"
|
||
return 0
|
||
else
|
||
echo -e "${SYM_BAD} Failed to add section [${section}] to ${file}" >&2
|
||
return 1
|
||
fi
|
||
}
|
||
|
||
# Fügt einene Abschnitt, wenn es noch nicht vorhanden ist vor dem Zielabschnitt hinzu.
|
||
# Also [Const] wird vor [DatabaseService] hinzugefügt.
|
||
# Aufruf: bash osmtool.sh add_ini_before_section "test.ini" "Const" "DatabaseService"
|
||
function add_ini_before_section() {
|
||
local file="$1"
|
||
local section="$2"
|
||
local target_section="$3" # Neuer Parameter für den Zielabschnitt
|
||
|
||
if verify_ini_section "$file" "$section" >/dev/null; then
|
||
return 0
|
||
fi
|
||
|
||
#echo -e "${SYM_INFO} Adding section [${section}] to ${file} before [${target_section}]"
|
||
|
||
# Temporäre Datei erstellen
|
||
temp_file=$(mktemp)
|
||
|
||
# Zielabschnitt suchen und neuen Abschnitt davor einfügen
|
||
local found=0
|
||
while IFS= read -r line; do
|
||
if [[ "$line" =~ ^\[${target_section}\] ]]; then
|
||
printf "[%s]\n\n" "$section" >> "$temp_file"
|
||
found=1
|
||
fi
|
||
echo "$line" >> "$temp_file"
|
||
done < "$file"
|
||
|
||
# Falls Zielabschnitt nicht gefunden, am Ende einfügen (Fallback)
|
||
if [[ $found -eq 0 ]]; then
|
||
printf "\n[%s]\n" "$section" >> "$temp_file"
|
||
echo -e "${SYM_WARNING} Target section [${target_section}] not found, appended [${section}] at end of file"
|
||
fi
|
||
|
||
# Originaldatei ersetzen
|
||
if mv "$temp_file" "$file"; then
|
||
echo -e "${SYM_OK} Successfully added section [${section}] to ${file}"
|
||
return 0
|
||
else
|
||
echo -e "${SYM_BAD} Failed to update ${file}" >&2
|
||
return 1
|
||
fi
|
||
}
|
||
|
||
# Setzt den Wert des Keys in der gegebenen Sektion
|
||
# bash osmtool.sh set_ini_key "test.ini" "Const" "GridSize" "256"
|
||
# [Const]
|
||
# GridSize = 256
|
||
#
|
||
# Wenn die Sektion oder der Key nicht vorhanden ist, wird er hinzugefügt.
|
||
# Falls der Key bereits vorhanden ist, wird der Wert aktualisiert.
|
||
function set_ini_key() {
|
||
local file="$1" section="$2" key="$3" value="$4"
|
||
local temp_file
|
||
temp_file=$(mktemp) || {
|
||
echo -e "${COLOR_BAD}Fehler beim Erstellen der temporären Datei${COLOR_RESET}" >&2
|
||
return 1
|
||
}
|
||
|
||
# Key für Regex absichern
|
||
local key_escaped
|
||
key_escaped=$(printf '%s\n' "$key" | sed 's/[]\/$*.^[]/\\&/g')
|
||
|
||
# Verarbeitung mit awk
|
||
awk -v section="[$section]" -v key="$key" -v value="$value" -v key_re="$key_escaped" '
|
||
BEGIN { in_section = 0; key_set = 0 }
|
||
|
||
{
|
||
trimmed = $0
|
||
sub(/^[[:space:]]+/, "", trimmed)
|
||
if (trimmed == section) {
|
||
print
|
||
in_section = 1
|
||
next
|
||
}
|
||
|
||
if (in_section && trimmed ~ /^\[.*\]/) {
|
||
if (!key_set) {
|
||
printf "%s = %s\n\n", key, value
|
||
key_set = 1
|
||
}
|
||
in_section = 0
|
||
}
|
||
|
||
if (in_section && $0 ~ "^[[:blank:]]*" key_re "[[:blank:]]*=") {
|
||
printf "%s = %s\n", key, value
|
||
key_set = 1
|
||
next
|
||
}
|
||
|
||
print
|
||
}
|
||
|
||
END {
|
||
if (in_section && !key_set) {
|
||
printf "%s = %s\n", key, value
|
||
} else if (!key_set) {
|
||
printf "\n[%s]\n%s = %s\n", section, key, value
|
||
}
|
||
}' "$file" > "$temp_file" || {
|
||
echo -e "${COLOR_BAD}AWK-Verarbeitung fehlgeschlagen${COLOR_RESET}" >&2
|
||
rm -f "$temp_file"
|
||
return 1
|
||
}
|
||
|
||
if ! mv "$temp_file" "$file"; then
|
||
echo -e "${COLOR_BAD}Konnte Datei ${COLOR_FILE}${file}${COLOR_RESET} nicht aktualisieren" >&2
|
||
rm -f "$temp_file"
|
||
return 1
|
||
fi
|
||
|
||
echo -e "${COLOR_OK}Gesetzt: ${COLOR_KEY}${key} = ${COLOR_VALUE}${value}${COLOR_OK} in [${section}]${COLOR_RESET}"
|
||
return 0
|
||
}
|
||
|
||
# Setze einen Key in einer INI-Datei
|
||
# Die INI-Datei wird nach dem Schlüssel durchsucht und der Key wird
|
||
# am passenden Ort eingefügt.
|
||
function add_ini_key() {
|
||
local file="$1" section="$2" key="$3" value="$4"
|
||
local temp_file
|
||
temp_file=$(mktemp) || {
|
||
echo -e "${COLOR_BAD}Failed to create temp file${COLOR_RESET}" >&2
|
||
return 1
|
||
}
|
||
|
||
# Verarbeitung mit awk
|
||
if ! awk -v section="[${section}]" -v key="$key" -v value="$value" '
|
||
BEGIN { in_section = 0; modified = 0 }
|
||
$0 == section { in_section = 1; print; next }
|
||
in_section && /^\[/ {
|
||
# Neue Sektion beginnt, Key einfügen (mit Leerzeichen um das =)
|
||
printf "%s = %s\n\n", key, value
|
||
modified = 1
|
||
in_section = 0
|
||
}
|
||
in_section && $0 ~ "^[[:blank:]]*" key "[[:blank:]]*=" {
|
||
# Existierenden Key ersetzen (mit Leerzeichen um das =)
|
||
printf "%s = %s\n", key, value
|
||
modified = 1
|
||
in_section = 0
|
||
next
|
||
}
|
||
{ print }
|
||
END {
|
||
if (!modified && in_section) {
|
||
# Am Ende der Sektion einfügen (mit Leerzeichen um das =)
|
||
printf "%s = %s\n", key, value
|
||
} else if (!modified) {
|
||
# Neue Sektion am Dateiende (mit Leerzeichen um das =)
|
||
printf "\n[%s]\n%s = %s\n", section, key, value
|
||
}
|
||
}
|
||
' "$file" > "$temp_file"; then
|
||
echo -e "${COLOR_BAD}AWK processing failed${COLOR_RESET}" >&2
|
||
rm -f "$temp_file"
|
||
return 1
|
||
fi
|
||
|
||
if ! mv "$temp_file" "$file"; then
|
||
echo -e "${COLOR_BAD}Failed to update ${COLOR_FILE}${file}${COLOR_RESET}" >&2
|
||
return 1
|
||
fi
|
||
|
||
echo -e "${COLOR_OK}Set ${COLOR_KEY}${key} = ${COLOR_VALUE}${value}${COLOR_OK} in [${section}]${COLOR_RESET}"
|
||
return 0
|
||
}
|
||
|
||
function del_ini_section() {
|
||
local file="$1"
|
||
local section="$2"
|
||
|
||
# Verifizieren ob der Abschnitt existiert (still, ohne Ausgabe)
|
||
if ! verify_ini_section "$file" "$section" >/dev/null; then
|
||
echo -e "${SYM_INFO} Section [${section}] not found in ${COLOR_FILE}${file}${COLOR_RESET}"
|
||
return 0
|
||
fi
|
||
|
||
echo -e "${SYM_INFO} Removing section [${COLOR_SECTION}${section}${COLOR_RESET}] from ${COLOR_FILE}${file}${COLOR_RESET}"
|
||
|
||
# Temporäre Datei mit Fehlerbehandlung
|
||
local temp_file
|
||
temp_file=$(mktemp) || {
|
||
echo -e "${SYM_BAD} Failed to create temporary file" >&2
|
||
return 1
|
||
}
|
||
|
||
# Abschnitt entfernen
|
||
if awk -v section="[${section}]" '
|
||
$0 == section { skip=1; next }
|
||
skip && /^\[/ { skip=0 }
|
||
!skip { print }
|
||
' "$file" > "$temp_file"; then
|
||
|
||
if mv "$temp_file" "$file"; then
|
||
echo -e "${SYM_OK} Successfully removed section [${COLOR_SECTION}${section}${COLOR_RESET}]"
|
||
return 0
|
||
else
|
||
echo -e "${SYM_BAD} Failed to update ${COLOR_FILE}${file}${COLOR_RESET}" >&2
|
||
rm -f "$temp_file"
|
||
return 1
|
||
fi
|
||
|
||
else
|
||
echo -e "${SYM_BAD} AWK processing failed" >&2
|
||
rm -f "$temp_file"
|
||
return 1
|
||
fi
|
||
}
|
||
|
||
function uncomment_ini_line() {
|
||
local file="$1"
|
||
local search_key="$2"
|
||
|
||
# Sicherheitsprüfungen
|
||
[ ! -f "$file" ] && { echo -e "${COLOR_BAD}Datei nicht gefunden: ${file}${COLOR_RESET}" >&2; return 1; }
|
||
[ -z "$search_key" ] && { echo -e "${COLOR_BAD}Suchschlüssel darf nicht leer sein${COLOR_RESET}" >&2; return 1; }
|
||
|
||
# Temporäre Datei erstellen
|
||
local temp_file
|
||
temp_file=$(mktemp) || { echo -e "${COLOR_BAD}Temp-Datei konnte nicht erstellt werden${COLOR_RESET}" >&2; return 1; }
|
||
|
||
# Entkommentieren der Zeile
|
||
sed -E "/^[[:space:]]*;[[:space:]]*${search_key}[[:space:]]*=/s/^[[:space:]]*;//" "$file" > "$temp_file" || {
|
||
rm -f "$temp_file"
|
||
echo -e "${COLOR_BAD}Sed-Verarbeitung fehlgeschlagen${COLOR_RESET}" >&2
|
||
return 1
|
||
}
|
||
|
||
# Originaldatei ersetzen
|
||
if mv "$temp_file" "$file"; then
|
||
echo -e "${COLOR_OK}Zeile '${search_key}' erfolgreich entkommentiert${COLOR_RESET}"
|
||
return 0
|
||
else
|
||
echo -e "${COLOR_BAD}Datei konnte nicht aktualisiert werden${COLOR_RESET}" >&2
|
||
return 1
|
||
fi
|
||
}
|
||
|
||
function uncomment_ini_section_line() {
|
||
local file="$1"
|
||
local section="$2"
|
||
local search_key="$3"
|
||
|
||
# Sicherheitsprüfungen
|
||
[ ! -f "$file" ] && { echo -e "${COLOR_BAD}Datei nicht gefunden: ${file}${COLOR_RESET}" >&2; return 1; }
|
||
[ -z "$section" ] && { echo -e "${COLOR_BAD}Sektion darf nicht leer sein${COLOR_RESET}" >&2; return 1; }
|
||
[ -z "$search_key" ] && { echo -e "${COLOR_BAD}Suchschlüssel darf nicht leer sein${COLOR_RESET}" >&2; return 1; }
|
||
|
||
# Temporäre Datei erstellen
|
||
local temp_file
|
||
temp_file=$(mktemp) || { echo -e "${COLOR_BAD}Temp-Datei konnte nicht erstellt werden${COLOR_RESET}" >&2; return 1; }
|
||
|
||
# Entkommentieren der Zeile in der richtigen Sektion
|
||
awk -v section="[$section]" -v key="$search_key" '
|
||
BEGIN { in_section = 0 }
|
||
$0 ~ "^\\[" section "\\]" { in_section = 1; print; next }
|
||
in_section && /^\[/ { in_section = 0 } # Sektion beendet
|
||
in_section && /^[[:space:]]*;[[:space:]]*"key"[[:space:]]*=[[:space:]]*/ {
|
||
sub(/^[[:space:]]*;/, "", $0)
|
||
}
|
||
{ print }
|
||
' "$file" > "$temp_file" || {
|
||
rm -f "$temp_file"
|
||
echo -e "${COLOR_BAD}AWK-Verarbeitung fehlgeschlagen${COLOR_RESET}" >&2
|
||
return 1
|
||
}
|
||
|
||
# Originaldatei ersetzen
|
||
if mv "$temp_file" "$file"; then
|
||
echo -e "${COLOR_OK}Zeile '${search_key}' in Sektion '${section}' erfolgreich entkommentiert${COLOR_RESET}"
|
||
return 0
|
||
else
|
||
echo -e "${COLOR_BAD}Datei konnte nicht aktualisiert werden${COLOR_RESET}" >&2
|
||
return 1
|
||
fi
|
||
}
|
||
function comment_ini_line() {
|
||
local file="$1"
|
||
local section="$2"
|
||
local search_key="$3"
|
||
|
||
# Sicherheitsprüfungen
|
||
[ ! -f "$file" ] && { echo -e "${COLOR_BAD}Datei nicht gefunden: ${file}${COLOR_RESET}" >&2; return 1; }
|
||
[ -z "$section" ] && { echo -e "${COLOR_BAD}Sektion darf nicht leer sein${COLOR_RESET}" >&2; return 1; }
|
||
[ -z "$search_key" ] && { echo -e "${COLOR_BAD}Suchschlüssel darf nicht leer sein${COLOR_RESET}" >&2; return 1; }
|
||
|
||
# Temporäre Datei erstellen
|
||
local temp_file
|
||
temp_file=$(mktemp) || { echo -e "${COLOR_BAD}Temp-Datei konnte nicht erstellt werden${COLOR_RESET}" >&2; return 1; }
|
||
|
||
# Zeile in der richtigen Sektion kommentieren
|
||
awk -v section="[$section]" -v key="$search_key" '
|
||
BEGIN { in_section = 0 }
|
||
$0 ~ "^\\[" section "\\]" { in_section = 1; print; next }
|
||
in_section && /^\[/ { in_section = 0 }
|
||
in_section && $0 ~ key && !/^[[:space:]]*;/ {
|
||
# Nur nicht bereits kommentierte Zeilen kommentieren
|
||
sub(/^[[:space:]]*/, "&;", $0)
|
||
print $0
|
||
next
|
||
}
|
||
{ print }
|
||
' "$file" > "$temp_file" || {
|
||
rm -f "$temp_file"
|
||
echo -e "${COLOR_BAD}AWK-Verarbeitung fehlgeschlagen${COLOR_RESET}" >&2
|
||
return 1
|
||
}
|
||
|
||
# Originaldatei ersetzen
|
||
if mv "$temp_file" "$file"; then
|
||
echo -e "${COLOR_OK}Zeile '${search_key}' in Sektion '${section}' erfolgreich kommentiert${COLOR_RESET}"
|
||
return 0
|
||
else
|
||
echo -e "${COLOR_BAD}Datei konnte nicht aktualisiert werden${COLOR_RESET}" >&2
|
||
return 1
|
||
fi
|
||
}
|
||
|
||
function clear_ini_section() {
|
||
local file="$1"
|
||
local section="$2"
|
||
|
||
# Sicherheitsprüfungen
|
||
[ ! -f "$file" ] && { echo -e "${COLOR_BAD}Datei nicht gefunden: ${file}${COLOR_RESET}" >&2; return 1; }
|
||
[ -z "$section" ] && { echo -e "${COLOR_BAD}Sektion darf nicht leer sein${COLOR_RESET}" >&2; return 1; }
|
||
|
||
# Temporäre Datei erstellen
|
||
local temp_file
|
||
temp_file=$(mktemp) || { echo -e "${COLOR_BAD}Temp-Datei konnte nicht erstellt werden${COLOR_RESET}" >&2; return 1; }
|
||
|
||
# AWK zum Leeren der Sektion (behält Header)
|
||
awk -v section="$section" '
|
||
BEGIN { in_section = 0 }
|
||
|
||
# Sektionsanfang erkennen
|
||
$0 ~ "^\\[" section "\\]" {
|
||
in_section = 1
|
||
print $0 # Header ausgeben
|
||
next
|
||
}
|
||
|
||
# Sektionsende erkennen
|
||
in_section && /^\[/ {
|
||
in_section = 0
|
||
}
|
||
|
||
# Innerhalb der Sektion: nichts ausgeben (löschen)
|
||
in_section { next }
|
||
|
||
# Außerhalb der Sektion: normale Ausgabe
|
||
{ print }
|
||
' "$file" > "$temp_file"
|
||
|
||
# Originaldatei ersetzen
|
||
if mv "$temp_file" "$file"; then
|
||
echo -e "${COLOR_OK}Sektion '[${section}]' erfolgreich geleert${COLOR_RESET}"
|
||
return 0
|
||
else
|
||
echo -e "${COLOR_BAD}Datei konnte nicht aktualisiert werden${COLOR_RESET}" >&2
|
||
return 1
|
||
fi
|
||
}
|
||
|
||
#?──────────────────────────────────────────────────────────────────────────────────────────
|
||
#* Konfigurationen der einzelnen Dienste
|
||
#?──────────────────────────────────────────────────────────────────────────────────────────
|
||
|
||
# [Abschnitt]
|
||
# Schlüssel = Wert
|
||
# ; Kommentar
|
||
# [Section]
|
||
# Key = Value
|
||
# ; Comment
|
||
|
||
# clean_gridname() {
|
||
# echo "$1" | sed -e 's/ä/ae/g' -e 's/ö/oe/g' -e 's/ü/ue/g' -e 's/ß/ss/g' \
|
||
# -e 's/[- &]/_/g' -e 's/__\+/_/g' -e 's/^_//' -e 's/_$//'
|
||
# }
|
||
|
||
# Alle Datenbanken konfigurieren.
|
||
function database_set_iniconfig() {
|
||
# 24.04.2025
|
||
local password_file="${SCRIPT_DIR}/mariadb_passwords.txt"
|
||
local section="DatabaseService"
|
||
|
||
# Zugangsdaten auslesen
|
||
local db_user db_pass
|
||
db_user=$(grep -oP 'Benutzername:\s*\K\S+' "$password_file")
|
||
db_pass=$(grep -oP 'Passwort:\s*\K\S+' "$password_file")
|
||
|
||
if [[ -z "$db_user" || -z "$db_pass" ]]; then
|
||
echo -e "${COLOR_BAD}Benutzername oder Passwort fehlt in mariadb_passwords.txt${COLOR_RESET}"
|
||
return 1
|
||
fi
|
||
|
||
# === Robust-Datenbanken ===
|
||
local db_database="robust"
|
||
local robust_conn="Data Source=localhost;Database=${db_database};User ID=${db_user};Password=${db_pass};Old Guids=true;SslMode=None;"
|
||
|
||
# Robust.HG.ini
|
||
local robust_hg_ini="robust/bin/Robust.HG.ini"
|
||
if [[ -f "$robust_hg_ini" ]]; then
|
||
add_ini_key "$robust_hg_ini" "$section" "ConnectionString" "\"$robust_conn\""
|
||
else
|
||
echo -e "${COLOR_WARNING}Datei nicht gefunden: $robust_hg_ini${COLOR_RESET}"
|
||
fi
|
||
|
||
# Robust.local.ini
|
||
local robust_ini="robust/bin/Robust.local.ini"
|
||
if [[ -f "$robust_ini" ]]; then
|
||
add_ini_key "$robust_ini" "$section" "ConnectionString" "\"$robust_conn\""
|
||
else
|
||
echo -e "${COLOR_WARNING}Datei nicht gefunden: $robust_ini${COLOR_RESET}"
|
||
fi
|
||
|
||
# === simX-Datenbanken ===
|
||
for ((i=1; i<=1000; i++)); do
|
||
local sim_ini="${SCRIPT_DIR}/sim${i}/bin/config-include/GridCommon.ini"
|
||
if [[ -f "$sim_ini" ]]; then
|
||
local sim_conn="Data Source=localhost;Database=sim${i};User ID=${db_user};Password=${db_pass};Old Guids=true;SslMode=None;"
|
||
add_ini_key "$sim_ini" "$section" "ConnectionString" "\"$sim_conn\""
|
||
fi
|
||
done
|
||
|
||
echo -e "${COLOR_OK}Datenbanken erfolgreich konfiguriert${COLOR_RESET}"
|
||
blankline
|
||
}
|
||
|
||
# Welcome-Region konfigurieren wenn sie noch nicht existiert.
|
||
function welcomeiniconfig() {
|
||
# 25.04.2025
|
||
local ip="$1"
|
||
local gridname="$2"
|
||
|
||
# Gridname bereinigen
|
||
gridname=$(echo "$gridname" | sed -e 's/ä/ae/g' -e 's/ö/oe/g' -e 's/ü/ue/g' -e 's/[-&]/_/g' -e 's/ */_/g' -e 's/__\+/_/g')
|
||
|
||
local welcome_ini="${SCRIPT_DIR}/sim1/bin/Regions/$gridname.ini"
|
||
|
||
# Überprüfen ob die Welcome-Region bereits existiert
|
||
if [[ -f "$welcome_ini" ]]; then
|
||
echo -e "${COLOR_INFO}Überspringe Erstellung der Welcome-Region: '$gridname.ini' existiert bereits${COLOR_RESET}"
|
||
# Vorsichtshalber Region in Robust-Konfigurationen eintragen.
|
||
set_ini_key "${SCRIPT_DIR}/robust/bin/Robust.HG.ini" "GridService" "Region_$gridname" "\"DefaultRegion, DefaultHGRegion, FallbackRegion\""
|
||
set_ini_key "${SCRIPT_DIR}/robust/bin/Robust.local.ini" "GridService" "Region_$gridname" "\"DefaultRegion, FallbackRegion\""
|
||
return
|
||
fi
|
||
|
||
# region_uuid=$(uuidgen)
|
||
region_uuid=$(command -v uuidgen >/dev/null && uuidgen || cat /proc/sys/kernel/random/uuid 2>/dev/null || echo "$RANDOM-$RANDOM-$RANDOM-$RANDOM")
|
||
|
||
# Datei erstellen
|
||
#touch "$welcome_ini"
|
||
#touch "$welcome_ini" || echo "" > "$welcome_ini"
|
||
touch "$welcome_ini" 2>/dev/null || echo "" > "$welcome_ini"
|
||
|
||
# 2. Sektion hinzufügen
|
||
add_ini_section "$welcome_ini" "$gridname"
|
||
|
||
# 3. Alle Key-Value Paare setzen
|
||
set_ini_key "$welcome_ini" "$gridname" "RegionUUID" "$region_uuid"
|
||
set_ini_key "$welcome_ini" "$gridname" "Location" "3000,3000"
|
||
set_ini_key "$welcome_ini" "$gridname" "SizeX" "256"
|
||
set_ini_key "$welcome_ini" "$gridname" "SizeY" "256"
|
||
set_ini_key "$welcome_ini" "$gridname" "SizeZ" "256"
|
||
set_ini_key "$welcome_ini" "$gridname" "InternalPort" "9015"
|
||
set_ini_key "$welcome_ini" "$gridname" "ExternalHostName" "$system_ip"
|
||
set_ini_key "$welcome_ini" "$gridname" "MaxPrims" "15000"
|
||
set_ini_key "$welcome_ini" "$gridname" "MaxAgents" "40"
|
||
set_ini_key "$welcome_ini" "$gridname" "MaptileStaticUUID" "$region_uuid"
|
||
set_ini_key "$welcome_ini" "$gridname" "InternalAddress" "0.0.0.0"
|
||
set_ini_key "$welcome_ini" "$gridname" "AllowAlternatePorts" "False"
|
||
|
||
set_ini_key "$welcome_ini" "$gridname" ";NonPhysicalPrimMax" "512"
|
||
set_ini_key "$welcome_ini" "$gridname" ";PhysicalPrimMax" "128"
|
||
set_ini_key "$welcome_ini" "$gridname" ";ClampPrimSize" "false"
|
||
set_ini_key "$welcome_ini" "$gridname" ";MaxPrimsPerUser" "-1"
|
||
set_ini_key "$welcome_ini" "$gridname" ";ScopeID" "$region_uuid"
|
||
set_ini_key "$welcome_ini" "$gridname" ";RegionType" "Mainland"
|
||
set_ini_key "$welcome_ini" "$gridname" ";RenderMinHeight" "-1"
|
||
set_ini_key "$welcome_ini" "$gridname" ";RenderMaxHeight" "100"
|
||
set_ini_key "$welcome_ini" "$gridname" ";MapImageModule" "Warp3DImageModule"
|
||
set_ini_key "$welcome_ini" "$gridname" ";TextureOnMapTile" "true"
|
||
set_ini_key "$welcome_ini" "$gridname" ";DrawPrimOnMapTile" "true"
|
||
set_ini_key "$welcome_ini" "$gridname" ";GenerateMaptiles" "true"
|
||
set_ini_key "$welcome_ini" "$gridname" ";MaptileRefresh" "0"
|
||
set_ini_key "$welcome_ini" "$gridname" ";MaptileStaticFile" "path/to/SomeFile.png"
|
||
set_ini_key "$welcome_ini" "$gridname" ";MasterAvatarFirstName" "John"
|
||
set_ini_key "$welcome_ini" "$gridname" ";MasterAvatarLastName" "Doe"
|
||
set_ini_key "$welcome_ini" "$gridname" ";MasterAvatarSandboxPassword" "passwd"
|
||
|
||
# 4. Region in Robust-Konfigurationen eintragen
|
||
# DefaultRegion, DefaultHGRegion, FallbackRegion, NoDirectLogin, Persistent, LockedOut, Reservation, NoMove, Authenticate
|
||
set_ini_key "${SCRIPT_DIR}/robust/bin/Robust.HG.ini" "GridService" "Region_$gridname" "\"DefaultRegion, DefaultHGRegion, FallbackRegion\""
|
||
set_ini_key "${SCRIPT_DIR}/robust/bin/Robust.local.ini" "GridService" "Region_$gridname" "\"DefaultRegion, FallbackRegion\""
|
||
|
||
echo -e "${COLOR_OK}Welcome_Area.ini Konfiguration abgeschlossen für $gridname${COLOR_RESET}"
|
||
blankline
|
||
}
|
||
|
||
function moneyserveriniconfig() {
|
||
local ip="$1"
|
||
local gridname="$2"
|
||
|
||
# Gridname bereinigen
|
||
gridname=$(echo "$gridname" | sed -e 's/ä/ae/g' -e 's/ö/oe/g' -e 's/ü/ue/g' -e 's/[-&]/_/g' -e 's/ */_/g' -e 's/__\+/_/g')
|
||
|
||
# Passwort aus Datei laden
|
||
local password_file="${SCRIPT_DIR}/mariadb_passwords.txt"
|
||
local db_user db_pass
|
||
db_user=$(grep -oP 'Benutzername:\s*\K\S+' "$password_file")
|
||
db_pass=$(grep -oP 'Passwort:\s*\K\S+' "$password_file")
|
||
|
||
# Falls keine Benutzer- und Passwortwerte gelesen wurden, abbrechen
|
||
if [[ -z "$db_user" || -z "$db_pass" ]]; then
|
||
echo "Fehler: Benutzername oder Passwort konnten nicht ausgelesen werden."
|
||
return 1
|
||
fi
|
||
|
||
local dir="$SCRIPT_DIR/robust/bin"
|
||
local file="$dir/MoneyServer.ini"
|
||
|
||
# Sicherstellen, dass die Vorlage existiert
|
||
if [[ ! -f "$file.example" ]]; then
|
||
echo "FEHLER: Konfigurationsvorlage '$file.example' fehlt!" >&2
|
||
exit 1
|
||
fi
|
||
|
||
# Kopieren der Vorlage
|
||
cp "$file.example" "$file" || {
|
||
echo "FEHLER: Konnte '$file' nicht erstellen" >&2
|
||
exit 1
|
||
}
|
||
|
||
# [Startup]
|
||
# /tmp/MoneyServer.exe.pid
|
||
set_ini_key "$file" "Startup" "PIDFile" "\"/tmp/MoneyServer.exe.pid\""
|
||
|
||
# [MySql]
|
||
set_ini_key "$file" "MySql" "hostname" "\"localhost\""
|
||
set_ini_key "$file" "MySql" "database" "\"robust\""
|
||
set_ini_key "$file" "MySql" "username" "\"$db_user\""
|
||
set_ini_key "$file" "MySql" "password" "\"$db_pass\""
|
||
set_ini_key "$file" "MySql" "pooling" "\"true\""
|
||
set_ini_key "$file" "MySql" "port" "\"3306\""
|
||
set_ini_key "$file" "MySql" "MaxConnection" "\"25\""
|
||
|
||
# [MoneyServer]
|
||
set_ini_key "$file" "MoneyServer" "ServerPort" "\"8008\""
|
||
set_ini_key "$file" "MoneyServer" "CurrencyOnOff" "\"on\""
|
||
set_ini_key "$file" "MoneyServer" "CurrencyMaximum" "\"20000\""
|
||
set_ini_key "$file" "MoneyServer" "MoneyServerIPaddress" "\"http://$ip:8008\""
|
||
set_ini_key "$file" "MoneyServer" "DefaultBalance" "\"1000\""
|
||
|
||
# [Certificate]
|
||
set_ini_key "$file" "Certificate" "CheckClientCert" "\"false\""
|
||
set_ini_key "$file" "Certificate" "CheckServerCert" "\"false\""
|
||
|
||
echo -e "${COLOR_OK}MoneyServer.ini Konfiguration abgeschlossen${COLOR_RESET}"
|
||
blankline
|
||
}
|
||
|
||
# Konfiguriert OpenSim.ini für alle sim1 bis sim99-Verzeichnisse
|
||
function opensiminiconfig() {
|
||
# 24.04.2025
|
||
local ip="$1"
|
||
local gridname="$2"
|
||
local base_port=9010
|
||
local sim_counter=1
|
||
|
||
# Gridname bereinigen
|
||
gridname=$(echo "$gridname" | sed -e 's/ä/ae/g' -e 's/ö/oe/g' -e 's/ü/ue/g' -e 's/[-&]/_/g' -e 's/ */_/g' -e 's/__\+/_/g')
|
||
|
||
# Iteration über alle sim1 bis sim99 Verzeichnisse
|
||
for i in $(seq 1 99); do
|
||
sim_dir="$SCRIPT_DIR/sim$i"
|
||
if [[ -d "$sim_dir/bin" ]]; then
|
||
local dir="$sim_dir/bin"
|
||
local file="$dir/OpenSim.ini"
|
||
|
||
if [[ ! -f "$file.example" ]]; then
|
||
echo "FEHLER: Konfigurationsvorlage '$file.example' fehlt!" >&2
|
||
echo "Das Programm benötigt diese Datei zum Starten." >&2
|
||
exit 1 # Programm mit Fehlercode beenden
|
||
fi
|
||
|
||
# Nur wenn Vorlage existiert: Kopieren
|
||
cp "$file.example" "$file" || {
|
||
echo "FEHLER: Konnte '$file' nicht erstellen" >&2
|
||
exit 1
|
||
}
|
||
|
||
echo -e "${COLOR_INFO}Konfiguriere OpenSim.ini in $dir${COLOR_RESET}"
|
||
|
||
# Portberechnung pro Instanz
|
||
local public_port=$((base_port + (sim_counter - 1) * 100))
|
||
|
||
# Werte setzen
|
||
# [Const]
|
||
set_ini_key "$file" "Const" "BaseHostname" "$ip"
|
||
set_ini_key "$file" "Const" "PublicPort" "8002"
|
||
|
||
# [Startup]
|
||
#uncomment_ini_section_line "$file" "Startup" "PIDFile"
|
||
set_ini_key "$file" "Startup" "PIDFile" "\"/tmp/OpenSim.$i.exe.pid\""
|
||
|
||
# [Estates]
|
||
#set_ini_key "$file" "Estates" "DefaultEstateName" "$gridname Estate"
|
||
#set_ini_key "$file" "Estates" "DefaultEstateOwnerName" "$VORNAME $NACHNAME"
|
||
|
||
# [Network]
|
||
# http_listener_port = 9010
|
||
uncomment_ini_section_line "$file" "Network" "http_listener_port"
|
||
set_ini_key "$file" "Network" "http_listener_port" "$public_port"
|
||
|
||
# [SimulatorFeatures]
|
||
uncomment_ini_line "$file" "SearchServerURI"
|
||
|
||
# [ClientStack.LindenUDP] Begrenzt die Viewer damit sie die Server leistung nicht kippen können.
|
||
set_ini_key "$file" "ClientStack.LindenUDP" "DisableFacelights" "true"
|
||
# 10.000.000 bps = 10 Mbit/s pro Client gute Einstellung ist "350.000" bis "500.000"
|
||
set_ini_key "$file" "ClientStack.LindenUDP" "client_throttle_max_bps" "350000"
|
||
# 10.000.000 bps = 10 Mbit/s pro Region "70.000.000" gute Einstellung ist "70.000.000" bis "1.000.000.000"
|
||
set_ini_key "$file" "ClientStack.LindenUDP" "scene_throttle_max_bps" "70000000"
|
||
|
||
# [SimulatorFeatures]
|
||
set_ini_key "$file" "SimulatorFeatures" "SearchServerURI" "\${Const|BaseURL}:\${Const|PublicPort}"
|
||
set_ini_key "$file" "SimulatorFeatures" "DestinationGuideURI" "\${Const|BaseURL}:\${Const|PublicPort}"
|
||
|
||
# [Messaging]
|
||
set_ini_key "$file" "Messaging" "OfflineMessageModule" "Offline Message Module V2"
|
||
set_ini_key "$file" "Messaging" "OfflineMessageURL" "\${Const|PrivURL}:\${Const|PrivatePort}"
|
||
set_ini_key "$file" "Messaging" "StorageProvider" "OpenSim.Data.MySQL.dll"
|
||
set_ini_key "$file" "Messaging" "MuteListModule" "MuteListModule"
|
||
set_ini_key "$file" "Messaging" "ForwardOfflineGroupMessages" "true"
|
||
|
||
# [Materials]
|
||
set_ini_key "$file" "Materials" "MaxMaterialsPerTransaction" "250"
|
||
|
||
# [DataSnapshot]
|
||
set_ini_key "$file" "DataSnapshot" "gridname" "$gridname"
|
||
|
||
# [Economy]
|
||
set_ini_key "$file" "Economy" "SellEnabled" "true"
|
||
set_ini_key "$file" "Economy" "EconomyModule" "DTLNSLMoneyModule"
|
||
set_ini_key "$file" "Economy" "CurrencyServer" "\${Const|BaseURL}:8008/"
|
||
set_ini_key "$file" "Economy" "UserServer" "\${Const|BaseURL}:8002/"
|
||
set_ini_key "$file" "Economy" "CheckServerCert" "false"
|
||
set_ini_key "$file" "Economy" "PriceUpload" "0"
|
||
set_ini_key "$file" "Economy" "MeshModelUploadCostFactor" "1.0"
|
||
set_ini_key "$file" "Economy" "MeshModelUploadTextureCostFactor" "1.0"
|
||
set_ini_key "$file" "Economy" "MeshModelMinCostFactor" "1.0"
|
||
set_ini_key "$file" "Economy" "CheckServerCert" "false"
|
||
set_ini_key "$file" "Economy" "PriceUpload" "0"
|
||
set_ini_key "$file" "Economy" "MeshModelUploadCostFactor" "1.0"
|
||
set_ini_key "$file" "Economy" "MeshModelUploadTextureCostFactor" "1.0"
|
||
set_ini_key "$file" "Economy" "MeshModelMinCostFactor" "1.0"
|
||
set_ini_key "$file" "Economy" "PriceGroupCreate" "0"
|
||
set_ini_key "$file" "Economy" "ObjectCount" "0"
|
||
set_ini_key "$file" "Economy" "PriceEnergyUnit" "0"
|
||
set_ini_key "$file" "Economy" "PriceObjectClaim" "0"
|
||
set_ini_key "$file" "Economy" "PricePublicObjectDecay" "0"
|
||
set_ini_key "$file" "Economy" "PricePublicObjectDelete" "0"
|
||
set_ini_key "$file" "Economy" "PriceParcelClaim" "0"
|
||
set_ini_key "$file" "Economy" "PriceParcelClaimFactor" "1"
|
||
set_ini_key "$file" "Economy" "PriceRentLight" "0"
|
||
set_ini_key "$file" "Economy" "TeleportMinPrice" "0"
|
||
set_ini_key "$file" "Economy" "TeleportPriceExponent" "2"
|
||
set_ini_key "$file" "Economy" "EnergyEfficiency" "1"
|
||
set_ini_key "$file" "Economy" "PriceObjectRent" "0"
|
||
set_ini_key "$file" "Economy" "PriceObjectScaleFactor" "10"
|
||
set_ini_key "$file" "Economy" "PriceParcelRent" "0"
|
||
|
||
# [Groups]
|
||
set_ini_key "$file" "Groups" "Enabled" "true"
|
||
set_ini_key "$file" "Groups" "LevelGroupCreate" "0"
|
||
set_ini_key "$file" "Groups" "Module" "\"Groups Module V2\""
|
||
set_ini_key "$file" "Groups" "StorageProvider" "OpenSim.Data.MySQL.dll"
|
||
set_ini_key "$file" "Groups" "ServicesConnectorModule" "\"Groups HG Service Connector\""
|
||
set_ini_key "$file" "Groups" "LocalService" "remote"
|
||
set_ini_key "$file" "Groups" "GroupsServerURI" "\${Const|BaseURL}:\${Const|PrivatePort}"
|
||
set_ini_key "$file" "Groups" "HomeURI" "\"\${Const|BaseURL}:\${Const|PublicPort}\""
|
||
set_ini_key "$file" "Groups" "MessagingEnabled" "true"
|
||
set_ini_key "$file" "Groups" "MessagingModule" "\"Groups Messaging Module V2\""
|
||
set_ini_key "$file" "Groups" "NoticesEnabled" "true"
|
||
set_ini_key "$file" "Groups" "MessageOnlineUsersOnly" "true"
|
||
set_ini_key "$file" "Groups" "XmlRpcServiceReadKey" "1234"
|
||
set_ini_key "$file" "Groups" "XmlRpcServiceWriteKey" "1234"
|
||
|
||
# [InterestManagement]
|
||
set_ini_key "$file" "InterestManagement" "UpdatePrioritizationScheme" "BestAvatarResponsiveness"
|
||
set_ini_key "$file" "InterestManagement" "ObjectsCullingByDistance" "true"
|
||
|
||
# [MediaOnAPrim]
|
||
set_ini_key "$file" "MediaOnAPrim" "Enabled" "true"
|
||
|
||
# [NPC]
|
||
set_ini_key "$file" "NPC" "Enabled" "true"
|
||
set_ini_key "$file" "NPC" "MaxNumberNPCsPerScene" "40"
|
||
set_ini_key "$file" "NPC" "AllowNotOwned" "true"
|
||
set_ini_key "$file" "NPC" "AllowSenseAsAvatar" "true"
|
||
set_ini_key "$file" "NPC" "AllowCloneOtherAvatars" "true"
|
||
set_ini_key "$file" "NPC" "NoNPCGroup" "true"
|
||
|
||
# [Terrain]
|
||
set_ini_key "$file" "Terrain" "InitialTerrain" "\"flat\""
|
||
|
||
# [LandManagement]
|
||
set_ini_key "$file" "LandManagement" "ShowParcelBansLines" "true"
|
||
|
||
# [UserProfiles]
|
||
set_ini_key "$file" "UserProfiles" "ProfileServiceURL" "\${Const|BaseURL}:\${Const|PublicPort}"
|
||
set_ini_key "$file" "UserProfiles" "AllowUserProfileWebURLs" "true"
|
||
|
||
# [XBakes]
|
||
set_ini_key "$file" "XBakes" "URL" "\${Const|PrivURL}:\${Const|PrivatePort}"
|
||
|
||
# [Architecture]
|
||
set_ini_key "$file" "Architecture" "Include-Architecture" "\"config-include/GridHypergrid.ini\""
|
||
|
||
((sim_counter++))
|
||
fi
|
||
done
|
||
|
||
echo -e "${COLOR_OK}${sim_counter} Simulationen konfiguriert.${COLOR_RESET}"
|
||
blankline
|
||
}
|
||
|
||
# Konfiguration von Robust.HG.ini im robust/bin Verzeichnis
|
||
function robusthginiconfig() {
|
||
# 23.04.2025
|
||
local ip="$1"
|
||
local gridname="$2"
|
||
local dir="$SCRIPT_DIR/robust/bin"
|
||
local file="$dir/Robust.HG.ini"
|
||
|
||
# Gridname bereinigen
|
||
gridname=$(echo "$gridname" | sed -e 's/ä/ae/g' -e 's/ö/oe/g' -e 's/ü/ue/g' -e 's/[-&]/_/g' -e 's/ */_/g' -e 's/__\+/_/g')
|
||
|
||
if [[ ! -f "$file.example" ]]; then
|
||
echo "FEHLER: Konfigurationsvorlage '$file.example' fehlt!" >&2
|
||
echo "Das Programm benötigt diese Datei zum Starten." >&2
|
||
exit 1 # Programm mit Fehlercode beenden
|
||
fi
|
||
|
||
# Nur wenn Vorlage existiert: Kopieren
|
||
cp "$file.example" "$file" || {
|
||
echo "FEHLER: Konnte '$file' nicht erstellen" >&2
|
||
exit 1
|
||
}
|
||
|
||
# [Const]
|
||
set_ini_key "$file" "Const" "BaseHostname" "$ip"
|
||
|
||
# [Startup]
|
||
# PID-Dateien gehören grundsätzlich in /tmp warum: tmp Wird beim Neustart automatisch geleert. Keine Berechtigungsprobleme (normalerweise schreibbar für alle).
|
||
# Standard-PID-Datei: /tmp/Robust.exe.pid
|
||
uncomment_ini_line "$file" "PIDFile"
|
||
|
||
# [ServiceList]
|
||
uncomment_ini_line "$file" "OfflineIMServiceConnector"
|
||
uncomment_ini_line "$file" "GroupsServiceConnector"
|
||
uncomment_ini_line "$file" "BakedTextureService"
|
||
uncomment_ini_line "$file" "UserProfilesServiceConnector"
|
||
uncomment_ini_line "$file" "HGGroupsServiceConnector"
|
||
|
||
# [Network]
|
||
|
||
# [Hypergrid]
|
||
uncomment_ini_line "$file" "HomeURI"
|
||
uncomment_ini_line "$file" "GatekeeperURI"
|
||
|
||
# [DatabaseService] wird in database_set_iniconfig eingetragen.
|
||
|
||
# [GridService] für osWebinterface
|
||
uncomment_ini_line "$file" "MapTileDirectory"
|
||
|
||
# [LoginService] für osWebinterface etc. "\${Const|BaseURL}:\${Const|PublicPort}"
|
||
uncomment_ini_line "$file" "SearchURL"
|
||
uncomment_ini_line "$file" "DestinationGuide"
|
||
uncomment_ini_line "$file" "AvatarPicker"
|
||
uncomment_ini_line "$file" "MinLoginLevel"
|
||
uncomment_ini_line "$file" "Currency"
|
||
uncomment_ini_line "$file" "ClassifiedFee"
|
||
|
||
set_ini_key "$file" "LoginService" "WelcomeMessage" "\"Willkommen im $gridname!\""
|
||
set_ini_key "$file" "LoginService" "MapTileURL" "\"\${Const|BaseURL}:\${Const|PublicPort}/\""
|
||
set_ini_key "$file" "LoginService" "SearchURL" "\"\${Const|BaseURL}:\${Const|PublicPort}/searchservice.php\""
|
||
set_ini_key "$file" "LoginService" "DestinationGuide" "\"\${Const|BaseURL}/guide.php\""
|
||
set_ini_key "$file" "LoginService" "AvatarPicker" "\"\${Const|BaseURL}/avatarpicker.php\""
|
||
set_ini_key "$file" "LoginService" "Currency" "\"OS$\""
|
||
set_ini_key "$file" "LoginService" "DSTZone" "\"local\""
|
||
|
||
# [GatekeeperService]
|
||
uncomment_ini_line "$file" "ExternalName"
|
||
|
||
# [GridInfoService]
|
||
set_ini_key "$file" "GridInfoService" "gridname" "\"$gridname\""
|
||
set_ini_key "$file" "GridInfoService" "gridnick" "\"$gridname\""
|
||
set_ini_key "$file" "GridInfoService" "welcome" "\"\${Const|BaseURL}/welcomesplashpage.php\""
|
||
set_ini_key "$file" "GridInfoService" "economy" "\"\${Const|BaseURL}:8008/\""
|
||
set_ini_key "$file" "GridInfoService" "about" "\"\${Const|BaseURL}/aboutinformation.php\""
|
||
set_ini_key "$file" "GridInfoService" "register" "\"\${Const|BaseURL}/createavatar.php\""
|
||
set_ini_key "$file" "GridInfoService" "help" "\"\${Const|BaseURL}/help.php\""
|
||
set_ini_key "$file" "GridInfoService" "password" "\"\${Const|BaseURL}/passwordreset.php\""
|
||
set_ini_key "$file" "GridInfoService" "GridStatusRSS" "\"\${Const|BaseURL}/gridstatusrss.php\""
|
||
|
||
# [UserAgentService]
|
||
uncomment_ini_line "$file" "LevelOutsideContacts"
|
||
uncomment_ini_line "$file" "ShowUserDetailsInHGProfile"
|
||
|
||
# [Messaging]
|
||
set_ini_key "$file" "Messaging" "MaxOfflineIMs" "250"
|
||
|
||
# [Groups]
|
||
set_ini_key "$file" "Groups" "MaxAgentGroups" "100"
|
||
|
||
echo -e "${COLOR_OK}Robust.HG.ini konfiguriert.${COLOR_RESET}"
|
||
blankline
|
||
}
|
||
|
||
function robustiniconfig() {
|
||
local ip="$1"
|
||
local gridname="$2"
|
||
local dir="$SCRIPT_DIR/robust/bin"
|
||
local source_file="$dir/Robust.ini.example"
|
||
local target_file="$dir/Robust.local.ini"
|
||
|
||
# Gridname bereinigen
|
||
gridname=$(echo "$gridname" | sed -e 's/ä/ae/g' -e 's/ö/oe/g' -e 's/ü/ue/g' -e 's/[-&]/_/g' -e 's/ */_/g' -e 's/__\+/_/g')
|
||
|
||
if [[ ! -f "$source_file" ]]; then
|
||
echo -e "${COLOR_BAD}FEHLER: Konfigurationsvorlage '$source_file' fehlt!${COLOR_RESET}" >&2
|
||
echo -e "${COLOR_BAD}Das Programm benötigt diese Datei zum Starten.${COLOR_RESET}" >&2
|
||
exit 1
|
||
fi
|
||
|
||
# Vorlage nach Robust.local.ini kopieren
|
||
cp "$source_file" "$target_file" || {
|
||
echo -e "${COLOR_BAD}FEHLER: Konnte '$target_file' nicht erstellen${COLOR_RESET}" >&2
|
||
exit 1
|
||
}
|
||
|
||
# [Const]
|
||
set_ini_key "$target_file" "Const" "BaseHostname" "$ip"
|
||
|
||
# [ServiceList]
|
||
uncomment_ini_line "$target_file" "OfflineIMServiceConnector"
|
||
uncomment_ini_line "$target_file" "GroupsServiceConnector"
|
||
uncomment_ini_line "$target_file" "BakedTextureService"
|
||
uncomment_ini_line "$target_file" "UserProfilesServiceConnector"
|
||
|
||
# [LoginService] Konfiguration
|
||
set_ini_key "$target_file" "LoginService" "Currency" "\"OS$\""
|
||
set_ini_key "$target_file" "LoginService" "WelcomeMessage" "\"Willkommen im $gridname!\""
|
||
set_ini_key "$target_file" "LoginService" "MapTileURL" "\"\${Const|BaseURL}:\${Const|PublicPort}/\""
|
||
set_ini_key "$target_file" "LoginService" "SearchURL" "\"\${Const|BaseURL}/searchservice.php\""
|
||
set_ini_key "$target_file" "LoginService" "DestinationGuide" "\"\${Const|BaseURL}/guide.php\""
|
||
set_ini_key "$target_file" "LoginService" "AvatarPicker" "\"\${Const|BaseURL}/avatarpicker.php\""
|
||
|
||
# [GridInfoService]
|
||
set_ini_key "$target_file" "GridInfoService" "gridname" "\"$gridname\""
|
||
set_ini_key "$target_file" "GridInfoService" "gridnick" "\"$gridname\""
|
||
set_ini_key "$target_file" "GridInfoService" "welcome" "\"\${Const|BaseURL}/welcome\""
|
||
set_ini_key "$target_file" "GridInfoService" "economy" "\"\${Const|BaseURL}:8008/\""
|
||
set_ini_key "$target_file" "GridInfoService" "about" "\"\${Const|BaseURL}/about\""
|
||
set_ini_key "$target_file" "GridInfoService" "register" "\"\${Const|BaseURL}/register\""
|
||
set_ini_key "$target_file" "GridInfoService" "help" "\"\${Const|BaseURL}/help\""
|
||
set_ini_key "$target_file" "GridInfoService" "password" "\"\${Const|BaseURL}/password\""
|
||
set_ini_key "$target_file" "GridInfoService" "GridStatusRSS" "\"\${Const|BaseURL}:\${Const|PublicPort}/GridStatusRSS\""
|
||
|
||
echo -e "${COLOR_OK}Robust.local.ini erfolgreich konfiguriert.${COLOR_RESET}"
|
||
blankline
|
||
}
|
||
|
||
# Konfiguriert die FlotsamCache.ini Dateien
|
||
# - Erstellt die Dateien in den bin/config-include Ordner der Simulatoren
|
||
# - Setzt Optimierte Parameter den FlotsamCache.ini Dateien
|
||
function flotsaminiconfig() {
|
||
# 25.04.2025
|
||
for i in $(seq 1 99); do
|
||
local config_dir="$SCRIPT_DIR/sim$i/bin/config-include"
|
||
local file="$config_dir/FlotsamCache.ini"
|
||
|
||
if [[ -d "$config_dir" ]]; then
|
||
echo -e "${COLOR_FILE}Erstelle $file${COLOR_RESET}"
|
||
mkdir -p "$config_dir"
|
||
|
||
# Datei erstellen
|
||
#touch "$welcome_ini"
|
||
#touch "$welcome_ini" || echo "" > "$welcome_ini"
|
||
touch "$file" 2>/dev/null || echo "" > "$file"
|
||
|
||
# 2. Sektion hinzufügen
|
||
add_ini_section "$file" "AssetCache"
|
||
|
||
# 3. Alle Key-Value Paare setzen
|
||
set_ini_key "$file" "AssetCache" "CacheDirectory" "./assetcache"
|
||
set_ini_key "$file" "AssetCache" "LogLevel" "0"
|
||
set_ini_key "$file" "AssetCache" "HitRateDisplay" "100"
|
||
set_ini_key "$file" "AssetCache" "MemoryCacheEnabled" "false"
|
||
set_ini_key "$file" "AssetCache" "UpdateFileTimeOnCacheHit" "false"
|
||
set_ini_key "$file" "AssetCache" "NegativeCacheEnabled" "true"
|
||
set_ini_key "$file" "AssetCache" "NegativeCacheTimeout" "120"
|
||
set_ini_key "$file" "AssetCache" "NegativeCacheSliding" "false"
|
||
set_ini_key "$file" "AssetCache" "FileCacheEnabled" "true"
|
||
set_ini_key "$file" "AssetCache" "MemoryCacheTimeout" ".016"
|
||
set_ini_key "$file" "AssetCache" "FileCacheTimeout" "48"
|
||
set_ini_key "$file" "AssetCache" "FileCleanupTimer" "1.0"
|
||
|
||
echo -e "${COLOR_OK}→ FlotsamCache.ini neu geschrieben für sim$i${COLOR_RESET}"
|
||
fi
|
||
done
|
||
|
||
echo -e "${COLOR_OK}FlotsamCache.ini konfiguriert.${COLOR_RESET}"
|
||
blankline
|
||
}
|
||
|
||
function gridcommoniniconfig() {
|
||
local ip="$1"
|
||
local gridname="$2"
|
||
|
||
# Gridname bereinigen
|
||
gridname=$(echo "$gridname" | sed -e 's/ä/ae/g' -e 's/ö/oe/g' -e 's/ü/ue/g' -e 's/[-&]/_/g' -e 's/ */_/g' -e 's/__\+/_/g')
|
||
|
||
for i in $(seq 1 99); do
|
||
local config_dir="$SCRIPT_DIR/sim$i/bin/config-include"
|
||
local file="$config_dir/GridCommon.ini"
|
||
local example_file="$config_dir/GridCommon.ini.example"
|
||
|
||
# Strikte Prüfung - Abbruch wenn etwas fehlt
|
||
if [[ ! -d "$config_dir" ]] || [[ ! -f "$example_file" ]]; then
|
||
return 1
|
||
fi
|
||
|
||
# Vorlage kopieren
|
||
cp "$example_file" "$file" || return 1
|
||
|
||
# [Const]
|
||
add_ini_before_section "$file" "Const" "DatabaseService"
|
||
set_ini_key "$file" "Const" "BaseHostname" "\"$ip\""
|
||
set_ini_key "$file" "Const" "BaseURL" "\"http://\${Const|BaseHostname}\""
|
||
set_ini_key "$file" "Const" "PublicPort" "\"8002\""
|
||
set_ini_key "$file" "Const" "PrivatePort" "\"8003\""
|
||
|
||
# [DatabaseService] wird in database_set_iniconfig eingetragen.
|
||
clear_ini_section "$file" "DatabaseService"
|
||
set_ini_key "$file" "DatabaseService" "StorageProvider" "\"OpenSim.Data.MySQL.dll\""
|
||
|
||
# [Hypergrid]
|
||
set_ini_key "$file" "Hypergrid" "GatekeeperURI" "\"\${Const|BaseURL}:\${Const|PublicPort}\""
|
||
set_ini_key "$file" "Hypergrid" "HomeURI" "\"\${Const|BaseURL}:\${Const|PublicPort}\""
|
||
|
||
# [Modules]
|
||
set_ini_key "$file" "Modules" "AssetCaching" "\"FlotsamAssetCache\""
|
||
set_ini_key "$file" "Modules" "Include-FlotsamCache" "\"config-include/FlotsamCache.ini\""
|
||
set_ini_key "$file" "Modules" "AuthorizationServices" "\"RemoteAuthorizationServicesConnector\""
|
||
|
||
# [AssetService]
|
||
set_ini_key "$file" "AssetService" "DefaultAssetLoader" "\"OpenSim.Framework.AssetLoader.Filesystem.dll\""
|
||
set_ini_key "$file" "AssetService" "AssetLoaderArgs" "\"assets/AssetSets.xml\""
|
||
set_ini_key "$file" "AssetService" "AssetServerURI" "\"\${Const|PrivURL}:\${Const|PrivatePort}\""
|
||
|
||
# [InventoryService]
|
||
set_ini_key "$file" "InventoryService" "InventoryServerURI" "\"\${Const|PrivURL}:\${Const|PrivatePort}\""
|
||
|
||
# [GridInfo]
|
||
set_ini_key "$file" "GridInfo" "GridInfoURI" "\"\${Const|BaseURL}:\${Const|PublicPort}\""
|
||
|
||
# [GridService]
|
||
set_ini_key "$file" "GridService" "GridServerURI" "\"\${Const|PrivURL}:\${Const|PrivatePort}\""
|
||
set_ini_key "$file" "GridService" "MapTileDirectory" "\"./maptiles\""
|
||
set_ini_key "$file" "GridService" "Gatekeeper" "\"\${Const|BaseURL}:\${Const|PublicPort}\""
|
||
|
||
# [EstateDataStore]
|
||
set_ini_key "$file" "EstateService" "EstateServerURI" "\"\${Const|PrivURL}:\${Const|PrivatePort}\""
|
||
|
||
# [Messaging]
|
||
set_ini_key "$file" "Messaging" "Gatekeeper" "\"\${Const|BaseURL}:\${Const|PublicPort}\""
|
||
|
||
# [AvatarService]
|
||
set_ini_key "$file" "AvatarService" "AvatarServerURI" "\"\${Const|PrivURL}:\${Const|PrivatePort}\""
|
||
|
||
# [AgentPreferencesService]
|
||
set_ini_key "$file" "AgentPreferencesService" "AgentPreferencesServerURI" "\"\${Const|PrivURL}:\${Const|PrivatePort}\""
|
||
|
||
# [PresenceService]
|
||
set_ini_key "$file" "PresenceService" "PresenceServerURI" "\"\${Const|PrivURL}:\${Const|PrivatePort}\""
|
||
|
||
# [UserAccountService]
|
||
set_ini_key "$file" "UserAccountService" "UserAccountServerURI" "\"\${Const|PrivURL}:\${Const|PrivatePort}\""
|
||
|
||
# [GridUserService]
|
||
set_ini_key "$file" "GridUserService" "GridUserServerURI" "\"\${Const|PrivURL}:\${Const|PrivatePort}\""
|
||
|
||
# [AuthenticationService]
|
||
set_ini_key "$file" "AuthenticationService" "AuthenticationServerURI" "\"\${Const|PrivURL}:\${Const|PrivatePort}\""
|
||
|
||
# [FriendsService]
|
||
set_ini_key "$file" "FriendsService" "FriendsServerURI" "\"\${Const|PrivURL}:\${Const|PrivatePort}\""
|
||
|
||
# [HGInventoryAccessModule]
|
||
set_ini_key "$file" "HGInventoryAccessModule" "HomeURI" "\"\${Const|BaseURL}:\${Const|PublicPort}\""
|
||
set_ini_key "$file" "HGInventoryAccessModule" "Gatekeeper" "\"\${Const|BaseURL}:\${Const|PublicPort}\""
|
||
|
||
# [HGAssetService]
|
||
set_ini_key "$file" "HGAssetService" "HomeURI" "\"\${Const|BaseURL}:\${Const|PublicPort}\""
|
||
|
||
# [HGFriendsModule]
|
||
set_ini_key "$file" "HGFriendsModule" "LevelHGFriends" "0"
|
||
|
||
# [MapImageService]
|
||
set_ini_key "$file" "MapImageService" "MapImageServerURI" "\"\${Const|PrivURL}:\${Const|PrivatePort}\""
|
||
|
||
# [AuthorizationService]
|
||
set_ini_key "$file" "AuthorizationService" "AuthorizationServerURI" "\"\${Const|PrivURL}/hgauth.php\""
|
||
|
||
# [MuteListService]
|
||
set_ini_key "$file" "MuteListService" "MuteListServerURI" "\"\${Const|PrivURL}:\${Const|PrivatePort}\""
|
||
|
||
echo -e "${COLOR_OK}✓ sim$i: GridCommon.ini erfolgreich${COLOR_RESET}"
|
||
done
|
||
|
||
echo -e "${COLOR_OK}GridCommon.ini konfiguriert.${COLOR_RESET}"
|
||
blankline
|
||
}
|
||
|
||
function osslenableiniconfig() {
|
||
# 25.04.2025
|
||
for i in $(seq 1 99); do
|
||
local config_dir="$SCRIPT_DIR/sim$i/bin/config-include"
|
||
local file="$config_dir/osslEnable.ini"
|
||
|
||
if [[ -d "$config_dir" ]]; then
|
||
echo -e "${COLOR_FILE}Erstelle $file${COLOR_RESET}"
|
||
mkdir -p "$config_dir"
|
||
|
||
touch "$file" 2>/dev/null || echo "" > "$file"
|
||
|
||
# Sektion hinzufügen
|
||
add_ini_section "$file" "OSSL"
|
||
|
||
# Basis-Key-Value Paare
|
||
set_ini_key "$file" "OSSL" "AllowOSFunctions" "true"
|
||
set_ini_key "$file" "OSSL" "AllowMODFunctions" "true"
|
||
set_ini_key "$file" "OSSL" "AllowLightShareFunctions" "true"
|
||
set_ini_key "$file" "OSSL" "PermissionErrorToOwner" "false"
|
||
set_ini_key "$file" "OSSL" "OSFunctionThreatLevel" "VeryHigh"
|
||
set_ini_key "$file" "OSSL" "osslParcelO" "\"PARCEL_OWNER,\""
|
||
set_ini_key "$file" "OSSL" "osslParcelOG" "\"PARCEL_GROUP_MEMBER,PARCEL_OWNER,\""
|
||
set_ini_key "$file" "OSSL" "osslNPC" "\${OSSL|osslParcelOG}ESTATE_MANAGER,ESTATE_OWNER"
|
||
|
||
# Alle Allow_* Einträge
|
||
set_ini_key "$file" "OSSL" "Allow_osGetAgents" "true"
|
||
set_ini_key "$file" "OSSL" "Allow_osGetAvatarList" "true"
|
||
set_ini_key "$file" "OSSL" "Allow_osGetNPCList" "true"
|
||
set_ini_key "$file" "OSSL" "Allow_osNpcGetOwner" "\${OSSL|osslNPC}"
|
||
set_ini_key "$file" "OSSL" "Allow_osSetSunParam" "ESTATE_MANAGER,ESTATE_OWNER"
|
||
set_ini_key "$file" "OSSL" "Allow_osTeleportOwner" "true"
|
||
set_ini_key "$file" "OSSL" "Allow_osSetEstateSunSettings" "ESTATE_MANAGER,ESTATE_OWNER"
|
||
set_ini_key "$file" "OSSL" "Allow_osSetRegionSunSettings" "ESTATE_MANAGER,ESTATE_OWNER"
|
||
set_ini_key "$file" "OSSL" "Allow_osEjectFromGroup" "true"
|
||
set_ini_key "$file" "OSSL" "Allow_osForceBreakAllLinks" "true"
|
||
set_ini_key "$file" "OSSL" "Allow_osForceBreakLink" "true"
|
||
set_ini_key "$file" "OSSL" "Allow_osGetWindParam" "true"
|
||
set_ini_key "$file" "OSSL" "Allow_osInviteToGroup" "true"
|
||
set_ini_key "$file" "OSSL" "Allow_osReplaceString" "true"
|
||
set_ini_key "$file" "OSSL" "Allow_osSetDynamicTextureData" "true"
|
||
set_ini_key "$file" "OSSL" "Allow_osSetDynamicTextureDataFace" "true"
|
||
set_ini_key "$file" "OSSL" "Allow_osSetDynamicTextureDataBlend" "true"
|
||
set_ini_key "$file" "OSSL" "Allow_osSetDynamicTextureDataBlendFace" "true"
|
||
set_ini_key "$file" "OSSL" "Allow_osSetParcelMediaURL" "true"
|
||
set_ini_key "$file" "OSSL" "Allow_osSetParcelMusicURL" "true"
|
||
set_ini_key "$file" "OSSL" "Allow_osSetParcelSIPAddress" "true"
|
||
set_ini_key "$file" "OSSL" "Allow_osSetPrimFloatOnWater" "true"
|
||
set_ini_key "$file" "OSSL" "Allow_osSetWindParam" "true"
|
||
set_ini_key "$file" "OSSL" "Allow_osTerrainFlush" "ESTATE_MANAGER,ESTATE_OWNER"
|
||
set_ini_key "$file" "OSSL" "Allow_osAvatarName2Key" "\${OSSL|osslParcelO}ESTATE_MANAGER,ESTATE_OWNER"
|
||
set_ini_key "$file" "OSSL" "Allow_osFormatString" "true"
|
||
set_ini_key "$file" "OSSL" "Allow_osKey2Name" "\${OSSL|osslParcelO}ESTATE_MANAGER,ESTATE_OWNER"
|
||
set_ini_key "$file" "OSSL" "Allow_osListenRegex" "true"
|
||
set_ini_key "$file" "OSSL" "Allow_osLoadedCreationDate" "true"
|
||
set_ini_key "$file" "OSSL" "Allow_osLoadedCreationID" "true"
|
||
set_ini_key "$file" "OSSL" "Allow_osLoadedCreationTime" "true"
|
||
set_ini_key "$file" "OSSL" "Allow_osMessageObject" "true"
|
||
set_ini_key "$file" "OSSL" "Allow_osRegexIsMatch" "true"
|
||
set_ini_key "$file" "OSSL" "Allow_osGetAvatarHomeURI" "true"
|
||
set_ini_key "$file" "OSSL" "Allow_osNpcSetProfileAbout" "\${OSSL|osslNPC}"
|
||
set_ini_key "$file" "OSSL" "Allow_osNpcSetProfileImage" "\${OSSL|osslNPC}"
|
||
set_ini_key "$file" "OSSL" "Allow_osDie" "true"
|
||
set_ini_key "$file" "OSSL" "Allow_osDetectedCountry" "\${OSSL|osslParcelO}ESTATE_MANAGER,ESTATE_OWNER"
|
||
set_ini_key "$file" "OSSL" "Allow_osDropAttachment" "\${OSSL|osslParcelO}ESTATE_MANAGER,ESTATE_OWNER"
|
||
set_ini_key "$file" "OSSL" "Allow_osDropAttachmentAt" "\${OSSL|osslParcelO}ESTATE_MANAGER,ESTATE_OWNER"
|
||
set_ini_key "$file" "OSSL" "Allow_osGetAgentCountry" "\${OSSL|osslParcelO}ESTATE_MANAGER,ESTATE_OWNER"
|
||
set_ini_key "$file" "OSSL" "Allow_osGetGridCustom" "\${OSSL|osslParcelO}ESTATE_MANAGER,ESTATE_OWNER"
|
||
set_ini_key "$file" "OSSL" "Allow_osGetGridGatekeeperURI" "\${OSSL|osslParcelO}ESTATE_MANAGER,ESTATE_OWNER"
|
||
set_ini_key "$file" "OSSL" "Allow_osGetGridHomeURI" "\${OSSL|osslParcelO}ESTATE_MANAGER,ESTATE_OWNER"
|
||
set_ini_key "$file" "OSSL" "Allow_osGetGridLoginURI" "\${OSSL|osslParcelO}ESTATE_MANAGER,ESTATE_OWNER"
|
||
set_ini_key "$file" "OSSL" "Allow_osGetGridName" "true"
|
||
set_ini_key "$file" "OSSL" "Allow_osGetGridNick" "true"
|
||
set_ini_key "$file" "OSSL" "Allow_osGetNumberOfAttachments" "\${OSSL|osslParcelO}ESTATE_MANAGER,ESTATE_OWNER"
|
||
set_ini_key "$file" "OSSL" "Allow_osGetRegionStats" "\${OSSL|osslParcelO}ESTATE_MANAGER,ESTATE_OWNER"
|
||
set_ini_key "$file" "OSSL" "Allow_osGetSimulatorMemory" "\${OSSL|osslParcelO}ESTATE_MANAGER,ESTATE_OWNER"
|
||
set_ini_key "$file" "OSSL" "Allow_osGetSimulatorMemoryKB" "\${OSSL|osslParcelO}ESTATE_MANAGER,ESTATE_OWNER"
|
||
set_ini_key "$file" "OSSL" "Allow_osMessageAttachments" "\${OSSL|osslParcelO}ESTATE_MANAGER,ESTATE_OWNER"
|
||
set_ini_key "$file" "OSSL" "Allow_osReplaceAgentEnvironment" "\${OSSL|osslParcelO}ESTATE_MANAGER,ESTATE_OWNER"
|
||
set_ini_key "$file" "OSSL" "Allow_osSetSpeed" "\${OSSL|osslParcelO}ESTATE_MANAGER,ESTATE_OWNER"
|
||
set_ini_key "$file" "OSSL" "Allow_osSetOwnerSpeed" "\${OSSL|osslParcelO}ESTATE_MANAGER,ESTATE_OWNER"
|
||
set_ini_key "$file" "OSSL" "Allow_osRequestURL" "\${OSSL|osslParcelO}ESTATE_MANAGER,ESTATE_OWNER"
|
||
set_ini_key "$file" "OSSL" "Allow_osRequestSecureURL" "\${OSSL|osslParcelO}ESTATE_MANAGER,ESTATE_OWNER"
|
||
set_ini_key "$file" "OSSL" "Allow_osCauseDamage" "\${OSSL|osslParcelO}ESTATE_MANAGER,ESTATE_OWNER"
|
||
set_ini_key "$file" "OSSL" "Allow_osCauseHealing" "\${OSSL|osslParcelO}ESTATE_MANAGER,ESTATE_OWNER"
|
||
set_ini_key "$file" "OSSL" "Allow_osSetHealth" "\${OSSL|osslParcelO}ESTATE_MANAGER,ESTATE_OWNER"
|
||
set_ini_key "$file" "OSSL" "Allow_osSetHealRate" "\${OSSL|osslParcelO}ESTATE_MANAGER,ESTATE_OWNER"
|
||
set_ini_key "$file" "OSSL" "Allow_osForceAttachToAvatar" "\${OSSL|osslParcelO}ESTATE_MANAGER,ESTATE_OWNER"
|
||
set_ini_key "$file" "OSSL" "Allow_osForceAttachToAvatarFromInventory" "\${OSSL|osslParcelO}ESTATE_MANAGER,ESTATE_OWNER"
|
||
set_ini_key "$file" "OSSL" "Allow_osForceCreateLink" "\${OSSL|osslParcelO}ESTATE_MANAGER,ESTATE_OWNER"
|
||
set_ini_key "$file" "OSSL" "Allow_osForceDropAttachment" "\${OSSL|osslParcelO}ESTATE_MANAGER,ESTATE_OWNER"
|
||
set_ini_key "$file" "OSSL" "Allow_osForceDropAttachmentAt" "\${OSSL|osslParcelO}ESTATE_MANAGER,ESTATE_OWNER"
|
||
set_ini_key "$file" "OSSL" "Allow_osGetLinkPrimitiveParams" "\${OSSL|osslParcelO}ESTATE_MANAGER,ESTATE_OWNER"
|
||
set_ini_key "$file" "OSSL" "Allow_osGetPhysicsEngineType" "true"
|
||
set_ini_key "$file" "OSSL" "Allow_osGetRegionMapTexture" "\${OSSL|osslParcelO}ESTATE_MANAGER,ESTATE_OWNER"
|
||
set_ini_key "$file" "OSSL" "Allow_osGetScriptEngineName" "true"
|
||
set_ini_key "$file" "OSSL" "Allow_osGetSimulatorVersion" "true"
|
||
set_ini_key "$file" "OSSL" "Allow_osMakeNotecard" "\${OSSL|osslParcelO}ESTATE_MANAGER,ESTATE_OWNER"
|
||
set_ini_key "$file" "OSSL" "Allow_osMatchString" "true"
|
||
set_ini_key "$file" "OSSL" "Allow_osNpcCreate" "\${OSSL|osslNPC}"
|
||
set_ini_key "$file" "OSSL" "Allow_osNpcGetPos" "\${OSSL|osslNPC}"
|
||
set_ini_key "$file" "OSSL" "Allow_osNpcGetRot" "\${OSSL|osslNPC}"
|
||
set_ini_key "$file" "OSSL" "Allow_osNpcLoadAppearance" "\${OSSL|osslNPC}"
|
||
set_ini_key "$file" "OSSL" "Allow_osNpcMoveTo" "\${OSSL|osslNPC}"
|
||
set_ini_key "$file" "OSSL" "Allow_osNpcMoveToTarget" "\${OSSL|osslNPC}"
|
||
set_ini_key "$file" "OSSL" "Allow_osNpcPlayAnimation" "\${OSSL|osslNPC}"
|
||
set_ini_key "$file" "OSSL" "Allow_osNpcRemove" "\${OSSL|osslNPC}"
|
||
set_ini_key "$file" "OSSL" "Allow_osNpcSaveAppearance" "\${OSSL|osslNPC}"
|
||
set_ini_key "$file" "OSSL" "Allow_osNpcSay" "\${OSSL|osslNPC}"
|
||
set_ini_key "$file" "OSSL" "Allow_osNpcSayTo" "\${OSSL|osslNPC}"
|
||
set_ini_key "$file" "OSSL" "Allow_osNpcSetRot" "\${OSSL|osslNPC}"
|
||
set_ini_key "$file" "OSSL" "Allow_osNpcShout" "\${OSSL|osslNPC}"
|
||
set_ini_key "$file" "OSSL" "Allow_osNpcSit" "\${OSSL|osslNPC}"
|
||
set_ini_key "$file" "OSSL" "Allow_osNpcStand" "\${OSSL|osslNPC}"
|
||
set_ini_key "$file" "OSSL" "Allow_osNpcStopAnimation" "\${OSSL|osslNPC}"
|
||
set_ini_key "$file" "OSSL" "Allow_osNpcStopMoveToTarget" "\${OSSL|osslNPC}"
|
||
set_ini_key "$file" "OSSL" "Allow_osNpcTouch" "\${OSSL|osslNPC}"
|
||
set_ini_key "$file" "OSSL" "Allow_osNpcWhisper" "\${OSSL|osslNPC}"
|
||
set_ini_key "$file" "OSSL" "Allow_osOwnerSaveAppearance" "\${OSSL|osslParcelO}ESTATE_MANAGER,ESTATE_OWNER"
|
||
set_ini_key "$file" "OSSL" "Allow_osParcelJoin" "ESTATE_MANAGER,ESTATE_OWNER"
|
||
set_ini_key "$file" "OSSL" "Allow_osParcelSubdivide" "ESTATE_MANAGER,ESTATE_OWNER"
|
||
set_ini_key "$file" "OSSL" "Allow_osRegionRestart" "ESTATE_MANAGER,ESTATE_OWNER"
|
||
set_ini_key "$file" "OSSL" "Allow_osRegionNotice" "ESTATE_MANAGER,ESTATE_OWNER"
|
||
set_ini_key "$file" "OSSL" "Allow_osSetProjectionParams" "true"
|
||
set_ini_key "$file" "OSSL" "Allow_osSetRegionWaterHeight" "ESTATE_MANAGER,ESTATE_OWNER"
|
||
set_ini_key "$file" "OSSL" "Allow_osSetTerrainHeight" "ESTATE_MANAGER,ESTATE_OWNER"
|
||
set_ini_key "$file" "OSSL" "Allow_osSetTerrainTexture" "ESTATE_MANAGER,ESTATE_OWNER"
|
||
set_ini_key "$file" "OSSL" "Allow_osSetTerrainTextureHeight" "ESTATE_MANAGER,ESTATE_OWNER"
|
||
set_ini_key "$file" "OSSL" "Allow_osAgentSaveAppearance" "ESTATE_MANAGER,ESTATE_OWNER"
|
||
set_ini_key "$file" "OSSL" "Allow_osAvatarPlayAnimation" "true"
|
||
set_ini_key "$file" "OSSL" "Allow_osAvatarStopAnimation" "true"
|
||
set_ini_key "$file" "OSSL" "Allow_osForceAttachToOtherAvatarFromInventory" "true"
|
||
set_ini_key "$file" "OSSL" "Allow_osForceDetachFromAvatar" "true"
|
||
set_ini_key "$file" "OSSL" "Allow_osForceOtherSit" "true"
|
||
set_ini_key "$file" "OSSL" "Allow_osGetNotecard" "\${OSSL|osslParcelO}ESTATE_MANAGER,ESTATE_OWNER"
|
||
set_ini_key "$file" "OSSL" "Allow_osGetNotecardLine" "\${OSSL|osslParcelO}ESTATE_MANAGER,ESTATE_OWNER"
|
||
set_ini_key "$file" "OSSL" "Allow_osGetNumberOfNotecardLines" "\${OSSL|osslParcelO}ESTATE_MANAGER,ESTATE_OWNER"
|
||
set_ini_key "$file" "OSSL" "Allow_osSetDynamicTextureURL" "ESTATE_MANAGER,ESTATE_OWNER"
|
||
set_ini_key "$file" "OSSL" "Allow_osSetDynamicTextureURLBlend" "ESTATE_MANAGER,ESTATE_OWNER"
|
||
set_ini_key "$file" "OSSL" "Allow_osSetDynamicTextureURLBlendFace" "ESTATE_MANAGER,ESTATE_OWNER"
|
||
set_ini_key "$file" "OSSL" "Allow_osSetRot" "true"
|
||
set_ini_key "$file" "OSSL" "Allow_osSetParcelDetails" "\${OSSL|osslParcelO}ESTATE_MANAGER,ESTATE_OWNER"
|
||
|
||
echo -e "${COLOR_OK}→ osslEnable.ini neu geschrieben für sim$i${COLOR_RESET}"
|
||
fi
|
||
done
|
||
|
||
echo -e "${COLOR_OK}osslEnable.ini konfiguriert.${COLOR_RESET}"
|
||
blankline
|
||
}
|
||
|
||
# Erstellt eine StandaloneCommon.ini
|
||
function standalonecommoniniconfig() {
|
||
local ip="$1"
|
||
local gridname="$2"
|
||
|
||
# Gridname bereinigen
|
||
gridname=$(echo "$gridname" | sed -e 's/ä/ae/g' -e 's/ö/oe/g' -e 's/ü/ue/g' -e 's/[-&]/_/g' -e 's/ */_/g' -e 's/__\+/_/g')
|
||
|
||
local config_dir="$SCRIPT_DIR/opensim/bin/config-include"
|
||
local file="$config_dir/StandaloneCommon.ini"
|
||
local example_file="$config_dir/StandaloneCommon.ini.example"
|
||
|
||
echo -e "${COLOR_FILE}Erstelle StandaloneCommon.ini in opensim/bin${COLOR_RESET}"
|
||
mkdir -p "$config_dir"
|
||
|
||
# Datei erstellen
|
||
#touch "$welcome_ini"
|
||
#touch "$welcome_ini" || echo "" > "$welcome_ini"
|
||
touch "$file" 2>/dev/null || echo "" > "$file"
|
||
|
||
# 2. Const-Sektion hinzufügen
|
||
add_ini_section "$file" "Const"
|
||
|
||
# 3. Werte für Const-Sektion setzen
|
||
set_ini_key "$file" "Const" "BaseHostname" "\"$ip\""
|
||
set_ini_key "$file" "Const" "BaseURL" "http://\${Const|BaseHostname}"
|
||
set_ini_key "$file" "Const" "PublicPort" "\"9000\""
|
||
set_ini_key "$file" "Const" "PrivatePort" "\"9003\""
|
||
set_ini_key "$file" "Const" "PrivURL" "http://\${Const|BaseHostname}:\${Const|PrivatePort}"
|
||
|
||
# 4. Hypergrid- und GridInfo-Werte setzen
|
||
set_ini_key "$file" "Hypergrid" "GatekeeperURI" "\"http://$ip:8002\""
|
||
set_ini_key "$file" "Hypergrid" "HomeURI" "\"http://$ip:8002\""
|
||
set_ini_key "$file" "GridInfoService" "GridName" "\"$gridname\""
|
||
set_ini_key "$file" "GridInfoService" "GridLoginURI" "\"http://$ip:8002\""
|
||
|
||
echo -e "${COLOR_OK}→ StandaloneCommon.ini erfolgreich erstellt${COLOR_RESET}"
|
||
blankline
|
||
}
|
||
|
||
# Erstellt automatisch Regionen in allen Simulator-Instanzen (sim2 bis sim999)
|
||
# Jede Instanz erhält die vom Benutzer gewünschte Anzahl an Regionen
|
||
# Die Regionen werden mit zufälligen Positionen und automatischen Ports angelegt
|
||
# Warum sim1 ausgelassen wird:
|
||
# Performance-Optimierung:
|
||
# sim1 dient als "Welcome-Region" (Eingangsbereich des Grids)
|
||
# Diese Region hat oft mehr Besucherverkehr
|
||
# Durch Isolation auf einen Simulator bleibt sie performant
|
||
function regionsiniconfig() {
|
||
# 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
|
||
|
||
# Benutzereingabe mit Symbol und Farbe
|
||
echo -e "${SYM_INFO}${COLOR_LABEL} Wie viele Zufallsregionen sollen pro Simulator erstellt werden?${COLOR_RESET}"
|
||
read -r regions_per_sim
|
||
|
||
# Eingabeprüfung
|
||
# if ! [[ "$regions_per_sim" =~ ^[1-9][0-9]*$ ]]; then
|
||
# echo -e "${SYM_BAD} ${COLOR_BAD}Ungültige Eingabe: Bitte eine positive Zahl eingeben${COLOR_RESET}" >&2
|
||
# return 1
|
||
# fi
|
||
|
||
# Eingabeprüfung - falls leer, 1 verwenden
|
||
if [[ -z "$regions_per_sim" ]]; then
|
||
regions_per_sim=1
|
||
elif ! [[ "$regions_per_sim" =~ ^[1-9][0-9]*$ ]]; then
|
||
echo -e "${SYM_BAD} ${COLOR_BAD}Ungültige Eingabe: Bitte eine positive Zahl eingeben${COLOR_RESET}" >&2
|
||
return 1
|
||
fi
|
||
|
||
system_ip=$(hostname -I | awk '{print $1}')
|
||
|
||
echo -e "\n${SYM_SERVER}${COLOR_HEADING} Starte Regionserstellung...${COLOR_RESET}"
|
||
|
||
# Simulatoren durchlaufen (beginnt bei 2 um sim1 für Welcome-Region freizuhalten)
|
||
for ((sim_num=2; sim_num<=999; sim_num++)); do
|
||
sim_dir="${SCRIPT_DIR}/sim${sim_num}/bin/Regions"
|
||
|
||
if [[ -d "$sim_dir" ]]; then
|
||
echo -e "${SYM_FOLDER}${COLOR_SERVER} Simulator ${sim_num}:${COLOR_RESET} ${COLOR_ACTION}Erstelle ${regions_per_sim} Region(en)${COLOR_RESET}" >&2
|
||
|
||
# Regionen erstellen
|
||
for ((region_num=1; region_num<=regions_per_sim; region_num++)); do
|
||
# Position berechnen (mit Kollisionsprüfung)
|
||
local attempts=0
|
||
local max_attempts=100
|
||
|
||
while true; do
|
||
offset=$(( (RANDOM % 2000) - 1000 ))
|
||
pos_x=$((center_x + offset))
|
||
offset=$(( (RANDOM % 2000) - 1000 ))
|
||
pos_y=$((center_y + offset))
|
||
location="$pos_x,$pos_y"
|
||
|
||
if [[ -z "${used_locations[$location]}" ]]; then
|
||
used_locations[$location]=1
|
||
break
|
||
fi
|
||
|
||
attempts=$((attempts + 1))
|
||
if (( attempts >= max_attempts )); then
|
||
echo -e "${SYM_BAD} ${COLOR_WARNING}Fehler: Konnte nach ${max_attempts} Versuchen keine eindeutige Position finden${COLOR_RESET}" >&2
|
||
return 1
|
||
fi
|
||
done
|
||
|
||
port=$((base_port + sim_num * 100 + region_num))
|
||
region_name=${genRegionName}
|
||
#region_uuid=$(generate_uuid)
|
||
config_file="${sim_dir}/${region_name}.ini"
|
||
|
||
# Prüfen ob Region existiert
|
||
if [[ -f "$config_file" ]]; then
|
||
echo -e "${SYM_WAIT} ${COLOR_WARNING}Überspringe ${COLOR_VALUE}${region_name}${COLOR_RESET}${COLOR_WARNING} - existiert bereits${COLOR_RESET}" >&2
|
||
continue
|
||
fi
|
||
|
||
# region_uuid=$(uuidgen)
|
||
region_uuid=$(command -v uuidgen >/dev/null && uuidgen || cat /proc/sys/kernel/random/uuid 2>/dev/null || echo "$RANDOM-$RANDOM-$RANDOM-$RANDOM")
|
||
|
||
# Datei erstellen
|
||
#touch "$welcome_ini"
|
||
#touch "$welcome_ini" || echo "" > "$welcome_ini"
|
||
touch "$config_file" 2>/dev/null || echo "" > "$config_file"
|
||
|
||
# Regionseinstellungen hinzufügen
|
||
add_ini_section "$config_file" "$region_name"
|
||
|
||
# Regionseinstellungen setzen
|
||
set_ini_key "$config_file" "$region_name" "RegionUUID" "$region_uuid"
|
||
set_ini_key "$config_file" "$region_name" "Location" "$location"
|
||
set_ini_key "$config_file" "$region_name" "SizeX" "256"
|
||
set_ini_key "$config_file" "$region_name" "SizeY" "256"
|
||
set_ini_key "$config_file" "$region_name" "SizeZ" "256"
|
||
set_ini_key "$config_file" "$region_name" "InternalPort" "$port"
|
||
set_ini_key "$config_file" "$region_name" "ExternalHostName" "$system_ip"
|
||
set_ini_key "$config_file" "$region_name" "MaxPrims" "15000"
|
||
set_ini_key "$config_file" "$region_name" "MaxAgents" "40"
|
||
set_ini_key "$config_file" "$region_name" "MaptileStaticUUID" "$region_uuid"
|
||
set_ini_key "$config_file" "$region_name" "InternalAddress" "0.0.0.0"
|
||
set_ini_key "$config_file" "$region_name" "AllowAlternatePorts" "False"
|
||
set_ini_key "$config_file" "$region_name" "NonPhysicalPrimMax" "512"
|
||
set_ini_key "$config_file" "$region_name" "PhysicalPrimMax" "128"
|
||
set_ini_key "$config_file" "$region_name" ";ClampPrimSize" "false"
|
||
set_ini_key "$config_file" "$region_name" ";MaxPrimsPerUser" "-1"
|
||
set_ini_key "$config_file" "$region_name" ";ScopeID" "$region_uuid"
|
||
set_ini_key "$config_file" "$region_name" ";RegionType" "Mainland"
|
||
set_ini_key "$config_file" "$region_name" ";RenderMinHeight" "-1"
|
||
set_ini_key "$config_file" "$region_name" ";RenderMaxHeight" "100"
|
||
set_ini_key "$config_file" "$region_name" ";MapImageModule" "Warp3DImageModule"
|
||
set_ini_key "$config_file" "$region_name" ";TextureOnMapTile" "true"
|
||
set_ini_key "$config_file" "$region_name" ";DrawPrimOnMapTile" "true"
|
||
set_ini_key "$config_file" "$region_name" ";GenerateMaptiles" "true"
|
||
set_ini_key "$config_file" "$region_name" ";MaptileRefresh" "0"
|
||
set_ini_key "$config_file" "$region_name" ";MaptileStaticFile" "path/to/SomeFile.png"
|
||
set_ini_key "$config_file" "$region_name" ";MasterAvatarFirstName" "John"
|
||
set_ini_key "$config_file" "$region_name" ";MasterAvatarLastName" "Doe"
|
||
set_ini_key "$config_file" "$region_name" ";MasterAvatarSandboxPassword" "passwd"
|
||
|
||
echo -e "${SYM_OK} ${COLOR_VALUE}${region_name} ${COLOR_DIR}(${location}, Port ${port})${COLOR_RESET}" >&2
|
||
done
|
||
fi
|
||
done
|
||
|
||
echo -e "${SYM_OK}${COLOR_OK} Regionserstellung abgeschlossen!${COLOR_RESET}"
|
||
blankline
|
||
return 0
|
||
}
|
||
|
||
# Hauptfunktion, fragt Benutzer nach IP & Gridnamen und ruft alle Teilfunktionen auf
|
||
function iniconfig() {
|
||
echo "Das Arbeitsverzeichnis ist: $SCRIPT_DIR"
|
||
|
||
echo "Wie ist Ihre IP oder DNS-Adresse? ($system_ip)"
|
||
read -r ip
|
||
|
||
# Falls die IP leer bleibt, wird system_ip verwendet
|
||
if [[ -z "$ip" ]]; then
|
||
ip=$system_ip
|
||
fi
|
||
|
||
echo "Wie heißt Ihr Grid?"
|
||
read -r gridname
|
||
|
||
# Falls der Gridname leer bleibt, wird eine generierte Name verwendet
|
||
if [[ -z "$gridname" ]]; then
|
||
gridname=${genGridName}
|
||
fi
|
||
|
||
echo "Verwendete IP: $ip"
|
||
echo "Gridname: $gridname"
|
||
|
||
#! ⚠️ **Wichtige Sicherheitsinformation!**
|
||
# Zur Kontrolle wird der Benutzername und das Passwort in der Datei:
|
||
# `mariadb_passwords.txt` und `userinfo.txt` gespeichert.
|
||
# Diese Konfiguration benötigt diese `mariadb_passwords.txt` und `userinfo.txt` Datei um die Daten einzutragen.
|
||
# Diese Dateien **solltet ihr danach unbedingt von eurem Server löschen** und stattdessen **sicher auf eurem PC aufbewahren**.
|
||
|
||
# Konfigurationsfunktionen für verschiedene Komponenten aufrufen
|
||
#generate_all_name
|
||
echo "Starte moneyserveriniconfig ..."
|
||
moneyserveriniconfig "$ip" "$gridname"
|
||
echo "Starte opensiminiconfig ..."
|
||
opensiminiconfig "$ip" "$gridname"
|
||
echo "Starte robusthginiconfig ..."
|
||
robusthginiconfig "$ip" "$gridname"
|
||
echo "Starte robustiniconfig ..."
|
||
robustiniconfig "$ip" "$gridname"
|
||
echo "Starte gridcommoniniconfig ..."
|
||
gridcommoniniconfig "$ip" "$gridname"
|
||
echo "Starte standalonecommoniniconfig ..."
|
||
standalonecommoniniconfig "$ip" "$gridname"
|
||
echo "Starte flotsaminiconfig ..."
|
||
flotsaminiconfig "$ip" "$gridname"
|
||
echo "Starte osslenableiniconfig ..."
|
||
osslenableiniconfig "$ip" "$gridname"
|
||
echo "Starte welcomeiniconfig ..."
|
||
welcomeiniconfig "$ip" "$gridname"
|
||
echo "Starte database_set_iniconfig ..."
|
||
database_set_iniconfig
|
||
# Auswahl des Modus Hypergrid oder Geschlossener Grid.
|
||
hypergrid "hypergrid"
|
||
#hypergrid "closed"
|
||
}
|
||
|
||
#?──────────────────────────────────────────────────────────────────────────────────────────
|
||
#* XML Konfigurationen für Addon Pakete wie Texturen, Avatare oder Skripte
|
||
#?──────────────────────────────────────────────────────────────────────────────────────────
|
||
|
||
# shellcheck disable=SC2317
|
||
function verify_xml_section() {
|
||
|
||
local file="$1"
|
||
local section_name="$2"
|
||
|
||
if [ ! -f "$file" ]; then
|
||
echo -e "${SYM_BAD} ${COLOR_BAD}Error: File ${COLOR_DIR}${file}${COLOR_BAD} does not exist${COLOR_RESET}" >&2
|
||
return 2
|
||
fi
|
||
|
||
if grep -q "<Section Name=\"$section_name\">" "$file"; then
|
||
echo -e "${SYM_OK} ${COLOR_LABEL}Section ${COLOR_VALUE}'$section_name'${COLOR_LABEL} exists in ${COLOR_DIR}${file}${COLOR_RESET}"
|
||
return 0
|
||
else
|
||
echo -e "${SYM_BAD} ${COLOR_LABEL}Section ${COLOR_VALUE}'$section_name'${COLOR_LABEL} not found in ${COLOR_DIR}${file}${COLOR_RESET}"
|
||
return 1
|
||
fi
|
||
}
|
||
|
||
# shellcheck disable=SC2317
|
||
function add_xml_section() {
|
||
local file="$1"
|
||
local section_name="$2"
|
||
local content="$3"
|
||
local closing_tag="${4:-</Nini>}" # Standard ist </Nini>, kann überschrieben werden
|
||
|
||
# Verifizieren ob der Abschnitt bereits existiert
|
||
if verify_xml_section "$file" "$section_name" >/dev/null; then
|
||
return 0
|
||
fi
|
||
|
||
# Temporäre Datei für Sicherheitskopie
|
||
local temp_file
|
||
temp_file=$(mktemp)
|
||
|
||
echo -e "${SYM_INFO} ${COLOR_ACTION}Adding section ${COLOR_VALUE}'$section_name'${COLOR_ACTION} to ${COLOR_DIR}${file}${COLOR_RESET}"
|
||
|
||
# Abschnitt vor dem schließenden Tag einfügen
|
||
if sed "s|$closing_tag| <Section Name=\"$section_name\">\n$content\n </Section>\n$closing_tag|" "$file" > "$temp_file"; then
|
||
if mv "$temp_file" "$file"; then
|
||
echo -e "${SYM_OK} ${COLOR_OK}Successfully added section ${COLOR_VALUE}'$section_name'${COLOR_OK} to ${COLOR_DIR}${file}${COLOR_RESET}"
|
||
return 0
|
||
fi
|
||
fi
|
||
|
||
echo -e "${SYM_BAD} ${COLOR_BAD}Failed to add section ${COLOR_VALUE}'$section_name'${COLOR_BAD} to ${COLOR_DIR}${file}${COLOR_RESET}" >&2
|
||
return 1
|
||
}
|
||
|
||
# shellcheck disable=SC2317
|
||
function del_xml_section() {
|
||
local file="$1"
|
||
local section_name="$2"
|
||
|
||
# Verifizieren ob der Abschnitt existiert
|
||
if ! verify_xml_section "$file" "$section_name" >/dev/null; then
|
||
return 0 # Abschnitt existiert nicht - nichts zu tun
|
||
fi
|
||
|
||
# Temporäre Datei für Sicherheitskopie
|
||
local temp_file
|
||
temp_file=$(mktemp)
|
||
|
||
echo -e "${SYM_INFO} ${COLOR_ACTION}Removing section ${COLOR_VALUE}'$section_name'${COLOR_ACTION} from ${COLOR_DIR}${file}${COLOR_RESET}"
|
||
|
||
# Abschnitt entfernen (inklusive aller Zeilen zwischen Section-Tags)
|
||
if sed "/<Section Name=\"$section_name\">/,/<\/Section>/d" "$file" > "$temp_file"; then
|
||
if mv "$temp_file" "$file"; then
|
||
echo -e "${SYM_OK} ${COLOR_OK}Successfully removed section ${COLOR_VALUE}'$section_name'${COLOR_OK} from ${COLOR_DIR}${file}${COLOR_RESET}"
|
||
return 0
|
||
fi
|
||
fi
|
||
|
||
echo -e "${SYM_BAD} ${COLOR_BAD}Failed to remove section ${COLOR_VALUE}'$section_name'${COLOR_BAD} from ${COLOR_DIR}${file}${COLOR_RESET}" >&2
|
||
return 1
|
||
}
|
||
|
||
#* Beispiel Implementierung für PBR Textures ohne Test eingefügt.
|
||
function configure_pbr_textures() {
|
||
local asset_sets_file="opensim/bin/assets/AssetSets.xml"
|
||
local libraries_file="opensim/bin/inventory/Libraries.xml"
|
||
|
||
echo -e "\n${COLOR_HEADING}=== Configuring PBR Textures ===${COLOR_RESET}"
|
||
|
||
# AssetSets.xml bearbeiten
|
||
add_xml_section "$asset_sets_file" "PBR Textures AssetSet" \
|
||
" <Key Name=\"file\" Value=\"PBRTexturesAssetSet/PBRTexturesAssetSet.xml\"/>" || return 1
|
||
|
||
# Libraries.xml bearbeiten
|
||
add_xml_section "$libraries_file" "PBRTextures Library" \
|
||
" <Key Name=\"foldersFile\" Value=\"PBRTexturesLibrary/PBRTexturesLibraryFolders.xml\"/>\n <Key Name=\"itemsFile\" Value=\"PBRTexturesLibrary/PBRTexturesLibraryItems.xml\"/>" || return 1
|
||
|
||
echo -e "${SYM_OK} ${COLOR_OK}PBR Textures configuration completed successfully${COLOR_RESET}"
|
||
|
||
}
|
||
|
||
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
|
||
blankline
|
||
}
|
||
|
||
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}"
|
||
blankline
|
||
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"
|
||
blankline
|
||
}
|
||
|
||
# Helper to clean config files (remove leading spaces/tabs)
|
||
clean_config() {
|
||
local file=$1
|
||
sed -i 's/^[ \t]*//' "$file"
|
||
}
|
||
|
||
|
||
|
||
# cleanall - Removes OpenSim completely
|
||
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
|
||
blankline
|
||
}
|
||
|
||
#?──────────────────────────────────────────────────────────────────────────────────────────
|
||
#* ZUSAMMENFASSUNG DER FUNKTIONEN IN LOGISCHE GRUPPEN
|
||
#?──────────────────────────────────────────────────────────────────────────────────────────
|
||
|
||
# Standalone-Service-Neustart (ohne Logbereinigung)
|
||
function standalonerestart() {
|
||
standalonestop
|
||
sleep $Simulator_Stop_wait # Wartezeit für sauberen Shutdown
|
||
standalonestart
|
||
}
|
||
|
||
# Kompletter OpenSim-Neustart mit Logrotation
|
||
function opensimrestart() {
|
||
opensimstop
|
||
sleep $Simulator_Stop_wait # Wartezeit für Dienst-Stopp
|
||
logclean # Logbereinigung
|
||
sleep $Simulator_Start_wait # Wartezeit vor Neustart
|
||
opensimstart
|
||
echo -e "\033[36mAktive Screen-Sessions:\033[0m"
|
||
screen -ls || echo "Keine Screen-Sessions gefunden"
|
||
}
|
||
|
||
# Server-Reboot mit Vorbereitung
|
||
function reboot() {
|
||
echo -e "\033[1;33m⚠ Server-Neustart wird eingeleitet...\033[0m"
|
||
|
||
opensimstop
|
||
sleep $Simulator_Stop_wait
|
||
shutdown -r now
|
||
}
|
||
|
||
# OpenSim komplett herunterladen ⚡ Vorsicht
|
||
function downloadallgit() {
|
||
# Downloads aus dem Github.
|
||
opensimgitcopy
|
||
moneygitcopy
|
||
#ruthrothgit # Funktioniert nicht richtig.
|
||
#avatarassetsgit # Funktioniert nicht richtig.
|
||
#osslscriptsgit
|
||
#pbrtexturesgit
|
||
# Versionierung des OpenSimulators.
|
||
versionrevision
|
||
# OpenSimulator erstellen aus dem Source Code.
|
||
opensimbuild
|
||
}
|
||
|
||
function autoinstall() {
|
||
# Server vorbereiten
|
||
servercheck
|
||
|
||
# Verzeichnisse erstellen. Standard: 1
|
||
createdirectory
|
||
|
||
# mySQL installieren. Standard: Benutzername wird generiert, dazu wird ein 16 stelliges Passwort erzeugt.
|
||
database_setup
|
||
|
||
# Downloads aus dem Github hier OpenSim und Money. einfach beises mit Enter bestätigen.
|
||
opensimgitcopy
|
||
moneygitcopy
|
||
|
||
# Versionierung des OpenSimulators. Keine eingabe erforderlich.
|
||
versionrevision
|
||
|
||
# OpenSimulator erstellen aus dem Source Code. Standard: ja.
|
||
opensimbuild
|
||
|
||
# Kleine Pause
|
||
sleep $Simulator_Start_wait
|
||
|
||
# OpenSimulator kopieren
|
||
opensimcopy
|
||
|
||
# Alles konfigurieren
|
||
iniconfig
|
||
|
||
# Zufallsregionen erstellen
|
||
regionsiniconfig
|
||
|
||
# Alles starten
|
||
#opensimrestart
|
||
|
||
#Vor dem Start die letzten vorbereitungen.
|
||
firststart
|
||
|
||
# todo: alles vereinfachen in einer Abfrage:
|
||
# 3.Schritt
|
||
# Standard-Zugangsdaten verwenden? (j/n)
|
||
# n
|
||
|
||
# Benutzername: MeinDatenbankBenutzername
|
||
# Passwort:MeinGeheimesDatenbankPawort123
|
||
|
||
# 4.Schritt
|
||
# ? OpenSimulator GitHub-Verwaltung
|
||
# Möchten Sie den OpenSimulator vom GitHub verwenden oder aktualisieren? ([upgrade]/new)
|
||
# new
|
||
# Möchten Sie diese Version mit .NET 6 oder .NET 8 betreiben? ([8]/6)
|
||
# 8
|
||
|
||
# 5.Schritt
|
||
# ? MoneyServer GitHub-Verwaltung
|
||
# Möchten Sie den MoneyServer vom GitHub verwenden oder aktualisieren? ([upgrade]/new)
|
||
# new
|
||
|
||
# 6.Schritt
|
||
# ?️ OpenSimulator Build-Prozess
|
||
# Möchten Sie den OpenSimulator jetzt erstellen? ([ja]/nein)
|
||
# ja
|
||
|
||
# 7.Schritt
|
||
# Das Arbeitsverzeichnis ist: /home
|
||
# Wie ist Ihre IP oder DNS-Adresse? (192.168.2.105)
|
||
# MeinOpenSimServer.de
|
||
|
||
# Wie heißt Ihr Grid?
|
||
# TeleTabiGrid
|
||
|
||
# 8.Schritt
|
||
# ☛ Wie viele Zufallsregionen sollen pro Simulator erstellt werden?
|
||
# 1
|
||
|
||
# 9.Schritt
|
||
# Master User Erstellung (Enter für Default-Werte)
|
||
# Vorname [John]:Tele
|
||
# Nachname [Doe]:Tabbi
|
||
# Passwort [123456]:GeheimesPasswort123
|
||
# E-Mail [john@doe.com]:purzel@baum.de
|
||
# UserID [automatisch generiert]:Enter drücken
|
||
|
||
# Zusammenfassung wird hier angezeigt.
|
||
# j
|
||
|
||
# Eure Informationen sind gespeichert in mariadb_passwords.txt und userinfo.txt bitte sicher verwahren.
|
||
|
||
}
|
||
|
||
#?──────────────────────────────────────────────────────────────────────────────────────────
|
||
#* Hilfefunktionen
|
||
#?──────────────────────────────────────────────────────────────────────────────────────────
|
||
|
||
function help() {
|
||
# Allgemeine Befehle
|
||
echo -e "${COLOR_SECTION}${SYM_SERVER} OpenSim Grundbefehle:${COLOR_RESET}"
|
||
echo -e "\t${COLOR_START}opensimstart${COLOR_RESET}\t\t# Startet OpenSimulator Gridserver oder Regionsserver"
|
||
echo -e "\t${COLOR_STOP}opensimstop${COLOR_RESET}\t\t# Stoppt OpenSimulator komplett"
|
||
echo -e "\t${COLOR_START}opensimrestart${COLOR_RESET}\t\t# Startet den OpenSimulator neu"
|
||
echo -e "\t${COLOR_OK}check_screens${COLOR_RESET}\t\t# Prüft laufende Prozesse und handelt entsprechend"
|
||
echo ""
|
||
|
||
# System-Checks & Setup
|
||
echo -e "${COLOR_SECTION}${SYM_TOOLS} System-Checks & Setup:${COLOR_RESET}"
|
||
echo -e "\t${COLOR_OK}servercheck${COLOR_RESET}\t\t# Installiert und Prüft den Server"
|
||
echo -e "\t${COLOR_OK}createdirectory${COLOR_RESET}\t\t# Erstellt alle benötigten Verzeichnisse"
|
||
echo -e "\t${COLOR_OK}setcrontab${COLOR_RESET}\t\t# Richtet Crontab ein damit der Server wartungsfrei laeuft"
|
||
echo ""
|
||
|
||
# Git-Operationen
|
||
echo -e "${COLOR_SECTION}${SYM_SYNC} Git-Operationen:${COLOR_RESET}"
|
||
echo -e "\t${COLOR_OK}opensimgitcopy${COLOR_RESET}\t\t# Klont den OpenSim Code"
|
||
echo -e "\t${COLOR_OK}moneygitcopy${COLOR_RESET}\t\t# Baut den MoneyServer in den OpenSimulator ein"
|
||
#echo -e "\t${COLOR_OK}osslscriptsgit${COLOR_RESET}\t\t# Klont OSSL-Skripte"
|
||
#echo -e "\t${COLOR_OK}versionrevision${COLOR_RESET}\t\t# Setzt Versionsrevision"
|
||
echo ""
|
||
|
||
# OpenSim Build & Deploy
|
||
echo -e "${COLOR_SECTION}${SYM_FOLDER} OpenSim Build & Deploy:${COLOR_RESET}"
|
||
echo -e "\t${COLOR_OK}opensimbuild${COLOR_RESET}\t\t# Kompiliert OpenSim zu ausführbaren Dateien"
|
||
echo -e "\t${COLOR_OK}opensimcopy${COLOR_RESET}\t\t# Kopiert OpenSim in alle Verzeichnisse"
|
||
#echo -e "\t${COLOR_OK}opensimupgrade${COLOR_RESET}\t\t# Upgradet OpenSim"
|
||
echo -e "\t${COLOR_OK}database_setup${COLOR_RESET}\t\t# Erstellt alle Datenbanken"
|
||
echo ""
|
||
|
||
# Konfigurationsmanagement
|
||
#echo -e "${COLOR_SECTION}${SYM_CONFIG} Konfigurationsmanagement:${COLOR_RESET}"
|
||
#echo -e "\t${COLOR_WARNING}moneyserveriniconfig${COLOR_RESET}\t# Konfiguriert MoneyServer.ini (experimentell)"
|
||
#echo -e "\t${COLOR_WARNING}opensiminiconfig${COLOR_RESET}\t# Konfiguriert OpenSim.ini (experimentell)"
|
||
#echo -e "\t${COLOR_WARNING}regionsiniconfig${COLOR_RESET}\t# Konfiguriert Regionen (experimentell)"
|
||
#echo ""
|
||
|
||
# Systembereinigung
|
||
echo -e "${COLOR_SECTION}${SYM_CLEAN} Systembereinigung:${COLOR_RESET}"
|
||
echo -e "\t${COLOR_OK}cacheclean${COLOR_RESET}\t\t# Bereinigt Cache"
|
||
echo -e "\t${COLOR_OK}logclean${COLOR_RESET}\t\t# Bereinigt Logs"
|
||
echo -e "\t${COLOR_OK}mapclean${COLOR_RESET}\t\t# Bereinigt Maptiles"
|
||
#echo -e "\t${COLOR_OK}clean_linux_logs${COLOR_RESET}\t# Bereinigt Systemlogs"
|
||
echo ""
|
||
|
||
# Hilfe
|
||
echo -e "${COLOR_SECTION}${SYM_INFO} Hilfe:${COLOR_RESET}"
|
||
echo -e "\t${COLOR_OK}help${COLOR_RESET}\t\t\t# Zeigt diese Hilfe"
|
||
echo -e "\t${COLOR_OK}prohelp${COLOR_RESET}\t\t\t# Zeigt die Pro Hilfe"
|
||
echo ""
|
||
}
|
||
|
||
function prohelp() {
|
||
#* OpenSim Grundbefehle
|
||
echo -e "${COLOR_SECTION}${SYM_SERVER} OpenSim Grundbefehle:${COLOR_RESET}"
|
||
echo -e "\t${COLOR_START}opensimstart${COLOR_RESET} \t\t\t # OpenSim starten"
|
||
echo -e "\t${COLOR_STOP}opensimstop${COLOR_RESET} \t\t\t # OpenSim stoppen"
|
||
echo -e "\t${COLOR_START}opensimrestart${COLOR_RESET} \t\t\t # OpenSim neu starten"
|
||
echo -e "\t${COLOR_OK}check_screens${COLOR_RESET} \t\t\t # Laufende OpenSim-Prozesse prüfen und neu starten"
|
||
echo " "
|
||
|
||
#* System-Checks & Setup
|
||
echo -e "${COLOR_SECTION}${SYM_TOOLS} System-Checks & Setup:${COLOR_RESET}"
|
||
echo -e "\t${COLOR_OK}servercheck${COLOR_RESET} \t\t\t # Serverbereitschaft prüfen und Abhängigkeiten installieren"
|
||
echo -e "\t${COLOR_OK}createdirectory${COLOR_RESET} \t\t # OpenSim-Verzeichnisse erstellen"
|
||
echo -e "\t${COLOR_OK}setcrontab${COLOR_RESET} \t\t\t # Crontab Automatisierungen einrichten"
|
||
echo -e "\t${COLOR_OK}autoinstall${COLOR_RESET} \t\t\t # OpenSimulator Automatisiert installieren und einrichten"
|
||
echo " "
|
||
|
||
#* Git-Operationen
|
||
echo -e "${COLOR_SECTION}${SYM_SYNC} Git-Operationen:${COLOR_RESET}"
|
||
echo -e "\t${COLOR_OK}opensimgitcopy${COLOR_RESET} \t\t\t # OpenSim aus Git herunterladen"
|
||
echo -e "\t${COLOR_OK}moneygitcopy${COLOR_RESET} \t\t\t # MoneyServer aus Git holen"
|
||
echo -e "\t${COLOR_WARNING}ruthrothgit${COLOR_RESET} \t\t\t # Ruth Roth IAR Dateien ${COLOR_BAD}(Vorsicht)${COLOR_RESET}"
|
||
echo -e "\t${COLOR_WARNING}avatarassetsgit${COLOR_RESET} \t\t # Avatar-Assets ${COLOR_BAD}(Vorsicht)${COLOR_RESET}"
|
||
echo -e "\t${COLOR_OK}osslscriptsgit${COLOR_RESET} \t\t\t # OSSL Beispielskripte herunterladen"
|
||
echo -e "\t${COLOR_WARNING}pbrtexturesgit${COLOR_RESET} \t\t\t # PBR-Texturen ${COLOR_BAD}(Vorsicht)${COLOR_RESET}"
|
||
echo -e "\t${COLOR_OK}downloadallgit${COLOR_RESET} \t\t\t # Alle Git-Repos herunterladen"
|
||
echo -e "\t${COLOR_OK}versionrevision${COLOR_RESET} \t\t # Versionsverwaltung aktivieren"
|
||
echo " "
|
||
|
||
#* OpenSim Build & Deployment
|
||
echo -e "${COLOR_SECTION}${SYM_FOLDER} OpenSim Build & Deploy:${COLOR_RESET}"
|
||
echo -e "\t${COLOR_OK}opensimbuild${COLOR_RESET} \t\t\t # OpenSim kompilieren"
|
||
echo -e "\t${COLOR_OK}opensimcopy${COLOR_RESET} \t\t\t # OpenSim Dateien kopieren"
|
||
echo -e "\t${COLOR_OK}opensimupgrade${COLOR_RESET} \t\t\t # OpenSim aktualisieren"
|
||
echo -e "\t${COLOR_OK}database_setup${COLOR_RESET} \t\t\t # Datenbank für OpenSim einrichten"
|
||
echo " "
|
||
|
||
#* Konfigurationsmanagement
|
||
echo -e "${COLOR_SECTION}${SYM_CONFIG} Konfigurationsmanagement:${COLOR_RESET}"
|
||
echo -e "\t${COLOR_WARNING}moneyserveriniconfig${COLOR_RESET} \t\t # Konfiguriert MoneyServer.ini ${COLOR_BAD}(experimentell)${COLOR_RESET}"
|
||
echo -e "\t${COLOR_WARNING}opensiminiconfig${COLOR_RESET} \t\t # Konfiguriert OpenSim.ini ${COLOR_BAD}(experimentell)${COLOR_RESET}"
|
||
echo -e "\t${COLOR_WARNING}robusthginiconfig${COLOR_RESET} \t\t # Konfiguriert Robust.HG.ini ${COLOR_BAD}(experimentell)${COLOR_RESET}"
|
||
echo -e "\t${COLOR_WARNING}robustiniconfig${COLOR_RESET} \t\t # Konfiguriert Robust.local.ini ${COLOR_BAD}(experimentell)${COLOR_RESET}"
|
||
echo -e "\t${COLOR_WARNING}gridcommoniniconfig${COLOR_RESET} \t\t # Erstellt GridCommon.ini ${COLOR_BAD}(experimentell)${COLOR_RESET}"
|
||
echo -e "\t${COLOR_WARNING}standalonecommoniniconfig${COLOR_RESET} \t # Erstellt StandaloneCommon.ini ${COLOR_BAD}(experimentell)${COLOR_RESET}"
|
||
echo -e "\t${COLOR_WARNING}flotsaminiconfig${COLOR_RESET} \t\t # Erstellt FlotsamCache.ini ${COLOR_BAD}(experimentell)${COLOR_RESET}"
|
||
echo -e "\t${COLOR_WARNING}osslenableiniconfig${COLOR_RESET} \t\t # Konfiguriert osslEnable.ini ${COLOR_BAD}(experimentell)${COLOR_RESET}"
|
||
echo -e "\t${COLOR_WARNING}welcomeiniconfig${COLOR_RESET} \t\t # Konfiguriert Begrüßungsregion ${COLOR_BAD}(experimentell)${COLOR_RESET}"
|
||
echo -e "\t${COLOR_WARNING}regionsiniconfig${COLOR_RESET} \t\t # Startet neue Regionen-Konfigurationen ${COLOR_BAD}(experimentell)${COLOR_RESET}"
|
||
echo -e "\t${COLOR_WARNING}iniconfig${COLOR_RESET} \t\t\t # Startet ALLE Konfigurationen ${COLOR_BAD}(experimentell)${COLOR_RESET}"
|
||
echo " "
|
||
|
||
#* XML & INI-Operationen
|
||
echo -e "${COLOR_SECTION}${SYM_SCRIPT} INI-Operationen:${COLOR_RESET}"
|
||
echo -e "\t${COLOR_OK}verify_ini_section${COLOR_RESET} \t\t # INI-Abschnitt verifizieren"
|
||
echo -e "\t${COLOR_OK}verify_ini_key${COLOR_RESET} \t\t\t # INI-Schlüssel verifizieren"
|
||
echo -e "\t${COLOR_OK}add_ini_section${COLOR_RESET} \t\t # INI-Abschnitt hinzufügen"
|
||
echo -e "\t${COLOR_OK}set_ini_key${COLOR_RESET} \t\t\t # INI-Schlüssel setzen"
|
||
echo -e "\t${COLOR_WARNING}del_ini_section${COLOR_RESET} \t\t # INI-Abschnitt löschen ${COLOR_BAD}(Vorsicht)${COLOR_RESET}"
|
||
echo " "
|
||
|
||
#* XML-Operationen
|
||
echo -e "${COLOR_SECTION}${SYM_SCRIPT} XML-Operationen:${COLOR_RESET}"
|
||
echo -e "\t${COLOR_OK}verify_xml_section${COLOR_RESET} \t\t # XML-Abschnitt verifizieren"
|
||
echo -e "\t${COLOR_OK}add_xml_section${COLOR_RESET} \t\t # XML-Abschnitt hinzufügen"
|
||
echo -e "\t${COLOR_WARNING}del_xml_section${COLOR_RESET} \t\t # XML-Abschnitt löschen ${COLOR_BAD}(Vorsicht)${COLOR_RESET}"
|
||
echo " "
|
||
|
||
#* System-Bereinigung
|
||
echo -e "${COLOR_SECTION}${SYM_CLEAN} Systembereinigung:${COLOR_RESET}"
|
||
echo -e "\t${COLOR_OK}reboot${COLOR_RESET} \t\t\t\t # Server neu starten"
|
||
echo -e "\t${COLOR_OK}cacheclean${COLOR_RESET} \t\t\t # Cache bereinigen"
|
||
echo -e "\t${COLOR_OK}logclean${COLOR_RESET} \t\t\t # Logs bereinigen"
|
||
echo -e "\t${COLOR_OK}mapclean${COLOR_RESET} \t\t\t # Maptiles bereinigen"
|
||
echo -e "\t${COLOR_OK}renamefiles${COLOR_RESET} \t\t\t # Beispieldateien umbenennen"
|
||
echo -e "\t${COLOR_OK}clean_linux_logs${COLOR_RESET} \t\t # Linux-Logs bereinigen"
|
||
echo -e "\t${COLOR_OK}delete_opensim${COLOR_RESET} \t\t # OpenSimulator mit Verzeichnisse entfernen"
|
||
echo " "
|
||
|
||
#* Hilfe
|
||
echo -e "${COLOR_SECTION}${SYM_INFO} Hilfe:${COLOR_RESET}"
|
||
echo -e "\t${COLOR_OK}help${COLOR_RESET} \t\t\t\t # Diese Hilfeseite anzeigen"
|
||
echo " "
|
||
}
|
||
|
||
#?──────────────────────────────────────────────────────────────────────────────────────────
|
||
#* Eingabeauswertung
|
||
#?──────────────────────────────────────────────────────────────────────────────────────────
|
||
|
||
case $KOMMANDO in
|
||
# Allgemeine Befehle #
|
||
check_screens) check_screens ;;
|
||
start|opensimstart) opensimstart ;;
|
||
stop|opensimstop) opensimstop ;;
|
||
osrestart|autorestart|restart|opensimrestart) opensimrestart ;;
|
||
|
||
# SYSTEM-CHECKS & SETUP #
|
||
servercheck) servercheck ;;
|
||
createdirectory) createdirectory ;;
|
||
setcrontab) setcrontab ;;
|
||
|
||
# GIT-OPERATIONEN #
|
||
opensimgitcopy|opensimgit) opensimgitcopy ;;
|
||
moneygitcopy|moneygit) moneygitcopy ;;
|
||
ruthrothgit) ruthrothgit ;;
|
||
avatarassetsgit) avatarassetsgit ;;
|
||
osslscriptsgit) osslscriptsgit ;;
|
||
pbrtexturesgit) pbrtexturesgit ;;
|
||
downloadallgit) downloadallgit ;;
|
||
versionrevision) versionrevision ;;
|
||
|
||
# OPENSIM BUILD & DEPLOY #
|
||
opensimbuild) opensimbuild ;;
|
||
opensimcopy) opensimcopy ;;
|
||
opensimupgrade) opensimupgrade ;;
|
||
database_setup) database_setup ;;
|
||
autoinstall) autoinstall ;;
|
||
|
||
# KONFIGURATIONS-MGMT AUTOKONFIGURATION #
|
||
moneyserveriniconfig) moneyserveriniconfig "$2" "$3" ;;
|
||
opensiminiconfig) opensiminiconfig "$2" "$3" ;;
|
||
robusthginiconfig) robusthginiconfig "$2" "$3" ;;
|
||
robustiniconfig) robustiniconfig "$2" "$3" ;;
|
||
gridcommoniniconfig) gridcommoniniconfig "$2" "$3" ;;
|
||
standalonecommoniniconfig) standalonecommoniniconfig "$2" "$3" ;;
|
||
flotsaminiconfig) flotsaminiconfig "$2" "$3" ;;
|
||
osslenableiniconfig) osslenableiniconfig "$2" "$3" ;;
|
||
welcomeiniconfig) welcomeiniconfig "$2" "$3" ;;
|
||
database_set_iniconfig) database_set_iniconfig ;;
|
||
regionsiniconfig) regionsiniconfig ;; # Alle neuen Konfigurationen starten.
|
||
cleanconfig) clean_config "$2" ;;
|
||
createmasteruser) createmasteruser "$2" "$3" "$4" "$5" "$6" ;;
|
||
firststart) firststart ;;
|
||
|
||
# Experimental #
|
||
configure_pbr_textures) configure_pbr_textures ;;
|
||
|
||
# INI-OPERATIONEN #
|
||
verify_ini_section) verify_ini_section "$2" "$3" "$4" ;;
|
||
verify_ini_key) verify_ini_key "$2" "$3" "$4" ;;
|
||
add_ini_section) add_ini_section "$2" "$3" ;;
|
||
add_ini_before_section) add_ini_before_section "$2" "$3" "$4" ;;
|
||
set_ini_key) set_ini_key "$2" "$3" "$4" "$5" ;;
|
||
add_ini_key) add_ini_key "$2" "$3" "$4" "$5" ;;
|
||
del_ini_section) del_ini_section "$2" "$3" ;;
|
||
uncomment_ini_line) uncomment_ini_line "$2" "$3" ;;
|
||
uncomment_ini_section_line) uncomment_ini_section_line "$2" "$3" "$4" ;;
|
||
comment_ini_line) comment_ini_line "$2" "$3" "$4" ;;
|
||
iniconfig) iniconfig ;;
|
||
|
||
# XML-OPERATIONEN #
|
||
verify_xml_section) verify_xml_section "$2" "$3" ;;
|
||
add_xml_section) add_xml_section "$2" "$3" "$4" ;;
|
||
del_xml_section) del_xml_section "$2" "$3" ;;
|
||
|
||
# STANDALONE-MODUS #
|
||
standalone) standalone ;;
|
||
standalonestart) standalonestart ;;
|
||
standalonestop) standalonestop ;;
|
||
standalonerestart) standalonerestart ;;
|
||
|
||
# SYSTEM-BEREINIGUNG #
|
||
reboot) reboot ;;
|
||
dataclean) dataclean ;;
|
||
pathclean) pathclean ;;
|
||
cacheclean) cacheclean ;;
|
||
logclean) logclean ;;
|
||
mapclean) mapclean ;;
|
||
autoallclean) autoallclean ;;
|
||
regionsclean) regionsclean ;;
|
||
cleanall) cleanall ;;
|
||
renamefiles) renamefiles ;;
|
||
colortest) colortest ;;
|
||
clean_linux_logs) clean_linux_logs ;;
|
||
delete_opensim) delete_opensim ;;
|
||
|
||
# HILFE & SONSTIGES #
|
||
generate_all_name) generate_all_name ;;
|
||
prohelp) prohelp ;;
|
||
h|help|hilfe|*) help ;;
|
||
esac
|
||
|
||
# Programm Ende mit Zeitstempel
|
||
blankline
|
||
echo -e "\e[36m${SCRIPTNAME}\e[0m ${VERSION} wurde beendet $(date +'%Y-%m-%d %H:%M:%S')" >&2
|
||
exit 0
|