add `-status` flag to enable the Status service (#902)

* add `-status` flag to enable the Status service

* remove status from default APIModules and add it only from statusd if specified

* remove AddAPIModule method

* allow -status flag values to be http or ipc
This commit is contained in:
Andrea Franz 2018-05-08 23:57:29 +02:00 committed by GitHub
parent 31cf2297d2
commit c673148bf4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 133 additions and 1 deletions

94
cmd/statusd/flags_test.go Normal file
View File

@ -0,0 +1,94 @@
package main
import (
"fmt"
"testing"
"github.com/status-im/status-go/geth/params"
"github.com/stretchr/testify/require"
)
func TestStatusFlag(t *testing.T) {
service := "status"
scenarios := []struct {
ipcEnabled bool
httpEnabled bool
flag string
err error
enabled bool
public bool
}{
// no flags
{},
// -status=ipc -ipc
{
ipcEnabled: true,
flag: "ipc",
enabled: true,
},
// -status=http -http
{
httpEnabled: true,
flag: "http",
enabled: true,
public: true,
},
// -status=ipc -http -ipc
{
httpEnabled: true,
ipcEnabled: true,
flag: "ipc",
enabled: true,
},
// -http -ipc
{
httpEnabled: true,
ipcEnabled: true,
flag: "",
},
// -status=ipc
{
err: errStatusServiceRequiresIPC,
flag: "ipc",
},
// -status=http
{
err: errStatusServiceRequiresHTTP,
flag: "http",
},
// -status=bad-value
{
err: errStatusServiceInvalidFlag,
flag: "bad-value",
},
}
for i, s := range scenarios {
msg := fmt.Sprintf("scenario %d", i)
c, err := params.NewNodeConfig("", "", 0)
require.Nil(t, err, msg)
c.IPCEnabled = s.ipcEnabled
c.RPCEnabled = s.httpEnabled
c, err = configureStatusService(s.flag, c)
if s.err != nil {
require.Equal(t, s.err, err, msg)
require.Nil(t, c, msg)
continue
}
require.Nil(t, err, msg)
require.Equal(t, s.enabled, c.StatusServiceEnabled, msg)
modules := c.FormatAPIModules()
if s.public {
require.Contains(t, modules, service, msg)
} else {
require.NotContains(t, modules, service, msg)
}
}
}

View File

@ -2,6 +2,7 @@ package main
import (
"context"
"errors"
"flag"
"fmt"
stdlog "log"
@ -37,6 +38,7 @@ var (
networkID = flag.Int("networkid", params.RopstenNetworkID, "Network identifier (integer, 1=Homestead, 3=Ropsten, 4=Rinkeby, 777=StatusChain)")
lesEnabled = flag.Bool("les", false, "Enable LES protocol")
whisperEnabled = flag.Bool("shh", false, "Enable Whisper protocol")
statusService = flag.String("status", "", `Enable StatusService, possible values: "ipc", "http"`)
swarmEnabled = flag.Bool("swarm", false, "Enable Swarm protocol")
maxPeers = flag.Int("maxpeers", 25, "maximum number of p2p peers (including all protocols)")
httpEnabled = flag.Bool("http", false, "Enable HTTP RPC endpoint")
@ -93,7 +95,7 @@ func main() {
config, err := makeNodeConfig()
if err != nil {
stdlog.Fatalf("Making config failed %s", err)
stdlog.Fatalf("Making config failed, %s", err)
}
if *version {
@ -263,6 +265,11 @@ func makeNodeConfig() (*params.NodeConfig, error) {
nodeConfig.ClusterConfig.BootNodes = strings.Split(*bootnodes, ",")
}
nodeConfig, err = configureStatusService(*statusService, nodeConfig)
if err != nil {
return nil, err
}
if *whisperEnabled {
return whisperConfig(nodeConfig)
}
@ -275,6 +282,32 @@ func makeNodeConfig() (*params.NodeConfig, error) {
return nodeConfig, nil
}
var errStatusServiceRequiresIPC = errors.New("to enable the StatusService on IPC, -ipc flag must be set")
var errStatusServiceRequiresHTTP = errors.New("to enable the StatusService on HTTP, -http flag must be set")
var errStatusServiceInvalidFlag = errors.New("-status flag valid values are: ipc, http")
func configureStatusService(flagValue string, nodeConfig *params.NodeConfig) (*params.NodeConfig, error) {
switch flagValue {
case "ipc":
if !nodeConfig.IPCEnabled {
return nil, errStatusServiceRequiresIPC
}
nodeConfig.StatusServiceEnabled = true
case "http":
if !nodeConfig.RPCEnabled {
return nil, errStatusServiceRequiresHTTP
}
nodeConfig.StatusServiceEnabled = true
nodeConfig.AddAPIModule("status")
case "":
nodeConfig.StatusServiceEnabled = false
default:
return nil, errStatusServiceInvalidFlag
}
return nodeConfig, nil
}
// printVersion prints verbose output about version and config.
func printVersion(config *params.NodeConfig, gitCommit, buildStamp string) {
if gitCommit != "" && len(gitCommit) > 8 {

View File

@ -631,3 +631,8 @@ func (c *NodeConfig) FormatAPIModules() []string {
return strings.Split(c.APIModules, ",")
}
// AddAPIModule adds a mobule to APIModules
func (c *NodeConfig) AddAPIModule(m string) {
c.APIModules = fmt.Sprintf("%s,%s", c.APIModules, m)
}