diff --git a/internal/api/config_handlers.go b/internal/api/config_handlers.go index e10dcfd83..36a7380a6 100644 --- a/internal/api/config_handlers.go +++ b/internal/api/config_handlers.go @@ -24,24 +24,26 @@ import ( // ConfigHandlers handles configuration-related API endpoints type ConfigHandlers struct { - config *config.Config - persistence *config.ConfigPersistence - monitor *monitoring.Monitor - reloadFunc func() error - wsHub *websocket.Hub - setupTokens map[string]time.Time // Temporary tokens for setup script access - tokenMutex sync.RWMutex // Mutex for thread-safe token access + config *config.Config + persistence *config.ConfigPersistence + monitor *monitoring.Monitor + reloadFunc func() error + wsHub *websocket.Hub + guestMetadataHandler *GuestMetadataHandler + setupTokens map[string]time.Time // Temporary tokens for setup script access + tokenMutex sync.RWMutex // Mutex for thread-safe token access } // NewConfigHandlers creates a new ConfigHandlers instance -func NewConfigHandlers(cfg *config.Config, monitor *monitoring.Monitor, reloadFunc func() error, wsHub *websocket.Hub) *ConfigHandlers { +func NewConfigHandlers(cfg *config.Config, monitor *monitoring.Monitor, reloadFunc func() error, wsHub *websocket.Hub, guestMetadataHandler *GuestMetadataHandler) *ConfigHandlers { h := &ConfigHandlers{ - config: cfg, - persistence: config.NewConfigPersistence(cfg.DataPath), - monitor: monitor, - reloadFunc: reloadFunc, - wsHub: wsHub, - setupTokens: make(map[string]time.Time), + config: cfg, + persistence: config.NewConfigPersistence(cfg.DataPath), + monitor: monitor, + reloadFunc: reloadFunc, + wsHub: wsHub, + guestMetadataHandler: guestMetadataHandler, + setupTokens: make(map[string]time.Time), } // Clean up expired tokens periodically @@ -1599,6 +1601,15 @@ func (h *ConfigHandlers) HandleImportConfig(w http.ResponseWriter, r *http.Reque } } + // Reload guest metadata from disk + if h.guestMetadataHandler != nil { + if err := h.guestMetadataHandler.Reload(); err != nil { + log.Warn().Err(err).Msg("Failed to reload guest metadata after import") + } else { + log.Info().Msg("Reloaded guest metadata after import") + } + } + log.Info().Msg("Configuration imported successfully") w.WriteHeader(http.StatusOK) diff --git a/internal/api/guest_metadata.go b/internal/api/guest_metadata.go index 12b3ebb92..895679ff0 100644 --- a/internal/api/guest_metadata.go +++ b/internal/api/guest_metadata.go @@ -21,6 +21,11 @@ func NewGuestMetadataHandler(dataPath string) *GuestMetadataHandler { } } +// Reload reloads the guest metadata from disk +func (h *GuestMetadataHandler) Reload() error { + return h.store.Load() +} + // HandleGetMetadata retrieves metadata for a specific guest or all guests func (h *GuestMetadataHandler) HandleGetMetadata(w http.ResponseWriter, r *http.Request) { if r.Method != http.MethodGet { diff --git a/internal/api/router.go b/internal/api/router.go index 8eaecc0e1..0cd5e16c7 100644 --- a/internal/api/router.go +++ b/internal/api/router.go @@ -87,9 +87,9 @@ func (r *Router) setupRoutes() { // Create handlers alertHandlers := NewAlertHandlers(r.monitor) notificationHandlers := NewNotificationHandlers(r.monitor) - configHandlers := NewConfigHandlers(r.config, r.monitor, r.reloadFunc, r.wsHub) - updateHandlers := NewUpdateHandlers(r.updateManager) guestMetadataHandler := NewGuestMetadataHandler(r.config.DataPath) + configHandlers := NewConfigHandlers(r.config, r.monitor, r.reloadFunc, r.wsHub, guestMetadataHandler) + updateHandlers := NewUpdateHandlers(r.updateManager) // API routes r.mux.HandleFunc("/api/health", r.handleHealth) diff --git a/pulse-linux-amd64 b/pulse-linux-amd64 index e79a49ffe..1df712713 100755 Binary files a/pulse-linux-amd64 and b/pulse-linux-amd64 differ