Page:
Agent Persistance
No results
1
Agent Persistance
GnomeZworc edited this page 2025-04-24 14:16:31 +02:00
Table of Contents
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
Belong to
This project belong to Nicolas Boufidjeline (nicolas.boufidjeline@g3e.fr)