mirror of
https://github.com/etcd-io/etcd.git
synced 2024-09-27 06:25:44 +00:00
62 lines
1.5 KiB
Go
62 lines
1.5 KiB
Go
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
|
|
}
|