added ipfs swarm connect
Juan Batiz-Benet committed
Nov 18, 2014 at 01:47 UTC
81135f3dc235cc5c296d7a6f28566554d0f3f28b
1 file changed
+102
-2
core/commands2/swarm.go
+102
-2
@@ -3,9 +3,15 @@ package commands
3
import (
4
"bytes"
5
"fmt"
6
+ "path"
7
8
cmds "github.com/jbenet/go-ipfs/commands"
9
+ internal "github.com/jbenet/go-ipfs/core/commands2/internal"
10
+ peer "github.com/jbenet/go-ipfs/peer"
11
errors "github.com/jbenet/go-ipfs/util/debugerror"
12
+
13
+ context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context"
14
+ ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr"
15
)
16
17
type stringList struct {
@@ -26,8 +32,8 @@ ipfs peers in the internet.
32
`,
33
},
34
Subcommands: map[string]*cmds.Command{
29
- "peers": swarmPeersCmd,
30
- // "connect": swarmConnectCmd,
35
+ "peers": swarmPeersCmd,
36
+ "connect": swarmConnectCmd,
37
},
38
}
39
@@ -66,6 +72,62 @@ ipfs swarm peers lists the set of peers this node is connected to.
72
Type: &stringList{},
73
}
74
75
+var swarmConnectCmd = &cmds.Command{
76
+ Helptext: cmds.HelpText{
77
+ Tagline: "Open connection to a given peer",
78
+ ShortDescription: `
79
+'ipfs swarm connect' opens a connection to a peer address. The address format
80
+is an ipfs multiaddr:
81
+
82
+ipfs swarm connect /ip4/104.131.131.82/tcp/4001/QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ
83
+`,
84
+ },
85
+ Arguments: []cmds.Argument{
86
+ cmds.StringArg("address", true, true, "address of peer to connect to"),
87
+ },
88
+ Run: func(req cmds.Request) (interface{}, error) {
89
+ ctx := context.TODO()
90
+
91
+ log.Debug("ipfs swarm connect")
92
+ n, err := req.Context().GetNode()
93
+ if err != nil {
94
+ return nil, err
95
+ }
96
+
97
+ addrs, err := internal.CastToStrings(req.Arguments())
98
+ if err != nil {
99
+ return nil, cmds.ClientError("Improperly formatted peer addresses: " + err.Error())
100
+ }
101
+
102
+ if n.Network == nil {
103
+ return nil, errNotOnline
104
+ }
105
+
106
+ peers, err := peersWithAddresses(n.Peerstore, addrs)
107
+ if err != nil {
108
+ return nil, err
109
+ }
110
+
111
+ output := make([]string, len(peers))
112
+ for i, p := range peers {
113
+ output[i] = "connect " + p.ID().String()
114
+
115
+ err := n.Network.DialPeer(ctx, p)
116
+ if err != nil {
117
+ output[i] += " failure: " + err.Error()
118
+ } else {
119
+ output[i] += " success"
120
+ }
121
+ }
122
+
123
+ return &stringList{output}, nil
124
+ },
125
+ Marshalers: cmds.MarshalerMap{
126
+ cmds.Text: stringListMarshaler,
127
+ },
128
+ Type: &stringList{},
129
+}
130
+
131
func stringListMarshaler(res cmds.Response) ([]byte, error) {
132
list, ok := res.Output().(*stringList)
133
if !ok {
@@ -79,3 +141,41 @@ func stringListMarshaler(res cmds.Response) ([]byte, error) {
141
}
142
return buf.Bytes(), nil
143
}
144
+
145
+// splitAddresses is a function that takes in a slice of string peer addresses
146
+// (multiaddr + peerid) and returns slices of multiaddrs and peerids.
147
+func splitAddresses(addrs []string) (maddrs []ma.Multiaddr, pids []peer.ID, err error) {
148
+
149
+ maddrs = make([]ma.Multiaddr, len(addrs))
150
+ pids = make([]peer.ID, len(addrs))
151
+ for i, addr := range addrs {
152
+ a, err := ma.NewMultiaddr(path.Dir(addr))
153
+ if err != nil {
154
+ return nil, nil, cmds.ClientError("invalid peer address: " + err.Error())
155
+ }
156
+ maddrs[i] = a
157
+ pids[i] = peer.DecodePrettyID(path.Base(addr))
158
+ }
159
+ return
160
+}
161
+
162
+// peersWithAddresses is a function that takes in a slice of string peer addresses
163
+// (multiaddr + peerid) and returns a slice of properly constructed peers
164
+func peersWithAddresses(ps peer.Peerstore, addrs []string) ([]peer.Peer, error) {
165
+ maddrs, pids, err := splitAddresses(addrs)
166
+ if err != nil {
167
+ return nil, err
168
+ }
169
+
170
+ peers := make([]peer.Peer, len(pids))
171
+ for i, pid := range pids {
172
+ p, err := ps.Get(pid)
173
+ if err != nil {
174
+ return nil, err
175
+ }
176
+
177
+ p.AddAddress(maddrs[i])
178
+ peers[i] = p
179
+ }
180
+ return peers, nil
181
+}