add metadata info

Signed-off-by: GnomeZworc <nicolas.boufidjeline@g3e.fr>
GnomeZworc 2025-04-24 01:10:36 +02:00
commit f8bd1aa345
Signed by: nicolas.boufideline
GPG key ID: 4406BBBF8845D632
2 changed files with 122 additions and 1 deletions

@ -31,3 +31,4 @@ Tout cela serait lancer depuis une api:
- [Les vms](./agent/instance/Home.md)
- [Serveur http](./agent/http/Home.md)
- [Persistance](./agent/persistance/Home.md)
- [Metadata](./agent/metadata/Home.md)

120
agent/metadata/Home.md Normal file

@ -0,0 +1,120 @@
# Metadata server
```go
package metadata
import (
"fmt"
"net"
"net/http"
"strings"
"sync"
)
type Metadata struct {
Name string
SSHKeys []string
}
type Server struct {
metadata Metadata
listener net.Listener
server *http.Server
mu sync.Mutex
port int
}
func New(metadata Metadata, port int) *Server {
return &Server{
metadata: metadata,
port: port,
}
}
func (s *Server) Start() error {
s.mu.Lock()
defer s.mu.Unlock()
addr := fmt.Sprintf("127.0.0.1:%d", s.port)
ln, err := net.Listen("tcp", addr)
if err != nil {
return err
}
s.listener = ln
mux := http.NewServeMux()
mux.HandleFunc("/meta-data", s.handleMetaData)
mux.HandleFunc("/user-data", s.handleUserData)
s.server = &http.Server{
Handler: mux,
}
go s.server.Serve(ln)
return nil
}
func (s *Server) Stop() error {
s.mu.Lock()
defer s.mu.Unlock()
if s.server != nil {
return s.server.Close()
}
return nil
}
func (s *Server) handleMetaData(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "instance-id: %s\n", s.metadata.Name)
fmt.Fprintf(w, "local-hostname: %s\n", s.metadata.Name)
}
func (s *Server) handleUserData(w http.ResponseWriter, r *http.Request) {
keys := strings.Join(s.metadata.SSHKeys, "\n - ")
userData := fmt.Sprintf(`#cloud-config
ssh_authorized_keys:
- %s
`, keys)
fmt.Fprint(w, userData)
}
```
```go
type VM struct {
Name string
SSHKeys []string
MetaServer *metadata.Server
MetaPort int
// ... autres champs comme PID, TAP name, etc.
}
func StartVM(vm *VM) error {
meta := metadata.Metadata{
Name: vm.Name,
SSHKeys: vm.SSHKeys,
}
metaSrv := metadata.New(meta, vm.MetaPort)
err := metaSrv.Start()
if err != nil {
return fmt.Errorf("metadata start failed: %w", err)
}
vm.MetaServer = metaSrv
// suite du démarrage de la VM : QEMU, netns, redirection iptables...
return nil
}
func StopVM(vm *VM) error {
// arrêter QEMU, nettoyer TAP, etc...
if vm.MetaServer != nil {
err := vm.MetaServer.Stop()
if err != nil {
fmt.Printf("Erreur arrêt metadata VM %s: %v\n", vm.Name, err)
}
}
return nil
}
```