mirror of
https://github.com/ManfredAabye/opensimMULTITOOLS-II.git
synced 2026-08-14 08:52:24 +00:00
040420261513
This commit is contained in:
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
@@ -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
@@ -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|sí) 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|sí) 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
@@ -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
@@ -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"
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
@@ -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.
|
||||
@@ -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`
|
||||
@@ -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.
|
||||
@@ -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.
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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).
|
||||
Reference in New Issue
Block a user