aboutsummaryrefslogtreecommitdiff
path: root/weed
diff options
context:
space:
mode:
authorChris Lu <chrislusf@users.noreply.github.com>2016-07-20 07:48:13 -0700
committerGitHub <noreply@github.com>2016-07-20 07:48:13 -0700
commitdd84637c34fcd0b02387ee60834a0007b4feb27f (patch)
tree9847cb7e85c0be95e1d16c651896cad4a146c835 /weed
parentd3ae3a8e146f0340776c4383458cebdc683bef7f (diff)
parentaf905a3ff719118bdde900f4c1387f738fbb83dd (diff)
downloadseaweedfs-dd84637c34fcd0b02387ee60834a0007b4feb27f.tar.xz
seaweedfs-dd84637c34fcd0b02387ee60834a0007b4feb27f.zip
Merge pull request #344 from cschiano/master
Add a visualization for the filer
Diffstat (limited to 'weed')
-rw-r--r--weed/server/filer_server_handlers_read.go111
-rw-r--r--weed/server/filer_ui/templates.go55
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>
+`))