From 4a2c17b1ab8316ab3b4fa2b769d1dccad3cb97d5 Mon Sep 17 00:00:00 2001
From: Lewis Marshall <lewis@lmars.net>
Date: Sun, 21 May 2017 23:56:40 -0700
Subject: [PATCH] cmd/swarm: Add --httpaddr flag (#14475)

Fixes #14474.

Signed-off-by: Lewis Marshall <lewis@lmars.net>
---
 cmd/swarm/main.go        |  8 ++++++++
 swarm/api/config.go      | 19 +++++++++++--------
 swarm/api/config_test.go |  1 +
 swarm/api/http/server.go |  1 -
 swarm/swarm.go           | 20 ++++++++++----------
 5 files changed, 30 insertions(+), 19 deletions(-)

diff --git a/cmd/swarm/main.go b/cmd/swarm/main.go
index 26aa3e50f..71149c310 100644
--- a/cmd/swarm/main.go
+++ b/cmd/swarm/main.go
@@ -67,6 +67,10 @@ var (
 		Name:  "bzzaccount",
 		Usage: "Swarm account key file",
 	}
+	SwarmListenAddrFlag = cli.StringFlag{
+		Name:  "httpaddr",
+		Usage: "Swarm HTTP API listening interface",
+	}
 	SwarmPortFlag = cli.StringFlag{
 		Name:  "bzzport",
 		Usage: "Swarm local http api port",
@@ -249,6 +253,7 @@ Cleans database of corrupted entries.
 		SwarmConfigPathFlag,
 		SwarmSwapEnabledFlag,
 		SwarmSyncEnabledFlag,
+		SwarmListenAddrFlag,
 		SwarmPortFlag,
 		SwarmAccountFlag,
 		SwarmNetworkIdFlag,
@@ -345,6 +350,9 @@ func registerBzzService(ctx *cli.Context, stack *node.Node) {
 	if len(bzzport) > 0 {
 		bzzconfig.Port = bzzport
 	}
+	if bzzaddr := ctx.GlobalString(SwarmListenAddrFlag.Name); bzzaddr != "" {
+		bzzconfig.ListenAddr = bzzaddr
+	}
 	swapEnabled := ctx.GlobalBool(SwarmSwapEnabledFlag.Name)
 	syncEnabled := ctx.GlobalBoolT(SwarmSyncEnabledFlag.Name)
 
diff --git a/swarm/api/config.go b/swarm/api/config.go
index 23a855500..647c153ed 100644
--- a/swarm/api/config.go
+++ b/swarm/api/config.go
@@ -32,7 +32,8 @@ import (
 )
 
 const (
-	port = "8500"
+	DefaultHTTPListenAddr = "127.0.0.1"
+	DefaultHTTPPort       = "8500"
 )
 
 var (
@@ -48,12 +49,13 @@ type Config struct {
 	*network.HiveParams
 	Swap *swap.SwapParams
 	*network.SyncParams
-	Path      string
-	Port      string
-	PublicKey string
-	BzzKey    string
-	EnsRoot   common.Address
-	NetworkId uint64
+	Path       string
+	ListenAddr string
+	Port       string
+	PublicKey  string
+	BzzKey     string
+	EnsRoot    common.Address
+	NetworkId  uint64
 }
 
 // config is agnostic to where private key is coming from
@@ -76,7 +78,8 @@ func NewConfig(path string, contract common.Address, prvKey *ecdsa.PrivateKey, n
 		HiveParams:    network.NewHiveParams(dirpath),
 		ChunkerParams: storage.NewChunkerParams(),
 		StoreParams:   storage.NewStoreParams(dirpath),
-		Port:          port,
+		ListenAddr:    DefaultHTTPListenAddr,
+		Port:          DefaultHTTPPort,
 		Path:          dirpath,
 		Swap:          swap.DefaultSwapParams(contract, prvKey),
 		PublicKey:     pubkeyhex,
diff --git a/swarm/api/config_test.go b/swarm/api/config_test.go
index 2f40098a3..6b5cea915 100644
--- a/swarm/api/config_test.go
+++ b/swarm/api/config_test.go
@@ -80,6 +80,7 @@ var (
         false
     ],
     "Path": "TMPDIR",
+    "ListenAddr": "127.0.0.1",
     "Port": "8500",
     "PublicKey": "0x045f5cfd26692e48d0017d380349bcf50982488bc11b5145f3ddf88b24924299048450542d43527fbe29a5cb32f38d62755393ac002e6bfdd71b8d7ba725ecd7a3",
     "BzzKey": "0xe861964402c0b78e2d44098329b8545726f215afa737d803714a4338552fcb81",
diff --git a/swarm/api/http/server.go b/swarm/api/http/server.go
index 849b9e10f..5f64f971b 100644
--- a/swarm/api/http/server.go
+++ b/swarm/api/http/server.go
@@ -69,7 +69,6 @@ func StartHttpServer(api *api.Api, config *ServerConfig) {
 	hdlr := c.Handler(NewServer(api))
 
 	go http.ListenAndServe(config.Addr, hdlr)
-	log.Info(fmt.Sprintf("Swarm HTTP proxy started on localhost:%s", config.Addr))
 }
 
 func NewServer(api *api.Api) *Server {
diff --git a/swarm/swarm.go b/swarm/swarm.go
index 442e68d51..4f93a30b7 100644
--- a/swarm/swarm.go
+++ b/swarm/swarm.go
@@ -21,6 +21,7 @@ import (
 	"context"
 	"crypto/ecdsa"
 	"fmt"
+	"net"
 
 	"github.com/ethereum/go-ethereum/accounts/abi/bind"
 	"github.com/ethereum/go-ethereum/common"
@@ -166,13 +167,13 @@ Start is called when the stack is started
 * TODO: start subservices like sword, swear, swarmdns
 */
 // implements the node.Service interface
-func (self *Swarm) Start(net *p2p.Server) error {
+func (self *Swarm) Start(srv *p2p.Server) error {
 	connectPeer := func(url string) error {
 		node, err := discover.ParseNode(url)
 		if err != nil {
 			return fmt.Errorf("invalid node URL: %v", err)
 		}
-		net.AddPeer(node)
+		srv.AddPeer(node)
 		return nil
 	}
 	// set chequebook
@@ -189,8 +190,8 @@ func (self *Swarm) Start(net *p2p.Server) error {
 
 	log.Warn(fmt.Sprintf("Starting Swarm service"))
 	self.hive.Start(
-		discover.PubkeyID(&net.PrivateKey.PublicKey),
-		func() string { return net.ListenAddr },
+		discover.PubkeyID(&srv.PrivateKey.PublicKey),
+		func() string { return srv.ListenAddr },
 		connectPeer,
 	)
 	log.Info(fmt.Sprintf("Swarm network started on bzz address: %v", self.hive.Addr()))
@@ -200,17 +201,16 @@ func (self *Swarm) Start(net *p2p.Server) error {
 
 	// start swarm http proxy server
 	if self.config.Port != "" {
-		addr := ":" + self.config.Port
+		addr := net.JoinHostPort(self.config.ListenAddr, self.config.Port)
 		go httpapi.StartHttpServer(self.api, &httpapi.ServerConfig{
 			Addr:       addr,
 			CorsString: self.corsString,
 		})
-	}
-
-	log.Debug(fmt.Sprintf("Swarm http proxy started on port: %v", self.config.Port))
+		log.Info(fmt.Sprintf("Swarm http proxy started on %v", addr))
 
-	if self.corsString != "" {
-		log.Debug(fmt.Sprintf("Swarm http proxy started with corsdomain: %v", self.corsString))
+		if self.corsString != "" {
+			log.Debug(fmt.Sprintf("Swarm http proxy started with corsdomain: %v", self.corsString))
+		}
 	}
 
 	return nil
-- 
GitLab