Skip to content

Commit

Permalink
Merge pull request #6675 from ipfs/feat/systemd-activation
Browse files Browse the repository at this point in the history
add systemd support
  • Loading branch information
Stebalien committed Sep 30, 2019
2 parents fdcdcb8 + 0d0b4fc commit 164dd28
Show file tree
Hide file tree
Showing 8 changed files with 119 additions and 73 deletions.
78 changes: 51 additions & 27 deletions cmd/ipfs/daemon.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import (
nodeMount "github.com/ipfs/go-ipfs/fuse/node"
fsrepo "github.com/ipfs/go-ipfs/repo/fsrepo"
migrate "github.com/ipfs/go-ipfs/repo/fsrepo/migrations"
sockets "github.com/libp2p/go-socket-activation"

"github.com/hashicorp/go-multierror"
cmds "github.com/ipfs/go-ipfs-cmds"
Expand Down Expand Up @@ -291,11 +292,6 @@ func daemonFunc(req *cmds.Request, re cmds.ResponseEmitter, env cmds.Environment
// fail before we get to that. It can't hurt to close it twice.
defer repo.Close()

cfg, err := cctx.GetConfig()
if err != nil {
return err
}

offline, _ := req.Options[offlineKwd].(bool)
ipnsps, _ := req.Options[enableIPNSPubSubKwd].(bool)
pubsub, _ := req.Options[enablePubSubKwd].(bool)
Expand Down Expand Up @@ -405,14 +401,10 @@ func daemonFunc(req *cmds.Request, re cmds.ResponseEmitter, env cmds.Environment
return err
}

// construct http gateway - if it is set in the config
var gwErrc <-chan error
if len(cfg.Addresses.Gateway) > 0 {
var err error
gwErrc, err = serveHTTPGateway(req, cctx)
if err != nil {
return err
}
// construct http gateway
gwErrc, err := serveHTTPGateway(req, cctx)
if err != nil {
return err
}

// Add ipfs version info to prometheous metrics
Expand All @@ -432,10 +424,12 @@ func daemonFunc(req *cmds.Request, re cmds.ResponseEmitter, env cmds.Environment

// The daemon is *finally* ready.
fmt.Printf("Daemon is ready\n")
notifyReady()

// Give the user some immediate feedback when they hit C-c
go func() {
<-req.Context.Done()
notifyStopping()
fmt.Println("Received interrupt signal, shutting down...")
fmt.Println("(Hit ctrl-c again to force-shutdown the daemon.)")
}()
Expand All @@ -459,6 +453,11 @@ func serveHTTPApi(req *cmds.Request, cctx *oldcmds.Context) (<-chan error, error
return nil, fmt.Errorf("serveHTTPApi: GetConfig() failed: %s", err)
}

listeners, err := sockets.TakeListeners("io.ipfs.api")
if err != nil {
return nil, fmt.Errorf("serveHTTPApi: socket activation failed: %s", err)
}

apiAddrs := make([]string, 0, 2)
apiAddr, _ := req.Options[commands.ApiOption].(string)
if apiAddr == "" {
Expand All @@ -467,25 +466,35 @@ func serveHTTPApi(req *cmds.Request, cctx *oldcmds.Context) (<-chan error, error
apiAddrs = append(apiAddrs, apiAddr)
}

listeners := make([]manet.Listener, 0, len(apiAddrs))
listenerAddrs := make(map[string]bool, len(listeners))
for _, listener := range listeners {
listenerAddrs[string(listener.Multiaddr().Bytes())] = true
}

for _, addr := range apiAddrs {
apiMaddr, err := ma.NewMultiaddr(addr)
if err != nil {
return nil, fmt.Errorf("serveHTTPApi: invalid API address: %q (err: %s)", apiAddr, err)
}
if listenerAddrs[string(apiMaddr.Bytes())] {
continue
}

apiLis, err := manet.Listen(apiMaddr)
if err != nil {
return nil, fmt.Errorf("serveHTTPApi: manet.Listen(%s) failed: %s", apiMaddr, err)
}

// we might have listened to /tcp/0 - lets see what we are listing on
apiMaddr = apiLis.Multiaddr()
fmt.Printf("API server listening on %s\n", apiMaddr)
fmt.Printf("WebUI: http://%s/webui\n", apiLis.Addr())
listenerAddrs[string(apiMaddr.Bytes())] = true
listeners = append(listeners, apiLis)
}

for _, listener := range listeners {
// we might have listened to /tcp/0 - lets see what we are listing on
fmt.Printf("API server listening on %s\n", listener.Multiaddr())
fmt.Printf("WebUI: http://%s/webui\n", listener.Addr())
}

// by default, we don't let you load arbitrary ipfs objects through the api,
// because this would open up the api to scripting vulnerabilities.
// only the webui objects are allowed.
Expand Down Expand Up @@ -584,28 +593,43 @@ func serveHTTPGateway(req *cmds.Request, cctx *oldcmds.Context) (<-chan error, e
writable = cfg.Gateway.Writable
}

listeners, err := sockets.TakeListeners("io.ipfs.gateway")
if err != nil {
return nil, fmt.Errorf("serveHTTPGateway: socket activation failed: %s", err)
}

listenerAddrs := make(map[string]bool, len(listeners))
for _, listener := range listeners {
listenerAddrs[string(listener.Multiaddr().Bytes())] = true
}

gatewayAddrs := cfg.Addresses.Gateway
listeners := make([]manet.Listener, 0, len(gatewayAddrs))
for _, addr := range gatewayAddrs {
gatewayMaddr, err := ma.NewMultiaddr(addr)
if err != nil {
return nil, fmt.Errorf("serveHTTPGateway: invalid gateway address: %q (err: %s)", addr, err)
}

if listenerAddrs[string(gatewayMaddr.Bytes())] {
continue
}

gwLis, err := manet.Listen(gatewayMaddr)
if err != nil {
return nil, fmt.Errorf("serveHTTPGateway: manet.Listen(%s) failed: %s", gatewayMaddr, err)
}
// we might have listened to /tcp/0 - lets see what we are listing on
gatewayMaddr = gwLis.Multiaddr()
listenerAddrs[string(gatewayMaddr.Bytes())] = true
listeners = append(listeners, gwLis)
}

if writable {
fmt.Printf("Gateway (writable) server listening on %s\n", gatewayMaddr)
} else {
fmt.Printf("Gateway (readonly) server listening on %s\n", gatewayMaddr)
}
// we might have listened to /tcp/0 - lets see what we are listing on
gwType := "readonly"
if writable {
gwType = "writable"
}

listeners = append(listeners, gwLis)
for _, listener := range listeners {
fmt.Printf("Gateway (%s) server listening on %s\n", gwType, listener.Multiaddr())
}

cmdctx := *cctx
Expand Down
15 changes: 15 additions & 0 deletions cmd/ipfs/daemon_linux.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
// +build linux

package main

import (
daemon "github.com/coreos/go-systemd/daemon"
)

func notifyReady() {
_, _ = daemon.SdNotify(false, daemon.SdNotifyReady)
}

func notifyStopping() {
_, _ = daemon.SdNotify(false, daemon.SdNotifyStopping)
}
7 changes: 7 additions & 0 deletions cmd/ipfs/daemon_other.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
// +build !linux

package main

func notifyReady() {}

func notifyStopping() {}
2 changes: 2 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ require (
github.com/AndreasBriese/bbloom v0.0.0-20190823232136-616930265c33 // indirect
github.com/blang/semver v3.5.1+incompatible
github.com/bren2010/proquint v0.0.0-20160323162903-38337c27106d
github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f
github.com/dustin/go-humanize v1.0.0
github.com/elgris/jsondiff v0.0.0-20160530203242-765b5c24c302
github.com/fatih/color v1.7.0 // indirect
Expand Down Expand Up @@ -78,6 +79,7 @@ require (
github.com/libp2p/go-libp2p-tls v0.1.1
github.com/libp2p/go-libp2p-yamux v0.2.1
github.com/libp2p/go-maddr-filter v0.0.5
github.com/libp2p/go-socket-activation v0.0.1
github.com/mattn/go-runewidth v0.0.4 // indirect
github.com/mitchellh/go-homedir v1.1.0
github.com/mr-tron/base58 v1.1.2
Expand Down

0 comments on commit 164dd28

Please sign in to comment.