two/internal/metadata/server.go
GnomeZworc 862406f041
f-25: use file for metadata
Signed-off-by: GnomeZworc <nicolas.boufidjeline@g3e.fr>
2026-04-29 00:48:55 +02:00

86 lines
1.9 KiB
Go

package metadata
import (
"fmt"
"log"
"net"
"net/http"
"os"
"path/filepath"
"strconv"
"strings"
"time"
"git.g3e.fr/syonad/two/internal/netns"
)
var data NoCloudData
func getIP(r *http.Request) string {
ip, _, err := net.SplitHostPort(r.RemoteAddr)
if err != nil {
return r.RemoteAddr
}
return ip
}
func readFile(dir, name string) string {
b, _ := os.ReadFile(filepath.Join(dir, name))
return strings.TrimRight(string(b), "\n")
}
func getFromFiles(config ServerConfig) NoCloudData {
dir := filepath.Join(config.RunDir, config.VmName)
port, _ := strconv.Atoi(readFile(dir, "bind_port"))
return NoCloudData{
MetaData: readFile(dir, "meta-data"),
UserData: readFile(dir, "user-data"),
NetworkConfig: readFile(dir, "network-config"),
VendorData: readFile(dir, "vendor-data"),
NetNs: readFile(dir, "vpc"),
Iface: readFile(dir, "bind_ip"),
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 ServerConfig) {
data = getFromFiles(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))
}