From 5338799c9fa5158031ebae53c6e64254175e7412 Mon Sep 17 00:00:00 2001 From: Shulhan Date: Fri, 1 Aug 2025 02:21:20 +0700 Subject: all: record and display the history of failed scan In the main Reports struct, we record the failed ScanReport in separate slices. Those slices then displayed on the main page under "Fail history" section. --- _www/index.tmpl | 36 ++++++++++++++++++++++++++---------- reports.go | 23 +++++++++++++++++++++++ server.go | 24 ++++++++++++++++++++---- worker.go | 11 ++--------- 4 files changed, 71 insertions(+), 23 deletions(-) diff --git a/_www/index.tmpl b/_www/index.tmpl index f7cebda..cf710db 100644 --- a/_www/index.tmpl +++ b/_www/index.tmpl @@ -7,20 +7,36 @@

{{.Title}}

- {{ range.Services }} -
+ +

Service status

+
+ {{ range.Services }}
- {{.Name}} - {{if .Last.Success}} - OK - {{else}} - FAIL +
+ {{.Name}} + {{if .Last.Success}} + OK + {{else}} + FAIL + {{ end }} +
+ {{if not .Last.Success}} +
{{.Last.At}}: {{ .Last.Error }}
{{ end }}
- {{if not .Last.Success}} -
{{.Last.At}}: {{ .Last.Error }}
{{ end }}
- {{ end }} + +

Fail history

+
+ {{ $list := reverse .Fail }} + {{ range $list }} +
+ {{ .Name }} + {{ .At }} + {{ .Error }} +
+ {{ end }} +
diff --git a/reports.go b/reports.go index 91ff2df..fdf472e 100644 --- a/reports.go +++ b/reports.go @@ -3,8 +3,31 @@ package lilin +import "sync" + +const failKeepSize = 600 +const failMax = failKeepSize + (failKeepSize / 3) + // Reports contains the report for all services. type Reports struct { Services map[string]*ServiceReport Title string + Fail []ScanReport + sync.Mutex +} + +// Store the service scan report. +func (reports *Reports) Store(scanReport ScanReport) { + reports.Lock() + var svcReport = reports.Services[scanReport.Name] + svcReport.Store(scanReport) + if !scanReport.Success { + reports.Fail = append(reports.Fail, scanReport) + if len(reports.Fail) >= failMax { + var start = len(reports.Fail) - failKeepSize + copy(reports.Fail, reports.Fail[start:]) + reports.Fail = reports.Fail[:failKeepSize-1] + } + } + reports.Unlock() } diff --git a/server.go b/server.go index 0ff4e2a..7943b1b 100644 --- a/server.go +++ b/server.go @@ -58,7 +58,22 @@ func NewServer(opts ServerOptions) (srv *Server, err error) { return nil, fmt.Errorf(`%s: %w`, logp, err) } - srv.pageIndexTmpl, err = template.ParseFS(wwwFS, `_www/index.tmpl`) + srv.pageIndexTmpl = template.New("index.html").Funcs(template.FuncMap{ + `reverse`: func(rev []ScanReport) (ver []ScanReport) { + var size = len(rev) + ver = make([]ScanReport, size) + for x := 0; x < len(rev); x++ { + ver[size-x-1] = rev[x] + } + return ver + }, + }) + var tmplraw []byte + tmplraw, err = wwwFS.ReadFile(`_www/index.tmpl`) + if err != nil { + return nil, err + } + srv.pageIndexTmpl, err = srv.pageIndexTmpl.Parse(string(tmplraw)) if err != nil { return nil, err } @@ -154,15 +169,16 @@ func (srv *Server) update() { c = 0 srv.pageIndexMutex.Lock() - srv.worker.reportsMutex.Lock() + srv.worker.Reports.Lock() srv.pageIndexBody.Reset() - err = srv.pageIndexTmpl.Execute(&srv.pageIndexBody, &srv.worker.Reports) + err = srv.pageIndexTmpl.Execute(&srv.pageIndexBody, + &srv.worker.Reports) if err != nil { log.Printf(`update: pageIndexTmpl: %s`, err) } - srv.worker.reportsMutex.Unlock() + srv.worker.Reports.Unlock() srv.pageIndexMutex.Unlock() } } diff --git a/worker.go b/worker.go index 48c78c6..83f91da 100644 --- a/worker.go +++ b/worker.go @@ -7,7 +7,6 @@ import ( "os" "path/filepath" "strings" - "sync" "git.sr.ht/~shulhan/pakakeh.go/lib/ini" ) @@ -19,8 +18,7 @@ type worker struct { reportq chan ScanReport - Reports Reports - reportsMutex sync.Mutex + Reports Reports } func newWorker(configDir string) (wrk *worker, err error) { @@ -114,12 +112,7 @@ func (wrk *worker) start(updateq chan<- struct{}) { if !ok { break } - - wrk.reportsMutex.Lock() - var svcReport = wrk.Reports.Services[scanReport.Name] - svcReport.Store(scanReport) - wrk.reportsMutex.Unlock() - + wrk.Reports.Store(scanReport) updateq <- struct{}{} } } -- cgit v1.3