From abb8c4f0b5b50a60cf8a365caebd50277e12a906 Mon Sep 17 00:00:00 2001 From: Siyuan Date: Wed, 8 Oct 2025 10:04:58 +0000 Subject: [PATCH] revert to default config if config is invalid --- config.go | 14 +++++++++++--- network.go | 31 +++++++++++++++++++++++++++---- 2 files changed, 38 insertions(+), 7 deletions(-) diff --git a/config.go b/config.go index 1694244f..593b635c 100644 --- a/config.go +++ b/config.go @@ -246,17 +246,25 @@ func LoadConfig() { } func SaveConfig() error { + return saveConfig(configPath) +} + +func SaveBackupConfig() error { + return saveConfig(configPath + ".bak") +} + +func saveConfig(path string) error { configLock.Lock() defer configLock.Unlock() - logger.Trace().Str("path", configPath).Msg("Saving config") + logger.Trace().Str("path", path).Msg("Saving config") // fixup old keyboard layout value if config.KeyboardLayout == "en_US" { config.KeyboardLayout = "en-US" } - file, err := os.Create(configPath) + file, err := os.Create(path) if err != nil { return fmt.Errorf("failed to create config file: %w", err) } @@ -272,7 +280,7 @@ func SaveConfig() error { return fmt.Errorf("failed to wite config: %w", err) } - logger.Info().Str("path", configPath).Msg("config saved") + logger.Info().Str("path", path).Msg("config saved") return nil } diff --git a/network.go b/network.go index a2518adb..70936a89 100644 --- a/network.go +++ b/network.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/jetkvm/kvm/internal/confparser" "github.com/jetkvm/kvm/internal/mdns" "github.com/jetkvm/kvm/internal/network/types" "github.com/jetkvm/kvm/pkg/nmlite" @@ -73,9 +74,27 @@ func networkStateChanged(iface string, state *types.InterfaceState) { } } +func validateNetworkConfig() { + err := confparser.SetDefaultsAndValidate(config.NetworkConfig) + if err == nil { + return + } + + networkLogger.Error().Err(err).Msg("failed to validate config, reverting to default config") + SaveBackupConfig() + + // do not use a pointer to the default config + // it has been already changed during LoadConfig + config.NetworkConfig = &(types.NetworkConfig{}) + SaveConfig() +} + func initNetwork() error { ensureConfigLoaded() + // validate the config, if it's invalid, revert to the default config and save the backup + validateNetworkConfig() + networkManager = nmlite.NewNetworkManager(context.Background(), networkLogger) networkManager.SetOnInterfaceStateChange(networkStateChanged) if err := networkManager.AddInterface(NetIfName, config.NetworkConfig); err != nil { @@ -97,13 +116,18 @@ func rpcGetNetworkSettings() *RpcNetworkSettings { func rpcSetNetworkSettings(settings RpcNetworkSettings) (*RpcNetworkSettings, error) { netConfig := settings.ToNetworkConfig() - networkLogger.Debug().Interface("newConfig", netConfig).Interface("config", settings).Msg("setting new config") + l := networkLogger.With(). + Str("interface", NetIfName). + Interface("newConfig", netConfig). + Logger() + + l.Debug().Msg("setting new config") s := networkManager.SetInterfaceConfig(NetIfName, netConfig) if s != nil { return nil, s } - networkLogger.Debug().Interface("newConfig", netConfig).Interface("config", settings).Msg("new config") + l.Debug().Msg("new config applied") newConfig, err := networkManager.GetInterfaceConfig(NetIfName) if err != nil { @@ -111,8 +135,7 @@ func rpcSetNetworkSettings(settings RpcNetworkSettings) (*RpcNetworkSettings, er } config.NetworkConfig = newConfig - networkLogger.Debug().Interface("newConfig", newConfig).Interface("config", settings).Msg("saving config") - + l.Debug().Msg("saving new config") if err := SaveConfig(); err != nil { return nil, err }