github.com/ConsenSys/Quorum@v20.10.0+incompatible/cmd/geth/usage.go (about) 1 // Copyright 2015 The go-ethereum Authors 2 // This file is part of go-ethereum. 3 // 4 // go-ethereum is free software: you can redistribute it and/or modify 5 // it under the terms of the GNU General Public License as published by 6 // the Free Software Foundation, either version 3 of the License, or 7 // (at your option) any later version. 8 // 9 // go-ethereum is distributed in the hope that it will be useful, 10 // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 // GNU General Public License for more details. 13 // 14 // You should have received a copy of the GNU General Public License 15 // along with go-ethereum. If not, see <http://www.gnu.org/licenses/>. 16 17 // Contains the geth command usage template and generator. 18 19 package main 20 21 import ( 22 "io" 23 "sort" 24 "strings" 25 26 "github.com/ethereum/go-ethereum/cmd/utils" 27 "github.com/ethereum/go-ethereum/internal/debug" 28 cli "gopkg.in/urfave/cli.v1" 29 ) 30 31 // AppHelpTemplate is the test template for the default, global app help topic. 32 var AppHelpTemplate = `NAME: 33 {{.App.Name}} - {{.App.Usage}} 34 35 Copyright 2013-2019 The go-ethereum Authors 36 37 USAGE: 38 {{.App.HelpName}} [options]{{if .App.Commands}} command [command options]{{end}} {{if .App.ArgsUsage}}{{.App.ArgsUsage}}{{else}}[arguments...]{{end}} 39 {{if .App.Version}} 40 VERSION: 41 {{.App.Version}} 42 {{end}}{{if len .App.Authors}} 43 AUTHOR(S): 44 {{range .App.Authors}}{{ . }}{{end}} 45 {{end}}{{if .App.Commands}} 46 COMMANDS: 47 {{range .App.Commands}}{{join .Names ", "}}{{ "\t" }}{{.Usage}} 48 {{end}}{{end}}{{if .FlagGroups}} 49 {{range .FlagGroups}}{{.Name}} OPTIONS: 50 {{range .Flags}}{{.}} 51 {{end}} 52 {{end}}{{end}}{{if .App.Copyright }} 53 COPYRIGHT: 54 {{.App.Copyright}} 55 {{end}} 56 ` 57 58 // flagGroup is a collection of flags belonging to a single topic. 59 type flagGroup struct { 60 Name string 61 Flags []cli.Flag 62 } 63 64 var quorumAccountFlagGroup = "QUORUM ACCOUNT" 65 66 // AppHelpFlagGroups is the application flags, grouped by functionality. 67 var AppHelpFlagGroups = []flagGroup{ 68 { 69 Name: "ETHEREUM", 70 Flags: []cli.Flag{ 71 configFileFlag, 72 utils.DataDirFlag, 73 utils.AncientFlag, 74 utils.KeyStoreDirFlag, 75 utils.NoUSBFlag, 76 utils.SmartCardDaemonPathFlag, 77 utils.NetworkIdFlag, 78 utils.TestnetFlag, 79 utils.RinkebyFlag, 80 utils.GoerliFlag, 81 utils.SyncModeFlag, 82 utils.ExitWhenSyncedFlag, 83 utils.GCModeFlag, 84 utils.EthStatsURLFlag, 85 utils.IdentityFlag, 86 utils.LightKDFFlag, 87 utils.WhitelistFlag, 88 }, 89 }, 90 { 91 Name: "LIGHT CLIENT", 92 Flags: []cli.Flag{ 93 utils.LightServeFlag, 94 utils.LightIngressFlag, 95 utils.LightEgressFlag, 96 utils.LightMaxPeersFlag, 97 utils.UltraLightServersFlag, 98 utils.UltraLightFractionFlag, 99 utils.UltraLightOnlyAnnounceFlag, 100 }, 101 }, 102 { 103 Name: "DEVELOPER CHAIN", 104 Flags: []cli.Flag{ 105 utils.DeveloperFlag, 106 utils.DeveloperPeriodFlag, 107 }, 108 }, 109 { 110 Name: "ETHASH", 111 Flags: []cli.Flag{ 112 utils.EthashCacheDirFlag, 113 utils.EthashCachesInMemoryFlag, 114 utils.EthashCachesOnDiskFlag, 115 utils.EthashDatasetDirFlag, 116 utils.EthashDatasetsInMemoryFlag, 117 utils.EthashDatasetsOnDiskFlag, 118 }, 119 }, 120 //{ 121 // Name: "DASHBOARD", 122 // Flags: []cli.Flag{ 123 // utils.DashboardEnabledFlag, 124 // utils.DashboardAddrFlag, 125 // utils.DashboardPortFlag, 126 // utils.DashboardRefreshFlag, 127 // utils.DashboardAssetsFlag, 128 // }, 129 //}, 130 { 131 Name: "TRANSACTION POOL", 132 Flags: []cli.Flag{ 133 utils.TxPoolLocalsFlag, 134 utils.TxPoolNoLocalsFlag, 135 utils.TxPoolJournalFlag, 136 utils.TxPoolRejournalFlag, 137 utils.TxPoolPriceLimitFlag, 138 utils.TxPoolPriceBumpFlag, 139 utils.TxPoolAccountSlotsFlag, 140 utils.TxPoolGlobalSlotsFlag, 141 utils.TxPoolAccountQueueFlag, 142 utils.TxPoolGlobalQueueFlag, 143 utils.TxPoolLifetimeFlag, 144 }, 145 }, 146 { 147 Name: "PERFORMANCE TUNING", 148 Flags: []cli.Flag{ 149 utils.CacheFlag, 150 utils.CacheDatabaseFlag, 151 utils.CacheTrieFlag, 152 utils.CacheGCFlag, 153 utils.CacheNoPrefetchFlag, 154 }, 155 }, 156 { 157 Name: "ACCOUNT", 158 Flags: []cli.Flag{ 159 utils.UnlockedAccountFlag, 160 utils.PasswordFileFlag, 161 utils.ExternalSignerFlag, 162 utils.InsecureUnlockAllowedFlag, 163 }, 164 }, 165 { 166 Name: "API AND CONSOLE", 167 Flags: []cli.Flag{ 168 utils.IPCDisabledFlag, 169 utils.IPCPathFlag, 170 utils.RPCEnabledFlag, 171 utils.RPCListenAddrFlag, 172 utils.RPCPortFlag, 173 utils.RPCApiFlag, 174 utils.RPCGlobalGasCap, 175 utils.RPCCORSDomainFlag, 176 utils.RPCVirtualHostsFlag, 177 utils.WSEnabledFlag, 178 utils.WSListenAddrFlag, 179 utils.WSPortFlag, 180 utils.WSApiFlag, 181 utils.WSAllowedOriginsFlag, 182 utils.GraphQLEnabledFlag, 183 utils.GraphQLListenAddrFlag, 184 utils.GraphQLPortFlag, 185 utils.GraphQLCORSDomainFlag, 186 utils.GraphQLVirtualHostsFlag, 187 utils.JSpathFlag, 188 utils.ExecFlag, 189 utils.PreloadJSFlag, 190 utils.RPCClientToken, 191 utils.RPCClientTLSInsecureSkipVerify, 192 utils.RPCClientTLSCert, 193 utils.RPCClientTLSCaCert, 194 utils.RPCClientTLSCipherSuites, 195 }, 196 }, 197 { 198 Name: "NETWORKING", 199 Flags: []cli.Flag{ 200 utils.BootnodesFlag, 201 utils.BootnodesV4Flag, 202 utils.BootnodesV5Flag, 203 utils.ListenPortFlag, 204 utils.MaxPeersFlag, 205 utils.MaxPendingPeersFlag, 206 utils.NATFlag, 207 utils.NoDiscoverFlag, 208 utils.DiscoveryV5Flag, 209 utils.NetrestrictFlag, 210 utils.NodeKeyFileFlag, 211 utils.NodeKeyHexFlag, 212 }, 213 }, 214 { 215 Name: "MINER", 216 Flags: []cli.Flag{ 217 utils.MiningEnabledFlag, 218 utils.MinerThreadsFlag, 219 utils.MinerNotifyFlag, 220 utils.MinerGasPriceFlag, 221 utils.MinerGasTargetFlag, 222 utils.MinerGasLimitFlag, 223 utils.MinerEtherbaseFlag, 224 utils.MinerExtraDataFlag, 225 utils.MinerRecommitIntervalFlag, 226 utils.MinerNoVerfiyFlag, 227 }, 228 }, 229 { 230 Name: "GAS PRICE ORACLE", 231 Flags: []cli.Flag{ 232 utils.GpoBlocksFlag, 233 utils.GpoPercentileFlag, 234 }, 235 }, 236 { 237 Name: "VIRTUAL MACHINE", 238 Flags: []cli.Flag{ 239 utils.VMEnableDebugFlag, 240 utils.EVMInterpreterFlag, 241 utils.EWASMInterpreterFlag, 242 // Quorum - timout for calls 243 utils.EVMCallTimeOutFlag, 244 }, 245 }, 246 { 247 Name: "LOGGING AND DEBUGGING", 248 Flags: append([]cli.Flag{ 249 utils.FakePoWFlag, 250 utils.NoCompactionFlag, 251 }, debug.Flags...), 252 }, 253 { 254 Name: "METRICS AND STATS", 255 Flags: metricsFlags, 256 }, 257 { 258 Name: "WHISPER (EXPERIMENTAL)", 259 Flags: whisperFlags, 260 }, 261 { 262 Name: "DEPRECATED", 263 Flags: []cli.Flag{ 264 utils.LightLegacyServFlag, 265 utils.LightLegacyPeersFlag, 266 utils.MinerLegacyThreadsFlag, 267 utils.MinerLegacyGasTargetFlag, 268 utils.MinerLegacyGasPriceFlag, 269 utils.MinerLegacyEtherbaseFlag, 270 utils.MinerLegacyExtraDataFlag, 271 }, 272 }, 273 // QUORUM 274 { 275 Name: "QUORUM", 276 Flags: []cli.Flag{ 277 utils.QuorumImmutabilityThreshold, 278 utils.EnableNodePermissionFlag, 279 utils.PluginSettingsFlag, 280 utils.PluginSkipVerifyFlag, 281 utils.PluginLocalVerifyFlag, 282 utils.PluginPublicKeyFlag, 283 utils.AllowedFutureBlockTimeFlag, 284 }, 285 }, 286 { 287 Name: quorumAccountFlagGroup, 288 Flags: []cli.Flag{ 289 utils.AccountPluginNewAccountConfigFlag, 290 }, 291 }, 292 { 293 Name: "RAFT", 294 Flags: []cli.Flag{ 295 utils.RaftModeFlag, 296 utils.RaftBlockTimeFlag, 297 utils.RaftJoinExistingFlag, 298 utils.RaftPortFlag, 299 utils.RaftDNSEnabledFlag, 300 }, 301 }, 302 { 303 Name: "ISTANBUL", 304 Flags: []cli.Flag{ 305 utils.IstanbulRequestTimeoutFlag, 306 utils.IstanbulBlockPeriodFlag, 307 }, 308 }, 309 // END QUORUM 310 { 311 Name: "MISC", 312 }, 313 } 314 315 // byCategory sorts an array of flagGroup by Name in the order 316 // defined in AppHelpFlagGroups. 317 type byCategory []flagGroup 318 319 func (a byCategory) Len() int { return len(a) } 320 func (a byCategory) Swap(i, j int) { a[i], a[j] = a[j], a[i] } 321 func (a byCategory) Less(i, j int) bool { 322 iCat, jCat := a[i].Name, a[j].Name 323 iIdx, jIdx := len(AppHelpFlagGroups), len(AppHelpFlagGroups) // ensure non categorized flags come last 324 325 for i, group := range AppHelpFlagGroups { 326 if iCat == group.Name { 327 iIdx = i 328 } 329 if jCat == group.Name { 330 jIdx = i 331 } 332 } 333 334 return iIdx < jIdx 335 } 336 337 func flagCategory(flag cli.Flag) string { 338 for _, category := range AppHelpFlagGroups { 339 for _, flg := range category.Flags { 340 if flg.GetName() == flag.GetName() { 341 return category.Name 342 } 343 } 344 } 345 return "MISC" 346 } 347 348 func init() { 349 // Override the default app help template 350 cli.AppHelpTemplate = AppHelpTemplate 351 352 // Define a one shot struct to pass to the usage template 353 type helpData struct { 354 App interface{} 355 FlagGroups []flagGroup 356 } 357 358 // Override the default app help printer, but only for the global app help 359 originalHelpPrinter := cli.HelpPrinter 360 cli.HelpPrinter = func(w io.Writer, tmpl string, data interface{}) { 361 if tmpl == AppHelpTemplate { 362 // Iterate over all the flags and add any uncategorized ones 363 categorized := make(map[string]struct{}) 364 for _, group := range AppHelpFlagGroups { 365 for _, flag := range group.Flags { 366 categorized[flag.String()] = struct{}{} 367 } 368 } 369 var uncategorized []cli.Flag 370 for _, flag := range data.(*cli.App).Flags { 371 if _, ok := categorized[flag.String()]; !ok { 372 if strings.HasPrefix(flag.GetName(), "dashboard") { 373 continue 374 } 375 uncategorized = append(uncategorized, flag) 376 } 377 } 378 if len(uncategorized) > 0 { 379 // Append all ungategorized options to the misc group 380 miscs := len(AppHelpFlagGroups[len(AppHelpFlagGroups)-1].Flags) 381 AppHelpFlagGroups[len(AppHelpFlagGroups)-1].Flags = append(AppHelpFlagGroups[len(AppHelpFlagGroups)-1].Flags, uncategorized...) 382 383 // Make sure they are removed afterwards 384 defer func() { 385 AppHelpFlagGroups[len(AppHelpFlagGroups)-1].Flags = AppHelpFlagGroups[len(AppHelpFlagGroups)-1].Flags[:miscs] 386 }() 387 } 388 389 // remove the Quorum account options from the main app usage as these should only be used by the geth account sub commands 390 for i, group := range AppHelpFlagGroups { 391 if group.Name == quorumAccountFlagGroup { 392 AppHelpFlagGroups = append(AppHelpFlagGroups[:i], AppHelpFlagGroups[i+1:]...) 393 } 394 } 395 396 // Render out custom usage screen 397 originalHelpPrinter(w, tmpl, helpData{data, AppHelpFlagGroups}) 398 } else if tmpl == utils.CommandHelpTemplate { 399 // Iterate over all command specific flags and categorize them 400 categorized := make(map[string][]cli.Flag) 401 for _, flag := range data.(cli.Command).Flags { 402 if _, ok := categorized[flag.String()]; !ok { 403 categorized[flagCategory(flag)] = append(categorized[flagCategory(flag)], flag) 404 } 405 } 406 407 // sort to get a stable ordering 408 sorted := make([]flagGroup, 0, len(categorized)) 409 for cat, flgs := range categorized { 410 sorted = append(sorted, flagGroup{cat, flgs}) 411 } 412 sort.Sort(byCategory(sorted)) 413 414 // add sorted array to data and render with default printer 415 originalHelpPrinter(w, tmpl, map[string]interface{}{ 416 "cmd": data, 417 "categorizedFlags": sorted, 418 }) 419 } else { 420 originalHelpPrinter(w, tmpl, data) 421 } 422 } 423 }