implement extended peer info in net peers cli

This commit is contained in:
vyzo 2021-03-06 19:14:13 +02:00
parent b4ca7928f1
commit 4a74f752c0
5 changed files with 64 additions and 10 deletions

View File

@ -33,6 +33,7 @@ type Common interface {
NetPubsubScores(context.Context) ([]PubsubScore, error) NetPubsubScores(context.Context) ([]PubsubScore, error)
NetAutoNatStatus(context.Context) (NatInfo, error) NetAutoNatStatus(context.Context) (NatInfo, error)
NetAgentVersion(ctx context.Context, p peer.ID) (string, error) NetAgentVersion(ctx context.Context, p peer.ID) (string, error)
NetPeerInfo(context.Context, peer.ID) (*ExtendedPeerInfo, error)
// NetBandwidthStats returns statistics about the nodes total bandwidth // NetBandwidthStats returns statistics about the nodes total bandwidth
// usage and current rate across all peers and protocols. // usage and current rate across all peers and protocols.

View File

@ -60,6 +60,7 @@ type CommonStruct struct {
NetBandwidthStatsByPeer func(ctx context.Context) (map[string]metrics.Stats, error) `perm:"read"` NetBandwidthStatsByPeer func(ctx context.Context) (map[string]metrics.Stats, error) `perm:"read"`
NetBandwidthStatsByProtocol func(ctx context.Context) (map[protocol.ID]metrics.Stats, error) `perm:"read"` NetBandwidthStatsByProtocol func(ctx context.Context) (map[protocol.ID]metrics.Stats, error) `perm:"read"`
NetAgentVersion func(ctx context.Context, p peer.ID) (string, error) `perm:"read"` NetAgentVersion func(ctx context.Context, p peer.ID) (string, error) `perm:"read"`
NetPeerInfo func(context.Context, peer.ID) (*api.ExtendedPeerInfo, error) `perm:"read"`
NetBlockAdd func(ctx context.Context, acl api.NetBlockList) error `perm:"admin"` NetBlockAdd func(ctx context.Context, acl api.NetBlockList) error `perm:"admin"`
NetBlockRemove func(ctx context.Context, acl api.NetBlockList) error `perm:"admin"` NetBlockRemove func(ctx context.Context, acl api.NetBlockList) error `perm:"admin"`
NetBlockList func(ctx context.Context) (api.NetBlockList, error) `perm:"read"` NetBlockList func(ctx context.Context) (api.NetBlockList, error) `perm:"read"`
@ -540,6 +541,10 @@ func (c *CommonStruct) NetAgentVersion(ctx context.Context, p peer.ID) (string,
return c.Internal.NetAgentVersion(ctx, p) return c.Internal.NetAgentVersion(ctx, p)
} }
func (c *CommonStruct) NetPeerInfo(ctx context.Context, p peer.ID) (*api.ExtendedPeerInfo, error) {
return c.Internal.NetPeerInfo(ctx, p)
}
// ID implements API.ID // ID implements API.ID
func (c *CommonStruct) ID(ctx context.Context) (peer.ID, error) { func (c *CommonStruct) ID(ctx context.Context) (peer.ID, error) {
return c.Internal.ID(ctx) return c.Internal.ID(ctx)

View File

@ -99,3 +99,10 @@ type NetBlockList struct {
IPAddrs []string IPAddrs []string
IPSubnets []string IPSubnets []string
} }
type ExtendedPeerInfo struct {
ID peer.ID
Agent string
Addrs []string
Protocols []string
}

View File

@ -48,6 +48,11 @@ var NetPeers = &cli.Command{
Aliases: []string{"a"}, Aliases: []string{"a"},
Usage: "Print agent name", Usage: "Print agent name",
}, },
&cli.BoolFlag{
Name: "extended",
Aliases: []string{"x"},
Usage: "Print extended peer information in json",
},
}, },
Action: func(cctx *cli.Context) error { Action: func(cctx *cli.Context) error {
api, closer, err := GetAPI(cctx) api, closer, err := GetAPI(cctx)
@ -65,18 +70,33 @@ var NetPeers = &cli.Command{
return strings.Compare(string(peers[i].ID), string(peers[j].ID)) > 0 return strings.Compare(string(peers[i].ID), string(peers[j].ID)) > 0
}) })
for _, peer := range peers { if cctx.Bool("extended") {
var agent string for _, peer := range peers {
if cctx.Bool("agent") { info, err := api.NetPeerInfo(ctx, peer.ID)
agent, err = api.NetAgentVersion(ctx, peer.ID)
if err != nil { if err != nil {
log.Warnf("getting agent version: %s", err) log.Warnf("error getting extended peer info: %s", err)
} else { } else {
agent = ", " + agent bytes, err := json.Marshal(&info)
if err != nil {
log.Warnf("error marshalling extended peer info: %s", err)
} else {
fmt.Println(string(bytes))
}
} }
} }
} else {
fmt.Printf("%s, %s%s\n", peer.ID, peer.Addrs, agent) for _, peer := range peers {
var agent string
if cctx.Bool("agent") {
agent, err := api.NetAgentVersion(ctx, peer.ID)
if err != nil {
log.Warnf("getting agent version: %s", err)
} else {
agent = ", " + agent
}
}
fmt.Printf("%s, %s%s\n", peer.ID, peer.Addrs, agent)
}
} }
return nil return nil
@ -88,8 +108,9 @@ var netScores = &cli.Command{
Usage: "Print peers' pubsub scores", Usage: "Print peers' pubsub scores",
Flags: []cli.Flag{ Flags: []cli.Flag{
&cli.BoolFlag{ &cli.BoolFlag{
Name: "extended", Name: "extended",
Usage: "print extended peer scores in json", Aliases: []string{"x"},
Usage: "print extended peer scores in json",
}, },
}, },
Action: func(cctx *cli.Context) error { Action: func(cctx *cli.Context) error {

View File

@ -99,6 +99,26 @@ func (a *CommonAPI) NetPeers(context.Context) ([]peer.AddrInfo, error) {
return out, nil return out, nil
} }
func (a *CommonAPI) NetPeerInfo(_ context.Context, p peer.ID) (*api.ExtendedPeerInfo, error) {
info := &api.ExtendedPeerInfo{ID: p}
agent, err := a.Host.Peerstore().Get(p, "AgentVersion")
if err == nil {
info.Agent = agent.(string)
}
for _, a := range a.Host.Peerstore().Addrs(p) {
info.Addrs = append(info.Addrs, a.String())
}
protocols, err := a.Host.Peerstore().GetProtocols(p)
if err == nil {
info.Protocols = protocols
}
return info, nil
}
func (a *CommonAPI) NetConnect(ctx context.Context, p peer.AddrInfo) error { func (a *CommonAPI) NetConnect(ctx context.Context, p peer.AddrInfo) error {
if swrm, ok := a.Host.Network().(*swarm.Swarm); ok { if swrm, ok := a.Host.Network().(*swarm.Swarm); ok {
swrm.Backoff().Clear(p.ID) swrm.Backoff().Clear(p.ID)