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
'