github.com/Night-mk/quorum@v21.1.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 utils.MultitenancyFlag, 285 }, 286 }, 287 { 288 Name: quorumAccountFlagGroup, 289 Flags: []cli.Flag{ 290 utils.AccountPluginNewAccountConfigFlag, 291 }, 292 }, 293 { 294 Name: "RAFT", 295 Flags: []cli.Flag{ 296 utils.RaftModeFlag, 297 utils.RaftBlockTimeFlag, 298 utils.RaftJoinExistingFlag, 299 utils.RaftPortFlag, 300 utils.RaftDNSEnabledFlag, 301 }, 302 }, 303 { 304 Name: "ISTANBUL", 305 Flags: []cli.Flag{ 306 utils.IstanbulRequestTimeoutFlag, 307 utils.IstanbulBlockPeriodFlag, 308 }, 309 }, 310 // END QUORUM 311 { 312 Name: "MISC", 313 }, 314 } 315 316 // byCategory sorts an array of flagGroup by Name in the order 317 // defined in AppHelpFlagGroups. 318 type byCategory []flagGroup 319 320 func (a byCategory) Len() int { return len(a) } 321 func (a byCategory) Swap(i, j int) { a[i], a[j] = a[j], a[i] } 322 func (a byCategory) Less(i, j int) bool { 323 iCat, jCat := a[i].Name, a[j].Name 324 iIdx, jIdx := len(AppHelpFlagGroups), len(AppHelpFlagGroups) // ensure non categorized flags come last 325 326 for i, group := range AppHelpFlagGroups { 327 if iCat == group.Name { 328 iIdx = i 329 } 330 if jCat == group.Name { 331 jIdx = i 332 } 333 } 334 335 return iIdx < jIdx 336 } 337 338 func flagCategory(flag cli.Flag) string { 339 for _, category := range AppHelpFlagGroups { 340 for _, flg := range category.Flags { 341 if flg.GetName() == flag.GetName() { 342 return category.Name 343 } 344 } 345 } 346 return "MISC" 347 } 348 349 func init() { 350 // Override the default app help template 351 cli.AppHelpTemplate = AppHelpTemplate 352 353 // Define a one shot struct to pass to the usage template 354 type helpData struct { 355 App interface{} 356 FlagGroups []flagGroup 357 } 358 359 // Override the default app help printer, but only for the global app help 360 originalHelpPrinter := cli.HelpPrinter 361 cli.HelpPrinter = func(w io.Writer, tmpl string, data interface{}) { 362 if tmpl == AppHelpTemplate { 363 // Iterate over all the flags and add any uncategorized ones 364 categorized := make(map[string]struct{}) 365 for _, group := range AppHelpFlagGroups { 366 for _, flag := range group.Flags { 367 categorized[flag.String()] = struct{}{} 368 } 369 } 370 var uncategorized []cli.Flag 371 for _, flag := range data.(*cli.App).Flags { 372 if _, ok := categorized[flag.String()]; !ok { 373 if strings.HasPrefix(flag.GetName(), "dashboard") { 374 continue 375 } 376 uncategorized = append(uncategorized, flag) 377 } 378 } 379 if len(uncategorized) > 0 { 380 // Append all ungategorized options to the misc group 381 miscs := len(AppHelpFlagGroups[len(AppHelpFlagGroups)-1].Flags) 382 AppHelpFlagGroups[len(AppHelpFlagGroups)-1].Flags = append(AppHelpFlagGroups[len(AppHelpFlagGroups)-1].Flags, uncategorized...) 383 384 // Make sure they are removed afterwards 385 defer func() { 386 AppHelpFlagGroups[len(AppHelpFlagGroups)-1].Flags = AppHelpFlagGroups[len(AppHelpFlagGroups)-1].Flags[:miscs] 387 }() 388 } 389 390 // remove the Quorum account options from the main app usage as these should only be used by the geth account sub commands 391 for i, group := range AppHelpFlagGroups { 392 if group.Name == quorumAccountFlagGroup { 393 AppHelpFlagGroups = append(AppHelpFlagGroups[:i], AppHelpFlagGroups[i+1:]...) 394 } 395 } 396 397 // Render out custom usage screen 398 originalHelpPrinter(w, tmpl, helpData{data, AppHelpFlagGroups}) 399 } else if tmpl == utils.CommandHelpTemplate { 400 // Iterate over all command specific flags and categorize them 401 categorized := make(map[string][]cli.Flag) 402 for _, flag := range data.(cli.Command).Flags { 403 if _, ok := categorized[flag.String()]; !ok { 404 categorized[flagCategory(flag)] = append(categorized[flagCategory(flag)], flag) 405 } 406 } 407 408 // sort to get a stable ordering 409 sorted := make([]flagGroup, 0, len(categorized)) 410 for cat, flgs := range categorized { 411 sorted = append(sorted, flagGroup{cat, flgs}) 412 } 413 sort.Sort(byCategory(sorted)) 414 415 // add sorted array to data and render with default printer 416 originalHelpPrinter(w, tmpl, map[string]interface{}{ 417 "cmd": data, 418 "categorizedFlags": sorted, 419 }) 420 } else { 421 originalHelpPrinter(w, tmpl, data) 422 } 423 } 424 }