@@ -16,11 +16,11 @@ import (
16
16
"syscall"
17
17
"time"
18
18
19
- kingpin "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ alecthomas/kingpin"
19
+ kingpin "github.com/alecthomas/kingpin"
20
20
serial "github.com/ipfs/go-ipfs/repo/fsrepo/serialize"
21
21
22
- ma "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ jbenet/go-multiaddr"
23
- manet "github.com/ipfs /go-ipfs /Godeps/_workspace/src/github.com/jbenet/go-multiaddr-net "
22
+ manet "github.com/jbenet/go-multiaddr-net "
23
+ ma "github.com/jbenet /go-multiaddr-net /Godeps/_workspace/src/github.com/jbenet/go-multiaddr"
24
24
)
25
25
26
26
// GetNumNodes returns the number of testbed nodes configured in the testbed directory
@@ -73,13 +73,19 @@ type initCfg struct {
73
73
Bootstrap string
74
74
PortStart int
75
75
Mdns bool
76
+ Utp bool
76
77
}
77
78
78
79
func (c * initCfg ) swarmAddrForPeer (i int ) string {
80
+ str := "/ip4/0.0.0.0/tcp/%d"
81
+ if c .Utp {
82
+ str = "/ip4/0.0.0.0/udp/%d/utp"
83
+ }
84
+
79
85
if c .PortStart == 0 {
80
- return "/ip4/0.0.0.0/tcp/0"
86
+ return fmt . Sprintf ( str , 0 )
81
87
}
82
- return fmt .Sprintf ("/ip4/0.0.0.0/tcp/%d" , c .PortStart + i )
88
+ return fmt .Sprintf (str , c .PortStart + i )
83
89
}
84
90
85
91
func (c * initCfg ) apiAddrForPeer (i int ) string {
@@ -250,14 +256,28 @@ func IpfsKillAll() error {
250
256
return nil
251
257
}
252
258
259
+ func envForDaemon (n int ) []string {
260
+ envs := os .Environ ()
261
+ npath := "IPFS_PATH=" + IpfsDirN (n )
262
+ for i , e := range envs {
263
+ p := strings .Split (e , "=" )
264
+ if p [0 ] == "IPFS_PATH" {
265
+ envs [i ] = npath
266
+ return envs
267
+ }
268
+ }
269
+
270
+ return append (envs , npath )
271
+ }
272
+
253
273
func IpfsStart (waitall bool ) error {
254
274
var addrs []string
255
275
n := GetNumNodes ()
256
276
for i := 0 ; i < n ; i ++ {
257
277
dir := IpfsDirN (i )
258
278
cmd := exec .Command ("ipfs" , "daemon" )
259
279
cmd .Dir = dir
260
- cmd .Env = append ( os . Environ (), "IPFS_PATH=" + dir )
280
+ cmd .Env = envForDaemon ( i )
261
281
262
282
cmd .SysProcAttr = & syscall.SysProcAttr {Setsid : true }
263
283
@@ -441,6 +461,11 @@ func IpfsShell(n int) error {
441
461
}
442
462
443
463
func ConnectNodes (from , to int ) error {
464
+ if from == to {
465
+ // skip connecting to self..
466
+ return nil
467
+ }
468
+ fmt .Printf ("connecting %d -> %d\n " , from , to )
444
469
cmd := exec .Command ("ipfs" , "id" , "-f" , "<addrs>" )
445
470
cmd .Env = []string {"IPFS_PATH=" + IpfsDirN (to )}
446
471
out , err := cmd .Output ()
@@ -449,7 +474,6 @@ func ConnectNodes(from, to int) error {
449
474
return err
450
475
}
451
476
addr := strings .Split (string (out ), "\n " )[0 ]
452
- fmt .Println ("ADDR: " , addr )
453
477
454
478
connectcmd := exec .Command ("ipfs" , "swarm" , "connect" , addr )
455
479
connectcmd .Env = []string {"IPFS_PATH=" + IpfsDirN (from )}
@@ -461,6 +485,55 @@ func ConnectNodes(from, to int) error {
461
485
return nil
462
486
}
463
487
488
+ func parseRange (s string ) ([]int , error ) {
489
+ if strings .HasPrefix (s , "[" ) && strings .HasSuffix (s , "]" ) {
490
+ ranges := strings .Split (s [1 :len (s )- 1 ], "," )
491
+ var out []int
492
+ for _ , r := range ranges {
493
+ rng , err := expandDashRange (r )
494
+ if err != nil {
495
+ return nil , err
496
+ }
497
+
498
+ out = append (out , rng ... )
499
+ }
500
+ return out , nil
501
+ } else {
502
+ i , err := strconv .Atoi (s )
503
+ if err != nil {
504
+ return nil , err
505
+ }
506
+
507
+ return []int {i }, nil
508
+ }
509
+ }
510
+
511
+ func expandDashRange (s string ) ([]int , error ) {
512
+ parts := strings .Split (s , "-" )
513
+ if len (parts ) == 0 {
514
+ i , err := strconv .Atoi (s )
515
+ if err != nil {
516
+ return nil , err
517
+ }
518
+ return []int {i }, nil
519
+ }
520
+ low , err := strconv .Atoi (parts [0 ])
521
+ if err != nil {
522
+ return nil , err
523
+ }
524
+
525
+ hi , err := strconv .Atoi (parts [1 ])
526
+ if err != nil {
527
+ return nil , err
528
+ }
529
+
530
+ var out []int
531
+ for i := low ; i <= hi ; i ++ {
532
+ out = append (out , i )
533
+ }
534
+ return out , nil
535
+ }
536
+
464
537
func GetAttr (attr string , node int ) (string , error ) {
465
538
switch attr {
466
539
case "id" :
@@ -518,9 +591,10 @@ func main() {
518
591
cfg := new (initCfg )
519
592
kingpin .Flag ("n" , "number of ipfs nodes to initialize" ).Short ('n' ).IntVar (& cfg .Count )
520
593
kingpin .Flag ("port" , "port to start allocations from" ).Default ("4002" ).Short ('p' ).IntVar (& cfg .PortStart )
521
- kingpin .Flag ("f " , "force initialization (overwrite existing configs)" ).BoolVar (& cfg .Force )
594
+ kingpin .Flag ("force " , "force initialization (overwrite existing configs)" ). Short ( 'f' ).BoolVar (& cfg .Force )
522
595
kingpin .Flag ("mdns" , "turn on mdns for nodes" ).BoolVar (& cfg .Mdns )
523
596
kingpin .Flag ("bootstrap" , "select bootstrapping style for cluster" ).Default ("star" ).StringVar (& cfg .Bootstrap )
597
+ kingpin .Flag ("utp" , "use utp for addresses" ).BoolVar (& cfg .Utp )
524
598
525
599
wait := kingpin .Flag ("wait" , "wait for nodes to come fully online before exiting" ).Bool ()
526
600
@@ -576,22 +650,26 @@ func main() {
576
650
os .Exit (1 )
577
651
}
578
652
579
- from , err := strconv . Atoi (args [1 ])
653
+ from , err := parseRange (args [1 ])
580
654
if err != nil {
581
655
fmt .Printf ("failed to parse: %s\n " , err )
582
656
return
583
657
}
584
658
585
- to , err := strconv . Atoi (args [2 ])
659
+ to , err := parseRange (args [2 ])
586
660
if err != nil {
587
661
fmt .Printf ("failed to parse: %s\n " , err )
588
662
return
589
663
}
590
664
591
- err = ConnectNodes (from , to )
592
- if err != nil {
593
- fmt .Printf ("failed to connect: %s\n " , err )
594
- return
665
+ for _ , f := range from {
666
+ for _ , t := range to {
667
+ err = ConnectNodes (f , t )
668
+ if err != nil {
669
+ fmt .Printf ("failed to connect: %s\n " , err )
670
+ return
671
+ }
672
+ }
595
673
}
596
674
597
675
case "get" :
0 commit comments