diff --git a/README.md b/README.md index 7ff3685..a4534ca 100644 --- a/README.md +++ b/README.md @@ -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. diff --git a/lang/de.lang b/lang/de.lang index 3dc0603..b81a7d3 100644 --- a/lang/de.lang +++ b/lang/de.lang @@ -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. diff --git a/lang/en.lang b/lang/en.lang index 5ae6d17..aded0cd 100644 --- a/lang/en.lang +++ b/lang/en.lang @@ -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. diff --git a/lang/es.lang b/lang/es.lang index 4159607..3f606e4 100644 --- a/lang/es.lang +++ b/lang/es.lang @@ -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. diff --git a/lang/fr.lang b/lang/fr.lang index 5d672dd..078f830 100644 --- a/lang/fr.lang +++ b/lang/fr.lang @@ -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. diff --git a/modular/osmtool_config.sh b/modular/osmtool_config.sh index 3a0eb89..115b946 100644 --- a/modular/osmtool_config.sh +++ b/modular/osmtool_config.sh @@ -8,10 +8,11 @@ source "$SCRIPT_DIR/osmtool_core.sh" usage() { cat <<'EOF' Usage: - osmtool_config.sh [--workdir ] --action + osmtool_config.sh [--workdir ] --action [--file ] [--strict ] 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" diff --git a/modular/osmtool_core.sh b/modular/osmtool_core.sh index 86d2e9c..9252cf8 100644 --- a/modular/osmtool_core.sh +++ b/modular/osmtool_core.sh @@ -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" <] --action + osmtool_install.sh [--workdir ] --action [--opensim-dir ] [--opensim-repo ] [--opensim-branch ] [--repo-mode ] [--tsassets-dir ] [--currency-dir ] [--data-backup-dir ] [--deploy-binaries ] [--legacy-patch-dir ] @@ -18,6 +18,7 @@ Usage: [--api-secret ] [--admin-secret ] 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 </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 </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 diff --git a/modular/osmtool_startstop.sh b/modular/osmtool_startstop.sh index dbde8e5..39d588e 100644 --- a/modular/osmtool_startstop.sh +++ b/modular/osmtool_startstop.sh @@ -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 diff --git a/osmtool.sh b/osmtool.sh index 9c5f19e..c3d9509 100644 --- a/osmtool.sh +++ b/osmtool.sh @@ -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" diff --git a/osmtool_config.json b/osmtool_config.json new file mode 100644 index 0000000..27d4709 --- /dev/null +++ b/osmtool_config.json @@ -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" +} diff --git a/osmtool_main.sh b/osmtool_main.sh index 85c228c..52150cd 100644 --- a/osmtool_main.sh +++ b/osmtool_main.sh @@ -13,7 +13,7 @@ usage() { Usage: osmtool_main.sh [--mode ] [--lang ] [--profile ] --module [module-options] osmtool_main.sh server_install - osmtool_main.sh + osmtool_main.sh 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 diff --git a/wiki/01-Schnellstart.md b/wiki/01-Schnellstart.md new file mode 100644 index 0000000..54928ba --- /dev/null +++ b/wiki/01-Schnellstart.md @@ -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) diff --git a/wiki/02-CLI-Kurzbefehle.md b/wiki/02-CLI-Kurzbefehle.md new file mode 100644 index 0000000..f65aa74 --- /dev/null +++ b/wiki/02-CLI-Kurzbefehle.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. diff --git a/wiki/03-Weboberflaeche.md b/wiki/03-Weboberflaeche.md new file mode 100644 index 0000000..42698f4 --- /dev/null +++ b/wiki/03-Weboberflaeche.md @@ -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` diff --git a/wiki/04-Sicherheit.md b/wiki/04-Sicherheit.md new file mode 100644 index 0000000..2673e8e --- /dev/null +++ b/wiki/04-Sicherheit.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. diff --git a/wiki/05-Konfiguration.md b/wiki/05-Konfiguration.md new file mode 100644 index 0000000..943e16e --- /dev/null +++ b/wiki/05-Konfiguration.md @@ -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. diff --git a/wiki/06-Backup-Restore.md b/wiki/06-Backup-Restore.md new file mode 100644 index 0000000..e414780 --- /dev/null +++ b/wiki/06-Backup-Restore.md @@ -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 diff --git a/wiki/07-Troubleshooting.md b/wiki/07-Troubleshooting.md new file mode 100644 index 0000000..1963c9b --- /dev/null +++ b/wiki/07-Troubleshooting.md @@ -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 diff --git a/wiki/08-Cronjobs.md b/wiki/08-Cronjobs.md new file mode 100644 index 0000000..6af1508 --- /dev/null +++ b/wiki/08-Cronjobs.md @@ -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 diff --git a/wiki/Home.md b/wiki/Home.md new file mode 100644 index 0000000..50cc13c --- /dev/null +++ b/wiki/Home.md @@ -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).