From 874c5754bb22dbf77d6b600ff91f0f4f1fc5073a Mon Sep 17 00:00:00 2001 From: Dmitry Vyukov Date: Mon, 12 Oct 2015 10:16:57 +0200 Subject: initial commit --- master/html.go | 94 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 master/html.go (limited to 'master/html.go') diff --git a/master/html.go b/master/html.go new file mode 100644 index 000000000..bb7ac1bd7 --- /dev/null +++ b/master/html.go @@ -0,0 +1,94 @@ +// Copyright 2015 syzkaller project authors. All rights reserved. +// Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file. + +package main + +import ( + "encoding/json" + "fmt" + "html/template" + "io/ioutil" + "net/http" +) + +func (m *Master) httpInfo(w http.ResponseWriter, r *http.Request) { + m.mu.Lock() + defer m.mu.Unlock() + + data := &UIData{ + CorpusLen: len(m.corpus.m), + } + for _, mgr := range m.managers { + data.Managers = append(data.Managers, UIManager{ + Name: mgr.name, + Http: mgr.http, + }) + } + if err := htmlTemplate.Execute(w, data); err != nil { + http.Error(w, fmt.Sprintf("failed to execute template: %v", err), http.StatusInternalServerError) + } +} + +func (m *Master) httpMinimize(w http.ResponseWriter, r *http.Request) { + m.mu.Lock() + defer m.mu.Unlock() + + corpus := make(map[string]bool) + for _, mgr := range m.managers { + resp, err := http.Get("http://" + mgr.http + "/current_corpus") + if err != nil { + http.Error(w, fmt.Sprintf("failed to query corpus from %v: %v", mgr.name, err), http.StatusInternalServerError) + return + } + defer resp.Body.Close() + data, err := ioutil.ReadAll(resp.Body) + if err != nil { + http.Error(w, fmt.Sprintf("failed to query corpus from %v: %v", mgr.name, err), http.StatusInternalServerError) + return + } + var hashes []string + err = json.Unmarshal(data, &hashes) + if err != nil || len(hashes) == 0 { + http.Error(w, fmt.Sprintf("failed to parse corpus from %v: %v", mgr.name, err), http.StatusInternalServerError) + return + } + for _, hash := range hashes { + corpus[hash] = true + } + } + orig := len(m.corpus.m) + m.corpus.minimize(corpus) + fmt.Printf("minimized: %v -> %v -> %v\n", orig, len(corpus), len(m.corpus.m)) + for _, mgr := range m.managers { + mgr.input = 0 + } +} + +type UIData struct { + CorpusLen int + Managers []UIManager +} + +type UIManager struct { + Name string + Http string +} + +var htmlTemplate = template.Must(template.New("").Parse(` + + + + syzkaller master + + +Corpus: {{.CorpusLen}}
+{{if .Managers}} + Managers:
+ {{range $mgr := $.Managers}} + {{$mgr.Name}}
+ {{end}} +{{else}} + No managers connected
+{{end}} + +`)) -- cgit mrf-deployment