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