|
|
@@ -32,6 +32,7 @@ import (
|
|
|
"os/user"
|
|
|
"path/filepath"
|
|
|
"runtime"
|
|
|
+ "sort"
|
|
|
"strings"
|
|
|
"time"
|
|
|
|
|
|
@@ -43,6 +44,7 @@ import (
|
|
|
"github.com/ethereum/go-ethereum/core/types"
|
|
|
"github.com/ethereum/go-ethereum/crypto"
|
|
|
"github.com/ethereum/go-ethereum/internal/ethapi"
|
|
|
+ "github.com/ethereum/go-ethereum/internal/flags"
|
|
|
"github.com/ethereum/go-ethereum/log"
|
|
|
"github.com/ethereum/go-ethereum/node"
|
|
|
"github.com/ethereum/go-ethereum/params"
|
|
|
@@ -52,6 +54,7 @@ import (
|
|
|
"github.com/ethereum/go-ethereum/signer/fourbyte"
|
|
|
"github.com/ethereum/go-ethereum/signer/rules"
|
|
|
"github.com/ethereum/go-ethereum/signer/storage"
|
|
|
+
|
|
|
colorable "github.com/mattn/go-colorable"
|
|
|
"github.com/mattn/go-isatty"
|
|
|
"gopkg.in/urfave/cli.v1"
|
|
|
@@ -101,10 +104,15 @@ var (
|
|
|
Usage: "Chain id to use for signing (1=mainnet, 3=Ropsten, 4=Rinkeby, 5=Goerli)",
|
|
|
}
|
|
|
rpcPortFlag = cli.IntFlag{
|
|
|
- Name: "rpcport",
|
|
|
+ Name: "http.port",
|
|
|
Usage: "HTTP-RPC server listening port",
|
|
|
Value: node.DefaultHTTPPort + 5,
|
|
|
}
|
|
|
+ legacyRPCPortFlag = cli.IntFlag{
|
|
|
+ Name: "rpcport",
|
|
|
+ Usage: "HTTP-RPC server listening port (Deprecated, please use --http.port).",
|
|
|
+ Value: node.DefaultHTTPPort + 5,
|
|
|
+ }
|
|
|
signerSecretFlag = cli.StringFlag{
|
|
|
Name: "signersecret",
|
|
|
Usage: "A file containing the (encrypted) master seed to encrypt Clef data, e.g. keystore credentials and ruleset hash",
|
|
|
@@ -215,6 +223,42 @@ The gendoc generates example structures of the json-rpc communication types.
|
|
|
`}
|
|
|
)
|
|
|
|
|
|
+// AppHelpFlagGroups is the application flags, grouped by functionality.
|
|
|
+var AppHelpFlagGroups = []flags.FlagGroup{
|
|
|
+ {
|
|
|
+ Name: "FLAGS",
|
|
|
+ Flags: []cli.Flag{
|
|
|
+ logLevelFlag,
|
|
|
+ keystoreFlag,
|
|
|
+ configdirFlag,
|
|
|
+ chainIdFlag,
|
|
|
+ utils.LightKDFFlag,
|
|
|
+ utils.NoUSBFlag,
|
|
|
+ utils.SmartCardDaemonPathFlag,
|
|
|
+ utils.HTTPListenAddrFlag,
|
|
|
+ utils.HTTPVirtualHostsFlag,
|
|
|
+ utils.IPCDisabledFlag,
|
|
|
+ utils.IPCPathFlag,
|
|
|
+ utils.HTTPEnabledFlag,
|
|
|
+ rpcPortFlag,
|
|
|
+ signerSecretFlag,
|
|
|
+ customDBFlag,
|
|
|
+ auditLogFlag,
|
|
|
+ ruleFlag,
|
|
|
+ stdiouiFlag,
|
|
|
+ testFlag,
|
|
|
+ advancedMode,
|
|
|
+ acceptFlag,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ Name: "ALIASED (deprecated)",
|
|
|
+ Flags: []cli.Flag{
|
|
|
+ legacyRPCPortFlag,
|
|
|
+ },
|
|
|
+ },
|
|
|
+}
|
|
|
+
|
|
|
func init() {
|
|
|
app.Name = "Clef"
|
|
|
app.Usage = "Manage Ethereum account operations"
|
|
|
@@ -240,6 +284,7 @@ func init() {
|
|
|
testFlag,
|
|
|
advancedMode,
|
|
|
acceptFlag,
|
|
|
+ legacyRPCPortFlag,
|
|
|
}
|
|
|
app.Action = signer
|
|
|
app.Commands = []cli.Command{initCommand,
|
|
|
@@ -248,7 +293,41 @@ func init() {
|
|
|
delCredentialCommand,
|
|
|
newAccountCommand,
|
|
|
gendocCommand}
|
|
|
- cli.CommandHelpTemplate = utils.OriginCommandHelpTemplate
|
|
|
+ cli.CommandHelpTemplate = flags.CommandHelpTemplate
|
|
|
+ // Override the default app help template
|
|
|
+ cli.AppHelpTemplate = flags.ClefAppHelpTemplate
|
|
|
+
|
|
|
+ // Override the default app help printer, but only for the global app help
|
|
|
+ originalHelpPrinter := cli.HelpPrinter
|
|
|
+ cli.HelpPrinter = func(w io.Writer, tmpl string, data interface{}) {
|
|
|
+ if tmpl == flags.ClefAppHelpTemplate {
|
|
|
+ // Render out custom usage screen
|
|
|
+ originalHelpPrinter(w, tmpl, flags.HelpData{App: data, FlagGroups: AppHelpFlagGroups})
|
|
|
+ } else if tmpl == flags.CommandHelpTemplate {
|
|
|
+ // Iterate over all command specific flags and categorize them
|
|
|
+ categorized := make(map[string][]cli.Flag)
|
|
|
+ for _, flag := range data.(cli.Command).Flags {
|
|
|
+ if _, ok := categorized[flag.String()]; !ok {
|
|
|
+ categorized[flags.FlagCategory(flag, AppHelpFlagGroups)] = append(categorized[flags.FlagCategory(flag, AppHelpFlagGroups)], flag)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // sort to get a stable ordering
|
|
|
+ sorted := make([]flags.FlagGroup, 0, len(categorized))
|
|
|
+ for cat, flgs := range categorized {
|
|
|
+ sorted = append(sorted, flags.FlagGroup{Name: cat, Flags: flgs})
|
|
|
+ }
|
|
|
+ sort.Sort(flags.ByCategory(sorted))
|
|
|
+
|
|
|
+ // add sorted array to data and render with default printer
|
|
|
+ originalHelpPrinter(w, tmpl, map[string]interface{}{
|
|
|
+ "cmd": data,
|
|
|
+ "categorizedFlags": sorted,
|
|
|
+ })
|
|
|
+ } else {
|
|
|
+ originalHelpPrinter(w, tmpl, data)
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
func main() {
|
|
|
@@ -597,8 +676,17 @@ func signer(c *cli.Context) error {
|
|
|
}
|
|
|
handler := node.NewHTTPHandlerStack(srv, cors, vhosts)
|
|
|
|
|
|
+ // set port
|
|
|
+ port := c.Int(rpcPortFlag.Name)
|
|
|
+ if c.GlobalIsSet(legacyRPCPortFlag.Name) {
|
|
|
+ if !c.GlobalIsSet(rpcPortFlag.Name) {
|
|
|
+ port = c.Int(legacyRPCPortFlag.Name)
|
|
|
+ }
|
|
|
+ log.Warn("The flag --rpcport is deprecated and will be removed in the future, please use --http.port")
|
|
|
+ }
|
|
|
+
|
|
|
// start http server
|
|
|
- httpEndpoint := fmt.Sprintf("%s:%d", c.GlobalString(utils.HTTPListenAddrFlag.Name), c.Int(rpcPortFlag.Name))
|
|
|
+ httpEndpoint := fmt.Sprintf("%s:%d", c.GlobalString(utils.HTTPListenAddrFlag.Name), port)
|
|
|
httpServer, addr, err := node.StartHTTPEndpoint(httpEndpoint, rpc.DefaultHTTPTimeouts, handler)
|
|
|
if err != nil {
|
|
|
utils.Fatalf("Could not start RPC api: %v", err)
|