aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--_www/index.tmpl36
-rw-r--r--reports.go23
-rw-r--r--server.go24
-rw-r--r--worker.go11
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 @@
</head>
<body>
<h2>{{.Title}}</h2>
- {{ range.Services }}
- <div>
+
+ <h3>Service status</h3>
+ <div class="service-status">
+ {{ range.Services }}
<div>
- <span>{{.Name}}</span>
- {{if .Last.Success}}
- <span class="success"> OK </span>
- {{else}}
- <span class="fail"> FAIL </span>
+ <div>
+ <span>{{.Name}}</span>
+ {{if .Last.Success}}
+ <span class="success"> OK </span>
+ {{else}}
+ <span class="fail"> FAIL </span>
+ {{ end }}
+ </div>
+ {{if not .Last.Success}}
+ <div>{{.Last.At}}: {{ .Last.Error }}</div>
{{ end }}
</div>
- {{if not .Last.Success}}
- <div>{{.Last.At}}: {{ .Last.Error }}</div>
{{ end }}
</div>
- {{ end }}
+
+ <h3>Fail history</h3>
+ <div class="fail-history">
+ {{ $list := reverse .Fail }}
+ {{ range $list }}
+ <div class="fail-history-item">
+ <span class="name">{{ .Name }}</span>
+ <span class="at">{{ .At }}</span>
+ <span class="error">{{ .Error }}</span>
+ </div>
+ {{ end }}
+ </div>
</body>
</html>
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{}{}
}
}