f-8: code: use db for database config #8
All checks were successful
Pre Release Workflow / set-release-target (push) Successful in 1s
Pre Release Workflow / build (agent, amd64, linux) (push) Successful in 1m5s
Pre Release Workflow / build (db, amd64, linux) (push) Successful in 1m48s
Pre Release Workflow / build (meta_cli, amd64, linux) (push) Successful in 1m27s
Pre Release Workflow / build (metadata, amd64, linux) (push) Successful in 1m28s
Pre Release Workflow / prerelease (push) Successful in 12s

Signed-off-by: GnomeZworc <nicolas.boufidjeline@g3e.fr>
This commit is contained in:
GnomeZworc 2025-12-30 22:31:19 +01:00
commit d2bc7e5b7a
Signed by: nicolas.boufideline
GPG key ID: 4406BBBF8845D632
4 changed files with 92 additions and 33 deletions

View file

@ -2,29 +2,26 @@ package main
import ( import (
"flag" "flag"
"log"
"git.g3e.fr/syonad/two/internal/metadata" "git.g3e.fr/syonad/two/internal/metadata"
) )
var ( var (
iface = flag.String("interface", "0.0.0.0", "Interface IP à écouter") iface = flag.String("interface", "0.0.0.0", "Interface IP à écouter")
port = flag.Int("port", 8080, "Port à utiliser") port = flag.Int("port", 0, "Port à utiliser")
file = flag.String("file", "", "Fichier JSON contenant les données NoCloud")
netns_name = flag.String("netns", "", "Network namespace à 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() { func main() {
flag.Parse() flag.Parse()
if *file == "" {
log.Fatal("Vous devez spécifier un fichier via --file")
}
metadata.StartServer(metadata.Config{ metadata.StartServer(metadata.Config{
Netns: *netns_name, Netns: *netns_name,
File: *file, Iface: *iface,
Iface: *iface, Port: *port,
Port: *port, ConfFile: *conf_file,
VmName: *vm_name,
}) })
} }

View file

@ -1,15 +1,15 @@
package metadata package metadata
import ( import (
"encoding/json"
"fmt" "fmt"
"io/ioutil"
"log" "log"
"net" "net"
"net/http" "net/http"
"strconv"
"time" "time"
"git.g3e.fr/syonad/two/internal/netns" "git.g3e.fr/syonad/two/internal/netns"
"git.g3e.fr/syonad/two/pkg/db/kv"
) )
var data NoCloudData var data NoCloudData
@ -22,6 +22,48 @@ func getIP(r *http.Request) string {
return ip 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) { func rootHandler(w http.ResponseWriter, r *http.Request) {
ip := getIP(r) ip := getIP(r)
path := r.URL.Path path := r.URL.Path
@ -47,24 +89,17 @@ func rootHandler(w http.ResponseWriter, r *http.Request) {
} }
func StartServer(config Config) { func StartServer(config Config) {
if config.Netns != "" { data = getFromDB(config)
if err := netns.Enter(config.Netns); err != nil {
if data.NetNs != "" {
if err := netns.Enter(data.NetNs); err != nil {
log.Fatalf("Impossible d'entrer dans le netns: %v", err) 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) 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.Printf("Serveur NoCloud démarré sur http://%s/", address)
log.Fatal(http.ListenAndServe(address, nil)) log.Fatal(http.ListenAndServe(address, nil))
} }

View file

@ -1,15 +1,20 @@
package metadata package metadata
type NoCloudData struct { type NoCloudData struct {
MetaData string `json:"meta-data"` MetaData string
UserData string `json:"user-data"` UserData string
NetworkConfig string `json:"network-config"` NetworkConfig string
VendorData string `json:"vendor-data"` VendorData string
NetNs string
Iface string
Port int
} }
type Config struct { type Config struct {
Netns string Netns string
File string File string
Iface string Iface string
Port int Port int
ConfFile string
VmName string
} }

22
pkg/db/kv/getInDB.go Normal file
View file

@ -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
}