v0.7.0 : instance unique, handshake ré-affiché, sudoers fiabilisé, À propos refaite

- Instance unique : un second lancement réveille l'instance active.
- Autostart et reconnexion auto activés par défaut (nouvelle installation).
- Page « À propos » refaite en 5 onglets (contenu séparé dans app_info.py).
- Corrige le handshake/RX-TX qui ne s'affichaient plus (wg show sans élévation).
- Corrige le diagnostic sudo trompeur (sondes qui ne matchaient jamais les règles).
- Corrige make setup-sudoers bloqué hors session graphique (pkexec -> sudo), idempotent.
- Corrige le README : Kill Switch inexistant retiré, ordre d'élévation réel documenté.
This commit is contained in:
2026-09-01 19:18:24 +02:00
parent 6251a3ea8e
commit 8c09c02362
13 changed files with 590 additions and 104 deletions
+18 -5
View File
@@ -4,7 +4,7 @@
## ──────────────────────────────────────────────
APP := wgsecure
VERSION := 0.6.0
VERSION := 0.7.0
VENV := .venv
PYTHON := $(VENV)/bin/python3
PIP := $(VENV)/bin/pip
@@ -193,12 +193,20 @@ print() if not rows else print(chr(10) + ' ⚠️ → lancez make setup-su
@echo ""
# ── Droits sudo wg-quick sans dialogue de mot de passe ───────────────────────
# `pkexec` (utilisé jusqu'ici) exige un agent d'authentification polkit
# graphique : absent d'un terminal simple (SSH, tmux, session sans agent), il
# reste bloqué en attente d'une réponse qui n'arrive jamais. `sudo` n'a pas ce
# problème : lancé depuis un terminal, il y invite directement le mot de
# passe, avec ou sans polkit. La cible est idempotente : elle recalcule les
# règles à chaque lancement et n'invite pour un mot de passe que si le
# contenu déjà installé diffère (donc jamais lors d'une relance sans
# changement).
setup-sudoers:
@echo ""
@echo " 🔧 Configuration sudoers (wg-quick + nettoyage réseau, sans mot de passe)"
@$(PYTHON) -c "\
import os, subprocess, tempfile, shutil; \
user = os.environ.get('USER', os.path.basename(os.path.expanduser('~'))); \
user = os.environ.get('SUDO_USER') or os.environ.get('USER') or os.path.basename(os.path.expanduser('~')); \
w = lambda n: shutil.which(n) or ''; \
cmds = [c for c in ( \
w('wg-quick'), \
@@ -209,14 +217,19 @@ cmds = [c for c in ( \
w('install') + ' -D -m 600 -o root -g root * /etc/wireguard/*' if w('install') else '', \
) if c]; \
rules = ''.join(user + ' ALL=(ALL) NOPASSWD: ' + c + chr(10) for c in cmds); \
fd, tmp = tempfile.mkstemp(prefix='wgsecure_sudoers_', dir=os.path.expanduser('~')); \
dest = '/etc/sudoers.d/wgsecure'; \
current = subprocess.run(['sudo', '-n', 'cat', dest], capture_output=True, text=True); \
already_ok = current.returncode == 0 and current.stdout == rules; \
print(' ✅ Déjà configuré pour ' + user + ' — rien à faire.') if already_ok else None; \
import sys; sys.exit(0) if already_ok else None; \
fd, tmp = tempfile.mkstemp(prefix='wgsecure_sudoers_'); \
os.write(fd, rules.encode()); os.close(fd); os.chmod(tmp, 0o600); \
chk = subprocess.run(['visudo', '-cqf', tmp], capture_output=True); \
ok = chk.returncode == 0; \
r = subprocess.run(['pkexec', 'bash', '-c', 'install -m 440 -o root -g root ' + tmp + ' /etc/sudoers.d/wgsecure']) if ok else None; \
r = subprocess.run(['sudo', 'install', '-m', '440', '-o', 'root', '-g', 'root', tmp, dest]) if ok else None; \
os.unlink(tmp); \
print(' ❌ Règles sudoers invalides, rien installé : ' + chk.stderr.decode().strip()) if not ok else \
print(' ✅ /etc/sudoers.d/wgsecure configuré — plus de dialogue admin.' if r.returncode == 0 else ' ❌ Échec.')"
print(' ✅ ' + dest + ' configuré pour ' + user + ' — plus de dialogue admin.' if r.returncode == 0 else ' ❌ Échec.')"
@echo ""
# ── Réinitialisation du mot de passe administrateur ──────────────────────────