mirror of
https://github.com/speatzle/nfsense.git
synced 2025-05-10 18:38:22 +00:00
52 lines
1.4 KiB
Go
52 lines
1.4 KiB
Go
package config
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
|
|
"golang.org/x/exp/slog"
|
|
"nfsense.net/nfsense/internal/definitions/config"
|
|
)
|
|
|
|
// ApplyPendingChanges Takes all pending Changes and Tries to Apply them using the Registered Apply Functions.
|
|
// In Case of error it Attempts to Revert to the Current Config
|
|
func (m *ConfigManager) ApplyPendingChanges() error {
|
|
slog.Info("Applying Pending Changes...")
|
|
for _, fn := range m.applyFunctions {
|
|
err := fn(*m.currentConfig, *m.pendingConfig)
|
|
if err != nil {
|
|
slog.Error("Applying Pending Changes", "err", err)
|
|
err2 := revertToCurrent(m)
|
|
if err2 != nil {
|
|
slog.Error("Reverting Error", "err", err2)
|
|
return fmt.Errorf("Apply Error %w; Reverting Error %w", err, err2)
|
|
}
|
|
return err
|
|
}
|
|
}
|
|
m.currentConfig = m.pendingConfig.Clone()
|
|
|
|
err := m.saveConfig(m.currentConfigFilePath, m.pendingConfig)
|
|
if err != nil {
|
|
return fmt.Errorf("Save Current Config: %w", err)
|
|
}
|
|
err = os.Remove(m.pendingConfigFilePath)
|
|
if err != nil {
|
|
return fmt.Errorf("Delete Pending Config: %w", err)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func revertToCurrent(m *ConfigManager) error {
|
|
for _, fn := range m.applyFunctions {
|
|
err := fn(*m.pendingConfig, *m.currentConfig)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (m *ConfigManager) RegisterApplyFunction(fn func(currentConfig config.Config, pendingConfig config.Config) error) {
|
|
m.applyFunctions = append(m.applyFunctions, fn)
|
|
}
|