github.com/yggdrasil-network/yggdrasil-go@v0.5.6/src/admin/getpeers.go (about) 1 package admin 2 3 import ( 4 "encoding/hex" 5 "net" 6 "sort" 7 "time" 8 9 "github.com/yggdrasil-network/yggdrasil-go/src/address" 10 ) 11 12 type GetPeersRequest struct { 13 } 14 15 type GetPeersResponse struct { 16 Peers []PeerEntry `json:"peers"` 17 } 18 19 type PeerEntry struct { 20 URI string `json:"remote,omitempty"` 21 Up bool `json:"up"` 22 Inbound bool `json:"inbound"` 23 IPAddress string `json:"address,omitempty"` 24 PublicKey string `json:"key"` 25 Port uint64 `json:"port"` 26 Priority uint64 `json:"priority"` 27 RXBytes DataUnit `json:"bytes_recvd,omitempty"` 28 TXBytes DataUnit `json:"bytes_sent,omitempty"` 29 Uptime float64 `json:"uptime,omitempty"` 30 Latency time.Duration `json:"latency_ms,omitempty"` 31 LastErrorTime time.Duration `json:"last_error_time,omitempty"` 32 LastError string `json:"last_error,omitempty"` 33 } 34 35 func (a *AdminSocket) getPeersHandler(req *GetPeersRequest, res *GetPeersResponse) error { 36 peers := a.core.GetPeers() 37 res.Peers = make([]PeerEntry, 0, len(peers)) 38 for _, p := range peers { 39 peer := PeerEntry{ 40 Port: p.Port, 41 Up: p.Up, 42 Inbound: p.Inbound, 43 Priority: uint64(p.Priority), // can't be uint8 thanks to gobind 44 URI: p.URI, 45 RXBytes: DataUnit(p.RXBytes), 46 TXBytes: DataUnit(p.TXBytes), 47 Uptime: p.Uptime.Seconds(), 48 } 49 if p.Latency > 0 { 50 peer.Latency = p.Latency 51 } 52 if addr := address.AddrForKey(p.Key); addr != nil { 53 peer.PublicKey = hex.EncodeToString(p.Key) 54 peer.IPAddress = net.IP(addr[:]).String() 55 } 56 if p.LastError != nil { 57 peer.LastError = p.LastError.Error() 58 peer.LastErrorTime = time.Since(p.LastErrorTime) 59 } 60 res.Peers = append(res.Peers, peer) 61 } 62 sort.Slice(res.Peers, func(i, j int) bool { 63 if res.Peers[i].Inbound == res.Peers[j].Inbound { 64 if res.Peers[i].PublicKey == res.Peers[j].PublicKey { 65 if res.Peers[i].Priority == res.Peers[j].Priority { 66 return res.Peers[i].Uptime > res.Peers[j].Uptime 67 } 68 return res.Peers[i].Priority < res.Peers[j].Priority 69 } 70 return res.Peers[i].PublicKey < res.Peers[j].PublicKey 71 } 72 return !res.Peers[i].Inbound && res.Peers[j].Inbound 73 }) 74 return nil 75 }