From 454005d6ac65ea798d7ad72e62ce27dfff485698 Mon Sep 17 00:00:00 2001 From: GnomeZworc Date: Thu, 8 Jan 2026 23:37:35 +0100 Subject: [PATCH 1/4] f-10: code: add create and delete netns #10 Signed-off-by: GnomeZworc --- internal/netns/create.go | 5 ++++ internal/netns/create_linux.go | 55 ++++++++++++++++++++++++++++++++++ internal/netns/create_other.go | 5 ++++ internal/netns/delete.go | 5 ++++ internal/netns/delete_linux.go | 18 +++++++++++ internal/netns/delete_other.go | 5 ++++ internal/netns/exist.go | 14 +++++++++ 7 files changed, 107 insertions(+) create mode 100644 internal/netns/create.go create mode 100644 internal/netns/create_linux.go create mode 100644 internal/netns/create_other.go create mode 100644 internal/netns/delete.go create mode 100644 internal/netns/delete_linux.go create mode 100644 internal/netns/delete_other.go create mode 100644 internal/netns/exist.go diff --git a/internal/netns/create.go b/internal/netns/create.go new file mode 100644 index 0000000..d6ca305 --- /dev/null +++ b/internal/netns/create.go @@ -0,0 +1,5 @@ +package netns + +func Create(name string) error { + return create(name) +} diff --git a/internal/netns/create_linux.go b/internal/netns/create_linux.go new file mode 100644 index 0000000..8ee0afa --- /dev/null +++ b/internal/netns/create_linux.go @@ -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/ + 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 +} diff --git a/internal/netns/create_other.go b/internal/netns/create_other.go new file mode 100644 index 0000000..3c0fd66 --- /dev/null +++ b/internal/netns/create_other.go @@ -0,0 +1,5 @@ +//go:build !linux + +package netns + +func create(string) error { return nil } diff --git a/internal/netns/delete.go b/internal/netns/delete.go new file mode 100644 index 0000000..af0a585 --- /dev/null +++ b/internal/netns/delete.go @@ -0,0 +1,5 @@ +package netns + +func Delete(name string) error { + return delete(name) +} diff --git a/internal/netns/delete_linux.go b/internal/netns/delete_linux.go new file mode 100644 index 0000000..ac0af1f --- /dev/null +++ b/internal/netns/delete_linux.go @@ -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) +} diff --git a/internal/netns/delete_other.go b/internal/netns/delete_other.go new file mode 100644 index 0000000..186d355 --- /dev/null +++ b/internal/netns/delete_other.go @@ -0,0 +1,5 @@ +//go:build !linux + +package netns + +func delete(string) error { return nil } diff --git a/internal/netns/exist.go b/internal/netns/exist.go new file mode 100644 index 0000000..7783dd9 --- /dev/null +++ b/internal/netns/exist.go @@ -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) +} From a650a34fc3a424075c48ec9d88b4d77bf1735fe4 Mon Sep 17 00:00:00 2001 From: GnomeZworc Date: Thu, 8 Jan 2026 23:47:52 +0100 Subject: [PATCH 2/4] f-10: code: add function to call a function in a netns #10 Signed-off-by: GnomeZworc --- internal/netns/call.go | 5 ++++ internal/netns/call_linux.go | 44 ++++++++++++++++++++++++++++++++++++ internal/netns/call_other.go | 7 ++++++ 3 files changed, 56 insertions(+) create mode 100644 internal/netns/call.go create mode 100644 internal/netns/call_linux.go create mode 100644 internal/netns/call_other.go diff --git a/internal/netns/call.go b/internal/netns/call.go new file mode 100644 index 0000000..da326fd --- /dev/null +++ b/internal/netns/call.go @@ -0,0 +1,5 @@ +package netns + +func Call(name string, fn func() error) error { + return call(name, fn) +} diff --git a/internal/netns/call_linux.go b/internal/netns/call_linux.go new file mode 100644 index 0000000..b23ac19 --- /dev/null +++ b/internal/netns/call_linux.go @@ -0,0 +1,44 @@ +//go:build linux + +package netns + +import ( + "fmt" + "os" + "runtime" + + "golang.org/x/sys/unix" +) + +func call(name string, fn func() error) error { + runtime.LockOSThread() + defer runtime.UnlockOSThread() + + // sauvegarde du netns courant + orig, err := os.Open("/proc/self/ns/net") + if err != nil { + return err + } + defer orig.Close() + + // entrer dans le netns cible + f, err := os.Open(fmt.Sprintf("/var/run/netns/%s", name)) + if err != nil { + return err + } + defer f.Close() + + if err := unix.Setns(int(f.Fd()), unix.CLONE_NEWNET); err != nil { + return err + } + + // exécuter la fonction dans le netns + err = fn() + + // toujours revenir au netns d'origine + if restoreErr := unix.Setns(int(orig.Fd()), unix.CLONE_NEWNET); restoreErr != nil { + return restoreErr + } + + return err +} diff --git a/internal/netns/call_other.go b/internal/netns/call_other.go new file mode 100644 index 0000000..14a8924 --- /dev/null +++ b/internal/netns/call_other.go @@ -0,0 +1,7 @@ +//go:build !linux + +package netns + +func call(name string, fn func() error) error { + return fn() +} From 0d3d59a019bcc81aa5532f076339214c40cf01c9 Mon Sep 17 00:00:00 2001 From: GnomeZworc Date: Thu, 8 Jan 2026 23:57:35 +0100 Subject: [PATCH 3/4] f-10: bin: add a new binarie #10 Signed-off-by: GnomeZworc --- .forgejo/workflows/prerelease.yml | 2 +- cmd/netns/main.go | 40 +++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 cmd/netns/main.go diff --git a/.forgejo/workflows/prerelease.yml b/.forgejo/workflows/prerelease.yml index 0326071..0248db4 100644 --- a/.forgejo/workflows/prerelease.yml +++ b/.forgejo/workflows/prerelease.yml @@ -32,7 +32,7 @@ jobs: matrix: goos: [linux] goarch: [amd64] - binaries: [db, metadata, metacli, agent] + binaries: [db, metadata, metacli, agent, netns] uses: ./.forgejo/workflows/build.yml with: tag: ${{ needs.set-release-target.outputs.release_cible }} diff --git a/cmd/netns/main.go b/cmd/netns/main.go new file mode 100644 index 0000000..e1729f7 --- /dev/null +++ b/cmd/netns/main.go @@ -0,0 +1,40 @@ +package main + +import ( + "flag" + "fmt" + "os" + + "git.g3e.fr/syonad/two/internal/netns" +) + +var ( + netns_name = flag.String("netns", "", "Network namespace à faire") + action = flag.String("action", "", "Action a faire") +) + +func main() { + flag.Parse() + + switch *action { + case "create": + err := netns.Create(*netns_name) + if err != nil { + fmt.Println(err) + } + case "delete": + err := netns.Delete(*netns_name) + if err != nil { + fmt.Println(err) + } + case "check": + if netns.Exist(*netns_name) { + fmt.Printf("netns %s exist\n", *netns_name) + } else { + fmt.Printf("netns %s do not exist\n", *netns_name) + } + default: + fmt.Printf("Available commande:\n - create\n - delete\n - check\n") + os.Exit(1) + } +} From d1559b2ba070400ce6fadd0efe80d36b1ba7623e Mon Sep 17 00:00:00 2001 From: GnomeZworc Date: Thu, 8 Jan 2026 23:58:31 +0100 Subject: [PATCH 4/4] f-10: ci: change ci format #10 Signed-off-by: GnomeZworc --- .forgejo/workflows/prerelease.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.forgejo/workflows/prerelease.yml b/.forgejo/workflows/prerelease.yml index 0248db4..42d3a75 100644 --- a/.forgejo/workflows/prerelease.yml +++ b/.forgejo/workflows/prerelease.yml @@ -32,7 +32,12 @@ jobs: matrix: goos: [linux] goarch: [amd64] - binaries: [db, metadata, metacli, agent, netns] + binaries: + - db + - metadata + - metacli + - agent + - netns uses: ./.forgejo/workflows/build.yml with: tag: ${{ needs.set-release-target.outputs.release_cible }}