mirror of
https://github.com/cwinfo/yggdrasil-go.git
synced 2024-11-25 03:41:35 +00:00
Restore uptime
, bytes_sent
and bytes_recvd
to getPeers
(#888)
* Restore `uptime`, `bytes_sent` and `bytes_recvd` to the admin API for peers * Wrap conn in Yggdrasil instead, so not necessary to do so in Ironwood * Shuffle struct for alignment
This commit is contained in:
parent
9f5cc0eecb
commit
2d2ad4692b
@ -19,6 +19,9 @@ type PeerEntry struct {
|
|||||||
Port uint64 `json:"port"`
|
Port uint64 `json:"port"`
|
||||||
Coords []uint64 `json:"coords"`
|
Coords []uint64 `json:"coords"`
|
||||||
Remote string `json:"remote"`
|
Remote string `json:"remote"`
|
||||||
|
RXBytes uint64 `json:"bytes_recvd"`
|
||||||
|
TXBytes uint64 `json:"bytes_sent"`
|
||||||
|
Uptime float64 `json:"uptime"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *AdminSocket) getPeersHandler(req *GetPeersRequest, res *GetPeersResponse) error {
|
func (a *AdminSocket) getPeersHandler(req *GetPeersRequest, res *GetPeersResponse) error {
|
||||||
@ -31,6 +34,9 @@ func (a *AdminSocket) getPeersHandler(req *GetPeersRequest, res *GetPeersRespons
|
|||||||
Port: p.Port,
|
Port: p.Port,
|
||||||
Coords: p.Coords,
|
Coords: p.Coords,
|
||||||
Remote: p.Remote,
|
Remote: p.Remote,
|
||||||
|
RXBytes: p.RXBytes,
|
||||||
|
TXBytes: p.TXBytes,
|
||||||
|
Uptime: p.Uptime.Seconds(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
|
@ -2,12 +2,16 @@ package core
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"crypto/ed25519"
|
"crypto/ed25519"
|
||||||
|
"sync/atomic"
|
||||||
|
"time"
|
||||||
|
|
||||||
//"encoding/hex"
|
//"encoding/hex"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
//"errors"
|
//"errors"
|
||||||
//"fmt"
|
//"fmt"
|
||||||
"net"
|
"net"
|
||||||
"net/url"
|
"net/url"
|
||||||
|
|
||||||
//"sort"
|
//"sort"
|
||||||
//"time"
|
//"time"
|
||||||
|
|
||||||
@ -24,11 +28,14 @@ type Self struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type Peer struct {
|
type Peer struct {
|
||||||
Key ed25519.PublicKey
|
Key ed25519.PublicKey
|
||||||
Root ed25519.PublicKey
|
Root ed25519.PublicKey
|
||||||
Coords []uint64
|
Coords []uint64
|
||||||
Port uint64
|
Port uint64
|
||||||
Remote string
|
Remote string
|
||||||
|
RXBytes uint64
|
||||||
|
TXBytes uint64
|
||||||
|
Uptime time.Duration
|
||||||
}
|
}
|
||||||
|
|
||||||
type DHTEntry struct {
|
type DHTEntry struct {
|
||||||
@ -74,6 +81,11 @@ func (c *Core) GetPeers() []Peer {
|
|||||||
if name := names[p.Conn]; name != "" {
|
if name := names[p.Conn]; name != "" {
|
||||||
info.Remote = name
|
info.Remote = name
|
||||||
}
|
}
|
||||||
|
if linkconn, ok := p.Conn.(*linkConn); ok {
|
||||||
|
info.RXBytes = atomic.LoadUint64(&linkconn.rx)
|
||||||
|
info.TXBytes = atomic.LoadUint64(&linkconn.tx)
|
||||||
|
info.Uptime = time.Since(linkconn.up)
|
||||||
|
}
|
||||||
peers = append(peers, info)
|
peers = append(peers, info)
|
||||||
}
|
}
|
||||||
return peers
|
return peers
|
||||||
|
@ -14,6 +14,8 @@ import (
|
|||||||
//"sync/atomic"
|
//"sync/atomic"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"sync/atomic"
|
||||||
|
|
||||||
"github.com/yggdrasil-network/yggdrasil-go/src/address"
|
"github.com/yggdrasil-network/yggdrasil-go/src/address"
|
||||||
"github.com/yggdrasil-network/yggdrasil-go/src/util"
|
"github.com/yggdrasil-network/yggdrasil-go/src/util"
|
||||||
"golang.org/x/net/proxy"
|
"golang.org/x/net/proxy"
|
||||||
@ -40,7 +42,7 @@ type linkInfo struct {
|
|||||||
type link struct {
|
type link struct {
|
||||||
lname string
|
lname string
|
||||||
links *links
|
links *links
|
||||||
conn net.Conn
|
conn *linkConn
|
||||||
options linkOptions
|
options linkOptions
|
||||||
info linkInfo
|
info linkInfo
|
||||||
incoming bool
|
incoming bool
|
||||||
@ -124,7 +126,10 @@ func (l *links) call(u *url.URL, sintf string) error {
|
|||||||
func (l *links) create(conn net.Conn, name, linkType, local, remote string, incoming, force bool, options linkOptions) (*link, error) {
|
func (l *links) create(conn net.Conn, name, linkType, local, remote string, incoming, force bool, options linkOptions) (*link, error) {
|
||||||
// Technically anything unique would work for names, but let's pick something human readable, just for debugging
|
// Technically anything unique would work for names, but let's pick something human readable, just for debugging
|
||||||
intf := link{
|
intf := link{
|
||||||
conn: conn,
|
conn: &linkConn{
|
||||||
|
Conn: conn,
|
||||||
|
up: time.Now(),
|
||||||
|
},
|
||||||
lname: name,
|
lname: name,
|
||||||
links: l,
|
links: l,
|
||||||
options: options,
|
options: options,
|
||||||
@ -272,3 +277,24 @@ func (intf *link) close() {
|
|||||||
func (intf *link) name() string {
|
func (intf *link) name() string {
|
||||||
return intf.lname
|
return intf.lname
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type linkConn struct {
|
||||||
|
// tx and rx are at the beginning of the struct to ensure 64-bit alignment
|
||||||
|
// on 32-bit platforms, see https://pkg.go.dev/sync/atomic#pkg-note-BUG
|
||||||
|
rx uint64
|
||||||
|
tx uint64
|
||||||
|
up time.Time
|
||||||
|
net.Conn
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *linkConn) Read(p []byte) (n int, err error) {
|
||||||
|
n, err = c.Conn.Read(p)
|
||||||
|
atomic.AddUint64(&c.rx, uint64(n))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *linkConn) Write(p []byte) (n int, err error) {
|
||||||
|
n, err = c.Conn.Write(p)
|
||||||
|
atomic.AddUint64(&c.tx, uint64(n))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user