aboutsummaryrefslogtreecommitdiff
path: root/server.go
diff options
context:
space:
mode:
authorShulhan <ms@kilabit.info>2025-08-06 10:05:54 +0700
committerShulhan <ms@kilabit.info>2025-08-06 23:59:32 +0700
commit6884d4def670bb7c27bc44cdb1d2992b514cc699 (patch)
tree5ffce25cf4b1480ee6b9ff02705cd2469389e79b /server.go
parent5338799c9fa5158031ebae53c6e64254175e7412 (diff)
downloadlilin-6884d4def670bb7c27bc44cdb1d2992b514cc699.tar.xz
all: add "-dev" option for running lilin
The "-dev" flag enable running in development mode, where each refresh will re-read, parse, and execute the template.
Diffstat (limited to 'server.go')
-rw-r--r--server.go76
1 files changed, 59 insertions, 17 deletions
diff --git a/server.go b/server.go
index 7943b1b..1741c27 100644
--- a/server.go
+++ b/server.go
@@ -8,8 +8,10 @@ import (
"context"
"fmt"
"html/template"
+ "io/fs"
"log"
"net/http"
+ "os"
"sync"
"time"
)
@@ -25,6 +27,8 @@ type Server struct {
httpd *http.Server
worker *worker
+ fs fs.ReadFileFS
+
// updateq channel to receive notification when the new report coming
// from worker.
updateq chan struct{}
@@ -58,6 +62,48 @@ func NewServer(opts ServerOptions) (srv *Server, err error) {
return nil, fmt.Errorf(`%s: %w`, logp, err)
}
+ err = srv.initFS()
+ if err != nil {
+ }
+
+ err = srv.initTemplate()
+ if err != nil {
+ return nil, fmt.Errorf(`%s: %w`, logp, err)
+ }
+
+ var mux = http.NewServeMux()
+ mux.Handle(`GET /`, srv)
+
+ srv.httpd = &http.Server{
+ Addr: srv.Options.Address,
+ Handler: mux,
+ ReadTimeout: 5 * time.Second,
+ WriteTimeout: 5 * time.Second,
+ }
+ return srv, nil
+}
+
+func (srv *Server) initFS() (err error) {
+ if srv.Options.IsDevelopment {
+ var dirfs = os.DirFS(`_www`)
+ if err != nil {
+ return err
+ }
+ srv.fs = dirfs.(fs.ReadFileFS)
+ } else {
+ var subfs fs.FS
+ subfs, err = fs.Sub(wwwFS, `_www`)
+ if err != nil {
+ return err
+ }
+ srv.fs = subfs.(fs.ReadFileFS)
+ }
+ return nil
+}
+
+func (srv *Server) initTemplate() (err error) {
+ var logp = `initTemplate`
+
srv.pageIndexTmpl = template.New("index.html").Funcs(template.FuncMap{
`reverse`: func(rev []ScanReport) (ver []ScanReport) {
var size = len(rev)
@@ -68,30 +114,21 @@ func NewServer(opts ServerOptions) (srv *Server, err error) {
return ver
},
})
+
var tmplraw []byte
- tmplraw, err = wwwFS.ReadFile(`_www/index.tmpl`)
+ tmplraw, err = srv.fs.ReadFile(`index.tmpl`)
if err != nil {
- return nil, err
+ return fmt.Errorf(`%s: %w`, logp, err)
}
srv.pageIndexTmpl, err = srv.pageIndexTmpl.Parse(string(tmplraw))
if err != nil {
- return nil, err
+ return fmt.Errorf(`%s: %w`, logp, err)
}
err = srv.pageIndexTmpl.Execute(&srv.pageIndexBody, &srv.worker.Reports)
if err != nil {
- return nil, err
+ return fmt.Errorf(`%s: %w`, logp, err)
}
-
- var mux = http.NewServeMux()
- mux.Handle(`GET /`, srv)
-
- srv.httpd = &http.Server{
- Addr: srv.Options.Address,
- Handler: mux,
- ReadTimeout: 5 * time.Second,
- WriteTimeout: 5 * time.Second,
- }
- return srv, nil
+ return nil
}
// ListenAndServe start handling request on incoming connections.
@@ -172,8 +209,13 @@ func (srv *Server) update() {
srv.worker.Reports.Lock()
srv.pageIndexBody.Reset()
- err = srv.pageIndexTmpl.Execute(&srv.pageIndexBody,
- &srv.worker.Reports)
+ if srv.Options.IsDevelopment {
+ err = srv.initTemplate()
+ } else {
+ err = srv.pageIndexTmpl.Execute(
+ &srv.pageIndexBody,
+ &srv.worker.Reports)
+ }
if err != nil {
log.Printf(`update: pageIndexTmpl: %s`, err)
}