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