in pkg/skoop/ui/web.go [110:224]
func (u *WebUI) handleUI(w http.ResponseWriter, _ *http.Request) {
args := uiArgs{
DiagnoseInfo: fmt.Sprintf("%s -> %s", u.ctx.TaskConfig().SourceEndpoint, u.ctx.TaskConfig().DstEndpoint),
}
svg, err := u.g.ToSvg()
if err != nil {
http.Error(w, fmt.Sprintf("error generate svg: %s", err), http.StatusInternalServerError)
return
}
svgString := string(svg)
args.GraphSvg = template.HTML(svgString)
suspicionLevel := model.SuspicionLevel(model.SuspicionLevelInfo)
var globalSuspicions []suspicion
for _, sus := range u.globalSus {
globalSuspicions = append(globalSuspicions, suspicion{
Level: sus.Level.String(),
Message: sus.Message,
})
if suspicionLevel < sus.Level {
suspicionLevel = sus.Level
}
}
cluster := clusterInfo{
SuspicionLevel: suspicionLevel.String(),
Suspicions: globalSuspicions,
}
jsonBytes, err := json.Marshal(cluster)
if err != nil {
http.Error(w, fmt.Sprintf("error marshal node info: %s", err), http.StatusInternalServerError)
return
}
args.Cluster = template.JSStr(jsonBytes)
var nodes []nodeInfo
for _, node := range u.p.Nodes() {
n := nodeInfo{
ID: node.GetID(),
Type: string(node.GetType()),
SuspicionLevel: node.MaxSuspicionLevel().String(),
Suspicions: nil,
}
for _, sus := range node.GetSuspicions() {
n.Suspicions = append(n.Suspicions, suspicion{
Level: sus.Level.String(),
Message: strings.Replace(sus.Message, "\n", "\\n", -1),
})
}
nodes = append(nodes, n)
}
jsonBytes, err = json.Marshal(nodes)
if err != nil {
http.Error(w, fmt.Sprintf("error marshal node info: %s", err), http.StatusInternalServerError)
return
}
args.Nodes = template.JSStr(jsonBytes)
var edges []edgeInfo
for _, link := range u.p.Links() {
srcAttrs := map[string]string{}
if link.SourceAttribute != nil {
srcAttrs = link.SourceAttribute.GetAttrs()
}
dstAttrs := map[string]string{}
if link.DestinationAttribute != nil {
dstAttrs = link.DestinationAttribute.GetAttrs()
}
e := edgeInfo{
ID: link.GetID(),
Type: string(link.Type),
Packet: packet{
Src: link.Packet.Src.String(),
Dst: link.Packet.Dst.String(),
Dport: link.Packet.Dport,
Protocol: string(link.Packet.Protocol),
},
Oif: "-",
Iif: "-",
}
action := link.Destination.ActionOf(link)
if action != nil {
e.Action = string(action.Type)
}
if oif, ok := srcAttrs["if"]; ok {
e.Oif = oif
}
if iif, ok := dstAttrs["if"]; ok {
e.Iif = iif
}
edges = append(edges, e)
}
jsonBytes, err = json.Marshal(edges)
if err != nil {
http.Error(w, fmt.Sprintf("error marshal edge info: %s", err), http.StatusInternalServerError)
return
}
args.Edges = template.JSStr(jsonBytes)
w.Header().Add("Content-Type", "text/html; charset=utf-8")
err = u.template.ExecuteTemplate(w, "index.html", &args)
if err != nil {
http.Error(w, fmt.Sprintf("error render template: %s", err), http.StatusInternalServerError)
return
}
}