| package main |
| |
| import ( |
| "flag" |
| "html/template" |
| "net/http" |
| "path/filepath" |
| "runtime" |
| |
| "github.com/gorilla/mux" |
| "github.com/skia-dev/glog" |
| "go.skia.org/infra/go/common" |
| "go.skia.org/infra/go/httputils" |
| "go.skia.org/infra/go/influxdb" |
| ) |
| |
| // flags |
| var ( |
| local = flag.Bool("local", false, "Running locally if true. As opposed to in production.") |
| port = flag.String("port", ":8000", "HTTP service address (e.g., ':8000')") |
| resourcesDir = flag.String("resources_dir", "", "The directory to find templates, JS, and CSS files. If blank the current directory will be used.") |
| |
| influxHost = flag.String("influxdb_host", influxdb.DEFAULT_HOST, "The InfluxDB hostname.") |
| influxUser = flag.String("influxdb_name", influxdb.DEFAULT_USER, "The InfluxDB username.") |
| influxPassword = flag.String("influxdb_password", influxdb.DEFAULT_PASSWORD, "The InfluxDB password.") |
| influxDatabase = flag.String("influxdb_database", influxdb.DEFAULT_DATABASE, "The InfluxDB database.") |
| ) |
| |
| var ( |
| templates *template.Template |
| ) |
| |
| func loadTemplates() { |
| templates = template.Must(template.New("").ParseFiles( |
| filepath.Join(*resourcesDir, "templates/index.html"), |
| )) |
| } |
| |
| func templateHandler(name string) http.HandlerFunc { |
| return func(w http.ResponseWriter, r *http.Request) { |
| w.Header().Set("Content-Type", "text/html") |
| w.Header().Set("Access-Control-Allow-Origin", "*") |
| if *local { |
| loadTemplates() |
| } |
| if err := templates.ExecuteTemplate(w, name, struct{}{}); err != nil { |
| glog.Errorln("Failed to expand template:", err) |
| } |
| } |
| } |
| |
| func Init() { |
| if *resourcesDir == "" { |
| _, filename, _, _ := runtime.Caller(0) |
| *resourcesDir = filepath.Join(filepath.Dir(filename), "../..") |
| } |
| loadTemplates() |
| } |
| |
| func makeResourceHandler() func(http.ResponseWriter, *http.Request) { |
| fileServer := http.FileServer(http.Dir(*resourcesDir)) |
| return func(w http.ResponseWriter, r *http.Request) { |
| w.Header().Add("Cache-Control", "max-age=300") |
| w.Header().Set("Access-Control-Allow-Origin", "*") |
| fileServer.ServeHTTP(w, r) |
| } |
| } |
| |
| func main() { |
| defer common.LogPanic() |
| common.InitWithMetrics2("debugger", influxHost, influxUser, influxPassword, influxDatabase, local) |
| Init() |
| |
| router := mux.NewRouter() |
| router.PathPrefix("/res/").HandlerFunc(makeResourceHandler()) |
| router.HandleFunc("/", templateHandler("index.html")) |
| http.Handle("/", httputils.LoggingGzipRequestResponse(router)) |
| |
| glog.Infoln("Ready to serve.") |
| glog.Fatal(http.ListenAndServe(*port, nil)) |
| } |