@cryptotaxi247 / kubo / commits / 81135f3dc

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 +}