two/internal/metadata/server.go
GnomeZworc 7dbb508058
f-8: fix: close db for metadata
Signed-off-by: GnomeZworc <nicolas.boufidjeline@g3e.fr>
2026-01-01 23:24:11 +01:00

109 lines
2.5 KiB
Go

package metadata
import (
"fmt"
"log"
"net"
"net/http"
"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"
)
var data NoCloudData
func getIP(r *http.Request) string {
ip, _, err := net.SplitHostPort(r.RemoteAddr)
if err != nil {
return r.RemoteAddr
}
return ip
}
func getFromDB(config Config) NoCloudData {
var netns_name string
var port int
var iface string
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")
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
timestamp := time.Now().Format(time.RFC3339)
userAgent := r.Header.Get("User-Agent")
log.Printf("[%s] Requête IP %s vers %s | User-Agent: %s", timestamp, ip, path, userAgent)
w.Header().Set("Content-Type", "text/yaml")
switch path {
case "/user-data":
fmt.Fprint(w, data.UserData)
case "/meta-data":
fmt.Fprint(w, data.MetaData)
case "/network-config":
fmt.Fprint(w, data.NetworkConfig)
case "/vendor-data":
fmt.Fprint(w, data.VendorData)
default:
http.NotFound(w, r)
}
}
func StartServer(config Config) {
data = getFromDB(config)
if data.NetNs != "" {
if err := netns.Enter(data.NetNs); err != nil {
log.Fatalf("Impossible d'entrer dans le netns: %v", err)
}
}
http.HandleFunc("/", rootHandler)
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))
}