package main import ( "context" "embed" "flag" "html/template" "log" "net/http" "os" "os/signal" "syscall" ) //go:embed templates var templatesFS embed.FS func main() { listen := flag.String("listen", ":8080", "HTTP listen address") target := flag.String("target", "localhost:9091", "default gRPC endpoint (aggregator or collector)") n := flag.Int("n", 25, "default number of table rows") refresh := flag.Int("refresh", 30, "meta-refresh interval in seconds (0 = disabled)") flag.Parse() funcMap := template.FuncMap{"fmtCount": fmtCount} tmpl := template.Must( template.New("").Funcs(funcMap).ParseFS(templatesFS, "templates/*.html"), ) h := &Handler{ defaultTarget: *target, defaultN: *n, refreshSecs: *refresh, tmpl: tmpl, } srv := &http.Server{Addr: *listen, Handler: h} ctx, stop := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM) defer stop() go func() { log.Printf("frontend: listening on %s (default target %s)", *listen, *target) if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed { log.Printf("frontend: %v", err) os.Exit(1) } }() <-ctx.Done() log.Printf("frontend: shutting down") srv.Shutdown(context.Background()) }