R-1288: a restore of a set-aside unit sets the replaced install's unit aside at once, with no alarm. R-1282: the later media restart time is stored and resumed at start, once. Red-proved. Commit only.
gates / gates (push) Successful in 1m26s

This commit is contained in:
admin committed 2026-10-25 21:37:55 +01:00
1 parent a79a292d72
commit b5863a96eb
8 files changed
+274 -13

No files matched your search

+53 -12
View File
@@ -250,6 +250,53 @@ func nextMediaLater(now time.Time) time.Time {
return t
}
// mediaLaterRestart runs the „later" restart (tests replace it).
var mediaLaterRestart = func(s *Server, why string) { s.restartMediaApps(why) }
// scheduleMediaLater arms the one „later" timer for at (a time already past fires at once); when it fires, the stored
// time is cleared, so it runs once.
func (s *Server) scheduleMediaLater(at time.Time) {
s.mediaMu.Lock()
defer s.mediaMu.Unlock()
if s.mediaLaterTmr != nil {
s.mediaLaterTmr.Stop()
}
s.mediaLaterAt = at
d := time.Until(at)
if d < 0 {
d = 0
}
s.mediaLaterTmr = time.AfterFunc(d, func() {
mediaLaterRestart(s, "the household's „later\"")
s.mediaMu.Lock()
s.mediaLaterAt = time.Time{}
s.mediaMu.Unlock()
if s.settings != nil {
if err := s.settings.SetMediaRestartLater(time.Time{}); err != nil {
s.logger.Printf("[WARN] [media] clearing the stored „later\" media restart: %v", err)
}
}
})
}
// ResumeMediaLater (R-1282, main calls it at start) re-arms a „later" media restart the household asked for before
// this controller started: at its time, or at once when that time passed while the controller was down. It runs once.
func (s *Server) ResumeMediaLater() {
if s.settings == nil {
return
}
at := s.settings.GetMediaRestartLater()
if at.IsZero() {
return
}
if time.Until(at) <= 0 {
s.logger.Printf("[INFO] [media] the household's „later\" media restart (%s) passed while the controller was down — it runs now (R-1282)", at.Format(time.RFC3339))
} else {
s.logger.Printf("[INFO] [media] the household's „later\" media restart is kept from before the restart: %s (R-1282)", at.Format(time.RFC3339))
}
s.scheduleMediaLater(at)
}
// handleMediaRestart: POST /api/storage/media/restart {"when":"now"|"later","force":bool}.
func (s *Server) handleMediaRestart(w http.ResponseWriter, r *http.Request) {
var req struct {
@@ -262,19 +309,13 @@ func (s *Server) handleMediaRestart(w http.ResponseWriter, r *http.Request) {
}
if req.When == "later" {
at := nextMediaLater(time.Now())
s.mediaMu.Lock()
if s.mediaLaterTmr != nil {
s.mediaLaterTmr.Stop()
if s.settings != nil {
if err := s.settings.SetMediaRestartLater(at); err != nil {
s.logger.Printf("[WARN] [media] storing the „later\" media restart time: %v — a controller restart before then forgets it", err)
}
}
s.mediaLaterAt = at
s.mediaLaterTmr = time.AfterFunc(time.Until(at), func() {
s.restartMediaApps("the household's „later\"")
s.mediaMu.Lock()
s.mediaLaterAt = time.Time{}
s.mediaMu.Unlock()
})
s.mediaMu.Unlock()
s.logger.Printf("[INFO] [media] media restart scheduled for %s (the household's „later\"; a controller restart forgets it, the notice stays)", at.Format(time.RFC3339))
s.scheduleMediaLater(at)
s.logger.Printf("[INFO] [media] media restart scheduled for %s (the household's „later\"; stored — a controller restart keeps it, R-1282)", at.Format(time.RFC3339))
writeDiskJSON(w, http.StatusOK, true, "", map[string]string{"later_at": at.Format("2006-01-02 15:04")})
return
}