From d64b27ab880e545ad275e6f4c60ec8022c15eef3 Mon Sep 17 00:00:00 2001 From: "marcus.hinz" Date: Thu, 25 Jun 2026 14:34:54 +0200 Subject: [PATCH] projects/vpn: browsergebundene VPN-Tray-Apps (Wuerth/Heron) + Build-Scripts --- projects/vpn/README.md | 41 ++++ projects/vpn/build_heron_app.sh | 112 +++++++++ projects/vpn/build_wuerth_app.sh | 94 ++++++++ projects/vpn/heron_vpn_tray.py | 362 ++++++++++++++++++++++++++++ projects/vpn/icon.icns | Bin 0 -> 121474 bytes projects/vpn/setup.py | 33 +++ projects/vpn/setup_heron.py | 28 +++ projects/vpn/wuerth.png | Bin 0 -> 112526 bytes projects/vpn/wuerth_vpn_proxy.sh | 67 ++++++ projects/vpn/wuerth_vpn_tray.py | 401 +++++++++++++++++++++++++++++++ 10 files changed, 1138 insertions(+) create mode 100644 projects/vpn/README.md create mode 100644 projects/vpn/build_heron_app.sh create mode 100755 projects/vpn/build_wuerth_app.sh create mode 100644 projects/vpn/heron_vpn_tray.py create mode 100644 projects/vpn/icon.icns create mode 100644 projects/vpn/setup.py create mode 100644 projects/vpn/setup_heron.py create mode 100755 projects/vpn/wuerth.png create mode 100755 projects/vpn/wuerth_vpn_proxy.sh create mode 100755 projects/vpn/wuerth_vpn_tray.py diff --git a/projects/vpn/README.md b/projects/vpn/README.md new file mode 100644 index 0000000..3c1c2fb --- /dev/null +++ b/projects/vpn/README.md @@ -0,0 +1,41 @@ +# VPN Tray-Apps (browsergebunden, rootlos) + +Menübar-Apps, die ein VPN rootlos aufbauen (openconnect + ocproxy als SOCKS5) +und einen dedizierten Browser starten, der per PAC nur die internen Hosts über +das VPN schickt und alles andere direkt. Jede App hat eigenen SOCKS-/PAC-Port +und eigenes Browser-Profil — mehrere VPNs laufen parallel ohne Konflikt. + +## Apps + +- **wuerth_vpn_tray.py** — Würth, Cisco AnyConnect (`--protocol=anyconnect`), + User+Passwort. Fertig und in Betrieb. +- **heron_vpn_tray.py** — Heron, GlobalProtect (`--protocol=gp`). Gerüst fertig; + der SAML-POST-/Duo-Login ist auf macOS nicht sauber rootlos lösbar + (openconnect `--external-browser` bedient nur SAML-REDIRECT; gp-saml-gui + braucht WebKit2GTK). Unter Linux via gp-saml-gui umsetzbar. + +## Voraussetzungen + +- `openconnect` + `ocproxy` (macOS: `brew install openconnect ocproxy`) +- PyQt6 (für die Tray-App), Microsoft Edge (dedizierter Browser) +- Bauen als App-Bundle: py2app (`pip install --user py2app`) + +## Bauen (macOS-App-Bundle, Menübar-Only, kein Dock-Icon) + + bash build_wuerth_app.sh # -> ~/Applications/WuerthVPN.app + bash build_heron_app.sh # -> ~/Applications/HeronVPN.app + +Die Build-Scripts bauen via py2app, dünnen die Qt-Frameworks aus (~79 MB), +installieren nach `~/Applications` und legen einen LaunchAgent für optionalen +Autostart an (`launchctl load ~/Library/LaunchAgents/com..vpntray.plist`). + +## Ohne Bundle (nur Shell) + +- **wuerth_vpn_proxy.sh** — schlanke Shell-Variante: fragt Passwort, baut das + VPN auf und startet Edge mit PAC. Ohne Tray/Bundle. + +## Konfiguration + +Im Kopf der jeweiligen `*_tray.py`: SERVER, VPN_USER, PORT/PACPORT, +INTERNAL_GLOB (welche Hosts über das VPN), START_URL, BOOKMARKS. Nach Änderung +neu bauen, da das Script ins Bundle kopiert wird. diff --git a/projects/vpn/build_heron_app.sh b/projects/vpn/build_heron_app.sh new file mode 100644 index 0000000..927381d --- /dev/null +++ b/projects/vpn/build_heron_app.sh @@ -0,0 +1,112 @@ +#!/usr/bin/env bash +# Baut HeronVPN.app via py2app (Menuebar-Only, kein Dock via LSUIElement), +# generiert ein "H"-Icon, duennt aus, installiert nach ~/Applications und legt +# einen LaunchAgent fuer optionalen Autostart bereit. +set -euo pipefail + +PY="/Library/Developer/CommandLineTools/usr/bin/python3" +APPS="$HOME/apps" +APP="$HOME/Applications/HeronVPN.app" +BID="com.heron.vpntray" +LSREG=/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister + +cd "$APPS" + +# --- 0. Icon erzeugen (H-Badge -> icon_heron.icns) --- +TMP="$(mktemp -d)" +QT_QPA_PLATFORM=offscreen "$PY" - "$TMP/h.png" <<'PYEOF' +import sys +from PyQt6.QtGui import QImage, QPainter, QColor, QFont, QGuiApplication +from PyQt6.QtCore import Qt +_app = QGuiApplication([]) # noetig fuer Font-Zugriff +S = 1024 +img = QImage(S, S, QImage.Format.Format_ARGB32) +img.fill(Qt.GlobalColor.transparent) +p = QPainter(img) +p.setRenderHint(QPainter.RenderHint.Antialiasing) +p.setBrush(QColor("#2e7d32")) +p.setPen(Qt.PenStyle.NoPen) +m = int(S * 0.09) +p.drawRoundedRect(m, m, S - 2 * m, S - 2 * m, S * 0.18, S * 0.18) +p.setPen(QColor("#ffffff")) +f = QFont(); f.setBold(True); f.setPixelSize(int(S * 0.6)); p.setFont(f) +p.drawText(img.rect(), Qt.AlignmentFlag.AlignCenter, "H") +p.end() +img.save(sys.argv[1]) +PYEOF +ISET="$TMP/icon.iconset"; mkdir -p "$ISET" +for s in 16 32 128 256 512; do + sips -z $s $s "$TMP/h.png" --out "$ISET/icon_${s}x${s}.png" >/dev/null + sips -z $((s*2)) $((s*2)) "$TMP/h.png" --out "$ISET/icon_${s}x${s}@2x.png" >/dev/null +done +iconutil -c icns "$ISET" -o "$APPS/icon_heron.icns" +rm -rf "$TMP" + +# --- 1. Bauen --- +rm -rf build dist +"$PY" setup_heron.py py2app >/tmp/heron_py2app.log 2>&1 || { tail -20 /tmp/heron_py2app.log; exit 1; } + +# --- 2. Nach ~/Applications uebernehmen --- +pkill -f "HeronVPN.app/Contents/MacOS/HeronVPN" 2>/dev/null || true +rm -rf "$APP" +cp -R "$APPS/dist/HeronVPN.app" "$APP" + +# --- 2b. Ausduennen (wie Wuerth) --- +QT="$APP/Contents/Resources/lib/python3.9/PyQt6/Qt6" +KEEP="QtCore QtGui QtWidgets QtDBus QtNetwork QtPrintSupport QtSvg QtSvgWidgets" +for fw in "$QT/lib"/*.framework; do + name="$(basename "$fw" .framework)" + echo " $KEEP " | grep -q " $name " || rm -rf "$fw" +done +rm -rf "$QT/qml" "$QT/translations" "$QT/qsci" +if [ -d "$QT/plugins" ]; then + for d in "$QT/plugins"/*/; do + case "$(basename "$d")" in + platforms|styles|imageformats|iconengines) ;; + *) rm -rf "$d";; + esac + done +fi +PYQT="$APP/Contents/Resources/lib/python3.9/PyQt6" +for m in QtQml QtQuick QtQuick3D QtQuickWidgets QtPdf QtPdfWidgets QtDesigner \ + QtMultimedia QtMultimediaWidgets Qt3DCore QtCharts QtDataVisualization \ + QtSql QtTest QtBluetooth QtPositioning QtSensors QtWebChannel \ + QtWebSockets QtNfc QtSpatialAudio QtShaderTools QtOpenGL QtOpenGLWidgets; do + find "$PYQT" -maxdepth 1 -name "${m}.*so" -delete 2>/dev/null || true +done +while IFS= read -r f; do + archs="$(lipo -archs "$f" 2>/dev/null || true)" + if [[ "$archs" == *x86_64* && "$archs" == *arm64* ]]; then + lipo "$f" -thin arm64 -output "$f" 2>/dev/null || true + fi +done < <(find "$APP" -type f \( -name "*.so" -o -name "*.dylib" -o -perm -u+x \)) +find "$APP" -type f \( -name "*.so" -o -name "*.dylib" \) -exec strip -x {} \; 2>/dev/null || true +codesign --force --deep -s - "$APP" >/dev/null 2>&1 + +# --- 3. Build-Ausgabe entfernen --- +"$LSREG" -u "$APPS/dist/HeronVPN.app" 2>/dev/null || true +rm -rf build dist + +# --- 4. registrieren --- +"$LSREG" -f "$APP" + +# --- 5. LaunchAgent --- +LA="$HOME/Library/LaunchAgents/$BID.plist" +mkdir -p "$HOME/Library/LaunchAgents" +cat >"$LA" < + + + + Label$BID + ProgramArguments + /usr/bin/open-a$APP + RunAtLoad + KeepAlive + + +AGENT + +echo "Fertig: $APP" +echo "Autostart aktivieren: launchctl load $LA" +echo "Autostart deaktivieren: launchctl unload $LA" diff --git a/projects/vpn/build_wuerth_app.sh b/projects/vpn/build_wuerth_app.sh new file mode 100755 index 0000000..4e229a8 --- /dev/null +++ b/projects/vpn/build_wuerth_app.sh @@ -0,0 +1,94 @@ +#!/usr/bin/env bash +# Baut WuerthVPN.app via py2app (Menuebar-Only, kein Dock-Icon via LSUIElement), +# installiert nach ~/Applications, raeumt die Build-Ausgabe weg (sonst doppelt +# im Launchpad) und legt einen LaunchAgent fuer optionalen Autostart bereit. +set -euo pipefail + +PY="/Library/Developer/CommandLineTools/usr/bin/python3" +APPS="$HOME/apps" +APP="$HOME/Applications/WuerthVPN.app" +BID="com.wuerth.vpntray" +LSREG=/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister + +cd "$APPS" + +# --- 1. Bauen --- +rm -rf build dist +"$PY" setup.py py2app >/tmp/wuerth_py2app.log 2>&1 || { tail -20 /tmp/wuerth_py2app.log; exit 1; } + +# --- 2. Nach ~/Applications uebernehmen --- +pkill -f "WuerthVPN.app/Contents/MacOS/WuerthVPN" 2>/dev/null || true +rm -rf "$APP" +cp -R "$APPS/dist/WuerthVPN.app" "$APP" + +# --- 2b. Ausduennen: nur QtCore/Gui/Widgets + Abhaengigkeiten behalten --- +QT="$APP/Contents/Resources/lib/python3.9/PyQt6/Qt6" +KEEP="QtCore QtGui QtWidgets QtDBus QtNetwork QtPrintSupport QtSvg QtSvgWidgets" +for fw in "$QT/lib"/*.framework; do + name="$(basename "$fw" .framework)" + echo " $KEEP " | grep -q " $name " || rm -rf "$fw" +done +rm -rf "$QT/qml" "$QT/translations" "$QT/qsci" +if [ -d "$QT/plugins" ]; then + for d in "$QT/plugins"/*/; do + case "$(basename "$d")" in + platforms|styles|imageformats|iconengines) ;; + *) rm -rf "$d";; + esac + done +fi + +# uebrige PyQt6-Bindings der entfernten Qt-Module loeschen +PYQT="$APP/Contents/Resources/lib/python3.9/PyQt6" +for m in QtQml QtQuick QtQuick3D QtQuickWidgets QtPdf QtPdfWidgets QtDesigner \ + QtMultimedia QtMultimediaWidgets Qt3DCore QtCharts QtDataVisualization \ + QtSql QtTest QtBluetooth QtPositioning QtSensors QtWebChannel \ + QtWebSockets QtNfc QtSpatialAudio QtShaderTools QtOpenGL QtOpenGLWidgets; do + find "$PYQT" -maxdepth 1 -name "${m}.*so" -delete 2>/dev/null || true +done + +# universale Mach-O auf arm64 thinnen +while IFS= read -r f; do + archs="$(lipo -archs "$f" 2>/dev/null || true)" + if [[ "$archs" == *x86_64* && "$archs" == *arm64* ]]; then + lipo "$f" -thin arm64 -output "$f" 2>/dev/null || true + fi +done < <(find "$APP" -type f \( -name "*.so" -o -name "*.dylib" -o -perm -u+x \)) + +# Symbole strippen +find "$APP" -type f \( -name "*.so" -o -name "*.dylib" \) -exec strip -x {} \; 2>/dev/null || true + +# Bundle-Siegel nach allen Aenderungen erneuern (sonst -10669/Gatekeeper) +codesign --force --deep -s - "$APP" >/dev/null 2>&1 + +# --- 3. Build-Ausgabe entfernen (sonst zweite App im Launchpad) --- +"$LSREG" -u "$APPS/dist/WuerthVPN.app" 2>/dev/null || true +rm -rf build dist + +# --- 4. App registrieren --- +"$LSREG" -f "$APP" + +# --- 5. LaunchAgent fuer Autostart bereitlegen (nicht automatisch geladen) --- +LA="$HOME/Library/LaunchAgents/$BID.plist" +mkdir -p "$HOME/Library/LaunchAgents" +cat >"$LA" < + + + + Label$BID + ProgramArguments + + /usr/bin/open + -a + $APP + + RunAtLoad + KeepAlive + + +AGENT + +echo "Fertig: $APP" +echo "Autostart aktivieren: launchctl load $LA" +echo "Autostart deaktivieren: launchctl unload $LA" diff --git a/projects/vpn/heron_vpn_tray.py b/projects/vpn/heron_vpn_tray.py new file mode 100644 index 0000000..ef352b8 --- /dev/null +++ b/projects/vpn/heron_vpn_tray.py @@ -0,0 +1,362 @@ +#!/usr/bin/env python3 +""" +Heron VPN – plattformuebergreifende Tray-App (PyQt6), GlobalProtect. + +Baut das VPN rootlos auf (openconnect --protocol=gp + ocproxy als SOCKS5) und +startet einen dedizierten Browser, der per PAC nur die internen Hosts ueber das +VPN schickt und alles andere direkt. Start/Stop ueber das Tray-Icon. + +Eigene Ports/Profil/Bundle -> laeuft parallel zur Wuerth-App. + +Abhaengigkeiten: + openconnect + ocproxy auf dem PATH (macOS: brew install openconnect ocproxy) + +ZU FUELLEN: VPN_USER, INTERNAL_GLOB, START_URL, BOOKMARKS. +""" + +from __future__ import annotations + +import json +import os +import platform +import shutil +import signal +import socket +import subprocess +import threading +from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer + +from PyQt6.QtCore import QTimer, Qt +from PyQt6.QtGui import QAction, QColor, QIcon, QPainter, QPixmap +from PyQt6.QtWidgets import ( + QApplication, QSystemTrayIcon, QMenu, QInputDialog, QLineEdit, QMessageBox, +) + +# ===== CONFIG ================================================================= +APP_NAME = "Heron VPN" +PROTOCOL = "gp" # GlobalProtect (Palo Alto) +SERVER = "ssl.heron.at" +AUTH = "saml" # "saml" = SSO via externem Browser, "password" +VPN_USER = "marcus.hinz@robotunits.com" # nur fuer AUTH="password" noetig +PORT = 11090 # SOCKS5 (ocproxy) – andere Ports als Wuerth +PACPORT = 11091 # lokaler PAC-HTTP-Server +INTERNAL_GLOB = "*.heron.at" # <-- interne Hosts anpassen (ueber VPN) +PROFILE = os.path.expanduser("~/.heron-edge") +START_URL = "https://robotunits.com" # <-- gewuenschte Startseite +LOGFILE = os.path.expanduser("~/.heron-vpn.log") +PAC_NAME = "heron.pac" + +# Lesezeichen, die ins frische Profil gesaet werden (Name, URL). <-- anpassen +BOOKMARKS: list[tuple[str, str]] = [ + ("Heron", "https://ssl.heron.at"), + +] +# ============================================================================= + + +# ---------- Plattform-Abstraktion -------------------------------------------- +def _system() -> str: + return platform.system() # 'Darwin' | 'Linux' | 'Windows' + + +def browser_argv() -> list[str]: + s = _system() + if s == "Darwin": + return ["/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge"] + if s == "Windows": + for p in ( + r"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe", + r"C:\Program Files\Microsoft\Edge\Application\msedge.exe", + ): + if os.path.exists(p): + return [p] + return ["msedge.exe"] + for name in ("microsoft-edge", "microsoft-edge-stable", "msedge"): + path = shutil.which(name) + if path: + return [path] + return ["microsoft-edge"] + + +def seed_profile(): + """Saet beim ersten Start Lesezeichen + sichtbare Leiste ins Profil.""" + default = os.path.join(PROFILE, "Default") + bm_path = os.path.join(default, "Bookmarks") + if not os.path.exists(bm_path): + os.makedirs(default, exist_ok=True) + children = [ + {"date_added": "0", "id": str(100 + i), "name": name, + "type": "url", "url": url} + for i, (name, url) in enumerate(BOOKMARKS) + ] + data = { + "checksum": "", + "roots": { + "bookmark_bar": {"children": children, "date_added": "0", + "id": "1", "name": "Lesezeichenleiste", + "type": "folder"}, + "other": {"children": [], "date_added": "0", "id": "2", + "name": "Weitere Lesezeichen", "type": "folder"}, + "synced": {"children": [], "date_added": "0", "id": "3", + "name": "Mobile Lesezeichen", "type": "folder"}, + }, + "version": 1, + } + with open(bm_path, "w") as f: + json.dump(data, f, indent=2) + + pref_path = os.path.join(default, "Preferences") + if not os.path.exists(pref_path): + os.makedirs(default, exist_ok=True) + with open(pref_path, "w") as f: + json.dump({"bookmark_bar": {"show_on_all_tabs": True}}, f) + + +def _tool(name: str) -> str: + path = shutil.which(name) + if path: + return path + if _system() == "Darwin": + cand = f"/opt/homebrew/bin/{name}" + if os.path.exists(cand): + return cand + return name + + +def _external_browser() -> str: + """Programm, das openconnect fuer das SAML-Login mit der SSO-URL aufruft.""" + s = _system() + if s == "Darwin": + return "/usr/bin/open" # oeffnet Standardbrowser mit der URL + if s == "Windows": + return "cmd" # TODO: 'cmd /c start' verifizieren + return shutil.which("xdg-open") or "xdg-open" + + +# ---------- PAC-Server (in-process) ------------------------------------------ +PAC_BODY = ( + "function FindProxyForURL(url, host) {\n" + f' if (shExpMatch(host, "{INTERNAL_GLOB}")) {{\n' + f' return "SOCKS5 127.0.0.1:{PORT}";\n' + " }\n" + ' return "DIRECT";\n' + "}\n" +) + + +class _PacHandler(BaseHTTPRequestHandler): + def do_GET(self): + body = PAC_BODY.encode() + self.send_response(200) + self.send_header("Content-Type", "application/x-ns-proxy-autoconfig") + self.send_header("Content-Length", str(len(body))) + self.end_headers() + self.wfile.write(body) + + def log_message(self, *_): + pass + + +def start_pac_server() -> ThreadingHTTPServer: + srv = ThreadingHTTPServer(("127.0.0.1", PACPORT), _PacHandler) + threading.Thread(target=srv.serve_forever, daemon=True).start() + return srv + + +# ---------- Icon (generiertes "H"-Badge in Zustandsfarbe) -------------------- +_ICON_CACHE: dict[str, QIcon] = {} + + +def badge_icon(color: str) -> QIcon: + if color in _ICON_CACHE: + return _ICON_CACHE[color] + pm = QPixmap(44, 44) + pm.fill(Qt.GlobalColor.transparent) + p = QPainter(pm) + p.setRenderHint(QPainter.RenderHint.Antialiasing) + p.setBrush(QColor(color)) + p.setPen(Qt.PenStyle.NoPen) + p.drawRoundedRect(4, 4, 36, 36, 9, 9) + p.setPen(QColor("#ffffff")) + f = p.font() + f.setBold(True) + f.setPixelSize(26) + p.setFont(f) + p.drawText(pm.rect(), Qt.AlignmentFlag.AlignCenter, "H") + p.end() + icon = QIcon(pm) + _ICON_CACHE[color] = icon + return icon + + +# ---------- App -------------------------------------------------------------- +class VpnTray: + def __init__(self, app: QApplication): + self.app = app + self.oc: subprocess.Popen | None = None + self.browser: subprocess.Popen | None = None + self.vpn_pw: str | None = None + self.state = "disconnected" + + self.pac = start_pac_server() + + self.tray = QSystemTrayIcon() + self.tray.setIcon(badge_icon("#9a9a9a")) + self.tray.setToolTip(f"{APP_NAME} – getrennt") + + self.menu = QMenu() + self.act_status = QAction("Getrennt") + self.act_status.setEnabled(False) + self.act_connect = QAction("Verbinden") + self.act_disconnect = QAction("Trennen") + self.act_open = QAction("Edge oeffnen") + self.act_quit = QAction("Beenden") + + self.act_connect.triggered.connect(self.connect) + self.act_disconnect.triggered.connect(self.disconnect) + self.act_open.triggered.connect(self.launch_browser) + self.act_quit.triggered.connect(self.quit) + + for a in (self.act_status, None, self.act_connect, self.act_disconnect, + self.act_open, None, self.act_quit): + if a is None: + self.menu.addSeparator() + else: + self.menu.addAction(a) + + self.tray.setContextMenu(self.menu) + self.tray.show() + self._set_state("disconnected") + + self.timer = QTimer() + self.timer.timeout.connect(self._tick) + self.timer.start(700) + + def _set_state(self, state: str): + self.state = state + color, label = { + "disconnected": ("#9a9a9a", "Getrennt"), + "connecting": ("#e6a817", "Verbinde…"), + "connected": ("#2e7d32", "Verbunden"), + "error": ("#cc3333", "Fehler"), + }[state] + self.tray.setIcon(badge_icon(color)) + self.tray.setToolTip(f"{APP_NAME} – {label}") + self.act_status.setText(label) + self.act_connect.setEnabled(state in ("disconnected", "error")) + self.act_disconnect.setEnabled(state in ("connecting", "connected")) + self.act_open.setEnabled(state == "connected") + + def connect(self): + base = [ + _tool("openconnect"), + f"--protocol={PROTOCOL}", + "--script", f"{_tool('ocproxy')} -D {PORT}", + "--script-tun", + ] + send_pw = None + + if AUTH == "saml": + # SSO: openconnect oeffnet den Standardbrowser fuer das Login. + cmd = base + ["--external-browser", _external_browser(), + f"https://{SERVER}"] + else: + if not self.vpn_pw: + pw, ok = QInputDialog.getText( + None, APP_NAME, f"VPN-Passwort fuer {VPN_USER}:", + QLineEdit.EchoMode.Password, + ) + if not (ok and pw): + return + self.vpn_pw = pw + send_pw = self.vpn_pw + cmd = base + ["--user", VPN_USER, "--passwd-on-stdin", + f"https://{SERVER}"] + + try: + self._log = open(LOGFILE, "wb") + self.oc = subprocess.Popen( + cmd, stdin=subprocess.PIPE if send_pw else None, + stdout=self._log, stderr=subprocess.STDOUT, + ) + if send_pw: + self.oc.stdin.write((send_pw + "\n").encode()) + self.oc.stdin.flush() + except FileNotFoundError: + self._set_state("error") + QMessageBox.critical(None, APP_NAME, "openconnect nicht gefunden.") + return + + self._set_state("connecting") + + def disconnect(self): + self._kill_browser() + if self.oc and self.oc.poll() is None: + try: + self.oc.send_signal(signal.SIGINT) + self.oc.wait(timeout=4) + except Exception: + try: + self.oc.terminate() + except Exception: + pass + self.oc = None + self._set_state("disconnected") + + def _kill_browser(self): + if _system() in ("Darwin", "Linux"): + subprocess.run( + ["pkill", "-f", f"user-data-dir={PROFILE}"], + stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, + ) + elif self.browser and self.browser.poll() is None: + self.browser.terminate() + self.browser = None + + def launch_browser(self): + seed_profile() + argv = browser_argv() + [ + f"--user-data-dir={PROFILE}", + f"--proxy-pac-url=http://127.0.0.1:{PACPORT}/{PAC_NAME}", + f"--host-resolver-rules=MAP {INTERNAL_GLOB} ~NOTFOUND", + "--no-first-run", "--no-default-browser-check", + "--disable-features=msSmartScreenProtection", + "--test-type", + START_URL, + ] + self.browser = subprocess.Popen(argv) + + def _tick(self): + if self.state == "connecting": + if self.oc and self.oc.poll() is not None: + self._set_state("error") + return + if _port_open(PORT): + self._set_state("connected") + self.launch_browser() + elif self.state == "connected": + if self.oc and self.oc.poll() is not None: + self.disconnect() + + def quit(self): + self.disconnect() + self.pac.shutdown() + self.app.quit() + + +def _port_open(port: int) -> bool: + with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: + s.settimeout(0.3) + return s.connect_ex(("127.0.0.1", port)) == 0 + + +def main(): + app = QApplication([]) + app.setApplicationName("HeronVPN") + app.setQuitOnLastWindowClosed(False) + _tray = VpnTray(app) # noqa: F841 + app.exec() + + +if __name__ == "__main__": + main() diff --git a/projects/vpn/icon.icns b/projects/vpn/icon.icns new file mode 100644 index 0000000000000000000000000000000000000000..907a2f52882489e8568665a00f8c379bac87f6bf GIT binary patch literal 121474 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

qYq`5)SAf&pKG5i0PjYSSw76x|N@TT~-&-?&u9 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 literal 0 HcmV?d00001 diff --git a/projects/vpn/setup.py b/projects/vpn/setup.py new file mode 100644 index 0000000..4aebb48 --- /dev/null +++ b/projects/vpn/setup.py @@ -0,0 +1,33 @@ +""" +py2app-Build fuer WuerthVPN.app (Menuebar-Only, kein Dock-Icon via LSUIElement). + +Bauen: + cd ~/apps + /Library/Developer/CommandLineTools/usr/bin/python3 setup.py py2app +Ergebnis: ~/apps/dist/WuerthVPN.app +""" +from setuptools import setup + +APP = ["wuerth_vpn_tray.py"] +DATA_FILES = ["wuerth.png"] +OPTIONS = { + "iconfile": "icon.icns", + "packages": ["PyQt6"], + "plist": { + "CFBundleName": "WuerthVPN", + "CFBundleDisplayName": "WuerthVPN", + "CFBundleIdentifier": "com.wuerth.vpntray", + "CFBundleShortVersionString": "1.0", + "CFBundleVersion": "1", + "LSUIElement": True, + "NSHighResolutionCapable": True, + }, +} + +setup( + app=APP, + name="WuerthVPN", + data_files=DATA_FILES, + options={"py2app": OPTIONS}, + setup_requires=["py2app"], +) diff --git a/projects/vpn/setup_heron.py b/projects/vpn/setup_heron.py new file mode 100644 index 0000000..2c954f3 --- /dev/null +++ b/projects/vpn/setup_heron.py @@ -0,0 +1,28 @@ +""" +py2app-Build fuer HeronVPN.app (Menuebar-Only, kein Dock-Icon via LSUIElement). + +Bauen: cd ~/apps && bash build_heron_app.sh +""" +from setuptools import setup + +APP = ["heron_vpn_tray.py"] +OPTIONS = { + "iconfile": "icon_heron.icns", + "packages": ["PyQt6"], + "plist": { + "CFBundleName": "HeronVPN", + "CFBundleDisplayName": "HeronVPN", + "CFBundleIdentifier": "com.heron.vpntray", + "CFBundleShortVersionString": "1.0", + "CFBundleVersion": "1", + "LSUIElement": True, + "NSHighResolutionCapable": True, + }, +} + +setup( + app=APP, + name="HeronVPN", + options={"py2app": OPTIONS}, + setup_requires=["py2app"], +) diff --git a/projects/vpn/wuerth.png b/projects/vpn/wuerth.png new file mode 100755 index 0000000000000000000000000000000000000000..95ae414fd6693eb1122f382ab597a2abc7b38f22 GIT binary patch literal 112526 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

nJ2~PV5D7k=32_)sg$X^= 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 Z=I-9FeOq0E2RT1X>zuwu-Y+(P{67yfUXK6( literal 0 HcmV?d00001 diff --git a/projects/vpn/wuerth_vpn_proxy.sh b/projects/vpn/wuerth_vpn_proxy.sh new file mode 100755 index 0000000..03dc66f --- /dev/null +++ b/projects/vpn/wuerth_vpn_proxy.sh @@ -0,0 +1,67 @@ +#!/usr/bin/env bash +# Baut das Wuerth-VPN rootlos auf (openconnect + ocproxy, SOCKS5 statt tun) +# und startet Edge mit eigenem, isoliertem Profil ueber diesen Proxy. +# Beim Schliessen von Edge wird openconnect beendet. +set -euo pipefail + +export PATH="/opt/homebrew/bin:$PATH" + +SERVER="loki.witglobal.net" +VPN_USER="ex08802409" +PORT=11080 +PACPORT=11081 +PROFILE="$HOME/.wuerth-edge" +EDGE="/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge" +START_URL="https://gitops.apps.ocp-dev01.wgn.wuerth.com" +# Hosts, die ueber das VPN (SOCKS) laufen sollen; alles andere geht direkt. +INTERNAL_GLOB="*.wgn.wuerth.com" + +read -rsp "VPN-Passwort fuer ${VPN_USER}: " VPN_PW; echo + +printf '%s\n' "$VPN_PW" | openconnect \ + --protocol=anyconnect \ + --user "$VPN_USER" \ + --passwd-on-stdin \ + --script "ocproxy -D ${PORT}" \ + --script-tun \ + "https://${SERVER}" & +OC_PID=$! + +# PAC-Datei: nur INTERNAL_GLOB ueber den VPN-SOCKS, Rest direkt ins Internet. +PACDIR="$(mktemp -d)" +cat >"$PACDIR/wuerth.pac" < ueber lokalen HTTP-Server ausliefern. +python3 -m http.server "$PACPORT" --bind 127.0.0.1 --directory "$PACDIR" >/dev/null 2>&1 & +HTTP_PID=$! + +cleanup() { kill "$OC_PID" "$HTTP_PID" 2>/dev/null || true; rm -rf "$PACDIR"; } +trap cleanup EXIT INT TERM + +# Warten, bis ocproxy den SOCKS-Port geoeffnet hat (max. 30 s) +for _ in $(seq 1 60); do + if nc -z 127.0.0.1 "$PORT" 2>/dev/null; then break; fi + if ! kill -0 "$OC_PID" 2>/dev/null; then + echo "openconnect beendet sich (Auth fehlgeschlagen?)." >&2 + exit 1 + fi + sleep 0.5 +done + +echo "SOCKS5 auf 127.0.0.1:${PORT} aktiv. Starte Edge..." + +"$EDGE" \ + --user-data-dir="$PROFILE" \ + --proxy-pac-url="http://127.0.0.1:${PACPORT}/wuerth.pac" \ + --host-resolver-rules="MAP ${INTERNAL_GLOB} ~NOTFOUND" \ + --no-first-run --no-default-browser-check \ + "$START_URL" + +# Edge beendet -> trap raeumt openconnect ab diff --git a/projects/vpn/wuerth_vpn_tray.py b/projects/vpn/wuerth_vpn_tray.py new file mode 100755 index 0000000..1d71561 --- /dev/null +++ b/projects/vpn/wuerth_vpn_tray.py @@ -0,0 +1,401 @@ +#!/usr/bin/env python3 +""" +Wuerth VPN – plattformuebergreifende Tray-App (PyQt6). + +Baut das VPN rootlos auf (openconnect + ocproxy als SOCKS5) und startet einen +dedizierten Browser, der per PAC nur die internen Hosts ueber das VPN schickt +und alles andere direkt. Start/Stop ueber das Tray-Icon. + +macOS/Linux: lauffaehig. Windows: rootloser ocproxy-Pfad noch zu verifizieren. + +Abhaengigkeiten: + pip3 install PyQt6 --break-system-packages + openconnect + ocproxy auf dem PATH (macOS: brew install openconnect ocproxy) +""" + +from __future__ import annotations + +import json +import os +import platform +import shutil +import signal +import socket +import subprocess +import threading +from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer + +from PyQt6.QtCore import QTimer, Qt +from PyQt6.QtGui import ( + QAction, QColor, QIcon, QImage, QPainter, QPixmap, + qAlpha, qBlue, qGreen, qRed, qRgba, +) +from PyQt6.QtWidgets import ( + QApplication, QSystemTrayIcon, QMenu, QInputDialog, QLineEdit, QMessageBox, +) + +# ===== CONFIG ================================================================= +SERVER = "loki.witglobal.net" +VPN_USER = "ex08802409" +PORT = 11080 # SOCKS5 (ocproxy) +PACPORT = 11081 # lokaler PAC-HTTP-Server +INTERNAL_GLOB = "*.wgn.wuerth.com" # nur diese Hosts ueber das VPN +PROFILE = os.path.expanduser("~/.wuerth-edge") +START_URL = "https://www.wuerth.com" +ICON_PATH = os.path.join( + os.environ.get("RESOURCEPATH", os.path.dirname(os.path.abspath(__file__))), + "wuerth.png", +) + +# Lesezeichen, die ins frische Profil gesaet werden (Name, URL). +BOOKMARKS = [ + ("ArgoCD Dev", "https://gitops.apps.ocp-dev01.wgn.wuerth.com"), + ("ArgoCD Prod", "https://gitops.apps.ocp-01.wgn.wuerth.com/"), + ("OpenShift DEV", "https://console-openshift-console.apps.ocp-dev01.wgn.wuerth.com"), + ("OpenShift Prod","https://console-openshift-console.apps.ocp-01.wgn.wuerth.com/dashboards"), + ("Plato", "https://plato.witglobal.net"), + ("Wuerth GitHub", "https://github.com/login"), + ("Wuerth", "https://www.wuerth.com"), +] +# ============================================================================= + + +# ---------- Plattform-Abstraktion -------------------------------------------- +def _system() -> str: + return platform.system() # 'Darwin' | 'Linux' | 'Windows' + + +def browser_argv() -> list[str]: + s = _system() + if s == "Darwin": + return ["/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge"] + if s == "Windows": + for p in ( + r"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe", + r"C:\Program Files\Microsoft\Edge\Application\msedge.exe", + ): + if os.path.exists(p): + return [p] + return ["msedge.exe"] + # Linux + for name in ("microsoft-edge", "microsoft-edge-stable", "msedge"): + path = shutil.which(name) + if path: + return [path] + return ["microsoft-edge"] + + +def seed_profile(): + """Saet beim ersten Start Lesezeichen + sichtbare Leiste ins Profil.""" + default = os.path.join(PROFILE, "Default") + bm_path = os.path.join(default, "Bookmarks") + if not os.path.exists(bm_path): + os.makedirs(default, exist_ok=True) + children = [ + {"date_added": "0", "id": str(100 + i), "name": name, + "type": "url", "url": url} + for i, (name, url) in enumerate(BOOKMARKS) + ] + data = { + "checksum": "", + "roots": { + "bookmark_bar": {"children": children, "date_added": "0", + "id": "1", "name": "Lesezeichenleiste", + "type": "folder"}, + "other": {"children": [], "date_added": "0", "id": "2", + "name": "Weitere Lesezeichen", "type": "folder"}, + "synced": {"children": [], "date_added": "0", "id": "3", + "name": "Mobile Lesezeichen", "type": "folder"}, + }, + "version": 1, + } + with open(bm_path, "w") as f: + json.dump(data, f, indent=2) + + # Lesezeichenleiste dauerhaft einblenden + pref_path = os.path.join(default, "Preferences") + if not os.path.exists(pref_path): + os.makedirs(default, exist_ok=True) + with open(pref_path, "w") as f: + json.dump({"bookmark_bar": {"show_on_all_tabs": True}}, f) + + +def _tool(name: str) -> str: + path = shutil.which(name) + if path: + return path + if _system() == "Darwin": + cand = f"/opt/homebrew/bin/{name}" + if os.path.exists(cand): + return cand + return name + + +# ---------- PAC-Server (in-process) ------------------------------------------ +PAC_BODY = ( + "function FindProxyForURL(url, host) {\n" + f' if (shExpMatch(host, "{INTERNAL_GLOB}")) {{\n' + f' return "SOCKS5 127.0.0.1:{PORT}";\n' + " }\n" + ' return "DIRECT";\n' + "}\n" +) + + +class _PacHandler(BaseHTTPRequestHandler): + def do_GET(self): + body = PAC_BODY.encode() + self.send_response(200) + self.send_header("Content-Type", "application/x-ns-proxy-autoconfig") + self.send_header("Content-Length", str(len(body))) + self.end_headers() + self.wfile.write(body) + + def log_message(self, *_): + pass + + +def start_pac_server() -> ThreadingHTTPServer: + srv = ThreadingHTTPServer(("127.0.0.1", PACPORT), _PacHandler) + threading.Thread(target=srv.serve_forever, daemon=True).start() + return srv + + +# ---------- Icon ------------------------------------------------------------- +def dot_icon(color: str) -> QIcon: + pm = QPixmap(22, 22) + pm.fill(Qt.GlobalColor.transparent) + p = QPainter(pm) + p.setRenderHint(QPainter.RenderHint.Antialiasing) + p.setBrush(QColor(color)) + p.setPen(Qt.PenStyle.NoPen) + p.drawEllipse(4, 4, 14, 14) + p.end() + return QIcon(pm) + + +_BASE_IMG: QImage | None = None +_ICON_CACHE: dict[str, QIcon] = {} + + +def _base_image() -> QImage: + global _BASE_IMG + if _BASE_IMG is None: + img = QImage(ICON_PATH) + if img.isNull(): + _BASE_IMG = QImage() + else: + _BASE_IMG = img.scaled( + 44, 44, Qt.AspectRatioMode.KeepAspectRatio, + Qt.TransformationMode.SmoothTransformation, + ).convertToFormat(QImage.Format.Format_ARGB32) + return _BASE_IMG + + +def logo_icon(color: str) -> QIcon: + """Wuerth-Wappen in der Zustandsfarbe; weisser Hintergrund -> transparent.""" + if color in _ICON_CACHE: + return _ICON_CACHE[color] + base = _base_image() + if base.isNull(): + return dot_icon(color) + + tgt = QColor(color) + img = QImage(base) + for y in range(img.height()): + for x in range(img.width()): + px = img.pixel(x, y) + a = qAlpha(px) + if a < 20: + continue + r, g, b = qRed(px), qGreen(px), qBlue(px) + hi, lo = max(r, g, b), min(r, g, b) + if hi > 225 and (hi - lo) < 30: # weiss -> transparent + img.setPixel(x, y, qRgba(0, 0, 0, 0)) + elif hi < 90: # schwarzer Text -> belassen + continue + else: # rote Flaeche -> Zustandsfarbe + img.setPixel(x, y, qRgba(tgt.red(), tgt.green(), tgt.blue(), a)) + + icon = QIcon(QPixmap.fromImage(img)) + _ICON_CACHE[color] = icon + return icon + + +# ---------- App -------------------------------------------------------------- +class VpnTray: + def __init__(self, app: QApplication): + self.app = app + self.oc: subprocess.Popen | None = None + self.browser: subprocess.Popen | None = None + self.vpn_pw: str | None = None + self.state = "disconnected" + + self.pac = start_pac_server() + + self.tray = QSystemTrayIcon() + self.tray.setIcon(logo_icon("#9a9a9a")) + self.tray.setToolTip("Wuerth VPN – getrennt") + + self.menu = QMenu() + self.act_status = QAction("Getrennt") + self.act_status.setEnabled(False) + self.act_connect = QAction("Verbinden") + self.act_disconnect = QAction("Trennen") + self.act_open = QAction("Edge oeffnen") + self.act_quit = QAction("Beenden") + + self.act_connect.triggered.connect(self.connect) + self.act_disconnect.triggered.connect(self.disconnect) + self.act_open.triggered.connect(self.launch_browser) + self.act_quit.triggered.connect(self.quit) + + for a in (self.act_status, None, self.act_connect, self.act_disconnect, + self.act_open, None, self.act_quit): + if a is None: + self.menu.addSeparator() + else: + self.menu.addAction(a) + + self.tray.setContextMenu(self.menu) + self.tray.show() + self._set_state("disconnected") + + # Pollt openconnect/SOCKS-Status + self.timer = QTimer() + self.timer.timeout.connect(self._tick) + self.timer.start(700) + + # --- UI-State --- + def _set_state(self, state: str): + self.state = state + color, label = { + "disconnected": ("#9a9a9a", "Getrennt"), + "connecting": ("#e6a817", "Verbinde…"), + "connected": ("#cc0000", "Verbunden"), + "error": ("#666666", "Fehler"), + }[state] + self.tray.setIcon(logo_icon(color)) + self.tray.setToolTip(f"Wuerth VPN – {label}") + self.act_status.setText(label) + self.act_connect.setEnabled(state in ("disconnected", "error")) + self.act_disconnect.setEnabled(state in ("connecting", "connected")) + self.act_open.setEnabled(state == "connected") + + # --- Verbinden --- + def connect(self): + if not self.vpn_pw: + pw, ok = QInputDialog.getText( + None, "Wuerth VPN", f"VPN-Passwort fuer {VPN_USER}:", + QLineEdit.EchoMode.Password, + ) + if not (ok and pw): + return + self.vpn_pw = pw + + cmd = [ + _tool("openconnect"), + "--protocol=anyconnect", + "--user", VPN_USER, + "--passwd-on-stdin", + "--script", f"{_tool('ocproxy')} -D {PORT}", + "--script-tun", + f"https://{SERVER}", + ] + try: + self._log = open(os.path.expanduser("~/.wuerth-vpn.log"), "wb") + self.oc = subprocess.Popen( + cmd, stdin=subprocess.PIPE, + stdout=self._log, stderr=subprocess.STDOUT, + ) + self.oc.stdin.write((self.vpn_pw + "\n").encode()) + self.oc.stdin.flush() + except FileNotFoundError: + self._set_state("error") + QMessageBox.critical(None, "Wuerth VPN", "openconnect nicht gefunden.") + return + + self._set_state("connecting") + + # --- Trennen --- + def disconnect(self): + self._kill_browser() + if self.oc and self.oc.poll() is None: + # SIGINT -> openconnect sendet ein sauberes BYE und meldet die + # Session am Gateway ab (statt sie per SIGTERM hart zu kappen). + try: + self.oc.send_signal(signal.SIGINT) + self.oc.wait(timeout=4) + except Exception: + try: + self.oc.terminate() + except Exception: + pass + self.oc = None + self._set_state("disconnected") + + def _kill_browser(self): + # Ueber das dedizierte Profil beenden – trifft nur diese Instanz, + # nicht ein evtl. normal laufendes Edge. + if _system() in ("Darwin", "Linux"): + # Muster ohne fuehrenden Bindestrich, sonst parst pkill es als Option. + subprocess.run( + ["pkill", "-f", f"user-data-dir={PROFILE}"], + stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, + ) + elif self.browser and self.browser.poll() is None: + self.browser.terminate() + self.browser = None + + # --- Browser --- + def launch_browser(self): + # Immer starten: laeuft schon eine Instanz mit diesem Profil, oeffnet + # sie nur ein neues Fenster mit START_URL; sonst startet sie frisch. + seed_profile() + argv = browser_argv() + [ + f"--user-data-dir={PROFILE}", + f"--proxy-pac-url=http://127.0.0.1:{PACPORT}/wuerth.pac", + f"--host-resolver-rules=MAP {INTERNAL_GLOB} ~NOTFOUND", + "--no-first-run", "--no-default-browser-check", + "--disable-features=msSmartScreenProtection", + "--test-type", # unterdrueckt die "unsupported flag"-Warnleiste + START_URL, + ] + self.browser = subprocess.Popen(argv) + + # --- Poll --- + def _tick(self): + if self.state == "connecting": + if self.oc and self.oc.poll() is not None: + self._set_state("error") + return + if _port_open(PORT): + self._set_state("connected") + self.launch_browser() + elif self.state == "connected": + if self.oc and self.oc.poll() is not None: + self.disconnect() + + def quit(self): + self.disconnect() + self.pac.shutdown() + self.app.quit() + + +def _port_open(port: int) -> bool: + with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: + s.settimeout(0.3) + return s.connect_ex(("127.0.0.1", port)) == 0 + + +def main(): + # Kein Dock-Icon: ueber LSUIElement im py2app-Bundle (greift beim Start). + app = QApplication([]) + app.setApplicationName("WuerthVPN") + app.setQuitOnLastWindowClosed(False) + _tray = VpnTray(app) # noqa: F841 (Referenz halten) + app.exec() + + +if __name__ == "__main__": + main()