diff --git a/etcd_handlers.go b/etcd_handlers.go index fdb40f650..ca62e4a62 100644 --- a/etcd_handlers.go +++ b/etcd_handlers.go @@ -19,7 +19,6 @@ package main import ( "fmt" "net/http" - "os" "strconv" "strings" @@ -42,7 +41,7 @@ func NewEtcdMuxer() *http.ServeMux { etcdMux.Handle("/"+version+"/stats/", errorHandler(StatsHttpHandler)) etcdMux.Handle("/version", errorHandler(VersionHttpHandler)) etcdMux.HandleFunc("/test/", TestHttpHandler) - etcdMux.Handle("/dashboard/", DashboardHttpHandler()) + etcdMux.Handle("/mod/dashboard/", DashboardHttpHandler("/mod/dashboard/")) return etcdMux } @@ -278,19 +277,6 @@ func GetHttpHandler(w http.ResponseWriter, req *http.Request) error { } -// 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 DashboardHttpHandler() http.Handler { - dashDir := os.Getenv("ETCD_DASHBOARD_DIR") - - if len(dashDir) == 0 { - dashDir = "./" - } - - return http.StripPrefix("/dashboard/", http.FileServer(http.Dir(dashDir))) -} - // Watch handler func WatchHttpHandler(w http.ResponseWriter, req *http.Request) error { key := req.URL.Path[len("/v1/watch/"):] diff --git a/etcd_modules.go b/etcd_modules.go new file mode 100644 index 000000000..a0397bd76 --- /dev/null +++ b/etcd_modules.go @@ -0,0 +1,42 @@ +package main + +import ( + "bytes" + "net/http" + "os" + "time" + + "github.com/coreos/etcd/dashboard/resources" +) + +func DashboardMemoryFileServer(w http.ResponseWriter, req *http.Request) { + path := req.URL.Path + if len(path) == 0 { + path = "index.html" + } + + b, ok := resources.File("/" + path) + + if ok == false { + http.Error(w, path+": File not found", http.StatusNotFound) + return + } + + http.ServeContent(w, req, path, time.Time{}, bytes.NewReader(b)) + return +} + +// 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 DashboardHttpHandler(prefix string) (handler http.Handler) { + handler = http.HandlerFunc(DashboardMemoryFileServer) + + // Serve the dashboard from a filesystem if the magic env variable is enabled + dashDir := os.Getenv("ETCD_DASHBOARD_DIR") + if len(dashDir) != 0 { + handler = http.FileServer(http.Dir(dashDir)) + } + + return http.StripPrefix(prefix, handler) +}