mirror of
https://github.com/cwinfo/yggdrasil-go.git
synced 2024-11-22 14:10:28 +00:00
Draw dot draphs (although maybe not very well)
This commit is contained in:
parent
c4ac0a90ac
commit
483d90a728
@ -46,35 +46,70 @@ func (a *admin) handleRequest(conn net.Conn) {
|
|||||||
}
|
}
|
||||||
buf = bytes.Trim(buf, "\x00\r\n\t")
|
buf = bytes.Trim(buf, "\x00\r\n\t")
|
||||||
switch string(buf) {
|
switch string(buf) {
|
||||||
case "switch table":
|
case "dot":
|
||||||
|
const mDepth = 1024
|
||||||
|
m := make(map[[mDepth]switchPort]string)
|
||||||
table := a.core.switchTable.table.Load().(lookupTable)
|
table := a.core.switchTable.table.Load().(lookupTable)
|
||||||
conn.Write([]byte(fmt.Sprintf(
|
peers := a.core.peers.ports.Load().(map[switchPort]*peer)
|
||||||
"port 0 -> %+v\n",
|
|
||||||
table.self.coords)))
|
|
||||||
for _, v := range table.elems {
|
|
||||||
conn.Write([]byte(fmt.Sprintf(
|
|
||||||
"port %d -> %+v\n",
|
|
||||||
v.port,
|
|
||||||
v.locator.coords)))
|
|
||||||
}
|
|
||||||
break
|
|
||||||
|
|
||||||
case "dht":
|
// Add my own entry
|
||||||
n := a.core.dht.nBuckets()
|
peerID := address_addrForNodeID(getNodeID(&peers[0].box))
|
||||||
for i := 0; i < n; i++ {
|
addr := net.IP(peerID[:]).String()
|
||||||
|
var index [mDepth]switchPort
|
||||||
|
copy(index[:mDepth], table.self.coords[:])
|
||||||
|
m[index] = addr
|
||||||
|
|
||||||
|
// Connect switch table entries to peer entries
|
||||||
|
for _, tableentry := range table.elems {
|
||||||
|
for _, peerentry := range peers {
|
||||||
|
if peerentry.port == tableentry.port {
|
||||||
|
peerID := address_addrForNodeID(getNodeID(&peerentry.box))
|
||||||
|
addr := net.IP(peerID[:]).String()
|
||||||
|
var index [mDepth]switchPort
|
||||||
|
copy(index[:mDepth], tableentry.locator.coords[:])
|
||||||
|
m[index] = addr
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Look up everything we know from DHT
|
||||||
|
for i := 0; i < a.core.dht.nBuckets(); i++ {
|
||||||
b := a.core.dht.getBucket(i)
|
b := a.core.dht.getBucket(i)
|
||||||
if len(b.infos) == 0 {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
for _, v := range b.infos {
|
for _, v := range b.infos {
|
||||||
addr := address_addrForNodeID(v.nodeID_hidden)
|
var destPorts []switchPort
|
||||||
ip := net.IP(addr[:]).String()
|
for offset := 0 ; ; {
|
||||||
|
coord, length := wire_decode_uint64(v.coords[offset:])
|
||||||
conn.Write([]byte(fmt.Sprintf("%+v -> %+v\n",
|
if length == 0 { break }
|
||||||
ip,
|
destPorts = append(destPorts, switchPort(coord))
|
||||||
v.coords)))
|
offset += length
|
||||||
|
}
|
||||||
|
addr := net.IP(address_addrForNodeID(v.nodeID_hidden)[:]).String()
|
||||||
|
var index [mDepth]switchPort
|
||||||
|
copy(index[:mDepth], destPorts[:])
|
||||||
|
m[index] = addr
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Now print it all out
|
||||||
|
conn.Write([]byte(fmt.Sprintf("graph {\n")))
|
||||||
|
for k := range m {
|
||||||
|
var mask [mDepth]switchPort
|
||||||
|
copy(mask[:mDepth], k[:])
|
||||||
|
for mk := range mask {
|
||||||
|
mask[len(mask)-1-mk] = 0
|
||||||
|
if len(m[k]) == 0 {
|
||||||
|
m[k] = fmt.Sprintf("%+v (missing)", k)
|
||||||
|
}
|
||||||
|
if len(m[mask]) == 0 {
|
||||||
|
m[mask] = fmt.Sprintf("%+v (missing)", mask)
|
||||||
|
}
|
||||||
|
if len(m[mask]) > 0 && m[mask] != m[k] {
|
||||||
|
conn.Write([]byte(fmt.Sprintf(" \"%+v\" -- \"%+v\";\n", m[k], m[mask])))
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
conn.Write([]byte(fmt.Sprintf("}\n")))
|
||||||
break
|
break
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
Loading…
Reference in New Issue
Block a user