diff options
Diffstat (limited to 'syz-cluster/dashboard')
| -rw-r--r-- | syz-cluster/dashboard/Dockerfile | 1 | ||||
| -rw-r--r-- | syz-cluster/dashboard/handler.go | 42 | ||||
| -rw-r--r-- | syz-cluster/dashboard/templates/index.html | 17 |
3 files changed, 56 insertions, 4 deletions
diff --git a/syz-cluster/dashboard/Dockerfile b/syz-cluster/dashboard/Dockerfile index 53925a53b..62d540cd8 100644 --- a/syz-cluster/dashboard/Dockerfile +++ b/syz-cluster/dashboard/Dockerfile @@ -7,6 +7,7 @@ COPY go.mod ./ COPY go.sum ./ RUN go mod download COPY pkg/gcs/ pkg/gcs/ +COPY pkg/html/urlutil/ pkg/html/urlutil/ # Build the tool. COPY syz-cluster/dashboard/ syz-cluster/dashboard/ diff --git a/syz-cluster/dashboard/handler.go b/syz-cluster/dashboard/handler.go index 50c1966f8..318705e7f 100644 --- a/syz-cluster/dashboard/handler.go +++ b/syz-cluster/dashboard/handler.go @@ -11,8 +11,10 @@ import ( "io" "io/fs" "net/http" + "strconv" "time" + "github.com/google/syzkaller/pkg/html/urlutil" "github.com/google/syzkaller/syz-cluster/pkg/app" "github.com/google/syzkaller/syz-cluster/pkg/blob" "github.com/google/syzkaller/syz-cluster/pkg/db" @@ -85,12 +87,26 @@ func (h *dashboardHandler) seriesList(w http.ResponseWriter, r *http.Request) er List []*db.SeriesWithSession Filter db.SeriesFilter Statuses []statusOption + // This is very primitive, but better than nothing. + FilterFormURL string + PrevPageURL string + NextPageURL string } + const perPage = 100 + offset, err := h.getOffset(r) + if err != nil { + return err + } + baseURL := r.URL.RequestURI() data := MainPageData{ Filter: db.SeriesFilter{ Cc: r.FormValue("cc"), Status: db.SessionStatus(r.FormValue("status")), + Limit: perPage, + Offset: offset, }, + // If the filters are changed, the old offset value is irrelevant. + FilterFormURL: urlutil.DropParam(baseURL, "offset", ""), Statuses: []statusOption{ {db.SessionStatusAny, "any"}, {db.SessionStatusWaiting, "waiting"}, @@ -98,14 +114,36 @@ func (h *dashboardHandler) seriesList(w http.ResponseWriter, r *http.Request) er {db.SessionStatusFinished, "finished"}, }, } - var err error - data.List, err = h.seriesRepo.ListLatest(r.Context(), data.Filter, time.Time{}, 0) + + data.List, err = h.seriesRepo.ListLatest(r.Context(), data.Filter, time.Time{}) if err != nil { return fmt.Errorf("failed to query the list: %w", err) } + if data.Filter.Offset > 0 { + data.PrevPageURL = urlutil.SetParam(baseURL, "offset", + fmt.Sprintf("%d", max(0, data.Filter.Offset-perPage))) + } + // TODO: this is not strictly correct (we also need to check whether there actually more rows). + // But let's tolerate it for now. + if len(data.List) == data.Filter.Limit { + data.NextPageURL = urlutil.SetParam(baseURL, "offset", + fmt.Sprintf("%d", data.Filter.Offset+len(data.List))) + } return h.templates["index.html"].ExecuteTemplate(w, "base.html", data) } +func (h *dashboardHandler) getOffset(r *http.Request) (int, error) { + val := r.FormValue("offset") + if val == "" { + return 0, nil + } + i, err := strconv.Atoi(val) + if err != nil || i < 0 { + return 0, fmt.Errorf("%w: invalid offset value", errBadRequest) + } + return i, nil +} + func (h *dashboardHandler) seriesInfo(w http.ResponseWriter, r *http.Request) error { type SessionTest struct { *db.FullSessionTest diff --git a/syz-cluster/dashboard/templates/index.html b/syz-cluster/dashboard/templates/index.html index 98d021a1b..f51e5d34f 100644 --- a/syz-cluster/dashboard/templates/index.html +++ b/syz-cluster/dashboard/templates/index.html @@ -1,6 +1,6 @@ {{define "content"}} <div class="mx-3"> - <form> + <form action="{{.FilterFormURL}}"> <div class="row align-items-center"> <div class="col-auto col-sm-3"> <label for="inputCc">Cc'd</label> @@ -13,7 +13,7 @@ {{range .Statuses}} <option value="{{.Key}}" {{if eq .Key $filter.Status}} selected{{end}}>{{.Value}}</option> {{end}} - </select> + </select> </div> <div class="col-auto"> <button type="submit" class="btn btn-primary">Submit</button> @@ -22,6 +22,19 @@ </form> </div> + {{if or .PrevPageURL .NextPageURL}} + <nav class="mx-3"> + <ul class="pagination"> + <li class="page-item {{if not .PrevPageURL}}disabled{{end}}"> + <a class="page-link" href="{{.PrevPageURL}}" tabindex="-1">Previous</a> + </li> + <li class="page-item {{if not .NextPageURL}}disabled{{end}}"> + <a class="page-link" href="{{.NextPageURL}}">Next</a> + </li> + </ul> + </nav> + {{end}} + <table class="table"> <thead class="thead-light"> <tr> |
