|
|
@@ -0,0 +1,61 @@
|
|
|
+package dashboard
|
|
|
+
|
|
|
+import (
|
|
|
+ "bytes"
|
|
|
+ "net/http"
|
|
|
+ "os"
|
|
|
+ "path"
|
|
|
+ "time"
|
|
|
+
|
|
|
+ "github.com/coreos/etcd/log"
|
|
|
+ "github.com/coreos/etcd/mod/dashboard/resources"
|
|
|
+)
|
|
|
+
|
|
|
+func memoryFileServer(w http.ResponseWriter, req *http.Request) {
|
|
|
+ log.Debugf("[recv] %s %s [%s]", req.Method, req.URL.Path, req.RemoteAddr)
|
|
|
+ upath := req.URL.Path
|
|
|
+
|
|
|
+ b, err := resources.Asset(req.URL.Path)
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ http.Error(w, upath+": File not found", http.StatusNotFound)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ http.ServeContent(w, req, upath, time.Time{}, bytes.NewReader(b))
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+func getDashDir() string {
|
|
|
+ return os.Getenv("ETCD_DASHBOARD_DIR")
|
|
|
+}
|
|
|
+
|
|
|
+// DashboardHttpHandler either uses the compiled in virtual filesystem for the
|
|
|
+// dashboard assets or if ETCD_DASHBOARD_DIR is set uses that as the source of
|
|
|
+// assets.
|
|
|
+func HttpHandler() (handler http.Handler) {
|
|
|
+ handler = http.HandlerFunc(memoryFileServer)
|
|
|
+
|
|
|
+ // Serve the dashboard from a filesystem if the magic env variable is enabled
|
|
|
+ dashDir := getDashDir()
|
|
|
+ if len(dashDir) != 0 {
|
|
|
+ log.Debugf("Using dashboard directory %s", dashDir)
|
|
|
+ handler = http.FileServer(http.Dir(dashDir))
|
|
|
+ }
|
|
|
+
|
|
|
+ return handler
|
|
|
+}
|
|
|
+
|
|
|
+// Always returns the index.html page.
|
|
|
+func IndexPage(w http.ResponseWriter, req *http.Request) {
|
|
|
+ dashDir := getDashDir()
|
|
|
+ if len(dashDir) != 0 {
|
|
|
+ // Serve the index page from disk if the env variable is set.
|
|
|
+ http.ServeFile(w, req, path.Join(dashDir, "index.html"))
|
|
|
+ } else {
|
|
|
+ // Otherwise serve it from the compiled resources.
|
|
|
+ b, _ := resources.Asset("index.html")
|
|
|
+ http.ServeContent(w, req, "index.html", time.Time{}, bytes.NewReader(b))
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|