forked from ethereum/go-ethereum
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
cmd/geth: add --config file flag (ethereum#13875)
* p2p/discover, p2p/discv5: add marshaling methods to Node * p2p/netutil: make Netlist decodable from TOML * common/math: encode nil HexOrDecimal256 as 0x0 * cmd/geth: add --config file flag * cmd/geth: add missing license header * eth: prettify Config again, fix tests * eth: use gasprice.Config instead of duplicating its fields * eth/gasprice: hide nil default from dumpconfig output * cmd/geth: hide genesis block in dumpconfig output * node: make tests compile * console: fix tests * cmd/geth: make TOML keys look exactly like Go struct fields * p2p: use discovery by default This makes the zero Config slightly more useful. It also fixes package node tests because Node detects reuse of the datadir through the NodeDatabase. * cmd/geth: make ethstats URL settable through config file * cmd/faucet: fix configuration * cmd/geth: dedup attach tests * eth: add comment for DefaultConfig * eth: pass downloader.SyncMode in Config This removes the FastSync, LightSync flags in favour of a more general SyncMode flag. * cmd/utils: remove jitvm flags * cmd/utils: make mutually exclusive flag error prettier It now reads: Fatal: flags --dev, --testnet can't be used at the same time * p2p: fix typo * node: add DefaultConfig, use it for geth * mobile: add missing NoDiscovery option * cmd/utils: drop MakeNode This exposed a couple of places that needed to be updated to use node.DefaultConfig. * node: fix typo * eth: make fast sync the default mode * cmd/utils: remove IPCApiFlag (unused) * node: remove default IPC path Set it in the frontends instead. * cmd/geth: add --syncmode * cmd/utils: make --ipcdisable and --ipcpath mutually exclusive * cmd/utils: don't enable WS, HTTP when setting addr * cmd/utils: fix --identity
- Loading branch information
Showing
55 changed files
with
6,615 additions
and
648 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,186 @@ | ||
// Copyright 2015 The go-ethereum Authors | ||
// This file is part of go-ethereum. | ||
// | ||
// go-ethereum is free software: you can redistribute it and/or modify | ||
// it under the terms of the GNU General Public License as published by | ||
// the Free Software Foundation, either version 3 of the License, or | ||
// (at your option) any later version. | ||
// | ||
// go-ethereum is distributed in the hope that it will be useful, | ||
// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
// GNU General Public License for more details. | ||
// | ||
// You should have received a copy of the GNU General Public License | ||
// along with go-ethereum. If not, see <http://www.gnu.org/licenses/>. | ||
|
||
package main | ||
|
||
import ( | ||
"bufio" | ||
"encoding/hex" | ||
"errors" | ||
"fmt" | ||
"io" | ||
"os" | ||
"reflect" | ||
"unicode" | ||
|
||
cli "gopkg.in/urfave/cli.v1" | ||
|
||
"github.com/ethereum/go-ethereum/cmd/utils" | ||
"github.com/ethereum/go-ethereum/contracts/release" | ||
"github.com/ethereum/go-ethereum/eth" | ||
"github.com/ethereum/go-ethereum/node" | ||
"github.com/ethereum/go-ethereum/params" | ||
"github.com/naoina/toml" | ||
) | ||
|
||
var ( | ||
dumpConfigCommand = cli.Command{ | ||
Action: dumpConfig, | ||
Name: "dumpconfig", | ||
Usage: "Show configuration values", | ||
ArgsUsage: "", | ||
Category: "MISCELLANEOUS COMMANDS", | ||
Description: `The dumpconfig command shows configuration values.`, | ||
} | ||
|
||
configFileFlag = cli.StringFlag{ | ||
Name: "config", | ||
Usage: "TOML configuration file", | ||
} | ||
) | ||
|
||
// These settings ensure that TOML keys use the same names as Go struct fields. | ||
var tomlSettings = toml.Config{ | ||
NormFieldName: func(rt reflect.Type, key string) string { | ||
return key | ||
}, | ||
FieldToKey: func(rt reflect.Type, field string) string { | ||
return field | ||
}, | ||
MissingField: func(rt reflect.Type, field string) error { | ||
link := "" | ||
if unicode.IsUpper(rune(rt.Name()[0])) && rt.PkgPath() != "main" { | ||
link = fmt.Sprintf(", see https://godoc.org/%s#%s for available fields", rt.PkgPath(), rt.Name()) | ||
} | ||
return fmt.Errorf("field '%s' is not defined in %s%s", field, rt.String(), link) | ||
}, | ||
} | ||
|
||
type ethstatsConfig struct { | ||
URL string `toml:",omitempty"` | ||
} | ||
|
||
type gethConfig struct { | ||
Eth eth.Config | ||
Node node.Config | ||
Ethstats ethstatsConfig | ||
} | ||
|
||
func loadConfig(file string, cfg *gethConfig) error { | ||
f, err := os.Open(file) | ||
if err != nil { | ||
return err | ||
} | ||
defer f.Close() | ||
|
||
err = tomlSettings.NewDecoder(bufio.NewReader(f)).Decode(cfg) | ||
// Add file name to errors that have a line number. | ||
if _, ok := err.(*toml.LineError); ok { | ||
err = errors.New(file + ", " + err.Error()) | ||
} | ||
return err | ||
} | ||
|
||
func defaultNodeConfig() node.Config { | ||
cfg := node.DefaultConfig | ||
cfg.Name = clientIdentifier | ||
cfg.Version = params.VersionWithCommit(gitCommit) | ||
cfg.HTTPModules = append(cfg.HTTPModules, "eth") | ||
cfg.WSModules = append(cfg.WSModules, "eth") | ||
cfg.IPCPath = "geth.ipc" | ||
return cfg | ||
} | ||
|
||
func makeConfigNode(ctx *cli.Context) (*node.Node, gethConfig) { | ||
// Load defaults. | ||
cfg := gethConfig{ | ||
Eth: eth.DefaultConfig, | ||
Node: defaultNodeConfig(), | ||
} | ||
|
||
// Load config file. | ||
if file := ctx.GlobalString(configFileFlag.Name); file != "" { | ||
if err := loadConfig(file, &cfg); err != nil { | ||
utils.Fatalf("%v", err) | ||
} | ||
} | ||
|
||
// Apply flags. | ||
utils.SetNodeConfig(ctx, &cfg.Node) | ||
stack, err := node.New(&cfg.Node) | ||
if err != nil { | ||
utils.Fatalf("Failed to create the protocol stack: %v", err) | ||
} | ||
utils.SetEthConfig(ctx, stack, &cfg.Eth) | ||
if ctx.GlobalIsSet(utils.EthStatsURLFlag.Name) { | ||
cfg.Ethstats.URL = ctx.GlobalString(utils.EthStatsURLFlag.Name) | ||
} | ||
|
||
return stack, cfg | ||
} | ||
|
||
func makeFullNode(ctx *cli.Context) *node.Node { | ||
stack, cfg := makeConfigNode(ctx) | ||
|
||
utils.RegisterEthService(stack, &cfg.Eth) | ||
|
||
// Whisper must be explicitly enabled, but is auto-enabled in --dev mode. | ||
shhEnabled := ctx.GlobalBool(utils.WhisperEnabledFlag.Name) | ||
shhAutoEnabled := !ctx.GlobalIsSet(utils.WhisperEnabledFlag.Name) && ctx.GlobalIsSet(utils.DevModeFlag.Name) | ||
if shhEnabled || shhAutoEnabled { | ||
utils.RegisterShhService(stack) | ||
} | ||
|
||
// Add the Ethereum Stats daemon if requested. | ||
if cfg.Ethstats.URL != "" { | ||
utils.RegisterEthStatsService(stack, cfg.Ethstats.URL) | ||
} | ||
|
||
// Add the release oracle service so it boots along with node. | ||
if err := stack.Register(func(ctx *node.ServiceContext) (node.Service, error) { | ||
config := release.Config{ | ||
Oracle: relOracle, | ||
Major: uint32(params.VersionMajor), | ||
Minor: uint32(params.VersionMinor), | ||
Patch: uint32(params.VersionPatch), | ||
} | ||
commit, _ := hex.DecodeString(gitCommit) | ||
copy(config.Commit[:], commit) | ||
return release.NewReleaseService(ctx, config) | ||
}); err != nil { | ||
utils.Fatalf("Failed to register the Geth release oracle service: %v", err) | ||
} | ||
return stack | ||
} | ||
|
||
// dumpConfig is the dumpconfig command. | ||
func dumpConfig(ctx *cli.Context) error { | ||
_, cfg := makeConfigNode(ctx) | ||
comment := "" | ||
|
||
if cfg.Eth.Genesis != nil { | ||
cfg.Eth.Genesis = nil | ||
comment += "# Note: this config doesn't contain the genesis block.\n\n" | ||
} | ||
|
||
out, err := tomlSettings.Marshal(&cfg) | ||
if err != nil { | ||
return err | ||
} | ||
io.WriteString(os.Stdout, comment) | ||
os.Stdout.Write(out) | ||
return nil | ||
} |
Oops, something went wrong.