- CLI (clap) : create/destroy/list. Network namespace créé via rtnetlink::NetworkNamespace (fork + unshare(CLONE_NEWNET) + bind-mount, équivalent de `ip netns add`), paire veth créée dans la racine, un bout déplacé dans le namespace (setns_by_fd) et adressé depuis un thread OS dédié qui fait setns() - jamais un thread du pool spawn_blocking de tokio, qui serait réutilisé pour d'autres tâches et resterait coincé dans le namespace. - Journal d'audit JSON (stderr + /var/log/tripoli-netctl/audit.log) à chaque opération. - Documenté explicitement comme labo pédagogique un-seul-poste : tripoli-edge et tripoli-api restent nativement sur l'hôte, ce projet ne pilote aucun trafic de production. - Testé en conditions réelles sur le serveur : création, adressage des deux côtés (dont lo, down par défaut dans un netns neuf), ping traversant effectivement la veth, puis destruction propre (veth + namespace) vérifiée par absence des interfaces et du namespace. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
22 lines
664 B
Rust
22 lines
664 B
Rust
/// Linux limite les noms d'interface à 15 caractères (IFNAMSIZ - 1). On
|
|
/// dérive un nom court et déterministe à partir du nom de service, pour
|
|
/// que `create`/`destroy` retrouvent toujours la même paire veth sans
|
|
/// avoir à la stocker séparément.
|
|
pub struct VethNames {
|
|
pub host: String,
|
|
pub peer: String,
|
|
}
|
|
|
|
pub fn veth_names(service_name: &str) -> VethNames {
|
|
let short: String = service_name
|
|
.chars()
|
|
.filter(|c| c.is_ascii_alphanumeric())
|
|
.map(|c| c.to_ascii_lowercase())
|
|
.take(6)
|
|
.collect();
|
|
|
|
VethNames {
|
|
host: format!("tv-{short}h"),
|
|
peer: format!("tv-{short}p"),
|
|
}
|
|
}
|