v0.295.0: a box that was off at its backup time catches up once (R-871, decision 109); the missed-backup banner (decision 110); a late daily timer after a host suspend is skipped
gates / gates (push) Successful in 31s

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS
This commit is contained in:
2026-10-05 09:27:16 +02:00
parent e730a629fd
commit 635c33d381
24 changed files with 2074 additions and 18 deletions
+9
View File
@@ -7,6 +7,8 @@ import (
"encoding/hex"
"fmt"
"gitea.dooplex.hu/admin/felhom-controller/internal/family"
"gitea.dooplex.hu/admin/felhom-controller/internal/metrics"
"gitea.dooplex.hu/admin/felhom-controller/internal/nightchain"
"html/template"
"io"
"io/fs"
@@ -36,6 +38,10 @@ import (
)
type Server struct {
// R-871: the missed-backup banner's inputs (SetMissedBackupBanner); nil = no banner.
nightLedger *nightchain.Ledger
metricsRecord *metrics.MetricsStore
cfg *config.Config
stackMgr *stacks.Manager
cpuCollector *system.CPUCollector
@@ -765,6 +771,8 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
case path == "/backup/shares/place" && r.Method == http.MethodPost:
s.sharesPlaceHandler(w, r)
// Controller-driven escrow ceremony wizard (v0.127.0): the customer-facing R flow.
case path == "/backups/missed-banner/dismiss" && r.Method == http.MethodPost:
s.missedBackupBannerDismissHandler(w, r)
case path == "/backup/escrow/banner/dismiss" && r.Method == http.MethodPost:
s.escrowBannerDismissHandler(w, r)
case path == "/backup/escrow" && r.Method == http.MethodGet:
@@ -1005,6 +1013,7 @@ func (s *Server) executeTemplate(w http.ResponseWriter, r *http.Request, name st
// through here (TestI18nDirectRenderPagesHaveNoAdminChrome); the session check inside is a second
// fence for the guest share page, which has no admin session.
s.addEscrowBanner(data, r)
s.addMissedBackupBanner(data, r) // R-871 (decision 110)
lang := s.langFor(r)
s.addLanguageData(data, r, lang)
var buf bytes.Buffer