@cryptotaxi247 / kubo / commits / 6fa2ab0d4

coreapi swarm: rewire address listing cmds

License: MIT Signed-off-by: Łukasz Magiera <magik6k@gmail.com>

Łukasz Magiera committed Sep 17, 2018 at 19:53 UTC 6fa2ab0d411689073ed45ee9c17303d9d6e60e2d
6 files changed +102 -46
core/commands/swarm.go
+40 -44
@@ -21,7 +21,7 @@ import (
21 "gx/ipfs/QmVBUpxsHh53rNcufqxMpLAmz37eGyLJUaexDy1W9YkiNk/go-ipfs-config"
22 "gx/ipfs/QmXTmUCBtDUrzDYVzASogLiNph7EBuYqEgPL7QoHNMzUnz/go-ipfs-cmds"
23 ma "gx/ipfs/QmYmsdtJ3HsodkePE3eU3TsCaP2YvPZJ4LoXnNkDE5Tpt7/go-multiaddr"
24 - "gx/ipfs/QmbNepETomvmXfz1X5pHNFD2QuPqnqi47dTd94QJWSorQ3/go-libp2p-peer"
24 + peer "gx/ipfs/QmbNepETomvmXfz1X5pHNFD2QuPqnqi47dTd94QJWSorQ3/go-libp2p-peer"
25 pstore "gx/ipfs/QmfAQMFpgDU2U4BXG64qVr8HSiictfWvkSBz7Y2oDj65st/go-libp2p-peerstore"
26 inet "gx/ipfs/QmfDPh144WGBqRxZb1TGDHerbMnZATrHZggAPw7putNnBq/go-libp2p-net"
27 )
@@ -66,45 +66,39 @@ var swarmPeersCmd = &cmds.Command{
66 cmdkit.BoolOption("direction", "Also list information about the direction of connection"),
67 },
68 Run: func(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Environment) error {
69 - n, err := cmdenv.GetNode(env)
69 + api, err := cmdenv.GetApi(env)
70 if err != nil {
71 return err
72 }
73
74 - if n.PeerHost == nil {
75 - return err
76 - }
77 -
74 verbose, _ := req.Options["verbose"].(bool)
75 latency, _ := req.Options["latency"].(bool)
76 streams, _ := req.Options["streams"].(bool)
77 direction, _ := req.Options["direction"].(bool)
78
83 - conns := n.PeerHost.Network().Conns()
79 + conns, err := api.Swarm().Peers(req.Context)
80 + if err != nil {
81 + return err
82 + }
83 +
84 var out connInfos
85 for _, c := range conns {
86 - pid := c.RemotePeer()
87 - addr := c.RemoteMultiaddr()
86 ci := connInfo{
89 - Addr: addr.String(),
90 - Peer: pid.Pretty(),
87 + Addr: c.Address().String(),
88 + Peer: c.ID().Pretty(),
89 }
90
93 - /*
94 - // FIXME(steb):
95 - swcon, ok := c.(*swarm.Conn)
96 - if ok {
97 - ci.Muxer = fmt.Sprintf("%T", swcon.StreamConn().Conn())
98 - }
99 - */
100 -
91 if verbose || direction {
92 // set direction
103 - ci.Direction = c.Stat().Direction
93 + ci.Direction = c.Direction()
94 }
95
96 if verbose || latency {
107 - lat := n.Peerstore.LatencyEWMA(pid)
97 + lat, err := c.Latency(req.Context)
98 + if err != nil {
99 + return err
100 + }
101 +
102 if lat == 0 {
103 ci.Latency = "n/a"
104 } else {
@@ -112,10 +106,13 @@ var swarmPeersCmd = &cmds.Command{
106 }
107 }
108 if verbose || streams {
115 - strs := c.GetStreams()
109 + strs, err := c.Streams(req.Context)
110 + if err != nil {
111 + return err
112 + }
113
114 for _, s := range strs {
118 - ci.Streams = append(ci.Streams, streamInfo{Protocol: string(s.Protocol())})
115 + ci.Streams = append(ci.Streams, streamInfo{Protocol: string(s)})
116 }
117 }
118 sort.Sort(&ci)
@@ -229,26 +226,25 @@ var swarmAddrsCmd = &cmds.Command{
226 "listen": swarmAddrsListenCmd,
227 },
228 Run: func(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Environment) error {
232 - n, err := cmdenv.GetNode(env)
229 + api, err := cmdenv.GetApi(env)
230 if err != nil {
231 return err
232 }
233
237 - if n.PeerHost == nil {
234 + addrs, err := api.Swarm().KnownAddrs(req.Context)
235 + if err != nil {
236 return err
237 }
238
241 - addrs := make(map[string][]string)
242 - ps := n.PeerHost.Network().Peerstore()
243 - for _, p := range ps.Peers() {
239 + out := make(map[string][]string)
240 + for p, paddrs := range addrs {
241 s := p.Pretty()
245 - for _, a := range ps.Addrs(p) {
246 - addrs[s] = append(addrs[s], a.String())
242 + for _, a := range paddrs {
243 + out[s] = append(out[s], a.String())
244 }
248 - sort.Sort(sort.StringSlice(addrs[s]))
245 }
246
251 - return cmds.EmitOnce(res, &addrMap{Addrs: addrs})
247 + return cmds.EmitOnce(res, &addrMap{Addrs: out})
248 },
249 Encoders: cmds.EncoderMap{
250 cmds.Text: cmds.MakeEncoder(func(req *cmds.Request, w io.Writer, v interface{}) error {
@@ -288,23 +284,27 @@ var swarmAddrsLocalCmd = &cmds.Command{
284 cmdkit.BoolOption("id", "Show peer ID in addresses."),
285 },
286 Run: func(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Environment) error {
291 - n, err := cmdenv.GetNode(env)
287 + api, err := cmdenv.GetApi(env)
288 if err != nil {
289 return err
290 }
291
296 - if n.PeerHost == nil {
292 + showid, _ := req.Options["id"].(bool)
293 + self, err := api.Key().Self(req.Context)
294 + if err != nil {
295 return err
296 }
297
300 - showid, _ := req.Options["id"].(bool)
301 - id := n.Identity.Pretty()
298 + maddrs, err := api.Swarm().LocalAddrs(req.Context)
299 + if err != nil {
300 + return err
301 + }
302
303 var addrs []string
304 - for _, addr := range n.PeerHost.Addrs() {
304 + for _, addr := range maddrs {
305 saddr := addr.String()
306 if showid {
307 - saddr = path.Join(saddr, "ipfs", id)
307 + saddr = path.Join(saddr, "ipfs", self.ID().Pretty())
308 }
309 addrs = append(addrs, saddr)
310 }
@@ -325,17 +325,13 @@ var swarmAddrsListenCmd = &cmds.Command{
325 `,
326 },
327 Run: func(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Environment) error {
328 - n, err := cmdenv.GetNode(env)
328 + api, err := cmdenv.GetApi(env)
329 if err != nil {
330 return err
331 }
332
333 - if n.PeerHost == nil {
334 - return err
335 - }
336 -
333 var addrs []string
338 - maddrs, err := n.PeerHost.Network().InterfaceListenAddresses()
334 + maddrs, err := api.Swarm().ListenAddrs(req.Context)
335 if err != nil {
336 return err
337 }
core/coreapi/interface/key.go
+3
@@ -33,6 +33,9 @@ type KeyAPI interface {
33 // List lists keys stored in keystore
34 List(ctx context.Context) ([]Key, error)
35
36 + // Self returns the 'main' node key
37 + Self(ctx context.Context) (Key, error)
38 +
39 // Remove removes keys from keystore. Returns ipns path of the removed key
40 Remove(ctx context.Context, name string) (Key, error)
41 }
core/coreapi/interface/swarm.go
+9 -1
@@ -9,12 +9,13 @@ import (
9 "gx/ipfs/QmZNkThpqfVXs9GNbexPrfBbXSLNYeKrE7jwFM2oqHbyqN/go-libp2p-protocol"
10 "gx/ipfs/QmbNepETomvmXfz1X5pHNFD2QuPqnqi47dTd94QJWSorQ3/go-libp2p-peer"
11 pstore "gx/ipfs/QmfAQMFpgDU2U4BXG64qVr8HSiictfWvkSBz7Y2oDj65st/go-libp2p-peerstore"
12 + net "gx/ipfs/QmfDPh144WGBqRxZb1TGDHerbMnZATrHZggAPw7putNnBq/go-libp2p-net"
13 )
14
15 var (
16 ErrNotConnected = errors.New("not connected")
17 ErrConnNotFound = errors.New("conn not found")
17 - )
18 +)
19
20 // ConnectionInfo contains information about a peer
21 type ConnectionInfo interface {
@@ -24,6 +25,9 @@ type ConnectionInfo interface {
25 // Address returns the multiaddress via which we are connected with the peer
26 Address() ma.Multiaddr
27
28 + // Direction returns which way the connection was established
29 + Direction() net.Direction
30 +
31 // Latency returns last known round trip time to the peer
32 Latency(context.Context) (time.Duration, error)
33
@@ -41,4 +45,8 @@ type SwarmAPI interface {
45
46 // Peers returns the list of peers we are connected to
47 Peers(context.Context) ([]ConnectionInfo, error)
48 +
49 + KnownAddrs(context.Context) (map[peer.ID][]ma.Multiaddr, error)
50 + LocalAddrs(context.Context) ([]ma.Multiaddr, error)
51 + ListenAddrs(context.Context) ([]ma.Multiaddr, error)
52 }
core/coreapi/key.go
+4
@@ -216,3 +216,7 @@ func (api *KeyAPI) Remove(ctx context.Context, name string) (coreiface.Key, erro
216
217 return &key{"", pid}, nil
218 }
219 +
220 +func (api *KeyAPI) Self(ctx context.Context) (coreiface.Key, error) {
221 + return &key{"self", api.node.Identity}, nil
222 +}
core/coreapi/swarm.go
+42
@@ -3,6 +3,7 @@ package coreapi
3 import (
4 "context"
5 "fmt"
6 + "sort"
7 "time"
8
9 coreiface "github.com/ipfs/go-ipfs/core/coreapi/interface"
@@ -24,6 +25,7 @@ type SwarmAPI struct {
25 type connInfo struct {
26 api *CoreAPI
27 conn net.Conn
28 + dir net.Direction
29
30 addr ma.Multiaddr
31 peer peer.ID
@@ -80,6 +82,41 @@ func (api *SwarmAPI) Disconnect(ctx context.Context, addr ma.Multiaddr) error {
82 return nil
83 }
84
85 +func (api *SwarmAPI) KnownAddrs(context.Context) (map[peer.ID][]ma.Multiaddr, error) {
86 + if api.node.PeerHost == nil {
87 + return nil, coreiface.ErrOffline
88 + }
89 +
90 + addrs := make(map[peer.ID][]ma.Multiaddr)
91 + ps := api.node.PeerHost.Network().Peerstore()
92 + for _, p := range ps.Peers() {
93 + for _, a := range ps.Addrs(p) {
94 + addrs[p] = append(addrs[p], a)
95 + }
96 + sort.Slice(addrs[p], func(i, j int) bool {
97 + return addrs[p][i].String() < addrs[p][j].String()
98 + })
99 + }
100 +
101 + return addrs, nil
102 +}
103 +
104 +func (api *SwarmAPI) LocalAddrs(context.Context) ([]ma.Multiaddr, error) {
105 + if api.node.PeerHost == nil {
106 + return nil, coreiface.ErrOffline
107 + }
108 +
109 + return api.node.PeerHost.Addrs(), nil
110 +}
111 +
112 +func (api *SwarmAPI) ListenAddrs(context.Context) ([]ma.Multiaddr, error) {
113 + if api.node.PeerHost == nil {
114 + return nil, coreiface.ErrOffline
115 + }
116 +
117 + return api.node.PeerHost.Network().InterfaceListenAddresses()
118 +}
119 +
120 func (api *SwarmAPI) Peers(context.Context) ([]coreiface.ConnectionInfo, error) {
121 if api.node.PeerHost == nil {
122 return nil, coreiface.ErrOffline
@@ -95,6 +132,7 @@ func (api *SwarmAPI) Peers(context.Context) ([]coreiface.ConnectionInfo, error)
132 ci := &connInfo{
133 api: api.CoreAPI,
134 conn: c,
135 + dir: c.Stat().Direction,
136
137 addr: addr,
138 peer: pid,
@@ -122,6 +160,10 @@ func (ci *connInfo) Address() ma.Multiaddr {
160 return ci.addr
161 }
162
163 +func (ci *connInfo) Direction() net.Direction {
164 + return ci.dir
165 +}
166 +
167 func (ci *connInfo) Latency(context.Context) (time.Duration, error) {
168 return ci.api.node.Peerstore.LatencyEWMA(peer.ID(ci.ID())), nil
169 }
test/sharness/lib/test-lib.sh
+4 -1
@@ -199,8 +199,11 @@ test_set_address_vars() {
199 '
200
201 if ipfs swarm addrs local >/dev/null 2>&1; then
202 + test_expect_success "get swarm addresses" '
203 + ipfs swarm addrs local > addrs_out
204 + '
205 +
206 test_expect_success "set swarm address vars" '
203 - ipfs swarm addrs local > addrs_out &&
207 SWARM_MADDR=$(grep "127.0.0.1" addrs_out) &&
208 SWARM_PORT=$(port_from_maddr $SWARM_MADDR)
209 '