mirror of
https://github.com/status-im/status-go.git
synced 2025-01-18 10:42:07 +00:00
4536e99275
This PR refactors CLI API, removes obsolete commands and splits status code into smaller pieces: * get rid of subcommands API (no ./status <command>) * get rid of custom cli app package * use stdlib flag package for handling command line flags * move cross-compilation / mobile related code to lib/ package * move wnode command into separate binary (cmd/node-status, name is subject to discuss) * remove faucet command as obsolete * update/add docs/READMES/wikis for new command line flags It makes statusd code much simpler and smaller, separates concerns (lib, wnode and statusd are different things).
143 lines
3.9 KiB
Go
143 lines
3.9 KiB
Go
package main
|
|
|
|
import (
|
|
"flag"
|
|
"fmt"
|
|
"log"
|
|
"os"
|
|
"runtime"
|
|
"strings"
|
|
|
|
"github.com/status-im/status-go/geth/api"
|
|
"github.com/status-im/status-go/geth/params"
|
|
)
|
|
|
|
var (
|
|
gitCommit = "N/A" // rely on linker: -ldflags -X main.GitCommit"
|
|
buildStamp = "N/A" // rely on linker: -ldflags -X main.buildStamp"
|
|
)
|
|
|
|
var (
|
|
prodMode = flag.Bool("production", false, "Whether production settings should be loaded")
|
|
nodeKeyFile = flag.String("nodekey", "", "P2P node key file (private key)")
|
|
dataDir = flag.String("datadir", params.DataDir, "Data directory for the databases and keystore")
|
|
networkID = flag.Int("networkid", params.RopstenNetworkID, "Network identifier (integer, 1=Homestead, 3=Ropsten, 4=Rinkeby, 777=StatusChain)")
|
|
whisperEnabled = flag.Bool("shh", false, "SHH protocol enabled")
|
|
swarmEnabled = flag.Bool("swarm", false, "Swarm protocol enabled")
|
|
httpEnabled = flag.Bool("http", false, "HTTP RPC endpoint enabled (default: false)")
|
|
httpPort = flag.Int("httpport", params.HTTPPort, "HTTP RPC server's listening port")
|
|
ipcEnabled = flag.Bool("ipc", false, "IPC RPC endpoint enabled")
|
|
logLevel = flag.String("log", "INFO", `Log level, one of: "ERROR", "WARN", "INFO", "DEBUG", and "TRACE"`)
|
|
logFile = flag.String("logfile", "", "Path to the log file")
|
|
version = flag.Bool("version", false, "Print version")
|
|
)
|
|
|
|
func main() {
|
|
flag.Usage = printUsage
|
|
flag.Parse()
|
|
|
|
config, err := makeNodeConfig()
|
|
if err != nil {
|
|
log.Fatalf("Making config failed: %v", err)
|
|
return
|
|
}
|
|
|
|
if *version {
|
|
printVersion(config, gitCommit, buildStamp)
|
|
return
|
|
}
|
|
|
|
backend := api.NewStatusBackend()
|
|
started, err := backend.StartNode(config)
|
|
if err != nil {
|
|
log.Fatalf("Node start failed: %v", err)
|
|
return
|
|
}
|
|
|
|
// wait till node is started
|
|
<-started
|
|
|
|
// wait till node has been stopped
|
|
node, err := backend.NodeManager().Node()
|
|
if err != nil {
|
|
log.Fatalf("Getting node failed: %v", err)
|
|
return
|
|
}
|
|
|
|
node.Wait()
|
|
}
|
|
|
|
// makeNodeConfig parses incoming CLI options and returns node configuration object
|
|
func makeNodeConfig() (*params.NodeConfig, error) {
|
|
devMode := !*prodMode
|
|
nodeConfig, err := params.NewNodeConfig(*dataDir, uint64(*networkID), devMode)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// TODO(divan): move this logic into params package
|
|
if *nodeKeyFile != "" {
|
|
nodeConfig.NodeKeyFile = *nodeKeyFile
|
|
}
|
|
|
|
if *logLevel != "" {
|
|
nodeConfig.LogLevel = *logLevel
|
|
}
|
|
if *logFile != "" {
|
|
nodeConfig.LogFile = *logFile
|
|
}
|
|
|
|
nodeConfig.LightEthConfig.Enabled = true
|
|
nodeConfig.RPCEnabled = *httpEnabled
|
|
nodeConfig.WhisperConfig.Enabled = *whisperEnabled
|
|
nodeConfig.SwarmConfig.Enabled = *swarmEnabled
|
|
|
|
// RPC configuration
|
|
if !*httpEnabled {
|
|
nodeConfig.HTTPHost = "" // HTTP RPC is disabled
|
|
}
|
|
nodeConfig.HTTPPort = *httpPort
|
|
nodeConfig.IPCEnabled = *ipcEnabled
|
|
|
|
return nodeConfig, nil
|
|
}
|
|
|
|
// printVersion prints verbose output about version and config.
|
|
func printVersion(config *params.NodeConfig, gitCommit, buildStamp string) {
|
|
if gitCommit != "" && len(gitCommit) > 8 {
|
|
params.Version += "-" + gitCommit[:8]
|
|
}
|
|
|
|
fmt.Println(strings.Title(params.ClientIdentifier))
|
|
fmt.Println("Version:", params.Version)
|
|
if gitCommit != "" {
|
|
fmt.Println("Git Commit:", gitCommit)
|
|
}
|
|
if buildStamp != "" {
|
|
fmt.Println("Build Stamp:", buildStamp)
|
|
}
|
|
|
|
fmt.Println("Network Id:", config.NetworkID)
|
|
fmt.Println("Go Version:", runtime.Version())
|
|
fmt.Println("OS:", runtime.GOOS)
|
|
fmt.Printf("GOPATH=%s\n", os.Getenv("GOPATH"))
|
|
fmt.Printf("GOROOT=%s\n", runtime.GOROOT())
|
|
|
|
config.LightEthConfig.Genesis = "SKIP"
|
|
fmt.Println("Loaded Config: ", config)
|
|
}
|
|
|
|
func printUsage() {
|
|
fmt.Fprintln(os.Stderr, "Usage: statusd [options]")
|
|
fmt.Fprintf(os.Stderr, `
|
|
Examples:
|
|
statusd # run status node with defaults
|
|
statusd -networkid 4 # run node on Rinkeby network
|
|
statusd -datadir /dir # specify different dir for data
|
|
statusd -ipc # enable IPC for usage with "geth attach"
|
|
|
|
Options:
|
|
`)
|
|
flag.PrintDefaults()
|
|
}
|