From 3831aa2d71cf05143c77ee8902c322b5e8aa1cde Mon Sep 17 00:00:00 2001 From: GnomeZworc Date: Thu, 18 Dec 2025 23:39:14 +0100 Subject: [PATCH 01/27] f-8: package: add go-systemd #8 Signed-off-by: GnomeZworc --- go.mod | 2 ++ go.sum | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/go.mod b/go.mod index cbc34b5..555ca1b 100644 --- a/go.mod +++ b/go.mod @@ -4,6 +4,7 @@ go 1.23.8 require ( github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/coreos/go-systemd/v22 v22.6.0 // indirect github.com/dgraph-io/badger/v4 v4.8.0 // indirect github.com/dgraph-io/ristretto/v2 v2.2.0 // indirect github.com/dustin/go-humanize v1.0.1 // indirect @@ -11,6 +12,7 @@ require ( github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/godbus/dbus/v5 v5.1.0 // indirect github.com/google/flatbuffers v25.2.10+incompatible // indirect github.com/klauspost/compress v1.18.0 // indirect github.com/pelletier/go-toml/v2 v2.2.4 // indirect diff --git a/go.sum b/go.sum index 2482f6c..f61e769 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,7 @@ github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/coreos/go-systemd/v22 v22.6.0 h1:aGVa/v8B7hpb0TKl0MWoAavPDmHvobFe5R5zn0bCJWo= +github.com/coreos/go-systemd/v22 v22.6.0/go.mod h1:iG+pp635Fo7ZmV/j14KUcmEyWF+0X7Lua8rrTWzYgWU= github.com/dgraph-io/badger/v4 v4.8.0 h1:JYph1ChBijCw8SLeybvPINizbDKWZ5n/GYbz2yhN/bs= github.com/dgraph-io/badger/v4 v4.8.0/go.mod h1:U6on6e8k/RTbUWxqKR0MvugJuVmkxSNc79ap4917h4w= github.com/dgraph-io/ristretto/v2 v2.2.0 h1:bkY3XzJcXoMuELV8F+vS8kzNgicwQFAaGINAEJdWGOM= @@ -15,6 +17,8 @@ github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= +github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/google/flatbuffers v25.2.10+incompatible h1:F3vclr7C3HpB1k9mxCGRMXq6FdUalZ6H/pNX4FP1v0Q= github.com/google/flatbuffers v25.2.10+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= -- 2.49.1 From 6a225a616282149d432dd2a826ba74d157af2814 Mon Sep 17 00:00:00 2001 From: GnomeZworc Date: Thu, 18 Dec 2025 23:39:46 +0100 Subject: [PATCH 02/27] f-8: code: add systemd lib #8 Signed-off-by: GnomeZworc --- pkg/systemd/main.go | 109 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 pkg/systemd/main.go diff --git a/pkg/systemd/main.go b/pkg/systemd/main.go new file mode 100644 index 0000000..ea5fef0 --- /dev/null +++ b/pkg/systemd/main.go @@ -0,0 +1,109 @@ +package systemd + +import ( + "context" + "errors" + "fmt" + "time" + + "github.com/coreos/go-systemd/v22/dbus" +) + +const ( + defaultTimeout = 5 * time.Second + jobMode = "replace" +) + +type Manager struct { + conn *dbus.Conn +} + +type ServiceStatus struct { + Name string + LoadState string + ActiveState string + SubState string + MainPID uint32 +} + +// New crée une connexion D-Bus systemd (scope système) +func New() (*Manager, error) { + ctx, cancel := context.WithTimeout(context.Background(), defaultTimeout) + defer cancel() + + conn, err := dbus.NewSystemConnectionContext(ctx) + if err != nil { + return nil, err + } + + return &Manager{conn: conn}, nil +} + +// Close ferme la connexion D-Bus +func (m *Manager) Close() { + if m.conn != nil { + m.conn.Close() + } +} + +// Start démarre un service systemd +func (m *Manager) Start(service string) error { + return m.job("StartUnit", service) +} + +// Stop arrête un service systemd +func (m *Manager) Stop(service string) error { + return m.job("StopUnit", service) +} + +func (m *Manager) job(method, service string) error { + ctx, cancel := context.WithTimeout(context.Background(), defaultTimeout) + defer cancel() + + ch := make(chan string, 1) + + var err error + switch method { + case "StartUnit": + _, err = m.conn.StartUnitContext(ctx, service, jobMode, ch) + case "StopUnit": + _, err = m.conn.StopUnitContext(ctx, service, jobMode, ch) + default: + return errors.New("unsupported job method") + } + + if err != nil { + return err + } + + result := <-ch + if result != "done" { + return fmt.Errorf("%s %s failed: %s", method, service, result) + } + + return nil +} + +// Status retourne l’état courant du service +func (m *Manager) Status(service string) (*ServiceStatus, error) { + ctx, cancel := context.WithTimeout(context.Background(), defaultTimeout) + defer cancel() + + props, err := m.conn.GetUnitPropertiesContext(ctx, service) + if err != nil { + return nil, err + } + + status := &ServiceStatus{ + Name: service, + LoadState: props["LoadState"].(string), + ActiveState: props["ActiveState"].(string), + SubState: props["SubState"].(string), + } + + if pid, ok := props["MainPID"].(uint32); ok { + status.MainPID = pid + } + + return status, nil +} -- 2.49.1 From 72b2e9afa9bf62d759e7182f206ce561f0b622c4 Mon Sep 17 00:00:00 2001 From: GnomeZworc Date: Mon, 22 Dec 2025 22:49:17 +0100 Subject: [PATCH 03/27] f-8: code: add first agent binari #8 Signed-off-by: GnomeZworc --- cmd/agent/main.go | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 cmd/agent/main.go diff --git a/cmd/agent/main.go b/cmd/agent/main.go new file mode 100644 index 0000000..bcb3849 --- /dev/null +++ b/cmd/agent/main.go @@ -0,0 +1,14 @@ +package main + +import ( + "fmt" + "os" +) + +func main() { + bin_name := os.Args[0] + + fmt.Printf("%s: Start process\n", bin_name) + + os.Exit(5) +} -- 2.49.1 From e1f317aeb9be38d5b74bb35f5e923f27d7bb03fc Mon Sep 17 00:00:00 2001 From: GnomeZworc Date: Tue, 23 Dec 2025 23:24:14 +0100 Subject: [PATCH 04/27] f-8: code: first implement of metadata cli #8 Signed-off-by: GnomeZworc --- cmd/meta_cli/main.go | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 cmd/meta_cli/main.go diff --git a/cmd/meta_cli/main.go b/cmd/meta_cli/main.go new file mode 100644 index 0000000..9fec4db --- /dev/null +++ b/cmd/meta_cli/main.go @@ -0,0 +1,17 @@ +package main + +import ( + "fmt" + "os" +) + +var ( + bin_name = os.Args[0] +) + +func main() { + + fmt.Printf("Start %s conf\n", bin_name) + + os.Exit(0) +} -- 2.49.1 From 1ac5a9fe4996679e32073e23db24a87b45c4289f Mon Sep 17 00:00:00 2001 From: GnomeZworc Date: Wed, 24 Dec 2025 14:04:30 +0100 Subject: [PATCH 05/27] f-8: conf: move configuration files #8 Signed-off-by: GnomeZworc --- conf/agent/config.dev.yml | 2 ++ {exemple => conf}/agent/config.exemple.yml | 0 2 files changed, 2 insertions(+) create mode 100644 conf/agent/config.dev.yml rename {exemple => conf}/agent/config.exemple.yml (100%) diff --git a/conf/agent/config.dev.yml b/conf/agent/config.dev.yml new file mode 100644 index 0000000..62cb624 --- /dev/null +++ b/conf/agent/config.dev.yml @@ -0,0 +1,2 @@ +database: + path: "./data/" \ No newline at end of file diff --git a/exemple/agent/config.exemple.yml b/conf/agent/config.exemple.yml similarity index 100% rename from exemple/agent/config.exemple.yml rename to conf/agent/config.exemple.yml -- 2.49.1 From 014ae61dbbc78288abe1d31d81e7504b6bd8b413 Mon Sep 17 00:00:00 2001 From: GnomeZworc Date: Wed, 24 Dec 2025 14:05:47 +0100 Subject: [PATCH 06/27] f-8: internal/conf: delete conf file existance check #8 Signed-off-by: GnomeZworc --- internal/config/agent/struct.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/internal/config/agent/struct.go b/internal/config/agent/struct.go index 12a46d3..c9537bf 100644 --- a/internal/config/agent/struct.go +++ b/internal/config/agent/struct.go @@ -17,9 +17,7 @@ func LoadConfig(path string) (*Config, error) { v.SetDefault("database.path", "/var/lib/two/data/") - if err := v.ReadInConfig(); err != nil { - return nil, err - } + v.ReadInConfig() var cfg Config if err := v.Unmarshal(&cfg); err != nil { -- 2.49.1 From 2418e08ee0c9649925bcf347689a3d63ce8680ae Mon Sep 17 00:00:00 2001 From: GnomeZworc Date: Wed, 24 Dec 2025 22:02:18 +0100 Subject: [PATCH 07/27] f-8: code: add params for meta_cli #8 Signed-off-by: GnomeZworc --- cmd/meta_cli/main.go | 45 ++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 41 insertions(+), 4 deletions(-) diff --git a/cmd/meta_cli/main.go b/cmd/meta_cli/main.go index 9fec4db..ce97286 100644 --- a/cmd/meta_cli/main.go +++ b/cmd/meta_cli/main.go @@ -1,17 +1,54 @@ package main import ( + "flag" "fmt" "os" + "strings" + + configuration "git.g3e.fr/syonad/two/internal/config/agent" + "git.g3e.fr/syonad/two/pkg/db/kv" + "github.com/dgraph-io/badger/v4" ) -var ( - bin_name = os.Args[0] -) +var DB *badger.DB + +func AddInDB(dbName string, line string) error { + // ID = partie avant le premier ';' + id := strings.Split(line, ";")[0] + "/bash" + key := []byte(dbName + "/" + id) + + return DB.Update(func(txn *badger.Txn) error { + return txn.Set(key, []byte(line)) + }) +} func main() { + conf_file := flag.String("conf", "/etc/two/agent.yml", "configuration file") + vm_name := flag.String("vm_name", "", "Nom de la vm") + vpc := flag.String("vpc_name", "", "vpc name") + bind_ip := flag.String("ip", "", "bind ip") + bind_port := flag.String("port", "", "bind port") + ssh_key := flag.String("key", "", "Clef ssh") + password := flag.String("pass", "", "password user") + start := flag.Bool("start", false, "start metadata server") + stop := flag.Bool("stop", false, "stop metadata server") - fmt.Printf("Start %s conf\n", bin_name) + flag.Parse() + + conf, err := configuration.LoadConfig(*conf_file) + if err != nil { + fmt.Println(err) + return + } + fmt.Print(conf) + + DB = kv.InitDB(kv.Config{ + Path: conf.Database.Path, + }) + defer DB.Close() + + fmt.Printf("conf metadata for %s\n - this key %s\n - this password %s\n", *vm_name, *ssh_key, *password) os.Exit(0) } -- 2.49.1 From b43e45488e2e8339ef27af0ea34c0c32b1e9e152 Mon Sep 17 00:00:00 2001 From: GnomeZworc Date: Fri, 26 Dec 2025 23:00:13 +0100 Subject: [PATCH 08/27] f-8: code: add func to control db #8 Signed-off-by: GnomeZworc --- pkg/db/kv/addInDB.go | 11 +++++++++++ pkg/db/kv/deleteInDB.go | 11 +++++++++++ 2 files changed, 22 insertions(+) create mode 100644 pkg/db/kv/addInDB.go create mode 100644 pkg/db/kv/deleteInDB.go diff --git a/pkg/db/kv/addInDB.go b/pkg/db/kv/addInDB.go new file mode 100644 index 0000000..44ea19c --- /dev/null +++ b/pkg/db/kv/addInDB.go @@ -0,0 +1,11 @@ +package kv + +import ( + "github.com/dgraph-io/badger/v4" +) + +func AddInDB(db *badger.DB, key string, value string) error { + return db.Update(func(txn *badger.Txn) error { + return txn.Set([]byte(key), []byte(value)) + }) +} diff --git a/pkg/db/kv/deleteInDB.go b/pkg/db/kv/deleteInDB.go new file mode 100644 index 0000000..fe8398e --- /dev/null +++ b/pkg/db/kv/deleteInDB.go @@ -0,0 +1,11 @@ +package kv + +import ( + "github.com/dgraph-io/badger/v4" +) + +func DeleteInDB(db *badger.DB, key string) error { + return db.Update(func(txn *badger.Txn) error { + return txn.Delete([]byte(key)) + }) +} -- 2.49.1 From 55ed2c8e53ca0a8ce740abfa0f9c7bd812301bd4 Mon Sep 17 00:00:00 2001 From: GnomeZworc Date: Fri, 26 Dec 2025 23:00:51 +0100 Subject: [PATCH 09/27] f-8: code: add module to load nocloud in db #8 Signed-off-by: GnomeZworc --- internal/load_db/nocloud/render.go | 50 +++++++++++++++++++ internal/load_db/nocloud/struct.go | 10 ++++ .../load_db/nocloud/templates/meta-data.tmpl | 2 + .../nocloud/templates/network-config.tmpl | 4 ++ .../load_db/nocloud/templates/user-data.tmpl | 3 ++ .../nocloud/templates/vendor-data.tmpl | 13 +++++ 6 files changed, 82 insertions(+) create mode 100644 internal/load_db/nocloud/render.go create mode 100644 internal/load_db/nocloud/struct.go create mode 100644 internal/load_db/nocloud/templates/meta-data.tmpl create mode 100644 internal/load_db/nocloud/templates/network-config.tmpl create mode 100644 internal/load_db/nocloud/templates/user-data.tmpl create mode 100644 internal/load_db/nocloud/templates/vendor-data.tmpl diff --git a/internal/load_db/nocloud/render.go b/internal/load_db/nocloud/render.go new file mode 100644 index 0000000..ad7eee1 --- /dev/null +++ b/internal/load_db/nocloud/render.go @@ -0,0 +1,50 @@ +package nocloud + +import ( + "bytes" + "embed" + "text/template" + + "git.g3e.fr/syonad/two/pkg/db/kv" + "github.com/dgraph-io/badger/v4" +) + +//go:embed templates/*.tmpl +var templateFS embed.FS + +func renderConfig(path string, cfg Config) (string, error) { + tpl, err := template.ParseFS(templateFS, path) + if err != nil { + return "", err + } + + var buf bytes.Buffer + if err := tpl.Execute(&buf, cfg); err != nil { + return "", err + } + + return buf.String(), nil +} + +var DB *badger.DB + +func LoadNcCloudInDB(config Config, db *badger.DB) { + meta_data, _ := renderConfig("templates/meta-data.tmpl", config) + user_data, _ := renderConfig("templates/user-data.tmpl", config) + network_config, _ := renderConfig("templates/network-config.tmpl", config) + vendor_data, _ := renderConfig("templates/vendor-data.tmpl", config) + + DB = db + + kv.AddInDB(DB, "metadata/"+config.Name+"/meta-data", meta_data) + kv.AddInDB(DB, "metadata/"+config.Name+"/user-data", user_data) + kv.AddInDB(DB, "metadata/"+config.Name+"/network-config", network_config) + kv.AddInDB(DB, "metadata/"+config.Name+"/vendor-data", vendor_data) + kv.AddInDB(DB, "metadata/"+config.Name+"/vpc", config.VpcName) + kv.AddInDB(DB, "metadata/"+config.Name+"/bind_ip", config.BindIP) + kv.AddInDB(DB, "metadata/"+config.Name+"/bind_port", config.BindPort) +} + +func UnLoadNoCloudInDB(vm_name string, db *badger.DB) { + kv.DeleteInDB(DB, "metadata/"+vm_name) +} diff --git a/internal/load_db/nocloud/struct.go b/internal/load_db/nocloud/struct.go new file mode 100644 index 0000000..4134000 --- /dev/null +++ b/internal/load_db/nocloud/struct.go @@ -0,0 +1,10 @@ +package nocloud + +type Config struct { + VpcName string + BindIP string + BindPort string + Name string + Password string + SSHKEY string +} diff --git a/internal/load_db/nocloud/templates/meta-data.tmpl b/internal/load_db/nocloud/templates/meta-data.tmpl new file mode 100644 index 0000000..ff876bb --- /dev/null +++ b/internal/load_db/nocloud/templates/meta-data.tmpl @@ -0,0 +1,2 @@ +instance-id: {{ .Name }} +local-hostname: {{ .Name }} diff --git a/internal/load_db/nocloud/templates/network-config.tmpl b/internal/load_db/nocloud/templates/network-config.tmpl new file mode 100644 index 0000000..0f8d052 --- /dev/null +++ b/internal/load_db/nocloud/templates/network-config.tmpl @@ -0,0 +1,4 @@ +version: 2 +ethernets: + eth0: + dhcp4: true diff --git a/internal/load_db/nocloud/templates/user-data.tmpl b/internal/load_db/nocloud/templates/user-data.tmpl new file mode 100644 index 0000000..84195ab --- /dev/null +++ b/internal/load_db/nocloud/templates/user-data.tmpl @@ -0,0 +1,3 @@ +#!/bin/sh + +passwd -d root diff --git a/internal/load_db/nocloud/templates/vendor-data.tmpl b/internal/load_db/nocloud/templates/vendor-data.tmpl new file mode 100644 index 0000000..148d6db --- /dev/null +++ b/internal/load_db/nocloud/templates/vendor-data.tmpl @@ -0,0 +1,13 @@ +#cloud-config +users: + - name: syonad + lock_passwd: false + gecos: alpine Cloud User + groups: [adm, wheel] + doas: + - permit nopass syonad + sudo: ["ALL=(ALL) NOPASSWD:ALL"] + shell: /bin/ash + passwd: "{{ .Password }}" + ssh_authorized_keys: + - "{{ .SSHKEY }}" \ No newline at end of file -- 2.49.1 From 1ac1e6186487d4223320bfb420cdbc60741ca58f Mon Sep 17 00:00:00 2001 From: GnomeZworc Date: Fri, 26 Dec 2025 23:02:14 +0100 Subject: [PATCH 10/27] f-8: code: move binary name #8 Signed-off-by: GnomeZworc --- cmd/agent/main.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/cmd/agent/main.go b/cmd/agent/main.go index bcb3849..0f82e93 100644 --- a/cmd/agent/main.go +++ b/cmd/agent/main.go @@ -5,10 +5,13 @@ import ( "os" ) +var ( + bin_name = os.Args[0] +) + func main() { - bin_name := os.Args[0] fmt.Printf("%s: Start process\n", bin_name) - os.Exit(5) + os.Exit(0) } -- 2.49.1 From df95d8b4a79fceaa0b790df081afda5b1850e2ec Mon Sep 17 00:00:00 2001 From: GnomeZworc Date: Fri, 26 Dec 2025 23:40:03 +0100 Subject: [PATCH 11/27] f-8: code: use flags in db binary #8 Signed-off-by: GnomeZworc --- cmd/db/main.go | 35 +++++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/cmd/db/main.go b/cmd/db/main.go index 0c6c1ba..205d8bf 100644 --- a/cmd/db/main.go +++ b/cmd/db/main.go @@ -1,6 +1,7 @@ package main import ( + "flag" "fmt" "os" "strings" @@ -125,7 +126,13 @@ func printDB() { } func main() { - conf, err := configuration.LoadConfig("/etc/two/agent.yml") + conf_file := flag.String("conf", "/etc/two/agent.yml", "configuration file") + + flag.Parse() + + args := flag.Args() + + conf, err := configuration.LoadConfig(*conf_file) if err != nil { fmt.Println(err) return @@ -136,53 +143,53 @@ func main() { }) defer DB.Close() - if len(os.Args) < 2 { + if len(args) < 1 { fmt.Println("Usage: db [args...]") return } - cmd := os.Args[1] + cmd := args[0] switch cmd { case "check_in_db": - if len(os.Args) != 4 { + if len(args) != 3 { fmt.Println("Usage: check_in_db ") os.Exit(1) } - ret := CheckInDB(os.Args[2], os.Args[3]) + ret := CheckInDB(args[1], args[2]) os.Exit(ret) case "add_in_db": - if len(os.Args) < 4 { + if len(args) < 3 { fmt.Println("Usage: add_in_db ") os.Exit(1) } - line := strings.Join(os.Args[3:], ";") - if err := AddInDB(os.Args[2], line); err != nil { + line := strings.Join(args[2:], ";") + if err := AddInDB(args[1], line); err != nil { fmt.Println("Error:", err) os.Exit(1) } case "delete_in_db": - if len(os.Args) != 4 { + if len(args) != 3 { fmt.Println("Usage: delete_in_db ") os.Exit(1) } - if err := DeleteInDB(os.Args[2], os.Args[3]); err != nil { + if err := DeleteInDB(args[1], args[2]); err != nil { fmt.Println("Error:", err) os.Exit(1) } case "count_in_db": - if len(os.Args) != 4 { + if len(args) != 3 { fmt.Println("Usage: count_in_db ") os.Exit(1) } - count := CountInDB(os.Args[2], os.Args[3]) + count := CountInDB(args[1], args[2]) fmt.Println(count) case "get_from_db": - if len(os.Args) != 4 { + if len(args) != 3 { fmt.Println("Usage: get_from_db ") os.Exit(1) } - line, _ := GetFromDB(os.Args[2], os.Args[3]) + line, _ := GetFromDB(args[1], args[2]) fmt.Println(line) case "print": printDB() -- 2.49.1 From b2d1922eaa7b809034e50cbdb5ef9ae8bc9a3af6 Mon Sep 17 00:00:00 2001 From: GnomeZworc Date: Fri, 26 Dec 2025 23:42:24 +0100 Subject: [PATCH 12/27] f-8: pkg: make delete in db recursif #8 Signed-off-by: GnomeZworc --- pkg/db/kv/deleteInDB.go | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/pkg/db/kv/deleteInDB.go b/pkg/db/kv/deleteInDB.go index fe8398e..36d8669 100644 --- a/pkg/db/kv/deleteInDB.go +++ b/pkg/db/kv/deleteInDB.go @@ -1,11 +1,44 @@ package kv import ( + "fmt" + "log" + "github.com/dgraph-io/badger/v4" ) -func DeleteInDB(db *badger.DB, key string) error { +func deleteKey(db *badger.DB, key string) error { return db.Update(func(txn *badger.Txn) error { return txn.Delete([]byte(key)) }) } + +func DeleteInDB(db *badger.DB, key string) error { + + prefix := []byte(key + "/") + + err := db.View(func(txn *badger.Txn) error { + opts := badger.DefaultIteratorOptions + opts.PrefetchValues = false + + it := txn.NewIterator(opts) + defer it.Close() + + for it.Seek(prefix); it.ValidForPrefix(prefix); it.Next() { + item := it.Item() + key := item.Key() + + k := append([]byte{}, key...) + fmt.Println(string(k)) + if err := deleteKey(db, string(k)); err != nil { + return err + } + } + return nil + }) + if err != nil { + log.Fatal(err) + } + + return deleteKey(db, key) +} -- 2.49.1 From 38f2ed1b83190cb9b7434659d17968d1d25684c4 Mon Sep 17 00:00:00 2001 From: GnomeZworc Date: Fri, 26 Dec 2025 23:43:29 +0100 Subject: [PATCH 13/27] f-8: code: use recursive delete #8 Signed-off-by: GnomeZworc --- cmd/db/main.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/cmd/db/main.go b/cmd/db/main.go index 205d8bf..765cad0 100644 --- a/cmd/db/main.go +++ b/cmd/db/main.go @@ -60,9 +60,7 @@ func AddInDB(dbName string, line string) error { func DeleteInDB(dbName, id string) error { key := []byte(dbName + "/" + id + "/bash") - return DB.Update(func(txn *badger.Txn) error { - return txn.Delete(key) - }) + return kv.DeleteInDB(DB, string(key)) } func CountInDB(dbName, id string) int { -- 2.49.1 From 97132550b0b000e53cee7801152c1f84d04099f2 Mon Sep 17 00:00:00 2001 From: GnomeZworc Date: Fri, 26 Dec 2025 23:46:18 +0100 Subject: [PATCH 14/27] f-8: code: move Load in DB to internal lib #8 Signed-off-by: GnomeZworc --- cmd/meta_cli/main.go | 35 +++++++++++++++-------------------- 1 file changed, 15 insertions(+), 20 deletions(-) diff --git a/cmd/meta_cli/main.go b/cmd/meta_cli/main.go index ce97286..971c370 100644 --- a/cmd/meta_cli/main.go +++ b/cmd/meta_cli/main.go @@ -3,26 +3,12 @@ package main import ( "flag" "fmt" - "os" - "strings" configuration "git.g3e.fr/syonad/two/internal/config/agent" + "git.g3e.fr/syonad/two/internal/load_db/nocloud" "git.g3e.fr/syonad/two/pkg/db/kv" - "github.com/dgraph-io/badger/v4" ) -var DB *badger.DB - -func AddInDB(dbName string, line string) error { - // ID = partie avant le premier ';' - id := strings.Split(line, ";")[0] + "/bash" - key := []byte(dbName + "/" + id) - - return DB.Update(func(txn *badger.Txn) error { - return txn.Set(key, []byte(line)) - }) -} - func main() { conf_file := flag.String("conf", "/etc/two/agent.yml", "configuration file") vm_name := flag.String("vm_name", "", "Nom de la vm") @@ -43,12 +29,21 @@ func main() { } fmt.Print(conf) - DB = kv.InitDB(kv.Config{ + db := kv.InitDB(kv.Config{ Path: conf.Database.Path, }) - defer DB.Close() + defer db.Close() - fmt.Printf("conf metadata for %s\n - this key %s\n - this password %s\n", *vm_name, *ssh_key, *password) - - os.Exit(0) + if *start { + nocloud.LoadNcCloudInDB(nocloud.Config{ + VpcName: *vpc, + Name: *vm_name, + BindIP: *bind_ip, + BindPort: *bind_port, + Password: *password, + SSHKEY: *ssh_key, + }, db) + } else if *stop { + nocloud.UnLoadNoCloudInDB(*vm_name, db) + } } -- 2.49.1 From c2664e94fa44a822c8e50dc2b5ccf611eb1e2239 Mon Sep 17 00:00:00 2001 From: GnomeZworc Date: Sun, 28 Dec 2025 14:20:12 +0100 Subject: [PATCH 15/27] f-8: clean: use kv func for db bin #8 Signed-off-by: GnomeZworc --- cmd/db/main.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/cmd/db/main.go b/cmd/db/main.go index 765cad0..8b8d25e 100644 --- a/cmd/db/main.go +++ b/cmd/db/main.go @@ -52,9 +52,7 @@ func AddInDB(dbName string, line string) error { id := strings.Split(line, ";")[0] + "/bash" key := []byte(dbName + "/" + id) - return DB.Update(func(txn *badger.Txn) error { - return txn.Set(key, []byte(line)) - }) + return kv.AddInDB(DB, string(key), line) } func DeleteInDB(dbName, id string) error { -- 2.49.1 From 348eb4aee32b127480087826b5f55ce0c2bb4cbf Mon Sep 17 00:00:00 2001 From: GnomeZworc Date: Sun, 28 Dec 2025 14:57:36 +0100 Subject: [PATCH 16/27] f-8: code: implemete netns first code #8 Signed-off-by: GnomeZworc --- go.mod | 6 ++++-- go.sum | 2 ++ internal/netns/enter.go | 5 +++++ internal/netns/enter_linux.go | 26 ++++++++++++++++++++++++++ internal/netns/enter_other.go | 8 ++++++++ 5 files changed, 45 insertions(+), 2 deletions(-) create mode 100644 internal/netns/enter.go create mode 100644 internal/netns/enter_linux.go create mode 100644 internal/netns/enter_other.go diff --git a/go.mod b/go.mod index 555ca1b..26bd137 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,8 @@ module git.g3e.fr/syonad/two -go 1.23.8 +go 1.24.0 + +toolchain go1.24.11 require ( github.com/cespare/xxhash/v2 v2.3.0 // indirect @@ -29,7 +31,7 @@ require ( go.opentelemetry.io/otel/trace v1.37.0 // indirect go.yaml.in/yaml/v3 v3.0.4 // indirect golang.org/x/net v0.41.0 // indirect - golang.org/x/sys v0.34.0 // indirect + golang.org/x/sys v0.39.0 // indirect golang.org/x/text v0.28.0 // indirect google.golang.org/protobuf v1.36.6 // indirect ) diff --git a/go.sum b/go.sum index f61e769..0d19489 100644 --- a/go.sum +++ b/go.sum @@ -53,6 +53,8 @@ golang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw= golang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA= golang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA= golang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/sys v0.39.0 h1:CvCKL8MeisomCi6qNZ+wbb0DN9E5AATixKsvNtMoMFk= +golang.org/x/sys v0.39.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng= golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU= google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= diff --git a/internal/netns/enter.go b/internal/netns/enter.go new file mode 100644 index 0000000..68ea372 --- /dev/null +++ b/internal/netns/enter.go @@ -0,0 +1,5 @@ +package netns + +func Enter(name string) error { + return enter(name) +} diff --git a/internal/netns/enter_linux.go b/internal/netns/enter_linux.go new file mode 100644 index 0000000..04e116a --- /dev/null +++ b/internal/netns/enter_linux.go @@ -0,0 +1,26 @@ +//go:build linux + +package netns + +import ( + "fmt" + "os" + "runtime" + + "golang.org/x/sys/unix" +) + +func enter(name string) error { + runtime.LockOSThread() + defer runtime.UnlockOSThread() + + path := fmt.Sprintf("/var/run/netns/%s", name) + + f, err := os.Open(path) + if err != nil { + return err + } + defer f.Close() + + return unix.Setns(int(f.Fd()), unix.CLONE_NEWNET) +} diff --git a/internal/netns/enter_other.go b/internal/netns/enter_other.go new file mode 100644 index 0000000..2691ff2 --- /dev/null +++ b/internal/netns/enter_other.go @@ -0,0 +1,8 @@ +//go:build !linux + +package netns + +func enter(name string) error { + // Ignoré hors Linux + return nil +} -- 2.49.1 From 2c6c1ff2dfb1f0c0eaf590e2fff2452db6285c7b Mon Sep 17 00:00:00 2001 From: GnomeZworc Date: Sun, 28 Dec 2025 14:58:09 +0100 Subject: [PATCH 17/27] f-8: code: use local usage of netns #8 Signed-off-by: GnomeZworc --- internal/metadata/server.go | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/internal/metadata/server.go b/internal/metadata/server.go index 336f754..2e43a1a 100644 --- a/internal/metadata/server.go +++ b/internal/metadata/server.go @@ -9,14 +9,17 @@ import ( "net" "net/http" "time" + + "git.g3e.fr/syonad/two/internal/netns" ) var data NoCloudData var ( - iface = flag.String("interface", "0.0.0.0", "Interface IP à écouter") - port = flag.Int("port", 8080, "Port à utiliser") - file = flag.String("file", "", "Fichier JSON contenant les données NoCloud") + iface = flag.String("interface", "0.0.0.0", "Interface IP à écouter") + port = flag.Int("port", 8080, "Port à utiliser") + file = flag.String("file", "", "Fichier JSON contenant les données NoCloud") + netns_name = flag.String("netns", "", "Network namespace à utiliser") ) func getIP(r *http.Request) string { @@ -54,6 +57,12 @@ func rootHandler(w http.ResponseWriter, r *http.Request) { func StartServer() { flag.Parse() + if *netns_name != "" { + if err := netns.Enter(*netns_name); err != nil { + log.Fatalf("Impossible d'entrer dans le netns: %v", err) + } + } + if *file == "" { log.Fatal("Vous devez spécifier un fichier via --file") } -- 2.49.1 From e3583e70215ea8c7624d42121c8cef555c046446 Mon Sep 17 00:00:00 2001 From: GnomeZworc Date: Sun, 28 Dec 2025 15:01:37 +0100 Subject: [PATCH 18/27] f-8: import local info for start/deploy metadata #8 Signed-off-by: GnomeZworc --- systemd/metadata_service/metadata@.service | 10 ++++++++++ systemd/metadata_start/run-metadata-in-netns.sh | 17 +++++++++++++++++ 2 files changed, 27 insertions(+) create mode 100644 systemd/metadata_service/metadata@.service create mode 100644 systemd/metadata_start/run-metadata-in-netns.sh diff --git a/systemd/metadata_service/metadata@.service b/systemd/metadata_service/metadata@.service new file mode 100644 index 0000000..54cf08a --- /dev/null +++ b/systemd/metadata_service/metadata@.service @@ -0,0 +1,10 @@ +[Unit] +Description=metadata in netns %i +After=network.target + +[Service] +Type=simple +ExecStart=/usr/local/bin/run-metadata-in-netns.sh %i + +[Install] +WantedBy=multi-user.target \ No newline at end of file diff --git a/systemd/metadata_start/run-metadata-in-netns.sh b/systemd/metadata_start/run-metadata-in-netns.sh new file mode 100644 index 0000000..612dd18 --- /dev/null +++ b/systemd/metadata_start/run-metadata-in-netns.sh @@ -0,0 +1,17 @@ +#!/bin/bash +set -e + +# Expects one argument: netns_bridge (e.g. vpc-00003_br-00002 or vpc1_br0) +arg="$1" +NETNS="${arg%%_*}" +ip_port="${arg#*_}" +IP="${ip_port%%-*}" +PORT="${ip_port#*-}" + +echo "start metadata ${NETNS} " + +exec ip netns exec "${NETNS}" \ + /usr/bin/metadata \ + -file "/opt/metadata/${arg}.conf" \ + -interface "${IP}" \ + -port "${PORT}" \ No newline at end of file -- 2.49.1 From 7b43cecc577330db6628eb9babe352ccb9c91b14 Mon Sep 17 00:00:00 2001 From: GnomeZworc Date: Mon, 29 Dec 2025 23:35:24 +0100 Subject: [PATCH 19/27] f-8: ci: add two binaries #8 Signed-off-by: GnomeZworc --- .forgejo/workflows/prerelease.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.forgejo/workflows/prerelease.yml b/.forgejo/workflows/prerelease.yml index fcb74c6..c6ea322 100644 --- a/.forgejo/workflows/prerelease.yml +++ b/.forgejo/workflows/prerelease.yml @@ -32,7 +32,7 @@ jobs: matrix: goos: [linux] goarch: [amd64] - binaries: [db, metadata] + binaries: [db, metadata, meta_cli, agent] uses: ./.forgejo/workflows/build.yml with: tag: ${{ needs.set-release-target.outputs.release_cible }} -- 2.49.1 From fc624e7e961cf283b604937dfc9ca7f8398cc2b2 Mon Sep 17 00:00:00 2001 From: GnomeZworc Date: Tue, 30 Dec 2025 21:27:35 +0100 Subject: [PATCH 20/27] f-8: code: move flags from pkg to binari #8 Signed-off-by: GnomeZworc --- cmd/metadata/main.go | 23 ++++++++++++++++++++++- internal/metadata/server.go | 24 +++++------------------- internal/metadata/struct.go | 7 +++++++ 3 files changed, 34 insertions(+), 20 deletions(-) diff --git a/cmd/metadata/main.go b/cmd/metadata/main.go index 54bae88..dc5bf29 100644 --- a/cmd/metadata/main.go +++ b/cmd/metadata/main.go @@ -1,9 +1,30 @@ package main import ( + "flag" + "log" + "git.g3e.fr/syonad/two/internal/metadata" ) +var ( + iface = flag.String("interface", "0.0.0.0", "Interface IP à écouter") + port = flag.Int("port", 8080, "Port à utiliser") + file = flag.String("file", "", "Fichier JSON contenant les données NoCloud") + netns_name = flag.String("netns", "", "Network namespace à utiliser") +) + func main() { - metadata.StartServer() + flag.Parse() + + if *file == "" { + log.Fatal("Vous devez spécifier un fichier via --file") + } + + metadata.StartServer(metadata.Config{ + Netns: *netns_name, + File: *file, + Iface: *iface, + Port: *port, + }) } diff --git a/internal/metadata/server.go b/internal/metadata/server.go index 2e43a1a..1cb9559 100644 --- a/internal/metadata/server.go +++ b/internal/metadata/server.go @@ -2,7 +2,6 @@ package metadata import ( "encoding/json" - "flag" "fmt" "io/ioutil" "log" @@ -15,13 +14,6 @@ import ( var data NoCloudData -var ( - iface = flag.String("interface", "0.0.0.0", "Interface IP à écouter") - port = flag.Int("port", 8080, "Port à utiliser") - file = flag.String("file", "", "Fichier JSON contenant les données NoCloud") - netns_name = flag.String("netns", "", "Network namespace à utiliser") -) - func getIP(r *http.Request) string { ip, _, err := net.SplitHostPort(r.RemoteAddr) if err != nil { @@ -54,20 +46,14 @@ func rootHandler(w http.ResponseWriter, r *http.Request) { } } -func StartServer() { - flag.Parse() - - if *netns_name != "" { - if err := netns.Enter(*netns_name); err != nil { +func StartServer(config Config) { + if config.Netns != "" { + if err := netns.Enter(config.Netns); err != nil { log.Fatalf("Impossible d'entrer dans le netns: %v", err) } } - if *file == "" { - log.Fatal("Vous devez spécifier un fichier via --file") - } - - raw, err := ioutil.ReadFile(*file) + raw, err := ioutil.ReadFile(config.File) if err != nil { log.Fatalf("Erreur de lecture du fichier: %v", err) } @@ -78,7 +64,7 @@ func StartServer() { http.HandleFunc("/", rootHandler) - address := fmt.Sprintf("%s:%d", *iface, *port) + address := fmt.Sprintf("%s:%d", config.Iface, config.Port) log.Printf("Serveur NoCloud démarré sur http://%s/", address) log.Fatal(http.ListenAndServe(address, nil)) } diff --git a/internal/metadata/struct.go b/internal/metadata/struct.go index f1edf18..bbf4bd7 100644 --- a/internal/metadata/struct.go +++ b/internal/metadata/struct.go @@ -6,3 +6,10 @@ type NoCloudData struct { NetworkConfig string `json:"network-config"` VendorData string `json:"vendor-data"` } + +type Config struct { + Netns string + File string + Iface string + Port int +} -- 2.49.1 From d2bc7e5b7a131ba49fa3d5d4caa354625e1eb770 Mon Sep 17 00:00:00 2001 From: GnomeZworc Date: Tue, 30 Dec 2025 22:31:19 +0100 Subject: [PATCH 21/27] f-8: code: use db for database config #8 Signed-off-by: GnomeZworc --- cmd/metadata/main.go | 19 +++++------ internal/metadata/server.go | 63 ++++++++++++++++++++++++++++--------- internal/metadata/struct.go | 21 ++++++++----- pkg/db/kv/getInDB.go | 22 +++++++++++++ 4 files changed, 92 insertions(+), 33 deletions(-) create mode 100644 pkg/db/kv/getInDB.go diff --git a/cmd/metadata/main.go b/cmd/metadata/main.go index dc5bf29..4813ed5 100644 --- a/cmd/metadata/main.go +++ b/cmd/metadata/main.go @@ -2,29 +2,26 @@ package main import ( "flag" - "log" "git.g3e.fr/syonad/two/internal/metadata" ) var ( iface = flag.String("interface", "0.0.0.0", "Interface IP à écouter") - port = flag.Int("port", 8080, "Port à utiliser") - file = flag.String("file", "", "Fichier JSON contenant les données NoCloud") + port = flag.Int("port", 0, "Port à utiliser") netns_name = flag.String("netns", "", "Network namespace à utiliser") + conf_file = flag.String("conf", "/etc/two/agent.yml", "configuration file") + vm_name = flag.String("vm", "", "Name of the vm") ) func main() { flag.Parse() - if *file == "" { - log.Fatal("Vous devez spécifier un fichier via --file") - } - metadata.StartServer(metadata.Config{ - Netns: *netns_name, - File: *file, - Iface: *iface, - Port: *port, + Netns: *netns_name, + Iface: *iface, + Port: *port, + ConfFile: *conf_file, + VmName: *vm_name, }) } diff --git a/internal/metadata/server.go b/internal/metadata/server.go index 1cb9559..831aa80 100644 --- a/internal/metadata/server.go +++ b/internal/metadata/server.go @@ -1,15 +1,15 @@ package metadata import ( - "encoding/json" "fmt" - "io/ioutil" "log" "net" "net/http" + "strconv" "time" "git.g3e.fr/syonad/two/internal/netns" + "git.g3e.fr/syonad/two/pkg/db/kv" ) var data NoCloudData @@ -22,6 +22,48 @@ func getIP(r *http.Request) string { return ip } +func getFromDB(config Config) NoCloudData { + var netns_name string + var port int + var iface string + + db := kv.InitDB(kv.Config{Path: config.ConfFile}) + + metadata, _ := kv.GetFromDB(db, "metadata/"+config.VmName+"/meta-data") + userdata, _ := kv.GetFromDB(db, "metadata/"+config.VmName+"/user-data") + networkconfig, _ := kv.GetFromDB(db, "metadata/"+config.VmName+"/network-config") + vendordata, _ := kv.GetFromDB(db, "metadata/"+config.VmName+"/vendor-data") + + if config.Netns == "" { + netns_name, _ = kv.GetFromDB(db, "metadata/"+config.VmName+"/vpc") + } else { + netns_name = config.Netns + } + + if config.Iface == "" { + iface, _ = kv.GetFromDB(db, "metadata/"+config.VmName+"/bind_ip") + } else { + iface = config.Iface + } + + if config.Port == 0 { + sport, _ := kv.GetFromDB(db, "metadata/"+config.VmName+"/bind_port") + port, _ = strconv.Atoi(sport) + } else { + port = config.Port + } + + return NoCloudData{ + MetaData: metadata, + UserData: userdata, + NetworkConfig: networkconfig, + VendorData: vendordata, + NetNs: netns_name, + Iface: iface, + Port: port, + } +} + func rootHandler(w http.ResponseWriter, r *http.Request) { ip := getIP(r) path := r.URL.Path @@ -47,24 +89,17 @@ func rootHandler(w http.ResponseWriter, r *http.Request) { } func StartServer(config Config) { - if config.Netns != "" { - if err := netns.Enter(config.Netns); err != nil { + data = getFromDB(config) + + if data.NetNs != "" { + if err := netns.Enter(data.NetNs); err != nil { log.Fatalf("Impossible d'entrer dans le netns: %v", err) } } - raw, err := ioutil.ReadFile(config.File) - if err != nil { - log.Fatalf("Erreur de lecture du fichier: %v", err) - } - - if err := json.Unmarshal(raw, &data); err != nil { - log.Fatalf("Erreur de parsing JSON: %v", err) - } - http.HandleFunc("/", rootHandler) - address := fmt.Sprintf("%s:%d", config.Iface, config.Port) + address := fmt.Sprintf("%s:%d", data.Iface, data.Port) log.Printf("Serveur NoCloud démarré sur http://%s/", address) log.Fatal(http.ListenAndServe(address, nil)) } diff --git a/internal/metadata/struct.go b/internal/metadata/struct.go index bbf4bd7..9e95341 100644 --- a/internal/metadata/struct.go +++ b/internal/metadata/struct.go @@ -1,15 +1,20 @@ package metadata type NoCloudData struct { - MetaData string `json:"meta-data"` - UserData string `json:"user-data"` - NetworkConfig string `json:"network-config"` - VendorData string `json:"vendor-data"` + MetaData string + UserData string + NetworkConfig string + VendorData string + NetNs string + Iface string + Port int } type Config struct { - Netns string - File string - Iface string - Port int + Netns string + File string + Iface string + Port int + ConfFile string + VmName string } diff --git a/pkg/db/kv/getInDB.go b/pkg/db/kv/getInDB.go new file mode 100644 index 0000000..bfe7590 --- /dev/null +++ b/pkg/db/kv/getInDB.go @@ -0,0 +1,22 @@ +package kv + +import ( + "github.com/dgraph-io/badger/v4" +) + +func GetFromDB(db *badger.DB, key string) (string, error) { + var result string + + err := db.View(func(txn *badger.Txn) error { + item, err := txn.Get([]byte(key)) + if err != nil { + return err + } + return item.Value(func(val []byte) error { + result = string(val) + return nil + }) + }) + + return result, err +} -- 2.49.1 From f3898b288dfba0b70861097dfcc5ae5b20a4c5ea Mon Sep 17 00:00:00 2001 From: GnomeZworc Date: Thu, 1 Jan 2026 23:19:25 +0100 Subject: [PATCH 22/27] f-8: code: set correct config path and data path #8 Signed-off-by: GnomeZworc --- internal/metadata/server.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/internal/metadata/server.go b/internal/metadata/server.go index 831aa80..e44edaf 100644 --- a/internal/metadata/server.go +++ b/internal/metadata/server.go @@ -8,6 +8,7 @@ import ( "strconv" "time" + configuration "git.g3e.fr/syonad/two/internal/config/agent" "git.g3e.fr/syonad/two/internal/netns" "git.g3e.fr/syonad/two/pkg/db/kv" ) @@ -27,7 +28,9 @@ func getFromDB(config Config) NoCloudData { var port int var iface string - db := kv.InitDB(kv.Config{Path: config.ConfFile}) + conf_db, _ := configuration.LoadConfig(config.ConfFile) + + db := kv.InitDB(kv.Config{Path: conf_db.Database.Path}) metadata, _ := kv.GetFromDB(db, "metadata/"+config.VmName+"/meta-data") userdata, _ := kv.GetFromDB(db, "metadata/"+config.VmName+"/user-data") -- 2.49.1 From 7dbb508058f34037e50f314ef5739ccfd0f1a9e2 Mon Sep 17 00:00:00 2001 From: GnomeZworc Date: Thu, 1 Jan 2026 23:24:11 +0100 Subject: [PATCH 23/27] f-8: fix: close db for metadata Signed-off-by: GnomeZworc --- internal/metadata/server.go | 1 + 1 file changed, 1 insertion(+) diff --git a/internal/metadata/server.go b/internal/metadata/server.go index e44edaf..a72a52e 100644 --- a/internal/metadata/server.go +++ b/internal/metadata/server.go @@ -31,6 +31,7 @@ func getFromDB(config Config) NoCloudData { conf_db, _ := configuration.LoadConfig(config.ConfFile) db := kv.InitDB(kv.Config{Path: conf_db.Database.Path}) + defer db.Close() metadata, _ := kv.GetFromDB(db, "metadata/"+config.VmName+"/meta-data") userdata, _ := kv.GetFromDB(db, "metadata/"+config.VmName+"/user-data") -- 2.49.1 From 87879048338f86db1bf9035abeb1d279fec133dc Mon Sep 17 00:00:00 2001 From: GnomeZworc Date: Fri, 2 Jan 2026 22:51:15 +0100 Subject: [PATCH 24/27] f-8: code: add readonly feature in kv db #8 Signed-off-by: GnomeZworc --- pkg/db/kv/init.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pkg/db/kv/init.go b/pkg/db/kv/init.go index 18148df..cc09cb0 100644 --- a/pkg/db/kv/init.go +++ b/pkg/db/kv/init.go @@ -4,8 +4,9 @@ import ( "github.com/dgraph-io/badger/v4" ) -func InitDB(conf Config) *badger.DB { - opts := badger.DefaultOptions(conf.Path) +func InitDB(conf Config, readonly bool) *badger.DB { + opts := badger.DefaultOptions(conf.Path). + WithReadOnly(readonly) opts.Logger = nil opts.ValueLogFileSize = 10 << 20 // 10 Mo par fichier vlog opts.NumMemtables = 1 -- 2.49.1 From de7a678640394042ae0dfea4499cac777720ad79 Mon Sep 17 00:00:00 2001 From: GnomeZworc Date: Fri, 2 Jan 2026 22:51:53 +0100 Subject: [PATCH 25/27] f-8: fix: implemente readonly usage #8 Signed-off-by: GnomeZworc --- cmd/db/main.go | 2 +- cmd/meta_cli/main.go | 2 +- internal/metadata/server.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cmd/db/main.go b/cmd/db/main.go index 8b8d25e..1166f44 100644 --- a/cmd/db/main.go +++ b/cmd/db/main.go @@ -136,7 +136,7 @@ func main() { DB = kv.InitDB(kv.Config{ Path: conf.Database.Path, - }) + }, false) defer DB.Close() if len(args) < 1 { diff --git a/cmd/meta_cli/main.go b/cmd/meta_cli/main.go index 971c370..a357991 100644 --- a/cmd/meta_cli/main.go +++ b/cmd/meta_cli/main.go @@ -31,7 +31,7 @@ func main() { db := kv.InitDB(kv.Config{ Path: conf.Database.Path, - }) + }, false) defer db.Close() if *start { diff --git a/internal/metadata/server.go b/internal/metadata/server.go index a72a52e..3a63cdb 100644 --- a/internal/metadata/server.go +++ b/internal/metadata/server.go @@ -30,7 +30,7 @@ func getFromDB(config Config) NoCloudData { conf_db, _ := configuration.LoadConfig(config.ConfFile) - db := kv.InitDB(kv.Config{Path: conf_db.Database.Path}) + db := kv.InitDB(kv.Config{Path: conf_db.Database.Path}, true) defer db.Close() metadata, _ := kv.GetFromDB(db, "metadata/"+config.VmName+"/meta-data") -- 2.49.1 From 93a2bc6d330c42d7abef3fdb130f88ac57bf4505 Mon Sep 17 00:00:00 2001 From: GnomeZworc Date: Sun, 4 Jan 2026 17:42:26 +0100 Subject: [PATCH 26/27] f-8: systemd: change systemd file #8 Signed-off-by: GnomeZworc --- .../{metadata_service => }/metadata@.service | 2 +- systemd/metadata_start/run-metadata-in-netns.sh | 17 ----------------- 2 files changed, 1 insertion(+), 18 deletions(-) rename systemd/{metadata_service => }/metadata@.service (69%) delete mode 100644 systemd/metadata_start/run-metadata-in-netns.sh diff --git a/systemd/metadata_service/metadata@.service b/systemd/metadata@.service similarity index 69% rename from systemd/metadata_service/metadata@.service rename to systemd/metadata@.service index 54cf08a..626b97c 100644 --- a/systemd/metadata_service/metadata@.service +++ b/systemd/metadata@.service @@ -4,7 +4,7 @@ After=network.target [Service] Type=simple -ExecStart=/usr/local/bin/run-metadata-in-netns.sh %i +ExecStart=/opt/two/bin/metadata --vm %i [Install] WantedBy=multi-user.target \ No newline at end of file diff --git a/systemd/metadata_start/run-metadata-in-netns.sh b/systemd/metadata_start/run-metadata-in-netns.sh deleted file mode 100644 index 612dd18..0000000 --- a/systemd/metadata_start/run-metadata-in-netns.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/bash -set -e - -# Expects one argument: netns_bridge (e.g. vpc-00003_br-00002 or vpc1_br0) -arg="$1" -NETNS="${arg%%_*}" -ip_port="${arg#*_}" -IP="${ip_port%%-*}" -PORT="${ip_port#*-}" - -echo "start metadata ${NETNS} " - -exec ip netns exec "${NETNS}" \ - /usr/bin/metadata \ - -file "/opt/metadata/${arg}.conf" \ - -interface "${IP}" \ - -port "${PORT}" \ No newline at end of file -- 2.49.1 From 989264681426a5fd472a5c39f8d740c9ddaeae94 Mon Sep 17 00:00:00 2001 From: GnomeZworc Date: Sun, 4 Jan 2026 17:43:51 +0100 Subject: [PATCH 27/27] f-8: code: start/stop metadata service Signed-off-by: GnomeZworc --- cmd/meta_cli/main.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/cmd/meta_cli/main.go b/cmd/meta_cli/main.go index a357991..9782b5f 100644 --- a/cmd/meta_cli/main.go +++ b/cmd/meta_cli/main.go @@ -7,6 +7,7 @@ import ( configuration "git.g3e.fr/syonad/two/internal/config/agent" "git.g3e.fr/syonad/two/internal/load_db/nocloud" "git.g3e.fr/syonad/two/pkg/db/kv" + "git.g3e.fr/syonad/two/pkg/systemd" ) func main() { @@ -22,6 +23,8 @@ func main() { flag.Parse() + service, _ := systemd.New() + conf, err := configuration.LoadConfig(*conf_file) if err != nil { fmt.Println(err) @@ -43,7 +46,9 @@ func main() { Password: *password, SSHKEY: *ssh_key, }, db) + service.Start("metadata@" + *vm_name) } else if *stop { nocloud.UnLoadNoCloudInDB(*vm_name, db) + service.Stop("metadata@" + *vm_name) } } -- 2.49.1