diff --git a/.gitmodules b/.gitmodules index c170b2192..daa0a7b2d 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,7 +1,7 @@ [submodule "qt-migration-legatus"] path = qt-migration-legatus url = git@devel:lifemaps/qt-migration-legatus.git - branch = story/release-at-16-oct-2026 + branch = feature/Re-implement-XmlPatterns [submodule "rpmbuild"] path = rpmbuild url = git@devel:lifemaps/rpmbuild.git diff --git a/qt-migration-legatus b/qt-migration-legatus index 6d96d7259..d327c66c4 160000 --- a/qt-migration-legatus +++ b/qt-migration-legatus @@ -1 +1 @@ -Subproject commit 6d96d72592757337c7ca8333357c1f896fb20580 +Subproject commit d327c66c46c1c62b8ec45e4015364100748ab178 diff --git a/scripts/README-gui-docker.md b/scripts/README-gui-docker.md new file mode 100644 index 000000000..960517f16 --- /dev/null +++ b/scripts/README-gui-docker.md @@ -0,0 +1,47 @@ +# Remote X11 Docker Forwarding for Qt6 Pipeline + +Diese Skripte automatisieren das Durchreichen von grafischen Anwendungen (GUI) aus einem Docker-Container über eine **SSH-Verbindung** innerhalb einer **GNU screen-Session**. Sie lösen die typischen Probleme mit X11-Cookies (`.Xauthority`) und wechselnden Display-Nummern. + +## 🚀 Voraussetzungen + +1. **Lokal:** Ein laufender X-Server (Linux Desktop, XQuartz auf macOS oder VcXsrv/Xming auf Windows). +2. **SSH-Verbindung:** Verbindung zum Server zwingend mit X11-Weiterleitung aufbauen: + ```bash + ssh -Y torsten@greifserv + ``` +3. **In Screen:** Stelle vor dem Start sicher, dass `$DISPLAY` in deiner Shell gesetzt ist (z. B. `export DISPLAY=localhost:10.0`). + +--- + +## 🛠️ Verwendung der Skripte + +Beide Skripte müssen vor der ersten Nutzung ausführbar gemacht werden: +```bash +chmod +x run_gui_docker.sh exec_gui_docker.sh +``` + +### 1. Container neu starten (`run_gui_docker.sh`) +Extrahiert das X11-Sicherheits-Cookie des Host-Users, bereinigt Hostnamen-Konflikte, startet den Container im Host-Netzwerk (`--net=host`) und konfiguriert die Rechte im Container vollautomatisch. + +* **Ausführung:** + ```bash + ./run_gui_docker.sh + ``` +* **Test im Container:** `xclock &` eingeben. Die Uhr sollte auf deinem lokalen PC erscheinen. + +### 2. In laufenden Container einklinken (`exec_gui_docker.sh`) +Öffnet eine weitere Shell (neues Screen-Fenster/Tab) in dem bereits laufenden GUI-Container. Es ermittelt automatisch die aktive Container-ID sowie das aktuelle Host-Display und vererbt die X11-Umgebungsvariablen. + +* **Ausführung:** + ```bash + ./exec_gui_docker.sh + ``` + +--- + +## 🛑 Fehlerbehebung + +* **Fehler:** `❌ Fehler: Kein aktives DISPLAY auf dem Host gefunden!` + * **Lösung:** Außerhalb von Screen `echo $DISPLAY` prüfen (z. B. `localhost:10.0`). In Screen die Variable händisch angleichen: `export DISPLAY=localhost:10.0`, danach das Skript erneut starten. +* **Fehler:** `X11 connection rejected...` beim manuellen Testen + * **Ursache:** Das Cookie passt nicht zum Display. Nutze immer `run_gui_docker.sh`, da dieses das Cookie netzwerkneutral umschreibt. diff --git a/scripts/exec_gui_docker.sh b/scripts/exec_gui_docker.sh new file mode 100755 index 000000000..0c77c3778 --- /dev/null +++ b/scripts/exec_gui_docker.sh @@ -0,0 +1,28 @@ +#!/bin/bash + +# 1. Laufenden Container automatisch finden +IMAGE_NAME="legatus-qt6-prebuilt" +CONTAINER_ID=$(docker ps --filter "ancestor=$IMAGE_NAME" --format "{{.ID}}" | head -n 1) + +if [ -z "$CONTAINER_ID" ]; then + echo "❌ Fehler: Es läuft kein Container, der auf dem Image '$IMAGE_NAME' basiert." + exit 1 +fi + +# 2. Aktuelle Display-Nummer vom Host auslesen +if [ -z "$DISPLAY" ]; then + echo "❌ Fehler: Kein aktives DISPLAY auf dem Host gefunden!" + exit 1 +fi + +DISPLAY_NUM=$(echo $DISPLAY | grep -oP '(?<=:)\d+' | head -n 1) +CONTAINER_DISPLAY=":${DISPLAY_NUM}.0" + +echo "🔌 Klinke in laufenden Container ein ($CONTAINER_ID)..." + +# 3. Docker exec mit den passenden X11-Variablen aufrufen +docker exec -it \ + -e DISPLAY="$CONTAINER_DISPLAY" \ + -e XAUTHORITY=/tmp/.Xauthority \ + "$CONTAINER_ID" \ + bash diff --git a/scripts/run_gui_docker.sh b/scripts/run_gui_docker.sh new file mode 100755 index 000000000..9667e4768 --- /dev/null +++ b/scripts/run_gui_docker.sh @@ -0,0 +1,54 @@ +#!/bin/bash + +# 1. Aktuelle Display-Nummer vom Host ermitteln (z.B. 10) +if [ -z "$DISPLAY" ] || [ "$DISPLAY" = "localhost" ]; then + echo "❌ Fehler: Kein aktives DISPLAY auf dem Host gefunden!" + echo "Stelle sicher, dass du dich per 'ssh -Y' verbunden hast." + exit 1 +fi + +# Extrahiere die reine Nummer (z.B. aus 'localhost:10.0' wird '10') +DISPLAY_NUM=$(echo $DISPLAY | grep -oP '(?<=:)\d+' | head -n 1) +CONTAINER_DISPLAY=":${DISPLAY_NUM}.0" + +echo "🔄 Erstelle X11-Cookie für Display :${DISPLAY_NUM}..." + +# 2. Cookie temporär extrahieren +COOKIE_FILE="/tmp/docker_x11_cookie_tmp" +rm -f "$COOKIE_FILE" +xauth extract "$COOKIE_FILE" "$DISPLAY" + +# Sicherheitsprüfung +if [ ! -f "$COOKIE_FILE" ] || [ ! -s "$COOKIE_FILE" ]; then + echo "❌ Fehler: X11-Cookie konnte nicht extrahiert werden (ist xauth installiert?)." + exit 1 +fi + +echo "🚀 Starte Docker-Container mit GUI-Forwarding..." + +# 3. Docker starten und Inline-Befehl zur Rechtevergabe im Container ausführen +docker run --rm -it \ + --net=host \ + -e RTI_LICENSE_FILE=/workspace/rti_license.dat \ + -v /tmp/.X11-unix:/tmp/.X11-unix:ro \ + -v "$COOKIE_FILE":"$COOKIE_FILE":ro \ + -v "$MIGRATE_PIPELINE_ROOT":/workspace \ + -v "$MIGRATE_PIPELINE_ROOT/external":/workspace/external:ro \ + -w /workspace/qt-migration-legatus/qt6-after/qt6-migrated-legatus \ + --entrypoint /bin/bash \ + legatus-qt6-prebuilt:latest \ + -c " + export XAUTHORITY=/tmp/.Xauthority + rm -f /tmp/.Xauthority + xauth add :${DISPLAY_NUM} . \$(xauth -f $COOKIE_FILE list | awk '{print \$3}') 2>/dev/null + export DISPLAY=${CONTAINER_DISPLAY} + echo -e '\n==================================================' + echo -e '✅ GUI-Docker-Umgebung erfolgreich konfiguriert!' + echo -e 'DISPLAY ist gesetzt auf: ' \$DISPLAY + echo -e 'Teste es jetzt mit: xclock &' + echo -e '==================================================\n' + bash + " + +# 4. Aufräumen nach dem Beenden des Containers +rm -f "$COOKIE_FILE"