@@ -26,6 +26,7 @@ import (
26
26
nodeMount "github.com/ipfs/go-ipfs/fuse/node"
27
27
fsrepo "github.com/ipfs/go-ipfs/repo/fsrepo"
28
28
migrate "github.com/ipfs/go-ipfs/repo/fsrepo/migrations"
29
+ sockets "github.com/libp2p/go-socket-activation"
29
30
30
31
"github.com/hashicorp/go-multierror"
31
32
cmds "github.com/ipfs/go-ipfs-cmds"
@@ -291,11 +292,6 @@ func daemonFunc(req *cmds.Request, re cmds.ResponseEmitter, env cmds.Environment
291
292
// fail before we get to that. It can't hurt to close it twice.
292
293
defer repo .Close ()
293
294
294
- cfg , err := cctx .GetConfig ()
295
- if err != nil {
296
- return err
297
- }
298
-
299
295
offline , _ := req .Options [offlineKwd ].(bool )
300
296
ipnsps , _ := req .Options [enableIPNSPubSubKwd ].(bool )
301
297
pubsub , _ := req .Options [enablePubSubKwd ].(bool )
@@ -405,14 +401,10 @@ func daemonFunc(req *cmds.Request, re cmds.ResponseEmitter, env cmds.Environment
405
401
return err
406
402
}
407
403
408
- // construct http gateway - if it is set in the config
409
- var gwErrc <- chan error
410
- if len (cfg .Addresses .Gateway ) > 0 {
411
- var err error
412
- gwErrc , err = serveHTTPGateway (req , cctx )
413
- if err != nil {
414
- return err
415
- }
404
+ // construct http gateway
405
+ gwErrc , err := serveHTTPGateway (req , cctx )
406
+ if err != nil {
407
+ return err
416
408
}
417
409
418
410
// Add ipfs version info to prometheous metrics
@@ -432,10 +424,12 @@ func daemonFunc(req *cmds.Request, re cmds.ResponseEmitter, env cmds.Environment
432
424
433
425
// The daemon is *finally* ready.
434
426
fmt .Printf ("Daemon is ready\n " )
427
+ notifyReady ()
435
428
436
429
// Give the user some immediate feedback when they hit C-c
437
430
go func () {
438
431
<- req .Context .Done ()
432
+ notifyStopping ()
439
433
fmt .Println ("Received interrupt signal, shutting down..." )
440
434
fmt .Println ("(Hit ctrl-c again to force-shutdown the daemon.)" )
441
435
}()
@@ -459,6 +453,11 @@ func serveHTTPApi(req *cmds.Request, cctx *oldcmds.Context) (<-chan error, error
459
453
return nil , fmt .Errorf ("serveHTTPApi: GetConfig() failed: %s" , err )
460
454
}
461
455
456
+ listeners , err := sockets .TakeListeners ("io.ipfs.api" )
457
+ if err != nil {
458
+ return nil , fmt .Errorf ("serveHTTPApi: socket activation failed: %s" , err )
459
+ }
460
+
462
461
apiAddrs := make ([]string , 0 , 2 )
463
462
apiAddr , _ := req .Options [commands .ApiOption ].(string )
464
463
if apiAddr == "" {
@@ -467,25 +466,35 @@ func serveHTTPApi(req *cmds.Request, cctx *oldcmds.Context) (<-chan error, error
467
466
apiAddrs = append (apiAddrs , apiAddr )
468
467
}
469
468
470
- listeners := make ([]manet.Listener , 0 , len (apiAddrs ))
469
+ listenerAddrs := make (map [string ]bool , len (listeners ))
470
+ for _ , listener := range listeners {
471
+ listenerAddrs [string (listener .Multiaddr ().Bytes ())] = true
472
+ }
473
+
471
474
for _ , addr := range apiAddrs {
472
475
apiMaddr , err := ma .NewMultiaddr (addr )
473
476
if err != nil {
474
477
return nil , fmt .Errorf ("serveHTTPApi: invalid API address: %q (err: %s)" , apiAddr , err )
475
478
}
479
+ if listenerAddrs [string (apiMaddr .Bytes ())] {
480
+ continue
481
+ }
476
482
477
483
apiLis , err := manet .Listen (apiMaddr )
478
484
if err != nil {
479
485
return nil , fmt .Errorf ("serveHTTPApi: manet.Listen(%s) failed: %s" , apiMaddr , err )
480
486
}
481
487
482
- // we might have listened to /tcp/0 - lets see what we are listing on
483
- apiMaddr = apiLis .Multiaddr ()
484
- fmt .Printf ("API server listening on %s\n " , apiMaddr )
485
- fmt .Printf ("WebUI: http://%s/webui\n " , apiLis .Addr ())
488
+ listenerAddrs [string (apiMaddr .Bytes ())] = true
486
489
listeners = append (listeners , apiLis )
487
490
}
488
491
492
+ for _ , listener := range listeners {
493
+ // we might have listened to /tcp/0 - lets see what we are listing on
494
+ fmt .Printf ("API server listening on %s\n " , listener .Multiaddr ())
495
+ fmt .Printf ("WebUI: http://%s/webui\n " , listener .Addr ())
496
+ }
497
+
489
498
// by default, we don't let you load arbitrary ipfs objects through the api,
490
499
// because this would open up the api to scripting vulnerabilities.
491
500
// only the webui objects are allowed.
@@ -584,28 +593,43 @@ func serveHTTPGateway(req *cmds.Request, cctx *oldcmds.Context) (<-chan error, e
584
593
writable = cfg .Gateway .Writable
585
594
}
586
595
596
+ listeners , err := sockets .TakeListeners ("io.ipfs.gateway" )
597
+ if err != nil {
598
+ return nil , fmt .Errorf ("serveHTTPGateway: socket activation failed: %s" , err )
599
+ }
600
+
601
+ listenerAddrs := make (map [string ]bool , len (listeners ))
602
+ for _ , listener := range listeners {
603
+ listenerAddrs [string (listener .Multiaddr ().Bytes ())] = true
604
+ }
605
+
587
606
gatewayAddrs := cfg .Addresses .Gateway
588
- listeners := make ([]manet.Listener , 0 , len (gatewayAddrs ))
589
607
for _ , addr := range gatewayAddrs {
590
608
gatewayMaddr , err := ma .NewMultiaddr (addr )
591
609
if err != nil {
592
610
return nil , fmt .Errorf ("serveHTTPGateway: invalid gateway address: %q (err: %s)" , addr , err )
593
611
}
594
612
613
+ if listenerAddrs [string (gatewayMaddr .Bytes ())] {
614
+ continue
615
+ }
616
+
595
617
gwLis , err := manet .Listen (gatewayMaddr )
596
618
if err != nil {
597
619
return nil , fmt .Errorf ("serveHTTPGateway: manet.Listen(%s) failed: %s" , gatewayMaddr , err )
598
620
}
599
- // we might have listened to /tcp/0 - lets see what we are listing on
600
- gatewayMaddr = gwLis .Multiaddr ()
621
+ listenerAddrs [string (gatewayMaddr .Bytes ())] = true
622
+ listeners = append (listeners , gwLis )
623
+ }
601
624
602
- if writable {
603
- fmt . Printf ( "Gateway (writable) server listening on %s \n " , gatewayMaddr )
604
- } else {
605
- fmt . Printf ( "Gateway (readonly) server listening on %s \n " , gatewayMaddr )
606
- }
625
+ // we might have listened to /tcp/0 - lets see what we are listing on
626
+ gwType := "readonly"
627
+ if writable {
628
+ gwType = "writable"
629
+ }
607
630
608
- listeners = append (listeners , gwLis )
631
+ for _ , listener := range listeners {
632
+ fmt .Printf ("Gateway (%s) server listening on %s\n " , gwType , listener .Multiaddr ())
609
633
}
610
634
611
635
cmdctx := * cctx
0 commit comments