diff --git a/app/utils/platform_utils.py b/app/utils/platform_utils.py index eb81bf0..648560b 100644 --- a/app/utils/platform_utils.py +++ b/app/utils/platform_utils.py @@ -39,6 +39,27 @@ def has_root_privileges() -> bool: return os.geteuid() == 0 +# Windows ouvre une fenêtre console pour chaque processus console lancé depuis +# une application GUI. WGSecure interroge `ping` et `wireguard` en boucle pour +# rafraîchir le statut : sans ce drapeau, l'utilisateur voit des fenêtres DOS +# apparaître et disparaître en permanence. CREATE_NO_WINDOW supprime la +# console ; startupinfo/SW_HIDE couvre les lanceurs qui l'ignorent. +_CREATE_NO_WINDOW = 0x08000000 + + +def _no_window_kwargs() -> dict: + """Options subprocess empêchant l'apparition d'une console sous Windows.""" + if not is_windows(): + return {} + startupinfo = subprocess.STARTUPINFO() + startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW + startupinfo.wShowWindow = subprocess.SW_HIDE + return { + "creationflags": _CREATE_NO_WINDOW, + "startupinfo": startupinfo, + } + + def run_command(cmd: list[str], timeout: int = 10, env: dict | None = None) -> tuple[int, str, str]: try: @@ -48,6 +69,7 @@ def run_command(cmd: list[str], timeout: int = 10, text=True, timeout=timeout, env=env, + **_no_window_kwargs(), ) return result.returncode, result.stdout.strip(), result.stderr.strip() except subprocess.TimeoutExpired: