From a569cb43f26efea5a5f4c258c90d9d6e3b8189fe Mon Sep 17 00:00:00 2001 From: GnomeZworc Date: Wed, 3 Dec 2025 23:54:12 +0100 Subject: [PATCH] start: init metadata serveur Signed-off-by: GnomeZworc --- cmd/metadata/main.go | 5 +++ go.mod | 2 +- internal/metadata/server.go | 75 +++++++++++++++++++++++++++++++++++++ internal/metadata/struct.go | 8 ++++ 4 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 cmd/metadata/main.go create mode 100644 internal/metadata/server.go create mode 100644 internal/metadata/struct.go diff --git a/cmd/metadata/main.go b/cmd/metadata/main.go new file mode 100644 index 0000000..e97962b --- /dev/null +++ b/cmd/metadata/main.go @@ -0,0 +1,5 @@ +package main + +func main() { + metadata.startServer() +} diff --git a/go.mod b/go.mod index 8978629..3721544 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,3 @@ -module git.g3e.fr/syonad +module git.g3e.fr/syonad/two go 1.23.8 diff --git a/internal/metadata/server.go b/internal/metadata/server.go new file mode 100644 index 0000000..d7fc2dd --- /dev/null +++ b/internal/metadata/server.go @@ -0,0 +1,75 @@ +package metadata + +import ( + "encoding/json" + "flag" + "fmt" + "io/ioutil" + "log" + "net" + "net/http" + "time" +) + +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") +) + +func getIP(r *http.Request) string { + ip, _, err := net.SplitHostPort(r.RemoteAddr) + if err != nil { + return r.RemoteAddr + } + return ip +} + +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() { + flag.Parse() + + if *file == "" { + log.Fatal("Vous devez spécifier un fichier via --file") + } + + raw, err := ioutil.ReadFile(*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", *iface, *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 new file mode 100644 index 0000000..f1edf18 --- /dev/null +++ b/internal/metadata/struct.go @@ -0,0 +1,8 @@ +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"` +}