In admin dot, reverse direction of peer links, include the switch port for each link, and sort the output by coords

This commit is contained in:
Arceliar 2018-01-21 16:19:39 -06:00
parent 73cc6b5ba0
commit 2b7c6eafcd

View File

@ -4,6 +4,7 @@ import "net"
import "os" import "os"
import "bytes" import "bytes"
import "fmt" import "fmt"
import "sort"
// TODO: Make all of this JSON // TODO: Make all of this JSON
// TODO: Add authentication // TODO: Add authentication
@ -153,10 +154,28 @@ func (a *admin) handleRequest(conn net.Conn) {
} }
infos[info.key] = info infos[info.key] = info
} }
// Finally, get a sorted list of keys, which we use to organize the output
var keys [][mDepth]switchPort
for _, info := range infos {
keys = append(keys, info.key)
}
less := func(i, j int) bool {
for idx := range keys[i] {
if keys[i][idx] < keys[j][idx] {
return true
}
if keys[i][idx] > keys[j][idx] {
return false
}
}
return false
}
sort.Slice(keys, less)
// Now print it all out // Now print it all out
conn.Write([]byte(fmt.Sprintf("digraph {\n"))) conn.Write([]byte(fmt.Sprintf("digraph {\n")))
// First set the labels // First set the labels
for _, info := range infos { for _, key := range keys {
info := infos[key]
if info.name == myAddr { if info.name == myAddr {
conn.Write([]byte(fmt.Sprintf("\"%v\" [ style = \"filled\", label = \"%v\" ];\n", info.key, info.name))) conn.Write([]byte(fmt.Sprintf("\"%v\" [ style = \"filled\", label = \"%v\" ];\n", info.key, info.name)))
} else { } else {
@ -164,11 +183,19 @@ func (a *admin) handleRequest(conn net.Conn) {
} }
} }
// Then print the tree structure // Then print the tree structure
for _, info := range infos { for _, key := range keys {
info := infos[key]
if info.key == info.parent { if info.key == info.parent {
continue continue
} // happens for the root, skip it } // happens for the root, skip it
conn.Write([]byte(fmt.Sprintf(" \"%+v\" -> \"%+v\";\n", info.key, info.parent))) for idx := len(info.key) - 1; idx >= 0; idx-- {
port := info.key[idx]
if port == 0 {
continue
}
conn.Write([]byte(fmt.Sprintf(" \"%+v\" -> \"%+v\" [ label = \"%v\" ];\n", info.parent, info.key, port)))
break
}
} }
conn.Write([]byte(fmt.Sprintf("}\n"))) conn.Write([]byte(fmt.Sprintf("}\n")))
break break