tripoli.cloud/tripoli-netctl/src/naming.rs
Adam Belkacemi 991f4dd04f Phase 4 : tripoli-netctl, labo network namespaces + veth (rtnetlink)
- 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>
2026-09-16 22:58:53 +02:00

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"),
}
}