usage.go 7.93 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
// 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/>.

// Contains the geth command usage template and generator.

package main

import (
	"io"
23
	"sort"
24 25

	"github.com/ethereum/go-ethereum/cmd/utils"
26
	"github.com/ethereum/go-ethereum/internal/debug"
27
	"github.com/ethereum/go-ethereum/internal/flags"
28
	"gopkg.in/urfave/cli.v1"
29 30 31
)

// AppHelpFlagGroups is the application flags, grouped by functionality.
32
var AppHelpFlagGroups = []flags.FlagGroup{
33 34 35
	{
		Name: "ETHEREUM",
		Flags: []cli.Flag{
36
			configFileFlag,
37
			utils.DataDirFlag,
38
			utils.AncientFlag,
39
			utils.MinFreeDiskSpaceFlag,
40
			utils.KeyStoreDirFlag,
41
			utils.USBFlag,
42
			utils.SmartCardDaemonPathFlag,
43
			utils.NetworkIdFlag,
44
			utils.MainnetFlag,
45
			utils.GoerliFlag,
46 47
			utils.RinkebyFlag,
			utils.RopstenFlag,
48
			utils.SepoliaFlag,
49
			utils.KilnFlag,
50
			utils.SyncModeFlag,
51
			utils.ExitWhenSyncedFlag,
52
			utils.GCModeFlag,
53
			utils.TxLookupLimitFlag,
54
			utils.EthStatsURLFlag,
55
			utils.IdentityFlag,
56
			utils.LightKDFFlag,
57
			utils.EthPeerRequiredBlocksFlag,
58 59 60
		},
	},
	{
61
		Name: "LIGHT CLIENT",
62
		Flags: []cli.Flag{
63 64 65 66
			utils.LightServeFlag,
			utils.LightIngressFlag,
			utils.LightEgressFlag,
			utils.LightMaxPeersFlag,
67 68 69
			utils.UltraLightServersFlag,
			utils.UltraLightFractionFlag,
			utils.UltraLightOnlyAnnounceFlag,
70
			utils.LightNoPruneFlag,
71
			utils.LightNoSyncServeFlag,
72 73
		},
	},
74 75
	{
		Name: "DEVELOPER CHAIN",
76 77 78
		Flags: []cli.Flag{
			utils.DeveloperFlag,
			utils.DeveloperPeriodFlag,
79
			utils.DeveloperGasLimitFlag,
80 81
		},
	},
82 83 84 85 86 87
	{
		Name: "ETHASH",
		Flags: []cli.Flag{
			utils.EthashCacheDirFlag,
			utils.EthashCachesInMemoryFlag,
			utils.EthashCachesOnDiskFlag,
88
			utils.EthashCachesLockMmapFlag,
89
			utils.EthashDatasetDirFlag,
90
			utils.EthashDatasetsInMemoryFlag,
91
			utils.EthashDatasetsOnDiskFlag,
92
			utils.EthashDatasetsLockMmapFlag,
93 94
		},
	},
95 96 97
	{
		Name: "TRANSACTION POOL",
		Flags: []cli.Flag{
98
			utils.TxPoolLocalsFlag,
99
			utils.TxPoolNoLocalsFlag,
100 101
			utils.TxPoolJournalFlag,
			utils.TxPoolRejournalFlag,
102 103 104 105 106 107 108 109 110
			utils.TxPoolPriceLimitFlag,
			utils.TxPoolPriceBumpFlag,
			utils.TxPoolAccountSlotsFlag,
			utils.TxPoolGlobalSlotsFlag,
			utils.TxPoolAccountQueueFlag,
			utils.TxPoolGlobalQueueFlag,
			utils.TxPoolLifetimeFlag,
		},
	},
111 112 113
	{
		Name: "PERFORMANCE TUNING",
		Flags: []cli.Flag{
114
			utils.CacheFlag,
115
			utils.CacheDatabaseFlag,
116
			utils.CacheTrieFlag,
117 118
			utils.CacheTrieJournalFlag,
			utils.CacheTrieRejournalFlag,
119
			utils.CacheGCFlag,
120
			utils.CacheSnapshotFlag,
121
			utils.CacheNoPrefetchFlag,
122
			utils.CachePreimagesFlag,
123
			utils.FDLimitFlag,
124 125 126 127 128 129 130
		},
	},
	{
		Name: "ACCOUNT",
		Flags: []cli.Flag{
			utils.UnlockedAccountFlag,
			utils.PasswordFileFlag,
131
			utils.ExternalSignerFlag,
132
			utils.InsecureUnlockAllowedFlag,
133 134 135 136 137
		},
	},
	{
		Name: "API AND CONSOLE",
		Flags: []cli.Flag{
138 139
			utils.IPCDisabledFlag,
			utils.IPCPathFlag,
140 141 142 143
			utils.HTTPEnabledFlag,
			utils.HTTPListenAddrFlag,
			utils.HTTPPortFlag,
			utils.HTTPApiFlag,
144
			utils.HTTPPathPrefixFlag,
145 146
			utils.HTTPCORSDomainFlag,
			utils.HTTPVirtualHostsFlag,
147 148 149 150
			utils.WSEnabledFlag,
			utils.WSListenAddrFlag,
			utils.WSPortFlag,
			utils.WSApiFlag,
151
			utils.WSPathPrefixFlag,
152
			utils.WSAllowedOriginsFlag,
153
			utils.JWTSecretFlag,
154
			utils.AuthListenFlag,
155
			utils.AuthPortFlag,
156
			utils.AuthVirtualHostsFlag,
157 158 159
			utils.GraphQLEnabledFlag,
			utils.GraphQLCORSDomainFlag,
			utils.GraphQLVirtualHostsFlag,
160
			utils.RPCGlobalGasCapFlag,
161
			utils.RPCGlobalEVMTimeoutFlag,
162
			utils.RPCGlobalTxFeeCapFlag,
163
			utils.AllowUnprotectedTxs,
164 165
			utils.JSpathFlag,
			utils.ExecFlag,
166
			utils.PreloadJSFlag,
167 168 169 170 171 172
		},
	},
	{
		Name: "NETWORKING",
		Flags: []cli.Flag{
			utils.BootnodesFlag,
173
			utils.DNSDiscoveryFlag,
174 175 176 177 178
			utils.ListenPortFlag,
			utils.MaxPeersFlag,
			utils.MaxPendingPeersFlag,
			utils.NATFlag,
			utils.NoDiscoverFlag,
179
			utils.DiscoveryV5Flag,
180
			utils.NetrestrictFlag,
181 182 183 184 185 186 187 188 189
			utils.NodeKeyFileFlag,
			utils.NodeKeyHexFlag,
		},
	},
	{
		Name: "MINER",
		Flags: []cli.Flag{
			utils.MiningEnabledFlag,
			utils.MinerThreadsFlag,
190
			utils.MinerNotifyFlag,
191
			utils.MinerNotifyFullFlag,
192
			utils.MinerGasPriceFlag,
193
			utils.MinerGasLimitFlag,
194 195
			utils.MinerEtherbaseFlag,
			utils.MinerExtraDataFlag,
196
			utils.MinerRecommitIntervalFlag,
197
			utils.MinerNoVerifyFlag,
198 199 200 201 202
		},
	},
	{
		Name: "GAS PRICE ORACLE",
		Flags: []cli.Flag{
203 204
			utils.GpoBlocksFlag,
			utils.GpoPercentileFlag,
205
			utils.GpoMaxGasPriceFlag,
206
			utils.GpoIgnoreGasPriceFlag,
207 208 209 210 211
		},
	},
	{
		Name: "VIRTUAL MACHINE",
		Flags: []cli.Flag{
212
			utils.VMEnableDebugFlag,
213 214 215
		},
	},
	{
216 217 218
		Name: "LOGGING AND DEBUGGING",
		Flags: append([]cli.Flag{
			utils.FakePoWFlag,
219
			utils.NoCompactionFlag,
220
		}, debug.Flags...),
221
	},
222
	{
223 224
		Name:  "METRICS AND STATS",
		Flags: metricsFlags,
225
	},
226
	{
227
		Name: "ALIASED (deprecated)",
228
		Flags: []cli.Flag{
229
			utils.NoUSBFlag,
230
			utils.LegacyWhitelistFlag,
231
		},
232
	},
233
	{
234
		Name: "MISC",
235 236
		Flags: []cli.Flag{
			utils.SnapshotFlag,
237
			utils.BloomFilterSizeFlag,
238 239
			cli.HelpFlag,
		},
240 241 242 243 244
	},
}

func init() {
	// Override the default app help template
245
	cli.AppHelpTemplate = flags.AppHelpTemplate
246

247 248 249
	// 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{}) {
250
		if tmpl == flags.AppHelpTemplate {
251 252 253 254 255 256 257
			// Iterate over all the flags and add any uncategorized ones
			categorized := make(map[string]struct{})
			for _, group := range AppHelpFlagGroups {
				for _, flag := range group.Flags {
					categorized[flag.String()] = struct{}{}
				}
			}
258 259 260 261 262
			deprecated := make(map[string]struct{})
			for _, flag := range utils.DeprecatedFlags {
				deprecated[flag.String()] = struct{}{}
			}
			// Only add uncategorized flags if they are not deprecated
263
			var uncategorized []cli.Flag
264 265
			for _, flag := range data.(*cli.App).Flags {
				if _, ok := categorized[flag.String()]; !ok {
266 267 268
					if _, ok := deprecated[flag.String()]; !ok {
						uncategorized = append(uncategorized, flag)
					}
269 270 271 272 273 274 275 276 277 278 279 280 281
				}
			}
			if len(uncategorized) > 0 {
				// Append all ungategorized options to the misc group
				miscs := len(AppHelpFlagGroups[len(AppHelpFlagGroups)-1].Flags)
				AppHelpFlagGroups[len(AppHelpFlagGroups)-1].Flags = append(AppHelpFlagGroups[len(AppHelpFlagGroups)-1].Flags, uncategorized...)

				// Make sure they are removed afterwards
				defer func() {
					AppHelpFlagGroups[len(AppHelpFlagGroups)-1].Flags = AppHelpFlagGroups[len(AppHelpFlagGroups)-1].Flags[:miscs]
				}()
			}
			// Render out custom usage screen
282 283
			originalHelpPrinter(w, tmpl, flags.HelpData{App: data, FlagGroups: AppHelpFlagGroups})
		} else if tmpl == flags.CommandHelpTemplate {
284 285 286 287
			// 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 {
288
					categorized[flags.FlagCategory(flag, AppHelpFlagGroups)] = append(categorized[flags.FlagCategory(flag, AppHelpFlagGroups)], flag)
289 290 291 292
				}
			}

			// sort to get a stable ordering
293
			sorted := make([]flags.FlagGroup, 0, len(categorized))
294
			for cat, flgs := range categorized {
295
				sorted = append(sorted, flags.FlagGroup{Name: cat, Flags: flgs})
296
			}
297
			sort.Sort(flags.ByCategory(sorted))
298 299 300 301 302 303

			// add sorted array to data and render with default printer
			originalHelpPrinter(w, tmpl, map[string]interface{}{
				"cmd":              data,
				"categorizedFlags": sorted,
			})
304 305 306 307 308
		} else {
			originalHelpPrinter(w, tmpl, data)
		}
	}
}