diff options
| -rw-r--r-- | cmd/lilin/main.go | 8 | ||||
| -rw-r--r-- | server.go | 76 |
2 files changed, 65 insertions, 19 deletions
diff --git a/cmd/lilin/main.go b/cmd/lilin/main.go index 21c40ec..dd97f72 100644 --- a/cmd/lilin/main.go +++ b/cmd/lilin/main.go @@ -5,6 +5,7 @@ package main import ( "context" + "flag" "log" "os" "os/signal" @@ -15,10 +16,13 @@ import ( func main() { var serverOpts = lilin.ServerOptions{ - BaseDir: `testdata`, - IsDevelopment: true, + BaseDir: `testdata`, } + flag.BoolVar(&serverOpts.IsDevelopment, `dev`, false, + `Enable development mode`) + flag.Parse() + var server *lilin.Server var err error server, err = lilin.NewServer(serverOpts) @@ -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) } |
