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

Persistance des data

package vm

import (
	"encoding/json"
	"fmt"
	"io/ioutil"
	"os"
	"path/filepath"
)

const defaultStateDir = "/var/lib/cloud-agent/vms"

type VMInstance struct {
	ID        string
	Pid       int
	QMPSocket string
	HMPSocket string
}

func (vm *VMInstance) SaveState(stateDir string) error {
	if stateDir == "" {
		stateDir = defaultStateDir
	}
	if err := os.MkdirAll(stateDir, 0755); err != nil {
		return err
	}

	file := filepath.Join(stateDir, vm.ID+".json")
	data, err := json.MarshalIndent(vm, "", "  ")
	if err != nil {
		return err
	}
	return os.WriteFile(file, data, 0644)
}

func LoadVMState(path string) (*VMInstance, error) {
	data, err := os.ReadFile(path)
	if err != nil {
		return nil, err
	}
	var vm VMInstance
	if err := json.Unmarshal(data, &vm); err != nil {
		return nil, err
	}
	return &vm, nil
}

func LoadAllVMs(stateDir string) ([]*VMInstance, error) {
	if stateDir == "" {
		stateDir = defaultStateDir
	}
	files, err := filepath.Glob(filepath.Join(stateDir, "*.json"))
	if err != nil {
		return nil, err
	}

	var vms []*VMInstance
	for _, file := range files {
		vm, err := LoadVMState(file)
		if err != nil {
			fmt.Printf("⚠️  Erreur chargement VM %s: %v\n", file, err)
			continue
		}
		vms = append(vms, vm)
	}
	return vms, nil
}
vm, _ := StartVM(cfg)
_ = vm.SaveState("") // "" = default dir
vm.StartMonitorLoop()

Restaurer toutes les VMs au démarrage :

func RestoreVMsOnStartup() {
	vms, err := LoadAllVMs("")
	if err != nil {
		log.Fatalf("Failed to load saved VMs: %v", err)
	}
	for _, vm := range vms {
		if vm.IsAlive() {
			vm.StartMonitorLoop()
			log.Printf("✅ Reattached to running VM: %s (PID %d)", vm.ID, vm.Pid)
		} else {
			log.Printf("⚠️  VM %s is dead, needs cleanup or recovery", vm.ID)
		}
	}
}

il va manquer une fonction RemoveState(vmID) après un CleanupVM