diff options
| author | Shulhan <ms@kilabit.info> | 2025-08-06 10:05:54 +0700 |
|---|---|---|
| committer | Shulhan <ms@kilabit.info> | 2025-08-06 23:59:32 +0700 |
| commit | 6884d4def670bb7c27bc44cdb1d2992b514cc699 (patch) | |
| tree | 5ffce25cf4b1480ee6b9ff02705cd2469389e79b /server.go | |
| parent | 5338799c9fa5158031ebae53c6e64254175e7412 (diff) | |
| download | lilin-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.go | 76 |
1 files changed, 59 insertions, 17 deletions
@@ -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) } |
