diff options
| author | Chris Lu <chrislusf@users.noreply.github.com> | 2016-07-20 07:48:13 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2016-07-20 07:48:13 -0700 |
| commit | dd84637c34fcd0b02387ee60834a0007b4feb27f (patch) | |
| tree | 9847cb7e85c0be95e1d16c651896cad4a146c835 | |
| parent | d3ae3a8e146f0340776c4383458cebdc683bef7f (diff) | |
| parent | af905a3ff719118bdde900f4c1387f738fbb83dd (diff) | |
| download | seaweedfs-dd84637c34fcd0b02387ee60834a0007b4feb27f.tar.xz seaweedfs-dd84637c34fcd0b02387ee60834a0007b4feb27f.zip | |
Merge pull request #344 from cschiano/master
Add a visualization for the filer
| -rw-r--r-- | weed/server/filer_server_handlers_read.go | 111 | ||||
| -rw-r--r-- | weed/server/filer_ui/templates.go | 55 |
2 files changed, 96 insertions, 70 deletions
diff --git a/weed/server/filer_server_handlers_read.go b/weed/server/filer_server_handlers_read.go index 8340021ce..98ec13f95 100644 --- a/weed/server/filer_server_handlers_read.go +++ b/weed/server/filer_server_handlers_read.go @@ -1,104 +1,75 @@ package weed_server import ( - "io" "net/http" - "net/url" "strconv" "strings" "github.com/chrislusf/seaweedfs/weed/glog" - "github.com/chrislusf/seaweedfs/weed/operation" - "github.com/chrislusf/seaweedfs/weed/util" + ui "github.com/chrislusf/seaweedfs/weed/server/filer_ui" "github.com/syndtr/goleveldb/leveldb" ) -// listDirectoryHandler lists directories and folers under a directory -// files are sorted by name and paginated via "lastFileName" and "limit". -// sub directories are listed on the first page, when "lastFileName" -// is empty. -func (fs *FilerServer) listDirectoryHandler(w http.ResponseWriter, r *http.Request) { +func (fs *FilerServer) GetOrHeadHandler(w http.ResponseWriter, r *http.Request, isGetMethod bool) { if !strings.HasSuffix(r.URL.Path, "/") { return } - dirlist, err := fs.filer.ListDirectories(r.URL.Path) - if err == leveldb.ErrNotFound { - glog.V(3).Infoln("Directory Not Found in db", r.URL.Path) - w.WriteHeader(http.StatusNotFound) + + if fs.disableDirListing { + w.WriteHeader(http.StatusMethodNotAllowed) return } - m := make(map[string]interface{}) - m["Directory"] = r.URL.Path - lastFileName := r.FormValue("lastFileName") - if lastFileName == "" { - m["Subdirectories"] = dirlist - } + limit, limit_err := strconv.Atoi(r.FormValue("limit")) if limit_err != nil { limit = 100 } - m["Files"], _ = fs.filer.ListFiles(r.URL.Path, lastFileName, limit) - writeJsonQuiet(w, r, http.StatusOK, m) -} -func (fs *FilerServer) GetOrHeadHandler(w http.ResponseWriter, r *http.Request, isGetMethod bool) { - if strings.HasSuffix(r.URL.Path, "/") { - if fs.disableDirListing { - w.WriteHeader(http.StatusMethodNotAllowed) - return - } - fs.listDirectoryHandler(w, r) - return - } + lastFileName := r.FormValue("lastFileName") + files, err := fs.filer.ListFiles(r.URL.Path, lastFileName, limit) - fileId, err := fs.filer.FindFile(r.URL.Path) if err == leveldb.ErrNotFound { - glog.V(3).Infoln("Not found in db", r.URL.Path) + glog.V(0).Infof("Error %s", err) w.WriteHeader(http.StatusNotFound) return } - urlLocation, err := operation.LookupFileId(fs.getMasterNode(), fileId) - if err != nil { - glog.V(1).Infoln("operation LookupFileId %s failed, err is %s", fileId, err.Error()) + directories, err2 := fs.filer.ListDirectories(r.URL.Path) + if err2 == leveldb.ErrNotFound { + glog.V(0).Infof("Error %s", err) w.WriteHeader(http.StatusNotFound) return } - urlString := urlLocation - if fs.redirectOnRead { - http.Redirect(w, r, urlString, http.StatusFound) - return - } - u, _ := url.Parse(urlString) - q := u.Query() - for key, values := range r.URL.Query() { - for _, value := range values { - q.Add(key, value) + + shouldDisplayLoadMore := len(files) > 0 + + lastFileName = "" + if len(files) > 0 { + lastFileName = files[len(files)-1].Name + + files2, err3 := fs.filer.ListFiles(r.URL.Path, lastFileName, limit) + if err3 == leveldb.ErrNotFound { + glog.V(0).Infof("Error %s", err) + w.WriteHeader(http.StatusNotFound) + return } + shouldDisplayLoadMore = len(files2) > 0 } - u.RawQuery = q.Encode() - request := &http.Request{ - Method: r.Method, - URL: u, - Proto: r.Proto, - ProtoMajor: r.ProtoMajor, - ProtoMinor: r.ProtoMinor, - Header: r.Header, - Body: r.Body, - Host: r.Host, - ContentLength: r.ContentLength, - } - glog.V(3).Infoln("retrieving from", u) - resp, do_err := util.Do(request) - if do_err != nil { - glog.V(0).Infoln("failing to connect to volume server", do_err.Error()) - writeJsonError(w, r, http.StatusInternalServerError, do_err) - return - } - defer resp.Body.Close() - for k, v := range resp.Header { - w.Header()[k] = v + + args := struct { + Path string + Files interface{} + Directories interface{} + Limit int + LastFileName string + ShouldDisplayLoadMore bool + }{ + r.URL.Path, + files, + directories, + limit, + lastFileName, + shouldDisplayLoadMore, } - w.WriteHeader(resp.StatusCode) - io.Copy(w, resp.Body) + ui.StatusTpl.Execute(w, args) } diff --git a/weed/server/filer_ui/templates.go b/weed/server/filer_ui/templates.go new file mode 100644 index 000000000..6f4f7ce86 --- /dev/null +++ b/weed/server/filer_ui/templates.go @@ -0,0 +1,55 @@ +package master_ui + +import ( + "html/template" +) + +var StatusTpl = template.Must(template.New("status").Parse(`<!DOCTYPE html> +<html> +<head> + <title>SeaweedFS Filer</title> + <link rel="icon" href="http://7viirv.com1.z0.glb.clouddn.com/seaweed_favicon.png" sizes="32x32" /> + <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/css/bootstrap.min.css"> +</head> +<body> + <div class="container"> + <div class="page-header"> + <h1> + <img src="http://7viirv.com1.z0.glb.clouddn.com/seaweed50x50.png"></img> + SeaweedFS Filer + </h1> + </div> + <div class="row"> + {{.Path}} + </div> + + <div class="row"> + <ul> + {{$path := .Path }} + {{ range $dirs_index, $dir := .Directories }} + <li> + <a href= {{ print $path $dir.Name "/"}} > + {{ $dir.Name }} + </a> + </li> + {{ end }} + + {{ range $file_index, $file := .Files }} + <li> + {{ $file.Name }} + </li> + {{ end }} + </ul> + </div> + +{{if .ShouldDisplayLoadMore}} + <div class="row"> + <a href= {{ print .Path "?limit=" .Limit "&lastFileName=" .LastFileName}} > + Load more + </a> + </div> + {{end}} + </div> +</body> +</html> +`)) |
