1 Agent Metadata
GnomeZworc edited this page 2025-04-24 14:16:31 +02:00

Metadata server

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)
}
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
}