040420261513

This commit is contained in:
Manfred Aabye
2026-04-04 15:13:41 +02:00
committed by GitHub
parent a5e59e573d
commit c97ad6eb89
21 changed files with 1649 additions and 179 deletions
+4 -3
View File
@@ -1,8 +1,5 @@
# opensimMULTITOOL II V26.4.230.588
Status: Es funktioniert noch nicht richtig.
Status: It's not working properly yet.
Diese README ist fuer Einsteiger geschrieben.
Wenn du noch nie mit OpenSim oder Bash gearbeitet hast, starte mit den Schritten in diesem Dokument von oben nach unten.
@@ -22,6 +19,10 @@ Das Projekt besteht aus zwei Hauptteilen:
- CLI-Skripte (Konsole): fuer Administration per Terminal
- Web-Oberflaeche unter webphp/: fuer Bedienung im Browser
Voraussetzungen
- Linux Server
## 2. Wichtige Sicherheitshinweise
- Vor groesseren Aktionen immer Backup machen.
+78
View File
@@ -58,3 +58,81 @@ ERR_TARGET_NOT_ALLOWED=Ziel fuer dieses Profil nicht erlaubt
ERR_NO_UI_BACKEND=Kein UI Backend gefunden. Installiere whiptail oder dialog oder nutze CLI Parameter.
HELP_LANG=Sprache (de|en|fr|es), Standard: de
HELP_PROFILE=Profil (grid-sim|robust|standalone), Standard: grid-sim
PROMPT_EXTERNAL_ADDON=Externes Addon
PROMPT_ADDON_INFO_1=Dieses Addon wird aus einem externen Git-Repository
PROMPT_ADDON_INFO_2=heruntergeladen und in den OpenSim-Build integriert.
PROMPT_INSTALL_YESNO=Installieren? (ja/nein) [nein]:
INFO_ADDON_SKIPPED=Addon vom Benutzer uebersprungen
PROMPT_JANUS_TITLE=Janus WebRTC Gateway
PROMPT_JANUS_INFO_1=Janus wird als WebRTC-Gateway fuer OpenSim benoetigt.
PROMPT_JANUS_INFO_2=Die Installation aendert System-Pakete und Dateien
PROMPT_JANUS_INFO_3=unter
PROMPT_CONTINUE_YESNO=Fortfahren? (ja/nein) [nein]:
INFO_JANUS_CANCELLED=Janus-Aktion vom Benutzer abgebrochen.
STARTSTOP_NOT_RUNNING=%s laeuft nicht
STARTSTOP_SENT_SHUTDOWN=Shutdown an %s gesendet
STARTSTOP_FORCE_QUIT=Session '%s' laeuft nach Shutdown noch; Screen wird erzwungen beendet
STARTSTOP_STOP_FAILED=Screen-Session konnte nicht gestoppt werden: %s
STARTSTOP_STOPPED=Screen-Session '%s' gestoppt
STARTSTOP_JANUS_BIN_MISSING=Janus-Binary fehlt: %s. Bitte zuerst compile-janus/install-janus ausfuehren.
STARTSTOP_JANUS_CORE_CFG_MISSING=Janus Core-Konfiguration fehlt in %s. Bitte zuerst configure-janus/install-janus ausfuehren.
STARTSTOP_JANUS_HTTP_CFG_MISSING=Janus HTTP-Konfiguration fehlt in %s. Bitte zuerst configure-janus/install-janus ausfuehren.
STARTSTOP_JANUS_MARKER_MISSING=Janus-Ready-Marker nicht gefunden (%s). Fahre fort, da Binary/Konfig vorhanden sind.
STARTSTOP_JANUS_ALREADY_RUNNING=Janus laeuft bereits
STARTSTOP_JANUS_CONTROL_NOT_CONFIGURED=Janus-Steuerung ist nicht konfiguriert. Erwartet wird ein Systemdienst oder janus.sh Helper.
STARTSTOP_REQUIRED_INI_MISSING=%s kann nicht starten: fehlende Datei %s. Bitte zuerst Konfigurationsaktion ausfuehren.
STARTSTOP_ALREADY_RUNNING=Screen-Session '%s' laeuft bereits, Start wird uebersprungen
STARTSTOP_STARTING_FROM=Starte %s aus %s
STARTSTOP_STARTED_OK=Screen-Session '%s' erfolgreich gestartet
STARTSTOP_START_FAILED=Screen-Session '%s' blieb nicht aktiv. Bitte Logs/Konfiguration pruefen.
STARTSTOP_GRID_STARTING=Starte Grid aus %s
STARTSTOP_ROBUST_DIR_MISSING=RobustServer kann nicht starten: fehlendes Verzeichnis %s
STARTSTOP_ROBUST_START_FAILED=RobustServer konnte nicht gestartet werden
STARTSTOP_MONEY_DLL_MISSING=MoneyServer kann nicht starten: fehlende Datei %s
STARTSTOP_MONEY_INI_MISSING=MoneyServer kann nicht starten: fehlende Datei %s
STARTSTOP_MONEY_START_FAILED=MoneyServer konnte nicht gestartet werden
STARTSTOP_SIM_START_FAILED=%s konnte nicht gestartet werden
STARTSTOP_NO_SIM_FOUND=Keine simX-Instanzen unter %s gefunden (erwartet z. B. sim1/bin)
STARTSTOP_GRID_STOPPING=Stoppe Grid
STARTSTOP_LOGCLEAN_BEGIN=Bereinige Log-Dateien vor Neustart
STARTSTOP_LOGS_DELETED=Logs in %s geloescht
STARTSTOP_LOGCLEAN_DONE=Log-Bereinigung abgeschlossen
STARTSTOP_ACTIVE_SESSIONS=Aktive Screen-Sessions:
STARTSTOP_NO_SESSIONS=Keine Screen-Sessions gefunden
STARTSTOP_NAME_REQUIRED=--name ist erforderlich bei --target region
STARTSTOP_UNSUPPORTED_START_TARGET=Nicht unterstuetztes Start-Ziel: %s
STARTSTOP_UNSUPPORTED_STOP_TARGET=Nicht unterstuetztes Stop-Ziel: %s
ERR_UNKNOWN_OPTION=Unbekannte Option: %s
ERR_MISSING_TARGET=Fehlendes --target
ERR_MISSING_ACTION=Fehlendes --action
INFO_USING_PROFILE=Verwendetes Profil: %s
ERR_UNSUPPORTED_GRID_ACTION=Nicht unterstuetzte Grid-Aktion: %s
ERR_UNSUPPORTED_ACTION=Nicht unterstuetzte Aktion: %s
INFO_TOOL_PURPOSE=Dies ist ein Tool welches der Verwaltung von OpenSim Servern dient.
INFO_USE_OWN_RISK=Bitte beachten Sie, dass die Anwendung auf eigene Gefahr und Verantwortung erfolgt.
INFO_ABORT_HINT=Zum Abbrechen bitte STRG+C oder CTRL+C druecken.
INFO_WORKDIR=Das Arbeitsverzeichnis ist:
INFO_SYSTEM_IP=Ihre IP Adresse ist:
ROOT_WARN_USER_MODE_1=Warning: Dieses Skript kann als Benutzer ausgefuehrt werden,
ROOT_WARN_USER_MODE_2=aber einige Funktionen benoetigen Root-Rechte.
ROOT_PROMPT_CONTINUE_NO_ROOT=Moechten Sie trotzdem ohne Root-Privilegien fortfahren? (ja/nein):
ROOT_CONTINUE_NO_ROOT=Fortfahren ohne Root-Rechte...
COMMON_ABORTED=Abbruch.
INPUT_INVALID_YES_NO=Ungueltige Eingabe. Bitte 'ja' oder 'nein' eingeben.
MODE_CONFIG=Modus Einstellung
MODE_HYPERGRID_ENABLED=Hypergrid Modus aktiviert.
MODE_CLOSEDGRID_ENABLED=Geschlossener Grid Modus aktiviert.
MODE_SET_OK=Modus erfolgreich gesetzt
CRON_PROMPT_MONTHLY_SELECTION=Auswahl (z.B. '2 3' oder '5'):
CRON_PROMPT_REBOOT_AFTER_CLEAN=Soll nach den Clean-Operationen ein Neustart erfolgen? (j/n)
CRON_PROMPT_DAILY_RESTART=Soll ein taeglicher Restart durchgefuehrt werden? (j/n)
CRON_PROMPT_DAILY_HOUR=Uhrzeit (Stunde, 0-23):
CRON_PROMPT_ENABLE_MONITORING=Soll die Ueberwachung aktiviert werden? (j/n)
CRON_PROMPT_MONITOR_INTERVAL=Intervall in Minuten (Standard: 30):
LEGACY_PROMPT_CONTINUE_YESNO=Fortfahren? (ja/nein)
PROMPT_DROP_ALL_TABLES=Wirklich ALLE Tabellen loeschen? (ja/nein)
PROMPT_CONTINUE_TIMEOUT_YESNO=Fortfahren? (ja/NEIN):
CLEANALL_PROMPT_REMOVE_ALL=Moechtest du OpenSim komplett mit Konfigurationen entfernen? (ja/nein)
CLEANALL_START_DELETE=Loesche OpenSim vollstaendig...
CLEANALL_BIN_CLEARED=Alle bin-Verzeichnisse wurden geleert.
CLEANALL_KEEP=OpenSim bleibt erhalten.
+78
View File
@@ -58,3 +58,81 @@ ERR_TARGET_NOT_ALLOWED=Target not allowed for this profile
ERR_NO_UI_BACKEND=No UI backend found. Install whiptail or dialog, or use CLI parameters.
HELP_LANG=Language (de|en|fr|es), default: de
HELP_PROFILE=Profile (grid-sim|robust|standalone), default: grid-sim
PROMPT_EXTERNAL_ADDON=External addon
PROMPT_ADDON_INFO_1=This addon is downloaded from an external Git repository
PROMPT_ADDON_INFO_2=and integrated into the OpenSim build.
PROMPT_INSTALL_YESNO=Install? (yes/no) [no]:
INFO_ADDON_SKIPPED=Addon skipped by user
PROMPT_JANUS_TITLE=Janus WebRTC Gateway
PROMPT_JANUS_INFO_1=Janus is required as the WebRTC gateway for OpenSim.
PROMPT_JANUS_INFO_2=Installation changes system packages and files
PROMPT_JANUS_INFO_3=under
PROMPT_CONTINUE_YESNO=Continue? (yes/no) [no]:
INFO_JANUS_CANCELLED=Janus action cancelled by user.
STARTSTOP_NOT_RUNNING=%s is not running
STARTSTOP_SENT_SHUTDOWN=Sent shutdown to %s
STARTSTOP_FORCE_QUIT=Session '%s' still running after shutdown; forcing screen quit
STARTSTOP_STOP_FAILED=Failed to stop screen session: %s
STARTSTOP_STOPPED=Screen session '%s' stopped
STARTSTOP_JANUS_BIN_MISSING=Janus binary missing: %s. Run compile-janus/install-janus first.
STARTSTOP_JANUS_CORE_CFG_MISSING=Janus core config missing in %s. Run configure-janus/install-janus first.
STARTSTOP_JANUS_HTTP_CFG_MISSING=Janus HTTP config missing in %s. Run configure-janus/install-janus first.
STARTSTOP_JANUS_MARKER_MISSING=Janus ready marker not found (%s). Continuing because binary/config files exist.
STARTSTOP_JANUS_ALREADY_RUNNING=Janus already running
STARTSTOP_JANUS_CONTROL_NOT_CONFIGURED=Janus control not configured. Expected system service or janus.sh helper.
STARTSTOP_REQUIRED_INI_MISSING=%s cannot start: missing file %s. Run config action first.
STARTSTOP_ALREADY_RUNNING=Screen session '%s' already running; skipping start
STARTSTOP_STARTING_FROM=Starting %s from %s
STARTSTOP_STARTED_OK=Screen session '%s' started successfully
STARTSTOP_START_FAILED=Screen session '%s' did not stay alive. Check logs/config.
STARTSTOP_GRID_STARTING=Starting grid from %s
STARTSTOP_ROBUST_DIR_MISSING=RobustServer cannot start: missing directory %s
STARTSTOP_ROBUST_START_FAILED=RobustServer failed to start
STARTSTOP_MONEY_DLL_MISSING=MoneyServer cannot start: missing file %s
STARTSTOP_MONEY_INI_MISSING=MoneyServer cannot start: missing file %s
STARTSTOP_MONEY_START_FAILED=MoneyServer failed to start
STARTSTOP_SIM_START_FAILED=%s failed to start
STARTSTOP_NO_SIM_FOUND=No simX instances found under %s (expected e.g. sim1/bin)
STARTSTOP_GRID_STOPPING=Stopping grid
STARTSTOP_LOGCLEAN_BEGIN=Cleaning log files before restart
STARTSTOP_LOGS_DELETED=Deleted logs in %s
STARTSTOP_LOGCLEAN_DONE=Log cleanup complete
STARTSTOP_ACTIVE_SESSIONS=Active screen sessions:
STARTSTOP_NO_SESSIONS=No screen sessions found
STARTSTOP_NAME_REQUIRED=--name is required for --target region
STARTSTOP_UNSUPPORTED_START_TARGET=Unsupported start target: %s
STARTSTOP_UNSUPPORTED_STOP_TARGET=Unsupported stop target: %s
ERR_UNKNOWN_OPTION=Unknown option: %s
ERR_MISSING_TARGET=Missing --target
ERR_MISSING_ACTION=Missing --action
INFO_USING_PROFILE=Using profile: %s
ERR_UNSUPPORTED_GRID_ACTION=Unsupported action for grid: %s
ERR_UNSUPPORTED_ACTION=Unsupported action: %s
INFO_TOOL_PURPOSE=This is a tool for managing OpenSim servers.
INFO_USE_OWN_RISK=Please note that this application is used at your own risk and responsibility.
INFO_ABORT_HINT=Press CTRL+C to abort.
INFO_WORKDIR=Working directory:
INFO_SYSTEM_IP=Your IP address is:
ROOT_WARN_USER_MODE_1=Warning: This script can run as a normal user,
ROOT_WARN_USER_MODE_2=but some functions require root privileges.
ROOT_PROMPT_CONTINUE_NO_ROOT=Do you want to continue without root privileges? (yes/no):
ROOT_CONTINUE_NO_ROOT=Continuing without root privileges...
COMMON_ABORTED=Aborted.
INPUT_INVALID_YES_NO=Invalid input. Please enter 'yes' or 'no'.
MODE_CONFIG=Mode configuration
MODE_HYPERGRID_ENABLED=Hypergrid mode enabled.
MODE_CLOSEDGRID_ENABLED=Closed grid mode enabled.
MODE_SET_OK=Mode successfully set
CRON_PROMPT_MONTHLY_SELECTION=Selection (e.g. '2 3' or '5'):
CRON_PROMPT_REBOOT_AFTER_CLEAN=Reboot after clean operations? (y/n)
CRON_PROMPT_DAILY_RESTART=Run a daily restart? (y/n)
CRON_PROMPT_DAILY_HOUR=Hour (0-23):
CRON_PROMPT_ENABLE_MONITORING=Enable monitoring? (y/n)
CRON_PROMPT_MONITOR_INTERVAL=Interval in minutes (default: 30):
LEGACY_PROMPT_CONTINUE_YESNO=Continue? (yes/no)
PROMPT_DROP_ALL_TABLES=Really delete ALL tables? (yes/no)
PROMPT_CONTINUE_TIMEOUT_YESNO=Continue? (yes/NO):
CLEANALL_PROMPT_REMOVE_ALL=Do you want to completely remove OpenSim including configurations? (yes/no)
CLEANALL_START_DELETE=Deleting OpenSim completely...
CLEANALL_BIN_CLEARED=All bin directories have been cleared.
CLEANALL_KEEP=OpenSim will be kept.
+78
View File
@@ -58,3 +58,81 @@ ERR_TARGET_NOT_ALLOWED=Destino no permitido para este perfil
ERR_NO_UI_BACKEND=No se encontro backend UI. Instala whiptail o dialog, o usa parametros CLI.
HELP_LANG=Idioma (de|en|fr|es), por defecto: de
HELP_PROFILE=Perfil (grid-sim|robust|standalone), por defecto: grid-sim
PROMPT_EXTERNAL_ADDON=Addon externo
PROMPT_ADDON_INFO_1=Este addon se descarga desde un repositorio Git externo
PROMPT_ADDON_INFO_2=y se integra en la compilacion de OpenSim.
PROMPT_INSTALL_YESNO=¿Instalar? (si/no) [no]:
INFO_ADDON_SKIPPED=Addon omitido por el usuario
PROMPT_JANUS_TITLE=Pasarela Janus WebRTC
PROMPT_JANUS_INFO_1=Janus es necesario como pasarela WebRTC para OpenSim.
PROMPT_JANUS_INFO_2=La instalacion modifica paquetes del sistema y archivos
PROMPT_JANUS_INFO_3=bajo
PROMPT_CONTINUE_YESNO=¿Continuar? (si/no) [no]:
INFO_JANUS_CANCELLED=Accion de Janus cancelada por el usuario.
STARTSTOP_NOT_RUNNING=%s no esta en ejecucion
STARTSTOP_SENT_SHUTDOWN=Shutdown enviado a %s
STARTSTOP_FORCE_QUIT=La sesion '%s' sigue activa tras shutdown; forzando cierre de screen
STARTSTOP_STOP_FAILED=No se pudo detener la sesion screen: %s
STARTSTOP_STOPPED=Sesion screen '%s' detenida
STARTSTOP_JANUS_BIN_MISSING=Falta el binario de Janus: %s. Ejecuta primero compile-janus/install-janus.
STARTSTOP_JANUS_CORE_CFG_MISSING=Falta la configuracion core de Janus en %s. Ejecuta primero configure-janus/install-janus.
STARTSTOP_JANUS_HTTP_CFG_MISSING=Falta la configuracion HTTP de Janus en %s. Ejecuta primero configure-janus/install-janus.
STARTSTOP_JANUS_MARKER_MISSING=No se encontro el marcador de Janus (%s). Se continua porque binario/config existen.
STARTSTOP_JANUS_ALREADY_RUNNING=Janus ya esta en ejecucion
STARTSTOP_JANUS_CONTROL_NOT_CONFIGURED=Control de Janus no configurado. Se esperaba servicio del sistema o helper janus.sh.
STARTSTOP_REQUIRED_INI_MISSING=%s no puede iniciar: falta el archivo %s. Ejecuta primero la accion de configuracion.
STARTSTOP_ALREADY_RUNNING=La sesion screen '%s' ya esta activa; se omite el inicio
STARTSTOP_STARTING_FROM=Iniciando %s desde %s
STARTSTOP_STARTED_OK=Sesion screen '%s' iniciada correctamente
STARTSTOP_START_FAILED=La sesion screen '%s' no se mantuvo activa. Revisa logs/config.
STARTSTOP_GRID_STARTING=Iniciando grid desde %s
STARTSTOP_ROBUST_DIR_MISSING=RobustServer no puede iniciar: falta el directorio %s
STARTSTOP_ROBUST_START_FAILED=RobustServer no pudo iniciar
STARTSTOP_MONEY_DLL_MISSING=MoneyServer no puede iniciar: falta el archivo %s
STARTSTOP_MONEY_INI_MISSING=MoneyServer no puede iniciar: falta el archivo %s
STARTSTOP_MONEY_START_FAILED=MoneyServer no pudo iniciar
STARTSTOP_SIM_START_FAILED=%s no pudo iniciar
STARTSTOP_NO_SIM_FOUND=No se encontraron instancias simX en %s (se esperaba, por ejemplo, sim1/bin)
STARTSTOP_GRID_STOPPING=Deteniendo grid
STARTSTOP_LOGCLEAN_BEGIN=Limpiando archivos log antes del reinicio
STARTSTOP_LOGS_DELETED=Logs eliminados en %s
STARTSTOP_LOGCLEAN_DONE=Limpieza de logs completada
STARTSTOP_ACTIVE_SESSIONS=Sesiones screen activas:
STARTSTOP_NO_SESSIONS=No se encontraron sesiones screen
STARTSTOP_NAME_REQUIRED=--name es obligatorio con --target region
STARTSTOP_UNSUPPORTED_START_TARGET=Destino de inicio no soportado: %s
STARTSTOP_UNSUPPORTED_STOP_TARGET=Destino de parada no soportado: %s
ERR_UNKNOWN_OPTION=Opcion desconocida: %s
ERR_MISSING_TARGET=Falta --target
ERR_MISSING_ACTION=Falta --action
INFO_USING_PROFILE=Perfil en uso: %s
ERR_UNSUPPORTED_GRID_ACTION=Accion de grid no soportada: %s
ERR_UNSUPPORTED_ACTION=Accion no soportada: %s
INFO_TOOL_PURPOSE=Esta es una herramienta para administrar servidores OpenSim.
INFO_USE_OWN_RISK=Tenga en cuenta que esta aplicacion se usa bajo su propio riesgo y responsabilidad.
INFO_ABORT_HINT=Pulse CTRL+C para cancelar.
INFO_WORKDIR=El directorio de trabajo es:
INFO_SYSTEM_IP=Su direccion IP es:
ROOT_WARN_USER_MODE_1=Advertencia: este script puede ejecutarse como usuario normal,
ROOT_WARN_USER_MODE_2=pero algunas funciones requieren privilegios root.
ROOT_PROMPT_CONTINUE_NO_ROOT=Desea continuar sin privilegios root? (si/no):
ROOT_CONTINUE_NO_ROOT=Continuando sin privilegios root...
COMMON_ABORTED=Cancelado.
INPUT_INVALID_YES_NO=Entrada invalida. Introduzca 'si' o 'no'.
MODE_CONFIG=Configuracion de modo
MODE_HYPERGRID_ENABLED=Modo hypergrid activado.
MODE_CLOSEDGRID_ENABLED=Modo de grid cerrado activado.
MODE_SET_OK=Modo establecido correctamente
CRON_PROMPT_MONTHLY_SELECTION=Seleccion (p. ej. '2 3' o '5'):
CRON_PROMPT_REBOOT_AFTER_CLEAN=Reiniciar despues de las operaciones de limpieza? (s/n)
CRON_PROMPT_DAILY_RESTART=Realizar reinicio diario? (s/n)
CRON_PROMPT_DAILY_HOUR=Hora (0-23):
CRON_PROMPT_ENABLE_MONITORING=Activar monitorizacion? (s/n)
CRON_PROMPT_MONITOR_INTERVAL=Intervalo en minutos (predeterminado: 30):
LEGACY_PROMPT_CONTINUE_YESNO=Continuar? (si/no)
PROMPT_DROP_ALL_TABLES=Realmente desea borrar TODAS las tablas? (si/no)
PROMPT_CONTINUE_TIMEOUT_YESNO=Continuar? (si/NO):
CLEANALL_PROMPT_REMOVE_ALL=Desea eliminar OpenSim completamente con configuraciones? (si/no)
CLEANALL_START_DELETE=Eliminando OpenSim completamente...
CLEANALL_BIN_CLEARED=Se han vaciado todos los directorios bin.
CLEANALL_KEEP=OpenSim se mantendra.
+78
View File
@@ -58,3 +58,81 @@ ERR_TARGET_NOT_ALLOWED=Cible non autorisee pour ce profil
ERR_NO_UI_BACKEND=Aucun backend UI trouve. Installez whiptail ou dialog, ou utilisez les parametres CLI.
HELP_LANG=Langue (de|en|fr|es), defaut: de
HELP_PROFILE=Profil (grid-sim|robust|standalone), defaut: grid-sim
PROMPT_EXTERNAL_ADDON=Addon externe
PROMPT_ADDON_INFO_1=Cet addon est telecharge depuis un depot Git externe
PROMPT_ADDON_INFO_2=et integre dans la compilation OpenSim.
PROMPT_INSTALL_YESNO=Installer ? (oui/non) [non] :
INFO_ADDON_SKIPPED=Addon ignore par l utilisateur
PROMPT_JANUS_TITLE=Passerelle Janus WebRTC
PROMPT_JANUS_INFO_1=Janus est requis comme passerelle WebRTC pour OpenSim.
PROMPT_JANUS_INFO_2=L installation modifie des paquets systeme et des fichiers
PROMPT_JANUS_INFO_3=sous
PROMPT_CONTINUE_YESNO=Continuer ? (oui/non) [non] :
INFO_JANUS_CANCELLED=Action Janus annulee par l utilisateur.
STARTSTOP_NOT_RUNNING=%s n est pas en cours d execution
STARTSTOP_SENT_SHUTDOWN=Commande shutdown envoyee a %s
STARTSTOP_FORCE_QUIT=La session '%s' tourne encore apres shutdown; fermeture forcee de screen
STARTSTOP_STOP_FAILED=Echec de l arret de la session screen : %s
STARTSTOP_STOPPED=Session screen '%s' arretee
STARTSTOP_JANUS_BIN_MISSING=Binaire Janus manquant : %s. Lancez d abord compile-janus/install-janus.
STARTSTOP_JANUS_CORE_CFG_MISSING=Configuration core Janus manquante dans %s. Lancez d abord configure-janus/install-janus.
STARTSTOP_JANUS_HTTP_CFG_MISSING=Configuration HTTP Janus manquante dans %s. Lancez d abord configure-janus/install-janus.
STARTSTOP_JANUS_MARKER_MISSING=Marqueur Janus introuvable (%s). Continuation car binaire/config existent.
STARTSTOP_JANUS_ALREADY_RUNNING=Janus est deja en cours d execution
STARTSTOP_JANUS_CONTROL_NOT_CONFIGURED=Controle Janus non configure. Service systeme ou helper janus.sh attendu.
STARTSTOP_REQUIRED_INI_MISSING=%s ne peut pas demarrer : fichier manquant %s. Lancez d abord l action de configuration.
STARTSTOP_ALREADY_RUNNING=La session screen '%s' est deja active; demarrage ignore
STARTSTOP_STARTING_FROM=Demarrage de %s depuis %s
STARTSTOP_STARTED_OK=Session screen '%s' demarree avec succes
STARTSTOP_START_FAILED=La session screen '%s' n est pas restee active. Verifiez logs/config.
STARTSTOP_GRID_STARTING=Demarrage de la grille depuis %s
STARTSTOP_ROBUST_DIR_MISSING=RobustServer ne peut pas demarrer : dossier manquant %s
STARTSTOP_ROBUST_START_FAILED=Echec du demarrage de RobustServer
STARTSTOP_MONEY_DLL_MISSING=MoneyServer ne peut pas demarrer : fichier manquant %s
STARTSTOP_MONEY_INI_MISSING=MoneyServer ne peut pas demarrer : fichier manquant %s
STARTSTOP_MONEY_START_FAILED=Echec du demarrage de MoneyServer
STARTSTOP_SIM_START_FAILED=Echec du demarrage de %s
STARTSTOP_NO_SIM_FOUND=Aucune instance simX trouvee sous %s (ex. sim1/bin attendu)
STARTSTOP_GRID_STOPPING=Arret de la grille
STARTSTOP_LOGCLEAN_BEGIN=Nettoyage des fichiers log avant redemarrage
STARTSTOP_LOGS_DELETED=Logs supprimes dans %s
STARTSTOP_LOGCLEAN_DONE=Nettoyage des logs termine
STARTSTOP_ACTIVE_SESSIONS=Sessions screen actives :
STARTSTOP_NO_SESSIONS=Aucune session screen trouvee
STARTSTOP_NAME_REQUIRED=--name est requis avec --target region
STARTSTOP_UNSUPPORTED_START_TARGET=Cible de demarrage non prise en charge : %s
STARTSTOP_UNSUPPORTED_STOP_TARGET=Cible d arret non prise en charge : %s
ERR_UNKNOWN_OPTION=Option inconnue : %s
ERR_MISSING_TARGET=--target manquant
ERR_MISSING_ACTION=--action manquant
INFO_USING_PROFILE=Profil utilise : %s
ERR_UNSUPPORTED_GRID_ACTION=Action grille non prise en charge : %s
ERR_UNSUPPORTED_ACTION=Action non prise en charge : %s
INFO_TOOL_PURPOSE=Cet outil sert a gerer des serveurs OpenSim.
INFO_USE_OWN_RISK=Veuillez noter que cette application est utilisee a vos risques et sous votre responsabilite.
INFO_ABORT_HINT=Appuyez sur CTRL+C pour annuler.
INFO_WORKDIR=Repertoire de travail :
INFO_SYSTEM_IP=Votre adresse IP est :
ROOT_WARN_USER_MODE_1=Attention : ce script peut etre execute en utilisateur normal,
ROOT_WARN_USER_MODE_2=mais certaines fonctions exigent les droits root.
ROOT_PROMPT_CONTINUE_NO_ROOT=Continuer sans privileges root ? (oui/non) :
ROOT_CONTINUE_NO_ROOT=Continuation sans droits root...
COMMON_ABORTED=Annule.
INPUT_INVALID_YES_NO=Entree invalide. Veuillez saisir 'oui' ou 'non'.
MODE_CONFIG=Configuration du mode
MODE_HYPERGRID_ENABLED=Mode hypergrid active.
MODE_CLOSEDGRID_ENABLED=Mode grille fermee active.
MODE_SET_OK=Mode defini avec succes
CRON_PROMPT_MONTHLY_SELECTION=Selection (ex. '2 3' ou '5') :
CRON_PROMPT_REBOOT_AFTER_CLEAN=Redemarrer apres les operations de nettoyage ? (o/n)
CRON_PROMPT_DAILY_RESTART=Executer un redemarrage quotidien ? (o/n)
CRON_PROMPT_DAILY_HOUR=Heure (0-23) :
CRON_PROMPT_ENABLE_MONITORING=Activer la surveillance ? (o/n)
CRON_PROMPT_MONITOR_INTERVAL=Intervalle en minutes (defaut : 30) :
LEGACY_PROMPT_CONTINUE_YESNO=Continuer ? (oui/non)
PROMPT_DROP_ALL_TABLES=Supprimer VRAIMENT TOUTES les tables ? (oui/non)
PROMPT_CONTINUE_TIMEOUT_YESNO=Continuer ? (oui/NON) :
CLEANALL_PROMPT_REMOVE_ALL=Voulez-vous supprimer completement OpenSim avec les configurations ? (oui/non)
CLEANALL_START_DELETE=Suppression complete de OpenSim...
CLEANALL_BIN_CLEARED=Tous les repertoires bin ont ete vides.
CLEANALL_KEEP=OpenSim sera conserve.
+14 -1
View File
@@ -8,10 +8,11 @@ source "$SCRIPT_DIR/osmtool_core.sh"
usage() {
cat <<'EOF'
Usage:
osmtool_config.sh [--workdir <path>] --action <validate-file|validate-runtime>
osmtool_config.sh [--workdir <path>] --action <init-config|validate-file|validate-runtime>
[--file <path>] [--strict <true|false>]
Examples:
osmtool_config.sh --action init-config
osmtool_config.sh --action validate-file --file /opt/sim1/bin/OpenSim.ini
osmtool_config.sh --action validate-runtime --profile grid-sim --workdir /opt
EOF
@@ -184,6 +185,15 @@ done
validate_profile "$PROFILE"
ensure_profile_action_allowed config "$PROFILE" "$ACTION"
if [[ "$ACTION" != "init-config" && ! -f "$OSMTOOL_CONFIG_FILE" ]]; then
if [[ -t 0 ]]; then
log INFO "Shared configuration not found. Starting interactive setup."
init_shared_config_interactive
else
log INFO "Shared configuration not found at $OSMTOOL_CONFIG_FILE (non-interactive mode)"
fi
fi
case "$STRICT" in
true|false) ;;
*) die "--strict must be true or false" ;;
@@ -192,6 +202,9 @@ esac
log INFO "Using profile: $PROFILE"
case "$ACTION" in
init-config)
init_shared_config_interactive
;;
validate-file)
[[ -n "$FILE" ]] || die "validate-file requires --file"
validate_file "$FILE"
+203 -2
View File
@@ -4,6 +4,7 @@ set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
ROOT_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
export DEFAULT_WORKDIR="/opt"
export OSMTOOL_CONFIG_FILE="${OSMTOOL_CONFIG_FILE:-$ROOT_DIR/osmtool_config.json}"
LANG_DIR="$ROOT_DIR/lang"
APP_LANG="${OSM_LANG:-de}"
@@ -34,6 +35,203 @@ normalize_lang() {
esac
}
config_get_string() {
local key="$1"
local default_value="$2"
local value=""
[[ -f "$OSMTOOL_CONFIG_FILE" ]] || {
printf '%s' "$default_value"
return
}
if command -v jq >/dev/null 2>&1; then
value="$(jq -r --arg k "$key" '.[$k] // empty' "$OSMTOOL_CONFIG_FILE" 2>/dev/null || true)"
else
value="$(sed -n -E "s/^[[:space:]]*\"${key}\"[[:space:]]*:[[:space:]]*\"([^\"]*)\"[[:space:]]*,?[[:space:]]*$/\1/p" "$OSMTOOL_CONFIG_FILE" | head -n1)"
fi
if [[ -n "$value" ]]; then
printf '%s' "$value"
else
printf '%s' "$default_value"
fi
}
config_get_bool() {
local key="$1"
local default_value="$2"
local value=""
[[ -f "$OSMTOOL_CONFIG_FILE" ]] || {
printf '%s' "$default_value"
return
}
if command -v jq >/dev/null 2>&1; then
value="$(jq -r --arg k "$key" '.[$k] // empty' "$OSMTOOL_CONFIG_FILE" 2>/dev/null || true)"
else
value="$(sed -n -E "s/^[[:space:]]*\"${key}\"[[:space:]]*:[[:space:]]*(true|false)[[:space:]]*,?[[:space:]]*$/\1/p" "$OSMTOOL_CONFIG_FILE" | head -n1)"
fi
case "$value" in
true|false) printf '%s' "$value" ;;
*) printf '%s' "$default_value" ;;
esac
}
config_get_int() {
local key="$1"
local default_value="$2"
local value=""
[[ -f "$OSMTOOL_CONFIG_FILE" ]] || {
printf '%s' "$default_value"
return
}
if command -v jq >/dev/null 2>&1; then
value="$(jq -r --arg k "$key" '.[$k] // empty' "$OSMTOOL_CONFIG_FILE" 2>/dev/null || true)"
else
value="$(sed -n -E "s/^[[:space:]]*\"${key}\"[[:space:]]*:[[:space:]]*([0-9]+)[[:space:]]*,?[[:space:]]*$/\1/p" "$OSMTOOL_CONFIG_FILE" | head -n1)"
fi
if [[ "$value" =~ ^[0-9]+$ ]]; then
printf '%s' "$value"
else
printf '%s' "$default_value"
fi
}
config_path_value() {
local value="$1"
if [[ "$value" = /* ]]; then
printf '%s' "$value"
else
printf '%s' "$ROOT_DIR/$value"
fi
}
load_shared_config() {
local cfg_lang cfg_workdir
cfg_lang="$(normalize_lang "$(config_get_string "language" "de")")"
cfg_workdir="$(config_get_string "path_workdir" "$DEFAULT_WORKDIR")"
DEFAULT_WORKDIR="$cfg_workdir"
export DEFAULT_WORKDIR
if [[ -z "${OSM_LANG:-}" ]]; then
APP_LANG="$cfg_lang"
fi
CONFIG_DB_ROOT_USER="$(config_get_string "db_root_user" "root")"
CONFIG_DB_ROOT_PASS="$(config_get_string "db_root_pass" "")"
CONFIG_DB_USER="$(config_get_string "db_user" "opensimuser")"
CONFIG_DB_PASS="$(config_get_string "db_pass" "")"
CONFIG_PUBLIC_HOST="$(config_get_string "public_host" "127.0.0.1")"
CONFIG_GRIDNAME="$(config_get_string "gridname" "")"
CONFIG_JANUS_PREFIX="$(config_get_string "janus_prefix" "/opt/janus")"
CONFIG_OPENSIM_DIR="$(config_get_string "opensim_dir" "")"
export CONFIG_DB_ROOT_USER CONFIG_DB_ROOT_PASS CONFIG_DB_USER CONFIG_DB_PASS
export CONFIG_PUBLIC_HOST CONFIG_GRIDNAME CONFIG_JANUS_PREFIX CONFIG_OPENSIM_DIR
}
config_prompt_with_default() {
local prompt="$1"
local default_value="$2"
local answer=""
read -r -p "$prompt [$default_value]: " answer
if [[ -z "$answer" ]]; then
printf '%s' "$default_value"
else
printf '%s' "$answer"
fi
}
write_shared_config_file() {
local language="$1"
local workdir="$2"
local db_root_user="$3"
local db_root_pass="$4"
local db_user="$5"
local db_pass="$6"
local public_host="$7"
local gridname="$8"
local janus_prefix="$9"
local opensim_dir="${10}"
cat > "$OSMTOOL_CONFIG_FILE" <<EOF
{
"language": "${language}",
"path_workdir": "${workdir}",
"path_lang_dir": "lang",
"path_robust_bin": "robust/bin",
"path_opensim_bin": "opensim/bin",
"db_root_user": "${db_root_user}",
"db_root_pass": "${db_root_pass}",
"db_user": "${db_user}",
"db_pass": "${db_pass}",
"public_host": "${public_host}",
"gridname": "${gridname}",
"janus_prefix": "${janus_prefix}",
"opensim_dir": "${opensim_dir}",
"log_enabled": true,
"old_log_del": true,
"debug_log": "osmtool_debug.log",
"max_log_size_mb": 10,
"simulator_start_wait": 15,
"moneyserver_start_wait": 30,
"robustserver_start_wait": 30,
"simulator_stop_wait": 15,
"moneyserver_stop_wait": 30,
"robustserver_stop_wait": 30
}
EOF
}
init_shared_config_interactive() {
local cur_lang cur_workdir cur_db_root_user cur_db_root_pass cur_db_user cur_db_pass
local cur_public_host cur_gridname cur_janus_prefix cur_opensim_dir
local language workdir db_root_user db_root_pass db_user db_pass public_host gridname janus_prefix opensim_dir
if [[ ! -t 0 ]]; then
die "Interactive config initialization requires a TTY"
fi
cur_lang="$(normalize_lang "${OSM_LANG:-$(config_get_string "language" "de")}")"
cur_workdir="$(config_get_string "path_workdir" "$DEFAULT_WORKDIR")"
cur_db_root_user="$(config_get_string "db_root_user" "root")"
cur_db_root_pass="$(config_get_string "db_root_pass" "")"
cur_db_user="$(config_get_string "db_user" "opensimuser")"
cur_db_pass="$(config_get_string "db_pass" "")"
cur_public_host="$(config_get_string "public_host" "127.0.0.1")"
cur_gridname="$(config_get_string "gridname" "")"
cur_janus_prefix="$(config_get_string "janus_prefix" "/opt/janus")"
cur_opensim_dir="$(config_get_string "opensim_dir" "$cur_workdir/opensim")"
echo "Shared configuration file: $OSMTOOL_CONFIG_FILE"
language="$(normalize_lang "$(config_prompt_with_default "Language (de|en|fr|es)" "$cur_lang")")"
workdir="$(config_prompt_with_default "Workdir" "$cur_workdir")"
db_root_user="$(config_prompt_with_default "DB root user" "$cur_db_root_user")"
db_root_pass="$(config_prompt_with_default "DB root password" "$cur_db_root_pass")"
db_user="$(config_prompt_with_default "DB app user" "$cur_db_user")"
db_pass="$(config_prompt_with_default "DB app password" "$cur_db_pass")"
public_host="$(config_prompt_with_default "Public host/IP" "$cur_public_host")"
gridname="$(config_prompt_with_default "Grid name" "$cur_gridname")"
janus_prefix="$(config_prompt_with_default "Janus prefix" "$cur_janus_prefix")"
opensim_dir="$(config_prompt_with_default "OpenSim source dir" "$cur_opensim_dir")"
mkdir -p "$(dirname "$OSMTOOL_CONFIG_FILE")"
write_shared_config_file "$language" "$workdir" "$db_root_user" "$db_root_pass" "$db_user" "$db_pass" "$public_host" "$gridname" "$janus_prefix" "$opensim_dir"
load_shared_config
set_language "$language"
log INFO "Shared configuration written: $OSMTOOL_CONFIG_FILE"
}
validate_profile() {
case "$1" in
grid-sim|robust|standalone) return 0 ;;
@@ -48,7 +246,7 @@ profile_action_allowed() {
case "$module:$profile" in
install:grid-sim|install:robust|install:standalone)
case "$action" in server-check|prepare-ubuntu|install-opensim-deps|install-dotnet8|install-opensim|configure-opensim|configure-database|compile-janus|configure-janus|install-janus) return 0 ;; esac
case "$action" in init-config|server-check|prepare-ubuntu|install-opensim-deps|install-dotnet8|install-opensim|configure-opensim|configure-database|compile-janus|configure-janus|install-janus) return 0 ;; esac
;;
startstop:grid-sim|startstop:robust|startstop:standalone)
case "$action" in start|stop|restart) return 0 ;; esac
@@ -84,7 +282,7 @@ profile_action_allowed() {
case "$action" in create-rollback|list-rollbacks|update-opensim|update-janus|full-update) return 0 ;; esac
;;
config:grid-sim|config:robust|config:standalone)
case "$action" in validate-file|validate-runtime) return 0 ;; esac
case "$action" in init-config|validate-file|validate-runtime) return 0 ;; esac
;;
report:grid-sim|report:robust|report:standalone)
case "$action" in generate) return 0 ;; esac
@@ -251,5 +449,8 @@ Global options:
EOF
}
# Load shared settings before translations and module defaults are resolved.
load_shared_config
# Ensure translations are available in every script that sources this core.
init_i18n
+239 -31
View File
@@ -8,7 +8,7 @@ source "$SCRIPT_DIR/osmtool_core.sh"
usage() {
cat <<'EOF'
Usage:
osmtool_install.sh [--workdir <path>] --action <server-check|prepare-ubuntu|install-opensim-deps|install-dotnet8|install-opensim|configure-opensim|configure-database|compile-janus|configure-janus|install-janus>
osmtool_install.sh [--workdir <path>] --action <init-config|server-check|prepare-ubuntu|install-opensim-deps|install-dotnet8|install-opensim|configure-opensim|configure-database|compile-janus|configure-janus|install-janus>
[--opensim-dir <path>] [--opensim-repo <url>] [--opensim-branch <name>] [--repo-mode <update|fresh>]
[--tsassets-dir <path>] [--currency-dir <path>] [--data-backup-dir <path>]
[--deploy-binaries <true|false>] [--legacy-patch-dir <path>]
@@ -18,6 +18,7 @@ Usage:
[--api-secret <value>] [--admin-secret <value>]
Actions:
init-config Create/update shared osmtool configuration interactively
server-check Validate server readiness and required dependencies
prepare-ubuntu Basic apt update/upgrade and base packages
install-opensim-deps Install OpenSim runtime dependencies
@@ -466,14 +467,72 @@ configure_opensim_runtime() {
fi
if [[ -n "$cfg_user" && -n "$cfg_pass" ]]; then
local db_conn_robust db_conn_sim sim_name_inner
# MoneyServer Credentials
set_ini_key_value "$WORKDIR/robust/bin/MoneyServer.ini" "username" "$cfg_user"
set_ini_key_value "$WORKDIR/robust/bin/MoneyServer.ini" "password" "$cfg_pass"
log INFO "Updated MoneyServer.ini database credentials from configured values"
# Robust.ini ConnectionString (zwingend erforderlich für Datenbankverbindung)
db_conn_robust="Data Source=localhost;Database=robust;User ID=${cfg_user};Password=${cfg_pass};Old Guids=true;"
if [[ -f "$WORKDIR/robust/bin/Robust.ini" ]]; then
upsert_key "$WORKDIR/robust/bin/Robust.ini" "ConnectionString" "\"${db_conn_robust}\""
fi
# Jede simX/bin/OpenSim.ini ConnectionString (zwingend, sonst startet sim nicht)
shopt -s nullglob
for sim_dir in "$WORKDIR"/sim[0-9]*/bin; do
sim_name_inner="$(basename "$(dirname "$sim_dir")")"
[[ "$sim_name_inner" =~ ^sim[0-9]+$ ]] || continue
[[ -f "$sim_dir/OpenSim.ini" ]] || continue
db_conn_sim="Data Source=localhost;Database=${sim_name_inner};User ID=${cfg_user};Password=${cfg_pass};Old Guids=true;"
upsert_key "$sim_dir/OpenSim.ini" "ConnectionString" "\"${db_conn_sim}\""
done
shopt -u nullglob
log INFO "Updated ConnectionStrings in Robust.ini, MoneyServer.ini und simX/OpenSim.ini"
else
log INFO "MoneyServer.ini credentials unchanged (no DB credentials available in parameters/UserInfo.ini)"
log INFO "Keine DB-Credentials verfügbar — ConnectionString nicht gesetzt. Erst configure-database ausführen."
fi
log INFO "OpenSim runtime ini configuration completed"
# Hostname/IP in alle Konfigurationsdateien einsetzen (YOURHOST ersetzen)
if [[ -n "$PUBLIC_HOST" && "$PUBLIC_HOST" != "127.0.0.1" ]]; then
local h_escaped
h_escaped="$(printf '%s' "$PUBLIC_HOST" | sed 's/[\/&]/\\&/g')"
local cfg_f
for cfg_f in \
"$WORKDIR/robust/bin/Robust.ini" \
"$WORKDIR/robust/bin/config-include/GridCommon.ini" \
"$WORKDIR/standalone/bin/config-include/StandaloneCommon.ini"; do
[[ -f "$cfg_f" ]] || continue
sed -i "s|YOURHOST|${h_escaped}|g" "$cfg_f"
done
shopt -s nullglob
for sim_dir in "$WORKDIR"/sim[0-9]*/bin; do
for cfg_f in "$sim_dir/OpenSim.ini" "$sim_dir/config-include/GridCommon.ini"; do
[[ -f "$cfg_f" ]] || continue
sed -i "s|YOURHOST|${h_escaped}|g" "$cfg_f"
done
done
shopt -u nullglob
log INFO "Hostname ($PUBLIC_HOST) in Konfigurationsdateien eingesetzt"
fi
# Gridname in Konfigurationsdateien setzen
if [[ -n "$GRIDNAME" ]]; then
local cfg_f
for cfg_f in \
"$WORKDIR/robust/bin/Robust.ini" \
"$WORKDIR/robust/bin/config-include/GridCommon.ini" \
"$WORKDIR/standalone/bin/config-include/StandaloneCommon.ini"; do
[[ -f "$cfg_f" ]] || continue
upsert_key "$cfg_f" "GridName" "\"${GRIDNAME}\""
upsert_key "$cfg_f" "WelcomeMessage" "\"Willkommen bei ${GRIDNAME}\""
done
log INFO "Gridname ($GRIDNAME) in Konfigurationsdateien gesetzt"
fi
log INFO "OpenSim runtime ini Konfiguration abgeschlossen"
}
sql_escape() {
@@ -550,13 +609,24 @@ configure_database() {
log INFO "Ensured database: robust"
fi
sim_db_list="$(discover_sim_databases)"
# Sim-Datenbanken: bei --sim-count N explizit, sonst Verzeichnisse ermitteln
local sim_db_list=""
if [[ "$SIM_COUNT" -gt 0 ]]; then
sim_db_list="$(for ((i=1; i<=SIM_COUNT; i++)); do echo "sim${i}"; done)"
log INFO "--sim-count $SIM_COUNT: erstelle Datenbanken sim1..sim${SIM_COUNT}"
else
sim_db_list="$(discover_sim_databases)"
if [[ -z "$sim_db_list" ]]; then
log INFO "Keine sim*-Verzeichnisse unter $WORKDIR gefunden — sim-Datenbanken übersprungen. Mit --sim-count N erzwingen."
fi
fi
if [[ -n "$sim_db_list" ]]; then
while IFS= read -r db_name; do
[[ -n "$db_name" ]] || continue
db_ident="\`$db_name\`"
local db_ident="\`$db_name\`"
run_mariadb_sql "CREATE DATABASE IF NOT EXISTS $db_ident CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
log INFO "Ensured database: $db_name"
log INFO "Datenbank sichergestellt: $db_name"
done <<< "$sim_db_list"
fi
@@ -570,7 +640,7 @@ configure_database() {
if [[ -n "$sim_db_list" ]]; then
while IFS= read -r db_name; do
[[ -n "$db_name" ]] || continue
db_ident="\`$db_name\`"
local db_ident="\`$db_name\`"
run_mariadb_sql "GRANT ALL PRIVILEGES ON $db_ident.* TO '$escaped_user'@'localhost';"
done <<< "$sim_db_list"
fi
@@ -578,7 +648,7 @@ configure_database() {
run_mariadb_sql "FLUSH PRIVILEGES;"
write_db_credentials_file
log INFO "MariaDB database setup completed"
log INFO "MariaDB Datenbank-Setup abgeschlossen"
}
server_check() {
@@ -793,11 +863,37 @@ configure_janus() {
upsert_key "$http_cfg" "admin_http" "false"
fi
local snippet_file
local snippet_file secrets_file
snippet_file="$WORKDIR/opensim-janus-config.generated.ini"
secrets_file="$HOME/janus_opensim_secrets.env"
mkdir -p "$WORKDIR" 2>/dev/null || sudo mkdir -p "$WORKDIR"
# Vollstaendiges OpenSim/Robust-Snippet (entspricht config-janus-linux.sh)
cat <<EOF | sudo tee "$snippet_file" >/dev/null
; ==========================================================
; OpenSim WebRTC/Janus Config (generiert von osmtool)
; ==========================================================
; ----------------------------
; OpenSim.ini [WebRtcVoice]
; ----------------------------
[WebRtcVoice]
Enabled = true
SpatialVoiceService = WebRtcVoice.dll:WebRtcVoiceServiceConnector
NonSpatialVoiceService = WebRtcVoice.dll:WebRtcVoiceServiceConnector
WebRtcVoiceServerURI = http://$PUBLIC_HOST:8003
; ----------------------------
; Robust.ini [ServiceList] + [WebRtcVoice] + [JanusWebRtcVoice]
; ----------------------------
[ServiceList]
VoiceServiceConnector = "8000/OpenSim.Server.Handlers.dll:OpenSim.Server.Handlers.WebRtcVoiceServerConnector"
[WebRtcVoice]
Enabled = true
NonSpatialVoiceService = WebRtcJanusService.dll:WebRtcJanusService
[JanusWebRtcVoice]
JanusGatewayURI = http://$PUBLIC_HOST:$HTTP_PORT/janus
APIToken = $api_secret
@@ -814,6 +910,16 @@ EOF
MessageDetails = false
EOF
# Secrets sichern (analog janus_instal.sh)
{
echo "JANUS_API_SECRET=$api_secret"
[[ -n "$admin_secret" ]] && echo "JANUS_ADMIN_SECRET=$admin_secret"
echo "JANUS_HTTP_PORT=$HTTP_PORT"
echo "JANUS_PUBLIC_HOST=$PUBLIC_HOST"
} > "$secrets_file"
chmod 600 "$secrets_file"
log INFO "Janus Secrets gespeichert: $secrets_file (chmod 600)"
cat <<EOF | sudo tee "$JANUS_PREFIX/.osmtool_janus_ready" >/dev/null
JANUS_PREFIX=$JANUS_PREFIX
HTTP_PORT=$HTTP_PORT
@@ -823,7 +929,10 @@ RTP_RANGE=$RTP_RANGE
PUBLIC_HOST=$PUBLIC_HOST
EOF
log INFO "Janus configured. Marker created: $JANUS_PREFIX/.osmtool_janus_ready"
log INFO "Janus konfiguriert. Snippet: $snippet_file — Marker: $JANUS_PREFIX/.osmtool_janus_ready"
log INFO "Firewall oeffnen: TCP $HTTP_PORT, UDP ${RTP_RANGE%%-*}-${RTP_RANGE##*-}"
log INFO "Janus neu starten: sudo systemctl restart janus"
log INFO "Snippet-Inhalt in OpenSim.ini und Robust.ini uebernehmen."
}
prepare_ubuntu() {
@@ -848,19 +957,32 @@ install_opensim() {
sync_git_repo "$OPENSIM_REPO" "$OPENSIM_DIR" "$OPENSIM_BRANCH" "$REPO_MODE"
ensure_user_owns_path "$OPENSIM_DIR"
# Patch-Dateien nur mit Bestaetigung einspielen
if [[ -n "$LEGACY_PATCH_DIR" ]]; then
apply_legacy_patches "$LEGACY_PATCH_DIR"
if confirm_addon "Patch-Dateien" "Verzeichnis: $LEGACY_PATCH_DIR"; then
apply_legacy_patches "$LEGACY_PATCH_DIR"
fi
fi
sync_support_repo "opensim-tsassets" "$TSASSETS_REPO" "$TSASSETS_DIR"
sync_support_repo "opensimcurrencyserver" "$CURRENCY_REPO" "$CURRENCY_DIR"
sync_support_repo "os-data-backup" "$DATA_BACKUP_REPO" "$DATA_BACKUP_DIR"
# opensim-tsassets (Texturen/Assets)
if confirm_addon "opensim-tsassets" "$TSASSETS_REPO"; then
sync_support_repo "opensim-tsassets" "$TSASSETS_REPO" "$TSASSETS_DIR"
copy_tree_contents "$TSASSETS_DIR/bin" "$OPENSIM_DIR/bin" "tsassets bin content"
copy_tree_contents "$TSASSETS_DIR/OpenSim" "$OPENSIM_DIR/OpenSim" "tsassets OpenSim content"
fi
copy_tree_contents "$TSASSETS_DIR/bin" "$OPENSIM_DIR/bin" "tsassets bin content"
copy_tree_contents "$TSASSETS_DIR/OpenSim" "$OPENSIM_DIR/OpenSim" "tsassets OpenSim content"
copy_tree_contents "$CURRENCY_DIR/addon-modules" "$OPENSIM_DIR/addon-modules" "currency addon modules"
copy_tree_contents "$CURRENCY_DIR/bin" "$OPENSIM_DIR/bin" "currency bin content"
copy_tree_contents "$DATA_BACKUP_DIR" "$OPENSIM_DIR/addon-modules/os-data-backup" "os-data-backup content"
# opensimcurrencyserver-dotnet (Geldsystem)
if confirm_addon "opensimcurrencyserver-dotnet" "$CURRENCY_REPO"; then
sync_support_repo "opensimcurrencyserver" "$CURRENCY_REPO" "$CURRENCY_DIR"
copy_tree_contents "$CURRENCY_DIR/addon-modules" "$OPENSIM_DIR/addon-modules" "currency addon modules"
copy_tree_contents "$CURRENCY_DIR/bin" "$OPENSIM_DIR/bin" "currency bin content"
fi
# os-data-backup
if confirm_addon "os-data-backup" "$DATA_BACKUP_REPO"; then
sync_support_repo "os-data-backup" "$DATA_BACKUP_REPO" "$DATA_BACKUP_DIR"
copy_tree_contents "$DATA_BACKUP_DIR" "$OPENSIM_DIR/addon-modules/os-data-backup" "os-data-backup content"
fi
log INFO "Running OpenSim prebuild"
(
@@ -882,18 +1004,89 @@ install_opensim() {
log INFO "OpenSim install/build flow completed"
}
# Allgemeine Bestaetigungsfunktion fuer externe Addons.
# Umgebungsvariable ADDON_CONFIRMED=true ueberspringt die Abfrage (CI/Automation).
confirm_addon() {
local addon_name="${1:-Addon}"
local addon_desc="${2:-}"
local answer
if [[ "${ADDON_CONFIRMED:-}" == "true" ]]; then
return 0
fi
echo
echo "======================================================="
echo " $(msg PROMPT_EXTERNAL_ADDON): $addon_name"
[[ -n "$addon_desc" ]] && echo " $addon_desc"
echo " $(msg PROMPT_ADDON_INFO_1)"
echo " $(msg PROMPT_ADDON_INFO_2)"
echo "======================================================="
read -r -p " $(msg PROMPT_INSTALL_YESNO) " answer
case "${answer,,}" in
j|ja|y|yes|o|oui|s|si|) return 0 ;;
*)
log INFO "$(msg INFO_ADDON_SKIPPED): $addon_name"
return 1
;;
esac
}
confirm_janus() {
local action_label="${1:-Janus-Aktion}"
local answer
# Im nicht-interaktiven Betrieb (z. B. CI) Var JANUS_CONFIRMED=true setzen
if [[ "${JANUS_CONFIRMED:-}" == "true" ]]; then
return 0
fi
echo
echo "======================================================="
echo " $(msg PROMPT_JANUS_TITLE): $action_label"
echo "======================================================="
echo " $(msg PROMPT_JANUS_INFO_1)"
echo " $(msg PROMPT_JANUS_INFO_2)"
echo " $(msg PROMPT_JANUS_INFO_3) $JANUS_PREFIX."
echo "======================================================="
read -r -p " $(msg PROMPT_CONTINUE_YESNO) " answer
case "${answer,,}" in
j|ja|y|yes|o|oui|s|si|) return 0 ;;
*)
log INFO "$(msg INFO_JANUS_CANCELLED)"
exit 0
;;
esac
}
install_janus() {
confirm_janus "Installation + Konfiguration"
compile_janus
configure_janus
}
ensure_shared_config_for_install() {
if [[ -f "$OSMTOOL_CONFIG_FILE" ]]; then
return 0
fi
if [[ -t 0 ]]; then
log INFO "Shared configuration not found. Starting interactive setup."
init_shared_config_interactive
return 0
fi
log INFO "Shared configuration not found at $OSMTOOL_CONFIG_FILE (non-interactive mode)"
return 0
}
WORKDIR="$DEFAULT_WORKDIR"
ACTION=""
PROFILE="grid-sim"
REPO_MODE="${REPO_MODE:-update}"
OPENSIM_REPO="${OPENSIM_REPO:-https://github.com/opensim/opensim.git}"
OPENSIM_BRANCH="${OPENSIM_BRANCH:-master}"
OPENSIM_DIR="${OPENSIM_DIR:-$WORKDIR/opensim}"
OPENSIM_DIR="${OPENSIM_DIR:-${CONFIG_OPENSIM_DIR:-$WORKDIR/opensim}}"
TSASSETS_REPO="${TSASSETS_REPO:-https://github.com/ManfredAabye/opensim-tsassets.git}"
TSASSETS_DIR="${TSASSETS_DIR:-$WORKDIR/opensim-tsassets}"
CURRENCY_REPO="${CURRENCY_REPO:-https://github.com/ManfredAabye/opensimcurrencyserver-dotnet.git}"
@@ -902,19 +1095,21 @@ DATA_BACKUP_REPO="${DATA_BACKUP_REPO:-https://github.com/ManfredAabye/os-data-ba
DATA_BACKUP_DIR="${DATA_BACKUP_DIR:-$WORKDIR/os-data-backup}"
DEPLOY_BINARIES="${DEPLOY_BINARIES:-true}"
LEGACY_PATCH_DIR="${LEGACY_PATCH_DIR:-}"
DB_ROOT_USER="${DB_ROOT_USER:-root}"
DB_ROOT_PASS="${DB_ROOT_PASS:-}"
DB_USER="${DB_USER:-opensimuser}"
DB_PASS="${DB_PASS:-}"
JANUS_PREFIX="${JANUS_PREFIX:-/opt/janus}"
DB_ROOT_USER="${DB_ROOT_USER:-${CONFIG_DB_ROOT_USER:-root}}"
DB_ROOT_PASS="${DB_ROOT_PASS:-${CONFIG_DB_ROOT_PASS:-}}"
DB_USER="${DB_USER:-${CONFIG_DB_USER:-opensimuser}}"
DB_PASS="${DB_PASS:-${CONFIG_DB_PASS:-}}"
JANUS_PREFIX="${JANUS_PREFIX:-${CONFIG_JANUS_PREFIX:-/opt/janus}}"
JANUS_SRC="${JANUS_SRC:-$WORKDIR/janus-gateway}"
PUBLIC_HOST="${PUBLIC_HOST:-127.0.0.1}"
PUBLIC_HOST="${PUBLIC_HOST:-${CONFIG_PUBLIC_HOST:-127.0.0.1}}"
HTTP_PORT="${HTTP_PORT:-8088}"
ADMIN_PORT="${ADMIN_PORT:-7088}"
RTP_RANGE="${RTP_RANGE:-10000-10200}"
ENABLE_ADMIN="${ENABLE_ADMIN:-false}"
API_SECRET="${API_SECRET:-}"
ADMIN_SECRET="${ADMIN_SECRET:-}"
GRIDNAME="${GRIDNAME:-${CONFIG_GRIDNAME:-}}"
SIM_COUNT="${SIM_COUNT:-0}"
while [[ $# -gt 0 ]]; do
case "$1" in
@@ -942,8 +1137,8 @@ while [[ $# -gt 0 ]]; do
--rtp-range) RTP_RANGE="$2"; shift 2 ;;
--enable-admin) ENABLE_ADMIN="$2"; shift 2 ;;
--api-secret) API_SECRET="$2"; shift 2 ;;
--admin-secret) ADMIN_SECRET="$2"; shift 2 ;;
--help|-h) usage; exit 0 ;;
--admin-secret) ADMIN_SECRET="$2"; shift 2 ;; --gridname) GRIDNAME="$2"; shift 2 ;;
--sim-count) SIM_COUNT="$2"; shift 2 ;; --help|-h) usage; exit 0 ;;
*) die "Unknown option: $1" ;;
esac
done
@@ -952,6 +1147,10 @@ done
validate_profile "$PROFILE"
ensure_profile_action_allowed install "$PROFILE" "$ACTION"
if [[ "$ACTION" != "init-config" ]]; then
ensure_shared_config_for_install
fi
case "$REPO_MODE" in
update|fresh) ;;
*) die "Unsupported repo mode: $REPO_MODE" ;;
@@ -969,6 +1168,9 @@ log INFO "OpenSim dir: $OPENSIM_DIR"
log INFO "Janus prefix: $JANUS_PREFIX"
case "$ACTION" in
init-config)
init_shared_config_interactive
;;
server-check) server_check ;;
prepare-ubuntu) prepare_ubuntu ;;
install-opensim-deps) install_opensim_deps ;;
@@ -976,8 +1178,14 @@ case "$ACTION" in
install-opensim) install_opensim ;;
configure-opensim) configure_opensim_runtime ;;
configure-database) configure_database ;;
compile-janus) compile_janus ;;
configure-janus) configure_janus ;;
compile-janus)
confirm_janus "Kompilierung"
compile_janus
;;
configure-janus)
confirm_janus "Konfiguration"
configure_janus
;;
install-janus) install_janus ;;
*) die "Unsupported action: $ACTION" ;;
esac
+123 -44
View File
@@ -5,6 +5,13 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
# shellcheck source=/dev/null
source "$SCRIPT_DIR/osmtool_core.sh"
msgf() {
local key="$1"
shift
# shellcheck disable=SC2059
printf "$(msg "$key")" "$@"
}
usage() {
cat <<'EOF'
Usage:
@@ -31,29 +38,29 @@ screen_session_exists() {
stop_screen_session() {
local screen_name="$1"
local grace_seconds="${2:-6}"
local grace_seconds="${2:-$SIMULATOR_STOP_WAIT}"
if ! screen_session_exists "$screen_name"; then
log INFO "$screen_name is not running"
log INFO "$(msgf STARTSTOP_NOT_RUNNING "$screen_name")"
return 0
fi
run_screen_cmd "$screen_name" "shutdown"
log INFO "Sent shutdown to $screen_name"
log INFO "$(msgf STARTSTOP_SENT_SHUTDOWN "$screen_name")"
sleep "$grace_seconds"
if screen_session_exists "$screen_name"; then
log INFO "Session '$screen_name' still running after shutdown; forcing screen quit"
log INFO "$(msgf STARTSTOP_FORCE_QUIT "$screen_name")"
screen -S "$screen_name" -X quit || true
sleep 1
fi
if screen_session_exists "$screen_name"; then
log ERROR "Failed to stop screen session: $screen_name"
log ERROR "$(msgf STARTSTOP_STOP_FAILED "$screen_name")"
return 1
fi
log INFO "Screen session '$screen_name' stopped"
log INFO "$(msgf STARTSTOP_STOPPED "$screen_name")"
return 0
}
@@ -64,17 +71,17 @@ ensure_janus_ready() {
local http_cfg="$JANUS_PREFIX/etc/janus/janus.transport.http.jcfg"
local http_cfg_legacy="$JANUS_PREFIX/etc/janus/janus.transport.http.cfg"
[[ -f "$JANUS_PREFIX/bin/janus" ]] || die "Janus binary missing: $JANUS_PREFIX/bin/janus. Run install module action compile-janus/install-janus first."
[[ -f "$JANUS_PREFIX/bin/janus" ]] || die "$(msgf STARTSTOP_JANUS_BIN_MISSING "$JANUS_PREFIX/bin/janus")"
if [[ ! -f "$core_cfg" && ! -f "$core_cfg_legacy" ]]; then
die "Janus core config missing in $JANUS_PREFIX/etc/janus. Run configure-janus/install-janus first."
die "$(msgf STARTSTOP_JANUS_CORE_CFG_MISSING "$JANUS_PREFIX/etc/janus")"
fi
if [[ ! -f "$http_cfg" && ! -f "$http_cfg_legacy" ]]; then
die "Janus HTTP config missing in $JANUS_PREFIX/etc/janus. Run configure-janus/install-janus first."
die "$(msgf STARTSTOP_JANUS_HTTP_CFG_MISSING "$JANUS_PREFIX/etc/janus")"
fi
[[ -f "$marker" ]] || log INFO "Janus ready marker not found ($marker). Continuing because binary/config files exist."
[[ -f "$marker" ]] || log INFO "$(msgf STARTSTOP_JANUS_MARKER_MISSING "$marker")"
}
janus_service_action() {
@@ -114,7 +121,7 @@ janus_service_action() {
case "$action" in
start)
if pgrep -f "$janus_bin" >/dev/null 2>&1; then
log INFO "Janus already running"
log INFO "$(msg STARTSTOP_JANUS_ALREADY_RUNNING)"
return 0
fi
if command -v screen >/dev/null 2>&1; then
@@ -146,7 +153,7 @@ janus_service_action() {
esac
fi
die "Janus control not configured. Expected system service or janus.sh helper."
die "$(msg STARTSTOP_JANUS_CONTROL_NOT_CONFIGURED)"
}
require_ini() {
@@ -155,7 +162,7 @@ require_ini() {
local label="$3"
if [[ ! -f "$bin_dir/$ini_file" ]]; then
die "$label cannot start: missing $bin_dir/$ini_file — run the config action first"
die "$(msgf STARTSTOP_REQUIRED_INI_MISSING "$label" "$bin_dir/$ini_file")"
fi
}
@@ -166,50 +173,114 @@ screen_start() {
local pat="\\.${screen_name}[[:space:]]"
if screen -list 2>/dev/null | grep -qE "$pat"; then
log INFO "Screen session '$screen_name' already running — skipping start"
log INFO "$(msgf STARTSTOP_ALREADY_RUNNING "$screen_name")"
return 0
fi
log INFO "Starting $screen_name from $bin_dir"
log INFO "$(msgf STARTSTOP_STARTING_FROM "$screen_name" "$bin_dir")"
(cd "$bin_dir" && screen -fa -S "$screen_name" -d -U -m dotnet "$dll")
sleep 0.5
if screen -list 2>/dev/null | grep -qE "$pat"; then
log INFO "Screen session '$screen_name' started successfully"
log INFO "$(msgf STARTSTOP_STARTED_OK "$screen_name")"
return 0
else
log ERROR "Screen session '$screen_name' did not stay alive — check logs or missing config"
log ERROR "$(msgf STARTSTOP_START_FAILED "$screen_name")"
return 1
fi
}
list_sim_names_asc() {
local sim_dir sim_name
local sim_names=()
shopt -s nullglob
for sim_dir in "$WORKDIR"/sim[0-9]*; do
[[ -d "$sim_dir/bin" ]] || continue
sim_name="$(basename "$sim_dir")"
[[ "$sim_name" =~ ^sim[0-9]+$ ]] || continue
sim_names+=("$sim_name")
done
shopt -u nullglob
if [[ ${#sim_names[@]} -eq 0 ]]; then
return 0
fi
printf '%s\n' "${sim_names[@]}" | sort -V
}
start_grid() {
log INFO "Starting grid from $WORKDIR"
local sim_name
local sim_count=0
if [[ -d "$WORKDIR/robust/bin" ]]; then
require_ini "$WORKDIR/robust/bin" "Robust.ini" "RobustServer"
screen_start "robustserver" "$WORKDIR/robust/bin" "Robust.dll"
fi
log INFO "$(msgf STARTSTOP_GRID_STARTING "$WORKDIR")"
if [[ -f "$WORKDIR/robust/bin/MoneyServer.dll" && -f "$WORKDIR/robust/bin/MoneyServer.ini" ]]; then
screen_start "moneyserver" "$WORKDIR/robust/bin" "MoneyServer.dll"
fi
[[ -d "$WORKDIR/robust/bin" ]] || die "$(msgf STARTSTOP_ROBUST_DIR_MISSING "$WORKDIR/robust/bin")"
require_ini "$WORKDIR/robust/bin" "Robust.ini" "RobustServer"
screen_start "robustserver" "$WORKDIR/robust/bin" "Robust.dll" || die "$(msg STARTSTOP_ROBUST_START_FAILED)"
sleep "$ROBUSTSERVER_START_WAIT"
if [[ -d "$WORKDIR/sim1/bin" ]]; then
require_ini "$WORKDIR/sim1/bin" "OpenSim.ini" "sim1"
screen_start "sim1" "$WORKDIR/sim1/bin" "OpenSim.dll"
fi
[[ -f "$WORKDIR/robust/bin/MoneyServer.dll" ]] || die "$(msgf STARTSTOP_MONEY_DLL_MISSING "$WORKDIR/robust/bin/MoneyServer.dll")"
[[ -f "$WORKDIR/robust/bin/MoneyServer.ini" ]] || die "$(msgf STARTSTOP_MONEY_INI_MISSING "$WORKDIR/robust/bin/MoneyServer.ini")"
screen_start "moneyserver" "$WORKDIR/robust/bin" "MoneyServer.dll" || die "$(msg STARTSTOP_MONEY_START_FAILED)"
sleep "$MONEYSERVER_START_WAIT"
while IFS= read -r sim_name; do
[[ -n "$sim_name" ]] || continue
require_ini "$WORKDIR/$sim_name/bin" "OpenSim.ini" "$sim_name"
screen_start "$sim_name" "$WORKDIR/$sim_name/bin" "OpenSim.dll" || die "$(msgf STARTSTOP_SIM_START_FAILED "$sim_name")"
sleep "$SIMULATOR_START_WAIT"
((sim_count+=1))
done < <(list_sim_names_asc)
[[ "$sim_count" -gt 0 ]] || die "$(msgf STARTSTOP_NO_SIM_FOUND "$WORKDIR")"
}
stop_grid() {
log INFO "Stopping grid"
stop_screen_session "sim1" || true
stop_screen_session "moneyserver" || true
stop_screen_session "robustserver" || true
local sim_names=()
local idx
log INFO "$(msg STARTSTOP_GRID_STOPPING)"
mapfile -t sim_names < <(list_sim_names_asc)
for ((idx=${#sim_names[@]}-1; idx>=0; idx--)); do
stop_screen_session "${sim_names[$idx]}" "$SIMULATOR_STOP_WAIT" || true
done
stop_screen_session "moneyserver" "$MONEYSERVER_STOP_WAIT" || true
stop_screen_session "robustserver" "$ROBUSTSERVER_STOP_WAIT" || true
}
logclean_grid() {
log INFO "$(msg STARTSTOP_LOGCLEAN_BEGIN)"
if [[ -d "$WORKDIR/robust/bin" ]]; then
rm -f "$WORKDIR/robust/bin/"*.log
log INFO "$(msgf STARTSTOP_LOGS_DELETED "$WORKDIR/robust/bin")"
fi
local sim_dir sim_name
shopt -s nullglob
for sim_dir in "$WORKDIR"/sim[0-9]*/bin; do
sim_name="$(basename "$(dirname "$sim_dir")")"
[[ "$sim_name" =~ ^sim[0-9]+$ ]] || continue
rm -f "$sim_dir/"*.log
log INFO "$(msgf STARTSTOP_LOGS_DELETED "$sim_dir")"
done
shopt -u nullglob
log INFO "$(msg STARTSTOP_LOGCLEAN_DONE)"
}
restart_grid() {
stop_grid
sleep 5
sleep "$SIMULATOR_STOP_WAIT"
logclean_grid
sleep "$SIMULATOR_START_WAIT"
start_grid
log INFO "$(msg STARTSTOP_ACTIVE_SESSIONS)"
screen -ls 2>/dev/null || log INFO "$(msg STARTSTOP_NO_SESSIONS)"
}
start_single() {
@@ -232,12 +303,12 @@ start_single() {
janus_service_action start
;;
region)
[[ -n "$NAME" ]] || die "--name is required for --target region"
[[ -n "$NAME" ]] || die "$(msg STARTSTOP_NAME_REQUIRED)"
require_ini "$WORKDIR/${NAME}/bin" "OpenSim.ini" "$NAME"
screen_start "$NAME" "$WORKDIR/${NAME}/bin" "OpenSim.dll"
;;
*)
die "Unsupported start target: $target"
die "$(msgf STARTSTOP_UNSUPPORTED_START_TARGET "$target")"
;;
esac
}
@@ -256,10 +327,10 @@ stop_single() {
;;
janus) janus_service_action stop ;;
region)
[[ -n "$NAME" ]] || die "--name is required for --target region"
[[ -n "$NAME" ]] || die "$(msg STARTSTOP_NAME_REQUIRED)"
stop_screen_session "$NAME"
;;
*) die "Unsupported stop target: $target" ;;
*) die "$(msgf STARTSTOP_UNSUPPORTED_STOP_TARGET "$target")" ;;
esac
}
@@ -270,6 +341,14 @@ NAME=""
PROFILE="grid-sim"
JANUS_PREFIX="${JANUS_PREFIX:-/opt/janus}"
# Wartezeiten (Sekunden) entsprechen den bewährten Werten aus osmtool.sh
SIMULATOR_STOP_WAIT="${SIMULATOR_STOP_WAIT:-15}"
MONEYSERVER_STOP_WAIT="${MONEYSERVER_STOP_WAIT:-30}"
ROBUSTSERVER_STOP_WAIT="${ROBUSTSERVER_STOP_WAIT:-30}"
SIMULATOR_START_WAIT="${SIMULATOR_START_WAIT:-15}"
MONEYSERVER_START_WAIT="${MONEYSERVER_START_WAIT:-30}"
ROBUSTSERVER_START_WAIT="${ROBUSTSERVER_START_WAIT:-30}"
while [[ $# -gt 0 ]]; do
case "$1" in
--workdir) WORKDIR="$2"; shift 2 ;;
@@ -279,12 +358,12 @@ while [[ $# -gt 0 ]]; do
--action) ACTION="$2"; shift 2 ;;
--name) NAME="$2"; shift 2 ;;
--help|-h) usage; exit 0 ;;
*) die "Unknown option: $1" ;;
*) die "$(msgf ERR_UNKNOWN_OPTION "$1")" ;;
esac
done
[[ -n "$TARGET" ]] || die "Missing --target"
[[ -n "$ACTION" ]] || die "Missing --action"
[[ -n "$TARGET" ]] || die "$(msg ERR_MISSING_TARGET)"
[[ -n "$ACTION" ]] || die "$(msg ERR_MISSING_ACTION)"
validate_profile "$PROFILE"
ensure_profile_action_allowed startstop "$PROFILE" "$ACTION"
ensure_profile_target_allowed "$PROFILE" "$TARGET"
@@ -293,14 +372,14 @@ if [[ "$TARGET" == "janus" && "$ACTION" != "stop" ]]; then
ensure_janus_ready
fi
log INFO "Using profile: $PROFILE"
log INFO "$(msgf INFO_USING_PROFILE "$PROFILE")"
if [[ "$TARGET" == "grid" ]]; then
case "$ACTION" in
start) start_grid ;;
stop) stop_grid ;;
restart) restart_grid ;;
*) die "Unsupported action for grid: $ACTION" ;;
*) die "$(msgf ERR_UNSUPPORTED_GRID_ACTION "$ACTION")" ;;
esac
else
case "$ACTION" in
@@ -311,6 +390,6 @@ else
sleep 3
start_single "$TARGET"
;;
*) die "Unsupported action: $ACTION" ;;
*) die "$(msgf ERR_UNSUPPORTED_ACTION "$ACTION")" ;;
esac
fi
+272 -61
View File
@@ -33,6 +33,113 @@ DEBUG_LOG="osmtool_debug.log" # Default: im aktuellen Verzeichnis
# Maximale Log-Größe in MB bevor Rotation erfolgt (0 = deaktiviert)
MAX_LOG_SIZE_MB=10 # 10MB empfohlen
#* 1b. KONFIGURATION AUS JSON (osmtool_config.json)
#* ----------------------------------------------------------------------
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
CONFIG_FILE_DEFAULT="$SCRIPT_DIR/osmtool_config.json"
CONFIG_FILE="${OSMTOOL_CONFIG_FILE:-$CONFIG_FILE_DEFAULT}"
function json_get_raw_value() {
local key="$1"
local file="$2"
[[ -f "$file" ]] || return 1
if command -v jq >/dev/null 2>&1; then
jq -r --arg k "$key" '.[$k] // empty' "$file" 2>/dev/null
return 0
fi
sed -n -E "s/^[[:space:]]*\"${key}\"[[:space:]]*:[[:space:]]*\"([^\"]*)\"[[:space:]]*,?[[:space:]]*$/\1/p" "$file" | head -n1
}
function json_get_string() {
local key="$1"
local default_value="$2"
local value
value="$(json_get_raw_value "$key" "$CONFIG_FILE")"
if [[ -n "$value" ]]; then
printf '%s' "$value"
else
printf '%s' "$default_value"
fi
}
function json_get_bool() {
local key="$1"
local default_value="$2"
local value
if command -v jq >/dev/null 2>&1; then
value="$(jq -r --arg k "$key" '.[$k] // empty' "$CONFIG_FILE" 2>/dev/null)"
else
value="$(sed -n -E "s/^[[:space:]]*\"${key}\"[[:space:]]*:[[:space:]]*(true|false)[[:space:]]*,?[[:space:]]*$/\1/p" "$CONFIG_FILE" | head -n1)"
fi
case "$value" in
true|false) printf '%s' "$value" ;;
*) printf '%s' "$default_value" ;;
esac
}
function json_get_int() {
local key="$1"
local default_value="$2"
local value
if command -v jq >/dev/null 2>&1; then
value="$(jq -r --arg k "$key" '.[$k] // empty' "$CONFIG_FILE" 2>/dev/null)"
else
value="$(sed -n -E "s/^[[:space:]]*\"${key}\"[[:space:]]*:[[:space:]]*([0-9]+)[[:space:]]*,?[[:space:]]*$/\1/p" "$CONFIG_FILE" | head -n1)"
fi
if [[ "$value" =~ ^[0-9]+$ ]]; then
printf '%s' "$value"
else
printf '%s' "$default_value"
fi
}
function resolve_cfg_path() {
local path_value="$1"
if [[ -z "$path_value" ]]; then
printf '%s' "$SCRIPT_DIR"
return
fi
if [[ "$path_value" = /* ]]; then
printf '%s' "$path_value"
else
printf '%s' "$SCRIPT_DIR/$path_value"
fi
}
if [[ -f "$CONFIG_FILE" ]]; then
LOG_ENABLED="$(json_get_bool "log_enabled" "$LOG_ENABLED")"
OLD_LOG_DEL="$(json_get_bool "old_log_del" "$OLD_LOG_DEL")"
DEBUG_LOG="$(json_get_string "debug_log" "$DEBUG_LOG")"
MAX_LOG_SIZE_MB="$(json_get_int "max_log_size_mb" "$MAX_LOG_SIZE_MB")"
fi
CFG_LANGUAGE="$(json_get_string "language" "de")"
CFG_LANG_DIR_REL="$(json_get_string "path_lang_dir" "lang")"
CFG_ROBUST_BIN_REL="$(json_get_string "path_robust_bin" "robust/bin")"
CFG_OPENSIM_BIN_REL="$(json_get_string "path_opensim_bin" "opensim/bin")"
CFG_WORKDIR_REL="$(json_get_string "path_workdir" ".")"
LANG_DIR="$(resolve_cfg_path "$CFG_LANG_DIR_REL")"
PATH_ROBUST_BIN="$(resolve_cfg_path "$CFG_ROBUST_BIN_REL")"
PATH_OPENSIM_BIN="$(resolve_cfg_path "$CFG_OPENSIM_BIN_REL")"
WORK_DIR="$(resolve_cfg_path "$CFG_WORKDIR_REL")"
export LANG_DIR PATH_ROBUST_BIN PATH_OPENSIM_BIN WORK_DIR
if [[ ! -d "$WORK_DIR" ]]; then
WORK_DIR="$SCRIPT_DIR"
fi
#* 2. LOG-SYSTEM INITIALISIERUNG
#* ----------------------------------------------------------------------
@@ -120,6 +227,109 @@ function log() {
fi
}
#* 5. I18N-SYSTEM (de|en|fr|es)
#* ----------------------------------------------------------------------
APP_LANG="${OSM_LANG:-$CFG_LANGUAGE}"
declare -A I18N_CURRENT=()
declare -A I18N_EN=()
function normalize_lang() {
case "$1" in
de|en|fr|es) echo "$1" ;;
*) echo "de" ;;
esac
}
function load_lang_file() {
local lang_file="$1"
local target_array_name="$2"
local line key value
[[ -f "$lang_file" ]] || return 1
while IFS= read -r line || [[ -n "$line" ]]; do
[[ -z "$line" || "${line:0:1}" == "#" ]] && continue
[[ "$line" == *=* ]] || continue
key="${line%%=*}"
value="${line#*=}"
if [[ "$target_array_name" == "I18N_EN" ]]; then
I18N_EN["$key"]="$value"
else
I18N_CURRENT["$key"]="$value"
fi
done < "$lang_file"
return 0
}
function init_i18n() {
APP_LANG="$(normalize_lang "$APP_LANG")"
I18N_CURRENT=()
I18N_EN=()
load_lang_file "$LANG_DIR/en.lang" I18N_EN || true
load_lang_file "$LANG_DIR/${APP_LANG}.lang" I18N_CURRENT || true
}
function msg() {
local key="$1"
if [[ -n "${I18N_CURRENT[$key]:-}" ]]; then
printf '%s' "${I18N_CURRENT[$key]}"
return
fi
if [[ -n "${I18N_EN[$key]:-}" ]]; then
printf '%s' "${I18N_EN[$key]}"
return
fi
printf '%s' "$key"
}
function is_yes() {
case "${1,,}" in
j|ja|y|yes|o|oui|s|si) return 0 ;;
*) return 1 ;;
esac
}
function is_no() {
case "${1,,}" in
n|no|nein|non) return 0 ;;
*) return 1 ;;
esac
}
function parse_lang_arg() {
local -a filtered=()
local i=1
while [[ $i -le $# ]]; do
local arg="${!i}"
if [[ "$arg" == "--lang" ]]; then
local next_index=$((i + 1))
if [[ $next_index -le $# ]]; then
APP_LANG="$(normalize_lang "${!next_index}")"
i=$((i + 2))
continue
fi
elif [[ "$arg" == --lang=* ]]; then
APP_LANG="$(normalize_lang "${arg#--lang=}")"
i=$((i + 1))
continue
fi
filtered+=("$arg")
i=$((i + 1))
done
set -- "${filtered[@]}"
FILTERED_ARGS=("$@")
}
parse_lang_arg "$@"
set -- "${FILTERED_ARGS[@]}"
export OSM_LANG="$APP_LANG"
init_i18n
#* ======================================================================
#* BEISPIELAUFRUFE:
#*
@@ -142,9 +352,9 @@ SCRIPTNAME="opensimMULTITOOL II"
# Versionsnummer besteht aus: Jahr.Monat.Funktionsanzahl.Eigentliche_Versionsnummer
VERSION="V26.4.230.588"
log "\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."
log "\e[33mZum Abbrechen bitte STRG+C oder CTRL+C drücken.\e[0m"
echo "$(msg INFO_TOOL_PURPOSE)"
echo "$(msg INFO_USE_OWN_RISK)"
log "\e[33m$(msg INFO_ABORT_HINT)\e[0m"
echo " "
#?──────────────────────────────────────────────────────────────────────────────────────────
@@ -229,7 +439,17 @@ Simulator_Stop_wait=15 # Sekunden
MoneyServer_Stop_wait=30 # Sekunden
RobustServer_Stop_wait=30 # Sekunden
KOMMANDO=$1 #! Eingabeauswertung fuer Funktionen.
if [[ -f "$CONFIG_FILE" ]]; then
Simulator_Start_wait="$(json_get_int "simulator_start_wait" "$Simulator_Start_wait")"
MoneyServer_Start_wait="$(json_get_int "moneyserver_start_wait" "$MoneyServer_Start_wait")"
RobustServer_Start_wait="$(json_get_int "robustserver_start_wait" "$RobustServer_Start_wait")"
Simulator_Stop_wait="$(json_get_int "simulator_stop_wait" "$Simulator_Stop_wait")"
MoneyServer_Stop_wait="$(json_get_int "moneyserver_stop_wait" "$MoneyServer_Stop_wait")"
RobustServer_Stop_wait="$(json_get_int "robustserver_stop_wait" "$RobustServer_Stop_wait")"
fi
# Sprachwert nach dem Bereinigen der Argumente fuer nachfolgende Logik sichern
KOMMANDO="${1:-}"
#* Leere Zeile
function blankline() {
@@ -248,39 +468,33 @@ function blankline() {
}
#* Hauptpfad des Skripts automatisch setzen
SCRIPT_DIR="$(dirname "$(realpath "$0")")"
cd "$SCRIPT_DIR" || exit 1
cd "$WORK_DIR" || exit 1
system_ip=$(hostname -I | awk '{print $1}')
log "${COLOR_LABEL}Das Arbeitsverzeichnis ist:${COLOR_RESET} ${COLOR_VALUE}$SCRIPT_DIR${COLOR_RESET}"
log "${COLOR_LABEL}Ihre IP Adresse ist:${COLOR_RESET} ${COLOR_VALUE}$system_ip${COLOR_RESET}"
log "${COLOR_LABEL}$(msg INFO_WORKDIR)${COLOR_RESET} ${COLOR_VALUE}$WORK_DIR${COLOR_RESET}"
log "${COLOR_LABEL}$(msg INFO_SYSTEM_IP)${COLOR_RESET} ${COLOR_VALUE}$system_ip${COLOR_RESET}"
blankline
#* Rootrechte erforderlich
function rootrights() {
# Root-Privilegien erforderlich
if [[ $EUID -ne 0 ]]; then
log "${COLOR_WARNING}Warning: Dieses Skript kann als Benutzer ausgeführt werden," >&2
log "aber einige Funktionen benötigen Root-Rechte.${COLOR_RESET}" >&2
log "${COLOR_WARNING}$(msg ROOT_WARN_USER_MODE_1)${COLOR_RESET}" >&2
log "$(msg ROOT_WARN_USER_MODE_2)${COLOR_RESET}" >&2
log "[sudo bash osmtool.sh]" >&2
while true; do
log "Möchten Sie trotzdem ohne Root-Privilegien fortfahren? (ja/nein): " >&2
log "$(msg ROOT_PROMPT_CONTINUE_NO_ROOT)" >&2
read -r answer
# Akzeptiere: j/J/ja/Ja/JA/y/Y/yes/Yes/YES + n/N/nein/Nein/NEIN
case "${answer,,}" in # ${answer,,} wandelt in Kleinbuchstaben um
j|ja|y|yes)
log "Fortfahren ohne Root-Rechte..." >&2
return 0 # Erfolg, fortfahren
;;
n|nein|no)
log "${COLOR_STOP}Abbruch.${COLOR_RESET}" >&2
exit 1
;;
*)
log "${COLOR_WARNING}Ungültige Eingabe. Bitte 'ja' oder 'nein' eingeben.${COLOR_RESET}" >&2
;;
esac
if is_yes "$answer"; then
log "$(msg ROOT_CONTINUE_NO_ROOT)" >&2
return 0
elif is_no "$answer"; then
log "${COLOR_STOP}$(msg COMMON_ABORTED)${COLOR_RESET}" >&2
exit 1
else
log "${COLOR_WARNING}$(msg INPUT_INVALID_YES_NO)${COLOR_RESET}" >&2
fi
done
fi
}
@@ -289,12 +503,12 @@ function rootrights() {
#* 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
local robust_dir="$PATH_ROBUST_BIN" # Konfigurierbarer Pfad zu Robust-Dateien
echo "Modus Einstellung"
echo "$(msg MODE_CONFIG)"
if [[ "$modus" == "hypergrid" ]]; then
echo "Hypergrid Modus aktiviert."
echo "$(msg MODE_HYPERGRID_ENABLED)"
# Prüfen ob Robust.HG.ini existiert
if [[ ! -f "$robust_dir/Robust.HG.ini" ]]; then
@@ -308,7 +522,7 @@ function hypergrid() {
}
else
echo "Geschlossener Grid Modus aktiviert."
echo "$(msg MODE_CLOSEDGRID_ENABLED)"
# Prüfen ob Robust.local.ini existiert
if [[ ! -f "$robust_dir/Robust.local.ini" ]]; then
@@ -322,7 +536,7 @@ function hypergrid() {
}
fi
log "${COLOR_OK}Modus erfolgreich auf $modus gesetzt${COLOR_RESET}"
log "${COLOR_OK}$(msg MODE_SET_OK): $modus${COLOR_RESET}"
return 0
}
@@ -2733,26 +2947,26 @@ function setcrontab() {
log " ${SYM_INFO} 4) logclean (inkl. automatischem stop vorher)"
log " ${SYM_INFO} 5) Vollständiger Neustart (stop → cacheclean → mapclean → logclean → reboot)"
log " ${SYM_INFO} 6) Nur Server neustarten (reboot)"
read -r -p "Auswahl (z.B. '2 3' oder '5'): " -a monthly_actions
read -r -p "$(msg CRON_PROMPT_MONTHLY_SELECTION) " -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
read -r -p "$(msg CRON_PROMPT_REBOOT_AFTER_CLEAN) " add_reboot
is_yes "$add_reboot" && needs_reboot=true
fi
log "\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
read -r -p "$(msg CRON_PROMPT_DAILY_RESTART) " daily_restart
if is_yes "$daily_restart"; then
read -r -p "$(msg CRON_PROMPT_DAILY_HOUR) " daily_hour
daily_hour=${daily_hour:-5} # Default: 5 Uhr
fi
log "\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
read -r -p "$(msg CRON_PROMPT_ENABLE_MONITORING) " enable_monitoring
if is_yes "$enable_monitoring"; then
read -r -p "$(msg CRON_PROMPT_MONITOR_INTERVAL) " monitor_interval
monitor_interval=${monitor_interval:-30}
fi
@@ -3233,9 +3447,9 @@ function robustrepair() {
;;
truncate)
log "${SYM_WARNING} ${COLOR_WARNING}${SYM_WARNING} Achtung: Leert alle Inhalte, behält aber Tabellenstrukturen!${COLOR_RESET}"
echo -ne "${COLOR_BAD}Fortfahren? (ja/nein): ${COLOR_RESET}"
echo -ne "${COLOR_BAD}$(msg LEGACY_PROMPT_CONTINUE_YESNO): ${COLOR_RESET}"
read -r confirm
if [[ "$confirm" == "ja" ]]; then
if is_yes "$confirm"; then
local tables
tables=$(mysql -u"$DB_USER" -p"$DB_PASS" -N -e "SHOW TABLES IN $DB_NAME;")
for t in $tables; do
@@ -3249,9 +3463,9 @@ function robustrepair() {
;;
dropassets)
log "${SYM_WARNING} ${COLOR_WARNING}${SYM_WARNING} Achtung: Löscht ALLE Einträge in der 'assets'-Tabelle!${COLOR_RESET}"
echo -ne "${COLOR_BAD}Fortfahren? (ja/nein): ${COLOR_RESET}"
echo -ne "${COLOR_BAD}$(msg LEGACY_PROMPT_CONTINUE_YESNO): ${COLOR_RESET}"
read -r confirm
if [[ "$confirm" == "ja" ]]; then
if is_yes "$confirm"; then
mysql -u"$DB_USER" -p"$DB_PASS" -e "DELETE FROM $DB_NAME.assets;"
log "${SYM_OK} ${COLOR_OK}Tabelle 'assets' wurde geleert.${COLOR_RESET}"
else
@@ -3260,9 +3474,9 @@ function robustrepair() {
;;
dropall)
log "${SYM_WARNING} ${COLOR_WARNING}${SYM_WARNING} Achtung: Alle Tabellen der Datenbank werden gelöscht!${COLOR_RESET}"
echo -ne "${COLOR_BAD}Wirklich ALLE Tabellen löschen? (ja/nein): ${COLOR_RESET}"
echo -ne "${COLOR_BAD}$(msg PROMPT_DROP_ALL_TABLES): ${COLOR_RESET}"
read -r confirm
if [[ "$confirm" == "ja" ]]; then
if is_yes "$confirm"; then
local tables
tables=$(mysql -u"$DB_USER" -p"$DB_PASS" -N -e "SHOW TABLES IN $DB_NAME;")
for t in $tables; do
@@ -3718,13 +3932,12 @@ WARNUNG
log "\e[0m"
# Bestätigung mit Timeout (10 Sekunden) für Sicherheit
read -t 30 -r -p "Fortfahren? (ja/NEIN): " confirm || {
read -t 30 -r -p "$(msg PROMPT_CONTINUE_TIMEOUT_YESNO) " confirm || {
log "\n\e[31mTimeout: Keine Bestätigung erhalten. Abbruch.\e[0m" >&2
return 1
}
case "${confirm,,}" in
ja|j|y|yes)
if is_yes "$confirm"; then
log "\e[32mBereinigung wird gestartet...\e[0m" >&2
# Jede Clean-Funktion mit Fehlerprüfung
local clean_functions=(dataclean pathclean cacheclean logclean mapclean)
@@ -3739,12 +3952,10 @@ WARNUNG
}
done
log "\e[32mBereinigung abgeschlossen.\e[0m" >&2
;;
*)
else
log "\e[33mAbbruch: Bereinigung wurde nicht durchgeführt.\e[0m" >&2
return 1
;;
esac
fi
blankline
}
@@ -5844,11 +6055,11 @@ function clean_config() {
# cleanall - Removes OpenSim completely
function cleanall() {
echo "Möchtest du OpenSim komplett mit Konfigurationen entfernen? (ja/nein)"
echo "$(msg CLEANALL_PROMPT_REMOVE_ALL)"
read -r answer
if [ "$answer" = "ja" ]; then
echo "Lösche OpenSim vollständig..."
if is_yes "$answer"; then
echo "$(msg CLEANALL_START_DELETE)"
# robust/bin Verzeichnis leeren, falls vorhanden
if [ -d "robust/bin" ]; then
@@ -5864,13 +6075,13 @@ function cleanall() {
fi
done
echo "Alle bin-Verzeichnisse wurden geleert."
echo "$(msg CLEANALL_BIN_CLEARED)"
elif [ "$answer" = "nein" ]; then
echo "OpenSim bleibt erhalten."
elif is_no "$answer"; then
echo "$(msg CLEANALL_KEEP)"
else
echo "Ungültige Eingabe. Bitte 'ja' oder 'nein' eingeben."
echo "$(msg INPUT_INVALID_YES_NO)"
fi
blankline
}
@@ -6180,7 +6391,7 @@ function createstandaloneuser() {
function createstandalonregion() {
# 12.05.2025 Standalone Region erstellen
local config_file="opensim/bin/Regions/opensim.ini"
local config_file="${PATH_OPENSIM_BIN}/Regions/opensim.ini"
local region_name="OpenSim"
local location="1000,1000"
local port="9015"
+19
View File
@@ -0,0 +1,19 @@
{
"language": "de",
"log_enabled": true,
"old_log_del": true,
"debug_log": "osmtool_debug.log",
"max_log_size_mb": 10,
"simulator_start_wait": 15,
"moneyserver_start_wait": 30,
"robustserver_start_wait": 30,
"simulator_stop_wait": 15,
"moneyserver_stop_wait": 30,
"robustserver_stop_wait": 30,
"path_workdir": ".",
"path_lang_dir": "lang",
"path_robust_bin": "robust/bin",
"path_opensim_bin": "opensim/bin"
}
+68 -37
View File
@@ -13,7 +13,7 @@ usage() {
Usage:
osmtool_main.sh [--mode <cli|ui>] [--lang <de|en|fr|es>] [--profile <grid-sim|robust|standalone>] --module <install|startstop|cleanup|health|backup|restore|update|config|report|smoke|cron> [module-options]
osmtool_main.sh server_install
osmtool_main.sh <install-grid-sim|opensimstart|opensimstop|opensimrestart|healthcheck|smoketest|dailyreport|croninstall|cronlist|janusinstall|janusrestart|dbsetup|dbbackup>
osmtool_main.sh <configinit|install-grid-sim|opensimstart|opensimstop|opensimrestart|healthcheck|smoketest|dailyreport|croninstall|cronlist|janusinstall|janusrestart|dbsetup|dbbackup>
Examples:
osmtool_main.sh install-grid-sim
@@ -43,37 +43,37 @@ dispatch_module() {
case "$module" in
install)
"$MOD_DIR/osmtool_install.sh" --profile "$PROFILE" "$@"
bash "$MOD_DIR/osmtool_install.sh" --profile "$PROFILE" "$@"
;;
startstop)
"$MOD_DIR/osmtool_startstop.sh" --profile "$PROFILE" "$@"
bash "$MOD_DIR/osmtool_startstop.sh" --profile "$PROFILE" "$@"
;;
cleanup)
"$MOD_DIR/osmtool_cleanup.sh" --profile "$PROFILE" "$@"
bash "$MOD_DIR/osmtool_cleanup.sh" --profile "$PROFILE" "$@"
;;
health)
"$MOD_DIR/osmtool_health.sh" --profile "$PROFILE" "$@"
bash "$MOD_DIR/osmtool_health.sh" --profile "$PROFILE" "$@"
;;
backup)
"$MOD_DIR/osmtool_data.sh" --profile "$PROFILE" "$@"
bash "$MOD_DIR/osmtool_data.sh" --profile "$PROFILE" "$@"
;;
update)
"$MOD_DIR/osmtool_update.sh" --profile "$PROFILE" "$@"
bash "$MOD_DIR/osmtool_update.sh" --profile "$PROFILE" "$@"
;;
config)
"$MOD_DIR/osmtool_config.sh" --profile "$PROFILE" "$@"
bash "$MOD_DIR/osmtool_config.sh" --profile "$PROFILE" "$@"
;;
report)
"$MOD_DIR/osmtool_report.sh" --profile "$PROFILE" "$@"
bash "$MOD_DIR/osmtool_report.sh" --profile "$PROFILE" "$@"
;;
smoke)
"$MOD_DIR/osmtool_smoke.sh" --profile "$PROFILE" "$@"
bash "$MOD_DIR/osmtool_smoke.sh" --profile "$PROFILE" "$@"
;;
cron)
bash "$MOD_DIR/osmtool_cron.sh" --profile "$PROFILE" "$@"
;;
restore)
"$MOD_DIR/osmtool_restore.sh" --profile "$PROFILE" "$@"
bash "$MOD_DIR/osmtool_restore.sh" --profile "$PROFILE" "$@"
;;
*)
die "$(msg ERR_UNKNOWN_MODULE): $module"
@@ -229,7 +229,7 @@ ui_flow() {
MODE="cli"
MODULE=""
LANG_OVERRIDE="${OSM_LANG:-de}"
LANG_OVERRIDE="${OSM_LANG:-$APP_LANG}"
PROFILE="grid-sim"
if [[ $# -eq 0 ]]; then
@@ -248,12 +248,18 @@ if [[ "${1:-}" == "server_install" ]]; then
validate_profile "$PROFILE"
log INFO "Running server_install shortcut (prepare-ubuntu -> install-opensim-deps -> install-dotnet8 -> server-check -> install-opensim -> configure-opensim)"
dispatch_module install --action prepare-ubuntu --workdir /opt
dispatch_module install --action install-opensim-deps --workdir /opt
dispatch_module install --action install-dotnet8 --workdir /opt
dispatch_module install --action server-check --workdir /opt
dispatch_module install --action install-opensim --workdir /opt
dispatch_module install --action configure-opensim --workdir /opt
dispatch_module install --action prepare-ubuntu --workdir "$DEFAULT_WORKDIR"
dispatch_module install --action install-opensim-deps --workdir "$DEFAULT_WORKDIR"
dispatch_module install --action install-dotnet8 --workdir "$DEFAULT_WORKDIR"
dispatch_module install --action server-check --workdir "$DEFAULT_WORKDIR"
dispatch_module install --action install-opensim --workdir "$DEFAULT_WORKDIR"
dispatch_module install --action configure-opensim --workdir "$DEFAULT_WORKDIR"
exit 0
fi
if [[ "${1:-}" == "configinit" ]]; then
set_language "$LANG_OVERRIDE"
dispatch_module config --action init-config --workdir "$DEFAULT_WORKDIR"
exit 0
fi
@@ -262,83 +268,108 @@ if [[ "${1:-}" == "install-grid-sim" ]]; then
set_language "$LANG_OVERRIDE"
validate_profile "$PROFILE"
log INFO "Running install-grid-sim shortcut (prepare-ubuntu -> install-opensim-deps -> install-dotnet8 -> server-check -> install-opensim -> configure-opensim)"
dispatch_module install --action prepare-ubuntu --workdir /opt
dispatch_module install --action install-opensim-deps --workdir /opt
dispatch_module install --action install-dotnet8 --workdir /opt
dispatch_module install --action server-check --workdir /opt
dispatch_module install --action install-opensim --workdir /opt
dispatch_module install --action configure-opensim --workdir /opt
# Pflichtparameter: Datenbank-Credentials und Anzahl Simulatoren
_db_user="${OSM_DB_USER:-}"
_db_pass="${OSM_DB_PASS:-}"
_sim_count="${OSM_SIM_COUNT:-1}"
_hostname="${OSM_HOST:-}"
_gridname="${OSM_GRIDNAME:-}"
if [[ -z "$_db_user" || -z "$_db_pass" ]]; then
log ERROR "Datenbankzugangsdaten fehlen. Vor dem Aufruf setzen:"
log ERROR " export OSM_DB_USER=opensim"
log ERROR " export OSM_DB_PASS='MeinSicheresPasswort'"
log ERROR " export OSM_SIM_COUNT=3 # Anzahl sim-Instanzen"
log ERROR " export OSM_HOST=1.2.3.4 # Öffentliche IP oder Hostname"
log ERROR " export OSM_GRIDNAME='Mein Grid'"
exit 1
fi
log INFO "Starte install-grid-sim (prepare-ubuntu → deps → dotnet8 → server-check → install-opensim → configure-database → configure-opensim)"
dispatch_module install --action prepare-ubuntu --workdir "$DEFAULT_WORKDIR"
dispatch_module install --action install-opensim-deps --workdir "$DEFAULT_WORKDIR"
dispatch_module install --action install-dotnet8 --workdir "$DEFAULT_WORKDIR"
dispatch_module install --action server-check --workdir "$DEFAULT_WORKDIR"
dispatch_module install --action install-opensim --workdir "$DEFAULT_WORKDIR"
# Datenbanken vor configure-opensim anlegen (ConnectionStrings werden danach geschrieben)
dispatch_module install --action configure-database --workdir "$DEFAULT_WORKDIR" \
--db-user "$_db_user" --db-pass "$_db_pass" --sim-count "$_sim_count"
# Ini-Dateien mit Credentials, Hostname und Gridname befüllen
dispatch_module install --action configure-opensim --workdir "$DEFAULT_WORKDIR" \
--db-user "$_db_user" --db-pass "$_db_pass" \
${_hostname:+--public-host "$_hostname"} \
${_gridname:+--gridname "$_gridname"}
exit 0
fi
if [[ "${1:-}" == "opensimstart" ]]; then
set_language "$LANG_OVERRIDE"
validate_profile "$PROFILE"
dispatch_module startstop --target "$(default_target_for_profile "$PROFILE")" --action start --workdir /opt
dispatch_module startstop --target "$(default_target_for_profile "$PROFILE")" --action start --workdir "$DEFAULT_WORKDIR"
exit 0
fi
if [[ "${1:-}" == "opensimstop" ]]; then
set_language "$LANG_OVERRIDE"
validate_profile "$PROFILE"
dispatch_module startstop --target "$(default_target_for_profile "$PROFILE")" --action stop --workdir /opt
dispatch_module startstop --target "$(default_target_for_profile "$PROFILE")" --action stop --workdir "$DEFAULT_WORKDIR"
exit 0
fi
if [[ "${1:-}" == "opensimrestart" ]]; then
set_language "$LANG_OVERRIDE"
validate_profile "$PROFILE"
dispatch_module startstop --target "$(default_target_for_profile "$PROFILE")" --action restart --workdir /opt
dispatch_module startstop --target "$(default_target_for_profile "$PROFILE")" --action restart --workdir "$DEFAULT_WORKDIR"
exit 0
fi
if [[ "${1:-}" == "healthcheck" ]]; then
set_language "$LANG_OVERRIDE"
validate_profile "$PROFILE"
dispatch_module health --action run --workdir /opt
dispatch_module health --action run --workdir "$DEFAULT_WORKDIR"
exit 0
fi
if [[ "${1:-}" == "smoketest" ]]; then
set_language "$LANG_OVERRIDE"
validate_profile "$PROFILE"
dispatch_module smoke --action run --workdir /opt
dispatch_module smoke --action run --workdir "$DEFAULT_WORKDIR"
exit 0
fi
if [[ "${1:-}" == "dailyreport" ]]; then
set_language "$LANG_OVERRIDE"
validate_profile "$PROFILE"
dispatch_module report --action generate --workdir /opt
dispatch_module report --action generate --workdir "$DEFAULT_WORKDIR"
exit 0
fi
if [[ "${1:-}" == "croninstall" ]]; then
set_language "$LANG_OVERRIDE"
validate_profile "$PROFILE"
dispatch_module cron --action install --workdir /opt
dispatch_module cron --action install --workdir "$DEFAULT_WORKDIR"
exit 0
fi
if [[ "${1:-}" == "cronlist" ]]; then
set_language "$LANG_OVERRIDE"
validate_profile "$PROFILE"
dispatch_module cron --action list --workdir /opt
dispatch_module cron --action list --workdir "$DEFAULT_WORKDIR"
exit 0
fi
if [[ "${1:-}" == "janusinstall" ]]; then
set_language "$LANG_OVERRIDE"
validate_profile "$PROFILE"
dispatch_module install --action install-janus --workdir /opt
dispatch_module install --action install-janus --workdir "$DEFAULT_WORKDIR"
exit 0
fi
if [[ "${1:-}" == "janusrestart" ]]; then
set_language "$LANG_OVERRIDE"
validate_profile "$PROFILE"
dispatch_module startstop --target janus --action restart --workdir /opt
dispatch_module startstop --target janus --action restart --workdir "$DEFAULT_WORKDIR"
exit 0
fi
@@ -353,7 +384,7 @@ if [[ "${1:-}" == "dbsetup" ]]; then
[[ -n "$DB_PASS_SHORT" ]] || die "dbsetup requires OSM_DB_PASS environment variable"
dispatch_module install --action configure-database --workdir /opt --db-user "$DB_USER_SHORT" --db-pass "$DB_PASS_SHORT" --db-root-user "$DB_ROOT_USER_SHORT" --db-root-pass "$DB_ROOT_PASS_SHORT"
dispatch_module install --action configure-database --workdir "$DEFAULT_WORKDIR" --db-user "$DB_USER_SHORT" --db-pass "$DB_PASS_SHORT" --db-root-user "$DB_ROOT_USER_SHORT" --db-root-pass "$DB_ROOT_PASS_SHORT"
exit 0
fi
@@ -367,7 +398,7 @@ if [[ "${1:-}" == "dbbackup" ]]; then
[[ -n "$DB_PASS_SHORT" ]] || die "dbbackup requires OSM_DB_PASS environment variable"
dispatch_module backup --action db-backup --workdir /opt --db-user "$DB_USER_SHORT" --db-pass "$DB_PASS_SHORT" --db-name "$DB_NAME_SHORT"
dispatch_module backup --action db-backup --workdir "$DEFAULT_WORKDIR" --db-user "$DB_USER_SHORT" --db-pass "$DB_PASS_SHORT" --db-name "$DB_NAME_SHORT"
exit 0
fi
+57
View File
@@ -0,0 +1,57 @@
# Schnellstart
Diese Anleitung fuehrt dich von Null bis zum ersten laufenden Grid.
## Voraussetzungen
- Linux-Server mit Shell-Zugang
- Projekt liegt z. B. unter `/opt/opensimMULTITOOLS-II`
- sudo-Rechte fuer Installation
## Schrittfolge
1. In das Projekt wechseln:
```bash
cd /opt/opensimMULTITOOLS-II
```
1. Grundinstallation fuer grid-sim starten:
```bash
bash osmtool_main.sh install-grid-sim
```
1. Datenbank einrichten (Passwort per Umgebungsvariable):
```bash
export OSM_DB_PASS='DEIN_PASSWORT'
bash osmtool_main.sh dbsetup
```
1. Grid starten:
```bash
bash osmtool_main.sh opensimrestart
```
1. Funktion pruefen:
```bash
bash osmtool_main.sh healthcheck
```
## Was install-grid-sim macht
Der Shortcut fuehrt intern eine komplette Kette aus:
- prepare-ubuntu
- install-opensim-deps
- install-dotnet8
- server-check
- install-opensim
- configure-opensim
## Naechster Schritt
- Weboberflaeche einrichten: [Weboberflaeche](03-Weboberflaeche.md)
+56
View File
@@ -0,0 +1,56 @@
# CLI Kurzbefehle
Diese Kurzbefehle sind absichtlich kurz gehalten und fuer den Alltag gedacht.
## Verfuegbare Kurzbefehle
```bash
bash osmtool_main.sh install-grid-sim
bash osmtool_main.sh opensimstart
bash osmtool_main.sh opensimstop
bash osmtool_main.sh opensimrestart
bash osmtool_main.sh healthcheck
bash osmtool_main.sh smoketest
bash osmtool_main.sh dailyreport
bash osmtool_main.sh croninstall
bash osmtool_main.sh cronlist
bash osmtool_main.sh janusinstall
bash osmtool_main.sh janusrestart
bash osmtool_main.sh dbsetup
bash osmtool_main.sh dbbackup
```
## Befehle mit Variablen
### dbsetup
Legt Datenbanken und Benutzer an.
```bash
export OSM_DB_PASS='DEIN_PASSWORT'
bash osmtool_main.sh dbsetup
```
Optionale Variablen:
- `OSM_DB_USER` (Standard: `opensim`)
- `OSM_DB_ROOT_USER` (Standard: `root`)
- `OSM_DB_ROOT_PASS` (Standard: leer)
### dbbackup
Sichert die Datenbank.
```bash
export OSM_DB_PASS='DEIN_PASSWORT'
bash osmtool_main.sh dbbackup
```
Optionale Variablen:
- `OSM_DB_USER` (Standard: `root`)
- `OSM_DB_NAME` (Standard: `opensim`)
## Wenn du volle Kontrolle brauchst
Neben Kurzbefehlen kannst du auch den modularen Modus mit `--module` und `--action` nutzen.
+43
View File
@@ -0,0 +1,43 @@
# Weboberflaeche
Die Weboberflaeche liegt im Ordner `webphp/`.
## Funktionen
- Login-Schutz
- Mehrsprachigkeit (`de`, `en`, `fr`, `es`)
- Modul- und Aktionsauswahl
- Kommando-Vorschau
- Ausgabefenster
- Live-Status fuer Screens, Ports und Artefakte
## Wichtige Regel zur Konfiguration
- Aktive Datei: `webphp/src/config.php`
- Vorlage: `webphp/src/config.sample.php`
Aenderungen werden nur aus `config.php` gelesen.
## Minimal-Setup
1. Dateien deployen
2. `webphp/src/config.php` anpassen
3. Webroot auf `webphp/public` setzen
4. Runner-Skript ausfuehrbar machen
## Live-Status anpassen
In `webphp/src/config.php`:
- `status_ports`
- `status_screens`
Wenn falsche Ports angezeigt werden, zuerst pruefen:
1. Wurde `config.php` geaendert?
2. Ist es die richtige Instanz?
3. Browser-Hard-Reload gemacht (`Ctrl+Shift+R`)?
## Referenz
Detaillierte technische Anleitung: `webphp/README.md`
+37
View File
@@ -0,0 +1,37 @@
# Sicherheit
## Grundregeln
- Produktivsystem nur mit Backups betreiben.
- Webzugriff nach Moeglichkeit auf interne Netze/IPs begrenzen.
- HTTPS verwenden.
- Starkes Passwort in `webphp/src/config.php` setzen.
## Login-Schutz (Web)
Die Weboberflaeche enthaelt Brute-Force-Schutz:
- Sperre nach mehreren Fehlversuchen pro IP
- Zeitbasierte Entsperrung
- Audit-Logging von Login-Ereignissen
## Wichtige Einstellungen
In `webphp/src/config.php`:
- `auth_lockout_max_attempts`
- `auth_lockout_seconds`
- optional `auth_store_path`
- optional `auth_audit_log_path`
## Audit-Log
Typische Events:
- `login_success`
- `login_failed_password`
- `login_failed_locked`
- `login_blocked`
- `csrf_invalid`
Nutze das Log fuer Nachverfolgung von Angriffen und Fehlbedienung.
+37
View File
@@ -0,0 +1,37 @@
# Konfiguration
## 1. Zentrale Bereiche
Es gibt zwei Konfigurationswelten:
- CLI/Skripte: ueber Parameter und Umgebungsvariablen
- Web: ueber `webphp/src/config.php`
## 2. Web-Konfiguration
Wichtige Eintraege in `webphp/src/config.php`:
- `session_key`: Schluessel fuer Session-Schutz
- `web_password`: Login-Passwort fuer Web-UI
- `command_timeout_seconds`: Timeout fuer Runner
- `default_workdir`: Standard-Arbeitsverzeichnis
- `status_ports`: Port-Check pro Profil
- `status_screens`: Screen-Check pro Profil
- `use_sudo` und `sudo_user`: optionaler sudo-Betrieb
## 3. Sicherheitseinstellungen
- `auth_lockout_max_attempts`
- `auth_lockout_seconds`
- optional `auth_store_path`
- optional `auth_audit_log_path`
## 4. Typische Stolpersteine
- Nur `config.sample.php` geaendert statt `config.php`
- Falscher Deploy-Pfad oder falsche Instanz
- Browsercache zeigt alte Daten
## 5. Empfehlung
Aendere zuerst in einer Testumgebung. Dokumentiere eigene Abweichungen in einer separaten Betriebsdoku.
+44
View File
@@ -0,0 +1,44 @@
# Backup und Restore
## 1. Grundprinzip
Jede groessere Aenderung startet mit einem Backup.
Empfohlen:
- Datenbank-Backup vor Updates
- OAR-Backup vor Regionenumbauten
- Regelmaessige automatisierte Sicherung per Cron
## 2. Datenbank sichern (Kurzbefehl)
```bash
export OSM_DB_PASS='DEIN_PASSWORT'
bash osmtool_main.sh dbbackup
```
## 3. Modulare Backup-Aktionen
Beispiele (ausfuehrlicher Modus):
```bash
bash osmtool_main.sh --module backup --action db-backup --db-user root --db-pass DEIN_PASSWORT --db-name opensim --workdir /opt
bash osmtool_main.sh --module backup --action oar-backup --workdir /opt --region sim1 --session sim1
bash osmtool_main.sh --module backup --action full-backup --workdir /opt --db-user root --db-pass DEIN_PASSWORT --db-name opensim --region sim1 --session sim1 --compress true
```
## 4. Restore
Restore-Funktionen laufen ueber das Modul `restore`.
Vor einem produktiven Restore immer:
- passenden Backupstand verifizieren
- Zielsystem stoppen
- optional Dry-Run oder Testsystem nutzen
## 5. Aufbewahrung
- Backups versioniert speichern
- externe/offsite Kopie einplanen
- Restore regelmaessig testen
+44
View File
@@ -0,0 +1,44 @@
# Troubleshooting
## 1. Live-Status zeigt falsche Ports
Pruefen:
1. Ports in `webphp/src/config.php` gesetzt?
1. Richtige Umgebung/Instanz aufgerufen?
1. Hard-Reload im Browser (`Ctrl+Shift+R`)?
## 2. Login ploetzlich gesperrt
Ursache:
- Mehrere falsche Loginversuche fuehren zur IP-Sperre.
Loesung:
- `auth_lockout_seconds` abwarten
- Audit-Log pruefen
## 3. check_screens startet neu
Erwartetes Verhalten:
- kritische Ausfaelle fuehren zu Neustart
- Status wird in `ProblemRestarts.log` protokolliert
## 4. Befehle schlagen ohne erkennbare Ursache fehl
Pruefen:
1. Rechte auf Skripte vorhanden (`chmod +x`)
1. Pfade korrekt (`/opt/...` vs andere Pfade)
1. Abhaengigkeiten installiert (dotnet, mysqldump, screen)
## 5. Web-UI startet Befehle nicht
Pruefen:
- runner-Skript vorhanden und ausfuehrbar
- `runner_path` korrekt
- `use_sudo` und `sudo_user` korrekt
- sudoers-Eintrag fuer Runner vorhanden
+33
View File
@@ -0,0 +1,33 @@
# Cronjobs
Cronjobs helfen, wiederkehrende Aufgaben zu automatisieren.
## 1. Kurzbefehle
```bash
bash osmtool_main.sh croninstall
bash osmtool_main.sh cronlist
```
## 2. Manuelle Crontab-Befehle
```bash
crontab -l
crontab -e
```
## 3. Beispiele
```cron
# Grid jeden Morgen um 05:00 neu starten
0 5 * * * bash /opt/osmtool.sh autorestart
# Alle 30 Minuten check_screens
*/30 * * * * bash /opt/osmtool.sh check_screens
```
## 4. Empfehlungen
- Logs aktivieren
- Zeiten so legen, dass Nutzer moeglichst wenig beeinflusst werden
- Neustarts mit Backup-Strategie kombinieren
+44
View File
@@ -0,0 +1,44 @@
# opensimMULTITOOLS-II Wiki
Willkommen zur lokalen Wiki-Dokumentation von opensimMULTITOOLS-II.
Diese Seiten erklaeren das Projekt fuer Einsteiger und fortgeschrittene Nutzer.
## Inhalt
1. [Schnellstart](01-Schnellstart.md)
2. [CLI Kurzbefehle](02-CLI-Kurzbefehle.md)
3. [Weboberflaeche](03-Weboberflaeche.md)
4. [Sicherheit](04-Sicherheit.md)
5. [Konfiguration](05-Konfiguration.md)
6. [Backup und Restore](06-Backup-Restore.md)
7. [Troubleshooting](07-Troubleshooting.md)
8. [Cronjobs](08-Cronjobs.md)
## Projektueberblick
opensimMULTITOOLS-II ist eine Sammlung von Skripten zur Verwaltung von OpenSim:
- Installation und Updates
- Start, Stop, Restart
- Backups und Restore
- Healthchecks und Reports
- Web-Dashboard mit Login, Mehrsprachigkeit und Live-Status
## Wichtige Dateien
- `osmtool_main.sh`: modularer Einstiegspunkt
- `osmtool.sh`: klassisches Hauptskript
- `modular/`: einzelne Funktionsmodule
- `webphp/`: Weboberflaeche
- `README.md`: komprimierter Projektleitfaden
## Version
- Aktueller Stand: V26.4.230.588
## Sicherheit zuerst
- Immer vor grossen Aktionen Backups machen.
- Erst in Testumgebung pruefen.
- Weboberflaeche nur abgesichert betreiben (HTTPS, starke Passwoerter, begrenzter Zugriff).