diff --git a/cmd/safesightd/main.go b/cmd/safesightd/main.go index b2baa5a..05fe142 100644 --- a/cmd/safesightd/main.go +++ b/cmd/safesightd/main.go @@ -6,6 +6,7 @@ import ( "net/http" "os" "path/filepath" + "strconv" "safesight-control/internal/api" "safesight-control/internal/config" @@ -75,9 +76,14 @@ func main() { log.Printf("load persisted tasks: %v", err) } alarmCollector := service.NewAlarmCollector(store.DB(), agentClient, regSvc) - if cfg.AlarmRetentionDays > 0 { - alarmCollector.SetRetention(cfg.AlarmRetentionDays) + // Load retention from DB (UI-persisted), fallback to config file + retention := cfg.AlarmRetentionDays + if persisted, err := storage.LoadSetting(store.DB(), "alarm_retention_days"); err == nil && persisted != "" { + if v, err := strconv.Atoi(persisted); err == nil && v >= 0 { + retention = v + } } + alarmCollector.SetRetention(retention) alarmCollector.Start() tplSvc := service.NewTemplateService(cfg) h := api.NewHandler(discoSvc, regSvc, agentClient, taskSvc, tplSvc) diff --git a/internal/storage/migrate.go b/internal/storage/migrate.go index 5b6ae87..19ffd3e 100644 --- a/internal/storage/migrate.go +++ b/internal/storage/migrate.go @@ -480,6 +480,10 @@ CREATE TABLE IF NOT EXISTS config_versions ( config_id TEXT NOT NULL DEFAULT '', config_json TEXT NOT NULL, created_at TEXT NOT NULL +); +CREATE TABLE IF NOT EXISTS settings ( + key TEXT PRIMARY KEY, + value TEXT NOT NULL DEFAULT '' ) `) return err diff --git a/internal/storage/settings.go b/internal/storage/settings.go new file mode 100644 index 0000000..2efeb63 --- /dev/null +++ b/internal/storage/settings.go @@ -0,0 +1,15 @@ +package storage + +import "database/sql" + +func LoadSetting(db *sql.DB, key string) (string, error) { + if db == nil { + return "", nil + } + var value string + err := db.QueryRow("SELECT value FROM settings WHERE key = ?", key).Scan(&value) + if err == sql.ErrNoRows { + return "", nil + } + return value, err +} diff --git a/internal/web/ui.go b/internal/web/ui.go index 11f4e7a..53a8305 100644 --- a/internal/web/ui.go +++ b/internal/web/ui.go @@ -4281,12 +4281,18 @@ func (u *UI) actionSystemConfig(w http.ResponseWriter, r *http.Request) { if days, err := strconv.Atoi(strings.TrimSpace(r.FormValue("alarm_retention_days"))); err == nil && days >= 0 { if u.alarmCollector != nil { u.alarmCollector.SetRetention(days) - // Trigger immediate cleanup with new retention go u.alarmCollector.RunCleanup() } - msg := "告警保留已设为 " + strconv.Itoa(days) + " 天,立即生效" + // Persist to DB so it survives restart + if strings.TrimSpace(u.dbPath) != "" { + if store, err := storage.OpenSQLite(u.dbPath); err == nil { + store.DB().Exec("INSERT OR REPLACE INTO settings(key,value) VALUES('alarm_retention_days',?)", strconv.Itoa(days)) + store.Close() + } + } + msg := "告警保留已设为 " + strconv.Itoa(days) + " 天,已持久化" if days == 0 { - msg = "告警将永久保留,立即生效" + msg = "告警将永久保留,已持久化" } u.renderSystemPage(w, r, http.StatusOK, msg, "") return diff --git a/safesightd-linux-arm64 b/safesightd-linux-arm64 index 0d36f30..9be1b35 100644 Binary files a/safesightd-linux-arm64 and b/safesightd-linux-arm64 differ