func()

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
	}
}