Le dépôt n'avait aucun moyen de monter un tunnel VPN ni de dire pourquoi il refuse de monter. Cinq technologies libres, un pilote chacune, derrière un `vpn.py` qui monte, démonte et diagnostique. Ce qui n'est pas secret — hôte, utilisateur, routes, MTU — vit dans une configuration JSON lisible ; clés pré-partagées et mots de passe vivent dans un coffre KeePassXC. Un profil se montre et se partage sans donner de quoi monter le tunnel. Les secrets s'écrivent en tmpfs sous 0700, jamais sur un disque persistant. Le diagnostic part du noyau et remonte, pour que la première ligne fausse soit la cause et non une conséquence. Vérifié : 138 tests, dont le rendu de chaque fichier généré. --- EN --- The repository had no way to raise a VPN tunnel, nor to say why one refuses to come up. Five free technologies, one driver each, behind a `vpn.py` that raises, tears down and diagnoses. What is not secret — host, user, routes, MTU — lives in readable JSON configuration; pre-shared keys and passwords live in a KeePassXC vault. A profile can be shown and shared without handing over the means to raise the tunnel. Secrets are written to tmpfs at 0700, never to a persistent disk. Diagnosis starts at the kernel and climbs, so the first false line is the cause and not a consequence. Checked: 138 tests, including the rendering of every generated file. Assisted-by: Claude Opus 5
43 lines
1.7 KiB
Python
43 lines
1.7 KiB
Python
#!/usr/bin/env python3
|
|
# © 2026 TechnoLibre (http://www.technolibre.ca)
|
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl)
|
|
"""Registre des pilotes VPN.
|
|
|
|
Un pilote par technologie, et RIEN d'autre ici : le registre est la seule
|
|
chose que le menu, le CLI et les tests ont besoin de connaître pour lister
|
|
les technologies disponibles. Ajouter un pilote, c'est une ligne.
|
|
"""
|
|
|
|
from script.vpn.drivers.base import VpnDriver # noqa: F401
|
|
from script.vpn.drivers.l2tp_ipsec import L2tpIpsecDriver
|
|
from script.vpn.drivers.openconnect import OpenconnectDriver
|
|
from script.vpn.drivers.openvpn import OpenvpnDriver
|
|
from script.vpn.drivers.sshuttle import SshuttleDriver
|
|
from script.vpn.drivers.wireguard import WireguardDriver
|
|
|
|
# Nom technique -> classe. Le nom se retrouve dans `driver` du profil et
|
|
# dans le paquet à installer : il ne change pas.
|
|
#
|
|
# L'ordre est celui du plus contraint au plus libre — c'est aussi celui dans
|
|
# lequel le menu les propose, et il aide à choisir : L2TP/IPsec quand le
|
|
# site l'impose, WireGuard quand on tient les deux bouts, sshuttle quand il
|
|
# n'y a qu'un accès SSH.
|
|
DRIVERS = {
|
|
L2tpIpsecDriver.name: L2tpIpsecDriver,
|
|
WireguardDriver.name: WireguardDriver,
|
|
OpenvpnDriver.name: OpenvpnDriver,
|
|
OpenconnectDriver.name: OpenconnectDriver,
|
|
SshuttleDriver.name: SshuttleDriver,
|
|
}
|
|
|
|
|
|
def get_driver(name):
|
|
"""Classe du pilote `name`, ou None. Ne lève pas : un profil peut
|
|
nommer un pilote retiré, et le CLI doit pouvoir le DIRE."""
|
|
return DRIVERS.get(name)
|
|
|
|
|
|
def driver_names():
|
|
"""Les noms dans l'ordre du registre, pas dans l'ordre alphabétique :
|
|
cet ordre est un conseil de choix, voir le commentaire de DRIVERS."""
|
|
return list(DRIVERS)
|