f-10: code: add create and delete netns #10

Signed-off-by: GnomeZworc <nicolas.boufidjeline@g3e.fr>
This commit is contained in:
GnomeZworc 2026-01-08 23:37:35 +01:00
commit 454005d6ac
Signed by: nicolas.boufideline
GPG key ID: 4406BBBF8845D632
7 changed files with 107 additions and 0 deletions

5
internal/netns/create.go Normal file
View file

@ -0,0 +1,5 @@
package netns
func Create(name string) error {
return create(name)
}

View file

@ -0,0 +1,55 @@
//go:build linux
package netns
import (
"os"
"golang.org/x/sys/unix"
)
func create(name string) error {
base := "/var/run/netns"
path := base + "/" + name
if err := os.MkdirAll(base, 0755); err != nil {
return err
}
// fichier cible
f, err := os.Create(path)
if err != nil {
return err
}
f.Close()
// sauvegarde du netns courant
orig, err := os.Open("/proc/self/ns/net")
if err != nil {
return err
}
defer orig.Close()
// nouveau netns
if err := unix.Unshare(unix.CLONE_NEWNET); err != nil {
return err
}
// bind mount du netns courant vers /var/run/netns/<name>
if err := unix.Mount(
"/proc/self/ns/net",
path,
"",
unix.MS_BIND,
"",
); err != nil {
return err
}
// revenir au netns original
if err := unix.Setns(int(orig.Fd()), unix.CLONE_NEWNET); err != nil {
return err
}
return nil
}

View file

@ -0,0 +1,5 @@
//go:build !linux
package netns
func create(string) error { return nil }

5
internal/netns/delete.go Normal file
View file

@ -0,0 +1,5 @@
package netns
func Delete(name string) error {
return delete(name)
}

View file

@ -0,0 +1,18 @@
//go:build linux
package netns
import (
"os"
"golang.org/x/sys/unix"
)
func delete(name string) error {
path := "/var/run/netns/" + name
if err := unix.Unmount(path, unix.MNT_DETACH); err != nil {
return err
}
return os.Remove(path)
}

View file

@ -0,0 +1,5 @@
//go:build !linux
package netns
func delete(string) error { return nil }

14
internal/netns/exist.go Normal file
View file

@ -0,0 +1,14 @@
package netns
import (
"os"
)
func exist(name string) bool {
_, err := os.Stat("/var/run/netns/" + name)
return err == nil
}
func Exist(name string) bool {
return exist(name)
}