mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-27 15:16:43 +00:00
Lint internal/cli
This commit is contained in:
parent
12ab0f0240
commit
45a72bc49e
20 changed files with 113 additions and 17 deletions
|
|
@ -19,6 +19,7 @@ func (a *Account) MarkDown() string {
|
||||||
"- [```account list```](./account_list.md): List the wallets in the Bor client.",
|
"- [```account list```](./account_list.md): List the wallets in the Bor client.",
|
||||||
"- [```account import```](./account_import.md): Import an account to the Bor client.",
|
"- [```account import```](./account_import.md): Import an account to the Bor client.",
|
||||||
}
|
}
|
||||||
|
|
||||||
return strings.Join(items, "\n\n")
|
return strings.Join(items, "\n\n")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,7 @@ func (a *AccountImportCommand) MarkDown() string {
|
||||||
"The ```account import``` command imports an account in Json format to the Bor data directory.",
|
"The ```account import``` command imports an account in Json format to the Bor data directory.",
|
||||||
a.Flags().MarkDown(),
|
a.Flags().MarkDown(),
|
||||||
}
|
}
|
||||||
|
|
||||||
return strings.Join(items, "\n\n")
|
return strings.Join(items, "\n\n")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -58,7 +59,9 @@ func (a *AccountImportCommand) Run(args []string) int {
|
||||||
a.UI.Error("Expected one argument")
|
a.UI.Error("Expected one argument")
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
key, err := crypto.LoadECDSA(args[0])
|
key, err := crypto.LoadECDSA(args[0])
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
a.UI.Error(fmt.Sprintf("Failed to load the private key '%s': %v", args[0], err))
|
a.UI.Error(fmt.Sprintf("Failed to load the private key '%s': %v", args[0], err))
|
||||||
return 1
|
return 1
|
||||||
|
|
@ -80,6 +83,8 @@ func (a *AccountImportCommand) Run(args []string) int {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
utils.Fatalf("Could not create the account: %v", err)
|
utils.Fatalf("Could not create the account: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
a.UI.Output(fmt.Sprintf("Account created: %s", acct.Address.String()))
|
a.UI.Output(fmt.Sprintf("Account created: %s", acct.Address.String()))
|
||||||
|
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,7 @@ func (a *AccountListCommand) MarkDown() string {
|
||||||
"The `account list` command lists all the accounts in the Bor data directory.",
|
"The `account list` command lists all the accounts in the Bor data directory.",
|
||||||
a.Flags().MarkDown(),
|
a.Flags().MarkDown(),
|
||||||
}
|
}
|
||||||
|
|
||||||
return strings.Join(items, "\n\n")
|
return strings.Join(items, "\n\n")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -53,7 +54,9 @@ func (a *AccountListCommand) Run(args []string) int {
|
||||||
a.UI.Error(fmt.Sprintf("Failed to get keystore: %v", err))
|
a.UI.Error(fmt.Sprintf("Failed to get keystore: %v", err))
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
a.UI.Output(formatAccounts(keystore.Accounts()))
|
a.UI.Output(formatAccounts(keystore.Accounts()))
|
||||||
|
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -64,10 +67,12 @@ func formatAccounts(accts []accounts.Account) string {
|
||||||
|
|
||||||
rows := make([]string, len(accts)+1)
|
rows := make([]string, len(accts)+1)
|
||||||
rows[0] = "Index|Address"
|
rows[0] = "Index|Address"
|
||||||
|
|
||||||
for i, d := range accts {
|
for i, d := range accts {
|
||||||
rows[i+1] = fmt.Sprintf("%d|%s",
|
rows[i+1] = fmt.Sprintf("%d|%s",
|
||||||
i,
|
i,
|
||||||
d.Address.String())
|
d.Address.String())
|
||||||
}
|
}
|
||||||
|
|
||||||
return formatList(rows)
|
return formatList(rows)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -18,6 +18,7 @@ func (a *AccountNewCommand) MarkDown() string {
|
||||||
"The `account new` command creates a new local account file on the Bor data directory. Bor should not be running to execute this command.",
|
"The `account new` command creates a new local account file on the Bor data directory. Bor should not be running to execute this command.",
|
||||||
a.Flags().MarkDown(),
|
a.Flags().MarkDown(),
|
||||||
}
|
}
|
||||||
|
|
||||||
return strings.Join(items, "\n\n")
|
return strings.Join(items, "\n\n")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -6,12 +6,12 @@ import (
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/internal/cli/flagset"
|
|
||||||
"github.com/ethereum/go-ethereum/rpc"
|
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/cmd/utils"
|
"github.com/ethereum/go-ethereum/cmd/utils"
|
||||||
"github.com/ethereum/go-ethereum/console"
|
"github.com/ethereum/go-ethereum/console"
|
||||||
|
"github.com/ethereum/go-ethereum/internal/cli/flagset"
|
||||||
"github.com/ethereum/go-ethereum/node"
|
"github.com/ethereum/go-ethereum/node"
|
||||||
|
"github.com/ethereum/go-ethereum/rpc"
|
||||||
|
|
||||||
"github.com/mitchellh/cli"
|
"github.com/mitchellh/cli"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -33,6 +33,7 @@ func (c *AttachCommand) MarkDown() string {
|
||||||
"Connect to remote Bor IPC console.",
|
"Connect to remote Bor IPC console.",
|
||||||
c.Flags().MarkDown(),
|
c.Flags().MarkDown(),
|
||||||
}
|
}
|
||||||
|
|
||||||
return strings.Join(items, "\n\n")
|
return strings.Join(items, "\n\n")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -49,7 +50,6 @@ func (c *AttachCommand) Synopsis() string {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *AttachCommand) Flags() *flagset.Flagset {
|
func (c *AttachCommand) Flags() *flagset.Flagset {
|
||||||
|
|
||||||
f := flagset.NewFlagSet("attach")
|
f := flagset.NewFlagSet("attach")
|
||||||
|
|
||||||
f.StringFlag(&flagset.StringFlag{
|
f.StringFlag(&flagset.StringFlag{
|
||||||
|
|
@ -75,13 +75,13 @@ func (c *AttachCommand) Flags() *flagset.Flagset {
|
||||||
|
|
||||||
// Run implements the cli.Command interface
|
// Run implements the cli.Command interface
|
||||||
func (c *AttachCommand) Run(args []string) int {
|
func (c *AttachCommand) Run(args []string) int {
|
||||||
|
|
||||||
flags := c.Flags()
|
flags := c.Flags()
|
||||||
|
|
||||||
//check if first arg is flag or IPC location
|
//check if first arg is flag or IPC location
|
||||||
if len(args) == 0 {
|
if len(args) == 0 {
|
||||||
args = append(args, "")
|
args = append(args, "")
|
||||||
}
|
}
|
||||||
|
|
||||||
if args[0] != "" && strings.HasPrefix(args[0], "--") {
|
if args[0] != "" && strings.HasPrefix(args[0], "--") {
|
||||||
if err := flags.Parse(args); err != nil {
|
if err := flags.Parse(args); err != nil {
|
||||||
c.UI.Error(err.Error())
|
c.UI.Error(err.Error())
|
||||||
|
|
@ -94,6 +94,7 @@ func (c *AttachCommand) Run(args []string) int {
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := c.remoteConsole(); err != nil {
|
if err := c.remoteConsole(); err != nil {
|
||||||
c.UI.Error(err.Error())
|
c.UI.Error(err.Error())
|
||||||
return 1
|
return 1
|
||||||
|
|
@ -104,25 +105,30 @@ func (c *AttachCommand) Run(args []string) int {
|
||||||
|
|
||||||
// remoteConsole will connect to a remote bor instance, attaching a JavaScript
|
// remoteConsole will connect to a remote bor instance, attaching a JavaScript
|
||||||
// console to it.
|
// console to it.
|
||||||
|
// nolint: unparam
|
||||||
func (c *AttachCommand) remoteConsole() error {
|
func (c *AttachCommand) remoteConsole() error {
|
||||||
// Attach to a remotely running geth instance and start the JavaScript console
|
// Attach to a remotely running geth instance and start the JavaScript console
|
||||||
|
|
||||||
path := node.DefaultDataDir()
|
path := node.DefaultDataDir()
|
||||||
|
|
||||||
if c.Endpoint == "" {
|
if c.Endpoint == "" {
|
||||||
if c.Meta.dataDir != "" {
|
if c.Meta.dataDir != "" {
|
||||||
path = c.Meta.dataDir
|
path = c.Meta.dataDir
|
||||||
}
|
}
|
||||||
|
|
||||||
if path != "" {
|
if path != "" {
|
||||||
homeDir, _ := os.UserHomeDir()
|
homeDir, _ := os.UserHomeDir()
|
||||||
path = filepath.Join(homeDir, "/.bor/data")
|
path = filepath.Join(homeDir, "/.bor/data")
|
||||||
}
|
}
|
||||||
|
|
||||||
c.Endpoint = fmt.Sprintf("%s/bor.ipc", path)
|
c.Endpoint = fmt.Sprintf("%s/bor.ipc", path)
|
||||||
}
|
}
|
||||||
|
|
||||||
client, err := dialRPC(c.Endpoint)
|
client, err := dialRPC(c.Endpoint)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
utils.Fatalf("Unable to attach to remote bor: %v", err)
|
utils.Fatalf("Unable to attach to remote bor: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
config := console.Config{
|
config := console.Config{
|
||||||
DataDir: path,
|
DataDir: path,
|
||||||
DocRoot: c.JSpathFlag,
|
DocRoot: c.JSpathFlag,
|
||||||
|
|
@ -134,7 +140,12 @@ func (c *AttachCommand) remoteConsole() error {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
utils.Fatalf("Failed to start the JavaScript console: %v", err)
|
utils.Fatalf("Failed to start the JavaScript console: %v", err)
|
||||||
}
|
}
|
||||||
defer console.Stop(false)
|
|
||||||
|
defer func() {
|
||||||
|
if err := console.Stop(false); err != nil {
|
||||||
|
c.UI.Error(err.Error())
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
if c.ExecCMD != "" {
|
if c.ExecCMD != "" {
|
||||||
console.Evaluate(c.ExecCMD)
|
console.Evaluate(c.ExecCMD)
|
||||||
|
|
@ -159,6 +170,7 @@ func dialRPC(endpoint string) (*rpc.Client, error) {
|
||||||
// these prefixes.
|
// these prefixes.
|
||||||
endpoint = endpoint[4:]
|
endpoint = endpoint[4:]
|
||||||
}
|
}
|
||||||
|
|
||||||
return rpc.Dial(endpoint)
|
return rpc.Dial(endpoint)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -175,5 +187,6 @@ func (c *AttachCommand) makeConsolePreloads() []string {
|
||||||
for _, file := range strings.Split(c.PreloadJSFlag, ",") {
|
for _, file := range strings.Split(c.PreloadJSFlag, ",") {
|
||||||
preloads = append(preloads, strings.TrimSpace(file))
|
preloads = append(preloads, strings.TrimSpace(file))
|
||||||
}
|
}
|
||||||
|
|
||||||
return preloads
|
return preloads
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,7 @@ import (
|
||||||
"github.com/ethereum/go-ethereum/p2p/discover"
|
"github.com/ethereum/go-ethereum/p2p/discover"
|
||||||
"github.com/ethereum/go-ethereum/p2p/enode"
|
"github.com/ethereum/go-ethereum/p2p/enode"
|
||||||
"github.com/ethereum/go-ethereum/p2p/nat"
|
"github.com/ethereum/go-ethereum/p2p/nat"
|
||||||
|
|
||||||
"github.com/mitchellh/cli"
|
"github.com/mitchellh/cli"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -45,6 +46,7 @@ func (c *BootnodeCommand) MarkDown() string {
|
||||||
"# Bootnode",
|
"# Bootnode",
|
||||||
c.Flags().MarkDown(),
|
c.Flags().MarkDown(),
|
||||||
}
|
}
|
||||||
|
|
||||||
return strings.Join(items, "\n\n")
|
return strings.Join(items, "\n\n")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -103,6 +105,7 @@ func (b *BootnodeCommand) Synopsis() string {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Run implements the cli.Command interface
|
// Run implements the cli.Command interface
|
||||||
|
// nolint: gocognit
|
||||||
func (b *BootnodeCommand) Run(args []string) int {
|
func (b *BootnodeCommand) Run(args []string) int {
|
||||||
flags := b.Flags()
|
flags := b.Flags()
|
||||||
if err := flags.Parse(args); err != nil {
|
if err := flags.Parse(args); err != nil {
|
||||||
|
|
@ -118,6 +121,7 @@ func (b *BootnodeCommand) Run(args []string) int {
|
||||||
} else {
|
} else {
|
||||||
glogger.Verbosity(log.LvlInfo)
|
glogger.Verbosity(log.LvlInfo)
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Root().SetHandler(glogger)
|
log.Root().SetHandler(glogger)
|
||||||
|
|
||||||
natm, err := nat.Parse(b.nat)
|
natm, err := nat.Parse(b.nat)
|
||||||
|
|
@ -128,6 +132,7 @@ func (b *BootnodeCommand) Run(args []string) int {
|
||||||
|
|
||||||
// create a one time key
|
// create a one time key
|
||||||
var nodeKey *ecdsa.PrivateKey
|
var nodeKey *ecdsa.PrivateKey
|
||||||
|
// nolint: nestif
|
||||||
if b.nodeKey != "" {
|
if b.nodeKey != "" {
|
||||||
// try to read the key either from file or command line
|
// try to read the key either from file or command line
|
||||||
if _, err := os.Stat(b.nodeKey); errors.Is(err, os.ErrNotExist) {
|
if _, err := os.Stat(b.nodeKey); errors.Is(err, os.ErrNotExist) {
|
||||||
|
|
@ -157,7 +162,7 @@ func (b *BootnodeCommand) Run(args []string) int {
|
||||||
}
|
}
|
||||||
// save the public key
|
// save the public key
|
||||||
pubRaw := fmt.Sprintf("%x", crypto.FromECDSAPub(&nodeKey.PublicKey)[1:])
|
pubRaw := fmt.Sprintf("%x", crypto.FromECDSAPub(&nodeKey.PublicKey)[1:])
|
||||||
if err := ioutil.WriteFile(filepath.Join(path, "pub.key"), []byte(pubRaw), 0755); err != nil {
|
if err := ioutil.WriteFile(filepath.Join(path, "pub.key"), []byte(pubRaw), 0600); err != nil {
|
||||||
b.UI.Error(fmt.Sprintf("failed to write node pub key: %v", err))
|
b.UI.Error(fmt.Sprintf("failed to write node pub key: %v", err))
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
|
|
@ -169,7 +174,9 @@ func (b *BootnodeCommand) Run(args []string) int {
|
||||||
b.UI.Error(fmt.Sprintf("could not resolve udp addr '%s': %v", b.listenAddr, err))
|
b.UI.Error(fmt.Sprintf("could not resolve udp addr '%s': %v", b.listenAddr, err))
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
conn, err := net.ListenUDP("udp", addr)
|
conn, err := net.ListenUDP("udp", addr)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
b.UI.Error(fmt.Sprintf("failed to listen udp addr '%s': %v", b.listenAddr, err))
|
b.UI.Error(fmt.Sprintf("failed to listen udp addr '%s': %v", b.listenAddr, err))
|
||||||
return 1
|
return 1
|
||||||
|
|
@ -180,7 +187,9 @@ func (b *BootnodeCommand) Run(args []string) int {
|
||||||
if !realaddr.IP.IsLoopback() {
|
if !realaddr.IP.IsLoopback() {
|
||||||
go nat.Map(natm, nil, "udp", realaddr.Port, realaddr.Port, "ethereum discovery")
|
go nat.Map(natm, nil, "udp", realaddr.Port, realaddr.Port, "ethereum discovery")
|
||||||
}
|
}
|
||||||
|
|
||||||
if ext, err := natm.ExternalIP(); err == nil {
|
if ext, err := natm.ExternalIP(); err == nil {
|
||||||
|
// nolint: govet
|
||||||
realaddr = &net.UDPAddr{IP: ext, Port: realaddr.Port}
|
realaddr = &net.UDPAddr{IP: ext, Port: realaddr.Port}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -198,6 +207,7 @@ func (b *BootnodeCommand) Run(args []string) int {
|
||||||
PrivateKey: nodeKey,
|
PrivateKey: nodeKey,
|
||||||
Log: log.Root(),
|
Log: log.Root(),
|
||||||
}
|
}
|
||||||
|
|
||||||
if b.v5 {
|
if b.v5 {
|
||||||
if _, err := discover.ListenV5(conn, ln, cfg); err != nil {
|
if _, err := discover.ListenV5(conn, ln, cfg); err != nil {
|
||||||
utils.Fatalf("%v", err)
|
utils.Fatalf("%v", err)
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,7 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/params"
|
"github.com/ethereum/go-ethereum/params"
|
||||||
|
|
||||||
"github.com/mitchellh/cli"
|
"github.com/mitchellh/cli"
|
||||||
"github.com/shirou/gopsutil/cpu"
|
"github.com/shirou/gopsutil/cpu"
|
||||||
"github.com/shirou/gopsutil/disk"
|
"github.com/shirou/gopsutil/disk"
|
||||||
|
|
@ -25,6 +26,7 @@ func (c *FingerprintCommand) MarkDown() string {
|
||||||
"# Fingerprint",
|
"# Fingerprint",
|
||||||
"Display the system fingerprint",
|
"Display the system fingerprint",
|
||||||
}
|
}
|
||||||
|
|
||||||
return strings.Join(items, "\n\n")
|
return strings.Join(items, "\n\n")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -45,6 +47,7 @@ func getCoresCount(cp []cpu.InfoStat) int {
|
||||||
for i := 0; i < len(cp); i++ {
|
for i := 0; i < len(cp); i++ {
|
||||||
cores += int(cp[i].Cores)
|
cores += int(cp[i].Cores)
|
||||||
}
|
}
|
||||||
|
|
||||||
return cores
|
return cores
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -76,6 +79,7 @@ func formatFingerprint(borFingerprint *BorFingerprint) string {
|
||||||
fmt.Sprintf("RAM :: total : %v GB, free : %v GB, used : %v GB", borFingerprint.MemoryDetails.TotalMem, borFingerprint.MemoryDetails.FreeMem, borFingerprint.MemoryDetails.UsedMem),
|
fmt.Sprintf("RAM :: total : %v GB, free : %v GB, used : %v GB", borFingerprint.MemoryDetails.TotalMem, borFingerprint.MemoryDetails.FreeMem, borFingerprint.MemoryDetails.UsedMem),
|
||||||
fmt.Sprintf("STORAGE :: total : %v GB, free : %v GB, used : %v GB", borFingerprint.DiskDetails.TotalDisk, borFingerprint.DiskDetails.FreeDisk, borFingerprint.DiskDetails.UsedDisk),
|
fmt.Sprintf("STORAGE :: total : %v GB, free : %v GB, used : %v GB", borFingerprint.DiskDetails.TotalDisk, borFingerprint.DiskDetails.FreeDisk, borFingerprint.DiskDetails.UsedDisk),
|
||||||
})
|
})
|
||||||
|
|
||||||
return base
|
return base
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -85,13 +89,13 @@ func convertBytesToGB(bytesValue uint64) float64 {
|
||||||
|
|
||||||
// Checks if fio exists on the node
|
// Checks if fio exists on the node
|
||||||
func (c *FingerprintCommand) checkFio() error {
|
func (c *FingerprintCommand) checkFio() error {
|
||||||
|
|
||||||
cmd := exec.Command("/bin/sh", "-c", "fio -v")
|
cmd := exec.Command("/bin/sh", "-c", "fio -v")
|
||||||
|
|
||||||
_, err := cmd.CombinedOutput()
|
_, err := cmd.CombinedOutput()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
message := "\nFio package not installed. Install Fio for IOPS Benchmarking :\n\nDebianOS : 'sudo apt-get update && sudo apt-get install fio -y'\nAWS AMI/CentOS : 'sudo yum install fio -y'\nOracle LinuxOS : 'sudo dnf install fio -y'\n"
|
message := "\nFio package not installed. Install Fio for IOPS Benchmarking :\n\nDebianOS : 'sudo apt-get update && sudo apt-get install fio -y'\nAWS AMI/CentOS : 'sudo yum install fio -y'\nOracle LinuxOS : 'sudo dnf install fio -y'\n"
|
||||||
c.UI.Output(message)
|
c.UI.Output(message)
|
||||||
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -101,9 +105,12 @@ func (c *FingerprintCommand) checkFio() error {
|
||||||
// Run the IOPS benchmark for the node
|
// Run the IOPS benchmark for the node
|
||||||
func (c *FingerprintCommand) benchmark() error {
|
func (c *FingerprintCommand) benchmark() error {
|
||||||
var b []byte
|
var b []byte
|
||||||
|
|
||||||
err := c.checkFio()
|
err := c.checkFio()
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil
|
// Missing Fio is not a fatal error. A message will be logged in console when it is missing in "checkFio()".
|
||||||
|
return nil //nolint:nilerr
|
||||||
}
|
}
|
||||||
|
|
||||||
c.UI.Output("\nRunning a 10 second test...\n")
|
c.UI.Output("\nRunning a 10 second test...\n")
|
||||||
|
|
@ -123,7 +130,6 @@ func (c *FingerprintCommand) benchmark() error {
|
||||||
|
|
||||||
// Run implements the cli.Command interface
|
// Run implements the cli.Command interface
|
||||||
func (c *FingerprintCommand) Run(args []string) int {
|
func (c *FingerprintCommand) Run(args []string) int {
|
||||||
|
|
||||||
v, err := mem.VirtualMemory()
|
v, err := mem.VirtualMemory()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.UI.Error(err.Error())
|
c.UI.Error(err.Error())
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,7 @@ func (c *ChainCommand) MarkDown() string {
|
||||||
"- [```chain sethead```](./chain_sethead.md): Set the current chain to a certain block.",
|
"- [```chain sethead```](./chain_sethead.md): Set the current chain to a certain block.",
|
||||||
"- [```chain watch```](./chain_watch.md): Watch the chainHead, reorg and fork events in real-time.",
|
"- [```chain watch```](./chain_watch.md): Watch the chainHead, reorg and fork events in real-time.",
|
||||||
}
|
}
|
||||||
|
|
||||||
return strings.Join(items, "\n\n")
|
return strings.Join(items, "\n\n")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -26,6 +26,7 @@ func (a *ChainSetHeadCommand) MarkDown() string {
|
||||||
"- ```number```: The block number to roll back.",
|
"- ```number```: The block number to roll back.",
|
||||||
a.Flags().MarkDown(),
|
a.Flags().MarkDown(),
|
||||||
}
|
}
|
||||||
|
|
||||||
return strings.Join(items, "\n\n")
|
return strings.Join(items, "\n\n")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -45,6 +46,7 @@ func (c *ChainSetHeadCommand) Flags() *flagset.Flagset {
|
||||||
Default: false,
|
Default: false,
|
||||||
Value: &c.yes,
|
Value: &c.yes,
|
||||||
})
|
})
|
||||||
|
|
||||||
return flags
|
return flags
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -88,6 +90,7 @@ func (c *ChainSetHeadCommand) Run(args []string) int {
|
||||||
c.UI.Error(err.Error())
|
c.UI.Error(err.Error())
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
if response != "y" {
|
if response != "y" {
|
||||||
c.UI.Output("set head aborted")
|
c.UI.Output("set head aborted")
|
||||||
return 0
|
return 0
|
||||||
|
|
@ -100,5 +103,6 @@ func (c *ChainSetHeadCommand) Run(args []string) int {
|
||||||
}
|
}
|
||||||
|
|
||||||
c.UI.Output("Done!")
|
c.UI.Output("Done!")
|
||||||
|
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -24,6 +24,7 @@ func (c *ChainWatchCommand) MarkDown() string {
|
||||||
"# Chain watch",
|
"# Chain watch",
|
||||||
"The ```chain watch``` command is used to view the chainHead, reorg and fork events in real-time.",
|
"The ```chain watch``` command is used to view the chainHead, reorg and fork events in real-time.",
|
||||||
}
|
}
|
||||||
|
|
||||||
return strings.Join(items, "\n\n")
|
return strings.Join(items, "\n\n")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -70,7 +71,10 @@ func (c *ChainWatchCommand) Run(args []string) int {
|
||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
<-signalCh
|
<-signalCh
|
||||||
sub.CloseSend()
|
|
||||||
|
if err := sub.CloseSend(); err != nil {
|
||||||
|
c.UI.Error(err.Error())
|
||||||
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
for {
|
for {
|
||||||
|
|
@ -80,6 +84,7 @@ func (c *ChainWatchCommand) Run(args []string) int {
|
||||||
c.UI.Output(err.Error())
|
c.UI.Output(err.Error())
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
c.UI.Output(formatHeadEvent(msg))
|
c.UI.Output(formatHeadEvent(msg))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -95,5 +100,6 @@ func formatHeadEvent(msg *proto.ChainWatchResponse) string {
|
||||||
} else if msg.Type == core.Chain2HeadReorgEvent {
|
} else if msg.Type == core.Chain2HeadReorgEvent {
|
||||||
out = fmt.Sprintf("Reorg Detected \nAdded : %v \nRemoved : %v", msg.Newchain, msg.Oldchain)
|
out = fmt.Sprintf("Reorg Detected \nAdded : %v \nRemoved : %v", msg.Newchain, msg.Oldchain)
|
||||||
}
|
}
|
||||||
|
|
||||||
return out
|
return out
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -9,11 +9,16 @@ import (
|
||||||
"github.com/ethereum/go-ethereum/internal/cli/server"
|
"github.com/ethereum/go-ethereum/internal/cli/server"
|
||||||
"github.com/ethereum/go-ethereum/internal/cli/server/proto"
|
"github.com/ethereum/go-ethereum/internal/cli/server/proto"
|
||||||
"github.com/ethereum/go-ethereum/node"
|
"github.com/ethereum/go-ethereum/node"
|
||||||
|
|
||||||
"github.com/mitchellh/cli"
|
"github.com/mitchellh/cli"
|
||||||
"github.com/ryanuber/columnize"
|
"github.com/ryanuber/columnize"
|
||||||
"google.golang.org/grpc"
|
"google.golang.org/grpc"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
emptyPlaceHolder = "<none>"
|
||||||
|
)
|
||||||
|
|
||||||
type MarkDownCommand interface {
|
type MarkDownCommand interface {
|
||||||
MarkDown
|
MarkDown
|
||||||
cli.Command
|
cli.Command
|
||||||
|
|
@ -48,6 +53,7 @@ func Run(args []string) int {
|
||||||
fmt.Fprintf(os.Stderr, "Error executing CLI: %s\n", err.Error())
|
fmt.Fprintf(os.Stderr, "Error executing CLI: %s\n", err.Error())
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
return exitCode
|
return exitCode
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -64,6 +70,7 @@ func Commands() map[string]MarkDownCommandFactory {
|
||||||
meta := &Meta{
|
meta := &Meta{
|
||||||
UI: ui,
|
UI: ui,
|
||||||
}
|
}
|
||||||
|
|
||||||
return map[string]MarkDownCommandFactory{
|
return map[string]MarkDownCommandFactory{
|
||||||
"server": func() (MarkDownCommand, error) {
|
"server": func() (MarkDownCommand, error) {
|
||||||
return &server.Command{
|
return &server.Command{
|
||||||
|
|
@ -180,6 +187,7 @@ func (m *Meta2) NewFlagSet(n string) *flagset.Flagset {
|
||||||
Usage: "Address of the grpc endpoint",
|
Usage: "Address of the grpc endpoint",
|
||||||
Default: "127.0.0.1:3131",
|
Default: "127.0.0.1:3131",
|
||||||
})
|
})
|
||||||
|
|
||||||
return f
|
return f
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -188,6 +196,7 @@ func (m *Meta2) Conn() (*grpc.ClientConn, error) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("failed to connect to server: %v", err)
|
return nil, fmt.Errorf("failed to connect to server: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return conn, nil
|
return conn, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -196,6 +205,7 @@ func (m *Meta2) BorConn() (proto.BorClient, error) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return proto.NewBorClient(conn), nil
|
return proto.NewBorClient(conn), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -243,18 +253,21 @@ func (m *Meta) GetKeystore() (*keystore.KeyStore, error) {
|
||||||
scryptP := keystore.StandardScryptP
|
scryptP := keystore.StandardScryptP
|
||||||
|
|
||||||
keys := keystore.NewKeyStore(keydir, scryptN, scryptP)
|
keys := keystore.NewKeyStore(keydir, scryptN, scryptP)
|
||||||
|
|
||||||
return keys, nil
|
return keys, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func formatList(in []string) string {
|
func formatList(in []string) string {
|
||||||
columnConf := columnize.DefaultConfig()
|
columnConf := columnize.DefaultConfig()
|
||||||
columnConf.Empty = "<none>"
|
columnConf.Empty = emptyPlaceHolder
|
||||||
|
|
||||||
return columnize.Format(in, columnConf)
|
return columnize.Format(in, columnConf)
|
||||||
}
|
}
|
||||||
|
|
||||||
func formatKV(in []string) string {
|
func formatKV(in []string) string {
|
||||||
columnConf := columnize.DefaultConfig()
|
columnConf := columnize.DefaultConfig()
|
||||||
columnConf.Empty = "<none>"
|
columnConf.Empty = emptyPlaceHolder
|
||||||
columnConf.Glue = " = "
|
columnConf.Glue = " = "
|
||||||
|
|
||||||
return columnize.Format(in, columnConf)
|
return columnize.Format(in, columnConf)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -18,8 +18,9 @@ import (
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/internal/cli/flagset"
|
"github.com/ethereum/go-ethereum/internal/cli/flagset"
|
||||||
"github.com/ethereum/go-ethereum/internal/cli/server/proto"
|
"github.com/ethereum/go-ethereum/internal/cli/server/proto"
|
||||||
"github.com/golang/protobuf/jsonpb"
|
|
||||||
gproto "github.com/golang/protobuf/proto"
|
"github.com/golang/protobuf/jsonpb" // nolint:staticcheck
|
||||||
|
gproto "github.com/golang/protobuf/proto" // nolint:staticcheck
|
||||||
"github.com/golang/protobuf/ptypes/empty"
|
"github.com/golang/protobuf/ptypes/empty"
|
||||||
grpc_net_conn "github.com/mitchellh/go-grpc-net-conn"
|
grpc_net_conn "github.com/mitchellh/go-grpc-net-conn"
|
||||||
)
|
)
|
||||||
|
|
@ -55,6 +56,7 @@ func (d *DebugCommand) MarkDown() string {
|
||||||
d.Flags().MarkDown(),
|
d.Flags().MarkDown(),
|
||||||
}
|
}
|
||||||
items = append(items, examples...)
|
items = append(items, examples...)
|
||||||
|
|
||||||
return strings.Join(items, "\n\n")
|
return strings.Join(items, "\n\n")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -112,6 +114,7 @@ func (d *DebugCommand) Run(args []string) int {
|
||||||
// User specified output directory
|
// User specified output directory
|
||||||
tmp = filepath.Join(d.output, stamped)
|
tmp = filepath.Join(d.output, stamped)
|
||||||
_, err := os.Stat(tmp)
|
_, err := os.Stat(tmp)
|
||||||
|
|
||||||
if !os.IsNotExist(err) {
|
if !os.IsNotExist(err) {
|
||||||
d.UI.Error("Output directory already exists")
|
d.UI.Error("Output directory already exists")
|
||||||
return 1
|
return 1
|
||||||
|
|
@ -139,6 +142,7 @@ func (d *DebugCommand) Run(args []string) int {
|
||||||
req := &proto.PprofRequest{
|
req := &proto.PprofRequest{
|
||||||
Seconds: int64(d.seconds),
|
Seconds: int64(d.seconds),
|
||||||
}
|
}
|
||||||
|
|
||||||
switch profile {
|
switch profile {
|
||||||
case "cpu":
|
case "cpu":
|
||||||
req.Type = proto.PprofRequest_CPU
|
req.Type = proto.PprofRequest_CPU
|
||||||
|
|
@ -148,7 +152,9 @@ func (d *DebugCommand) Run(args []string) int {
|
||||||
req.Type = proto.PprofRequest_LOOKUP
|
req.Type = proto.PprofRequest_LOOKUP
|
||||||
req.Profile = profile
|
req.Profile = profile
|
||||||
}
|
}
|
||||||
|
|
||||||
stream, err := clt.Pprof(ctx, req)
|
stream, err := clt.Pprof(ctx, req)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -157,6 +163,7 @@ func (d *DebugCommand) Run(args []string) int {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if _, ok := msg.Event.(*proto.PprofResponse_Open_); !ok {
|
if _, ok := msg.Event.(*proto.PprofResponse_Open_); !ok {
|
||||||
return fmt.Errorf("expected open message")
|
return fmt.Errorf("expected open message")
|
||||||
}
|
}
|
||||||
|
|
@ -179,6 +186,7 @@ func (d *DebugCommand) Run(args []string) int {
|
||||||
if _, err := io.Copy(file, conn); err != nil {
|
if _, err := io.Copy(file, conn); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -210,7 +218,7 @@ func (d *DebugCommand) Run(args []string) int {
|
||||||
d.UI.Output(err.Error())
|
d.UI.Output(err.Error())
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
if err := ioutil.WriteFile(filepath.Join(tmp, "status.json"), []byte(data), 0644); err != nil {
|
if err := ioutil.WriteFile(filepath.Join(tmp, "status.json"), []byte(data), 0600); err != nil {
|
||||||
d.UI.Output(fmt.Sprintf("Failed to write status: %v", err))
|
d.UI.Output(fmt.Sprintf("Failed to write status: %v", err))
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
|
|
@ -230,6 +238,7 @@ func (d *DebugCommand) Run(args []string) int {
|
||||||
}
|
}
|
||||||
|
|
||||||
d.UI.Output(fmt.Sprintf("Created debug archive: %s", archiveFile))
|
d.UI.Output(fmt.Sprintf("Created debug archive: %s", archiveFile))
|
||||||
|
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,7 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestCodeBlock(t *testing.T) {
|
func TestCodeBlock(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
assert := assert.New(t)
|
assert := assert.New(t)
|
||||||
|
|
||||||
lines := []string{
|
lines := []string{
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,7 @@ func (a *PeersCommand) MarkDown() string {
|
||||||
"- [```peers remove```](./peers_remove.md): Disconnects the local client from a connected peer if exists.",
|
"- [```peers remove```](./peers_remove.md): Disconnects the local client from a connected peer if exists.",
|
||||||
"- [```peers status```](./peers_status.md): Display the status of a peer by its id.",
|
"- [```peers status```](./peers_status.md): Display the status of a peer by its id.",
|
||||||
}
|
}
|
||||||
|
|
||||||
return strings.Join(items, "\n\n")
|
return strings.Join(items, "\n\n")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -22,6 +22,7 @@ func (p *PeersAddCommand) MarkDown() string {
|
||||||
"The ```peers add <enode>``` command joins the local client to another remote peer.",
|
"The ```peers add <enode>``` command joins the local client to another remote peer.",
|
||||||
p.Flags().MarkDown(),
|
p.Flags().MarkDown(),
|
||||||
}
|
}
|
||||||
|
|
||||||
return strings.Join(items, "\n\n")
|
return strings.Join(items, "\n\n")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -79,5 +80,6 @@ func (c *PeersAddCommand) Run(args []string) int {
|
||||||
c.UI.Error(err.Error())
|
c.UI.Error(err.Error())
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,7 @@ func (p *PeersListCommand) MarkDown() string {
|
||||||
"The ```peers list``` command lists the connected peers.",
|
"The ```peers list``` command lists the connected peers.",
|
||||||
p.Flags().MarkDown(),
|
p.Flags().MarkDown(),
|
||||||
}
|
}
|
||||||
|
|
||||||
return strings.Join(items, "\n\n")
|
return strings.Join(items, "\n\n")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -60,12 +61,14 @@ func (c *PeersListCommand) Run(args []string) int {
|
||||||
|
|
||||||
req := &proto.PeersListRequest{}
|
req := &proto.PeersListRequest{}
|
||||||
resp, err := borClt.PeersList(context.Background(), req)
|
resp, err := borClt.PeersList(context.Background(), req)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.UI.Error(err.Error())
|
c.UI.Error(err.Error())
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
c.UI.Output(formatPeers(resp.Peers))
|
c.UI.Output(formatPeers(resp.Peers))
|
||||||
|
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -76,6 +79,7 @@ func formatPeers(peers []*proto.Peer) string {
|
||||||
|
|
||||||
rows := make([]string, len(peers)+1)
|
rows := make([]string, len(peers)+1)
|
||||||
rows[0] = "ID|Enode|Name|Caps|Static|Trusted"
|
rows[0] = "ID|Enode|Name|Caps|Static|Trusted"
|
||||||
|
|
||||||
for i, d := range peers {
|
for i, d := range peers {
|
||||||
enode := strings.TrimPrefix(d.Enode, "enode://")
|
enode := strings.TrimPrefix(d.Enode, "enode://")
|
||||||
|
|
||||||
|
|
@ -87,5 +91,6 @@ func formatPeers(peers []*proto.Peer) string {
|
||||||
d.Static,
|
d.Static,
|
||||||
d.Trusted)
|
d.Trusted)
|
||||||
}
|
}
|
||||||
|
|
||||||
return formatList(rows)
|
return formatList(rows)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -22,6 +22,7 @@ func (p *PeersRemoveCommand) MarkDown() string {
|
||||||
"The ```peers remove <enode>``` command disconnects the local client from a connected peer if exists.",
|
"The ```peers remove <enode>``` command disconnects the local client from a connected peer if exists.",
|
||||||
p.Flags().MarkDown(),
|
p.Flags().MarkDown(),
|
||||||
}
|
}
|
||||||
|
|
||||||
return strings.Join(items, "\n\n")
|
return strings.Join(items, "\n\n")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -79,5 +80,6 @@ func (c *PeersRemoveCommand) Run(args []string) int {
|
||||||
c.UI.Error(err.Error())
|
c.UI.Error(err.Error())
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,7 @@ func (p *PeersStatusCommand) MarkDown() string {
|
||||||
"The ```peers status <peer id>``` command displays the status of a peer by its id.",
|
"The ```peers status <peer id>``` command displays the status of a peer by its id.",
|
||||||
p.Flags().MarkDown(),
|
p.Flags().MarkDown(),
|
||||||
}
|
}
|
||||||
|
|
||||||
return strings.Join(items, "\n\n")
|
return strings.Join(items, "\n\n")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -68,12 +69,14 @@ func (c *PeersStatusCommand) Run(args []string) int {
|
||||||
Enode: args[0],
|
Enode: args[0],
|
||||||
}
|
}
|
||||||
resp, err := borClt.PeersStatus(context.Background(), req)
|
resp, err := borClt.PeersStatus(context.Background(), req)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.UI.Error(err.Error())
|
c.UI.Error(err.Error())
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
c.UI.Output(formatPeer(resp.Peer))
|
c.UI.Output(formatPeer(resp.Peer))
|
||||||
|
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -87,5 +90,6 @@ func formatPeer(peer *proto.Peer) string {
|
||||||
fmt.Sprintf("Static|%v", peer.Static),
|
fmt.Sprintf("Static|%v", peer.Static),
|
||||||
fmt.Sprintf("Trusted|%v", peer.Trusted),
|
fmt.Sprintf("Trusted|%v", peer.Trusted),
|
||||||
})
|
})
|
||||||
|
|
||||||
return base
|
return base
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,7 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/internal/cli/server/proto"
|
"github.com/ethereum/go-ethereum/internal/cli/server/proto"
|
||||||
|
|
||||||
"github.com/golang/protobuf/ptypes/empty"
|
"github.com/golang/protobuf/ptypes/empty"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -20,6 +21,7 @@ func (p *StatusCommand) MarkDown() string {
|
||||||
"# Status",
|
"# Status",
|
||||||
"The ```status``` command outputs the status of the client.",
|
"The ```status``` command outputs the status of the client.",
|
||||||
}
|
}
|
||||||
|
|
||||||
return strings.Join(items, "\n\n")
|
return strings.Join(items, "\n\n")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -56,6 +58,7 @@ func (c *StatusCommand) Run(args []string) int {
|
||||||
}
|
}
|
||||||
|
|
||||||
c.UI.Output(printStatus(status))
|
c.UI.Output(printStatus(status))
|
||||||
|
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -69,6 +72,7 @@ func printStatus(status *proto.StatusResponse) string {
|
||||||
|
|
||||||
forks := make([]string, len(status.Forks)+1)
|
forks := make([]string, len(status.Forks)+1)
|
||||||
forks[0] = "Name|Block|Enabled"
|
forks[0] = "Name|Block|Enabled"
|
||||||
|
|
||||||
for i, d := range status.Forks {
|
for i, d := range status.Forks {
|
||||||
forks[i+1] = fmt.Sprintf("%s|%d|%v", d.Name, d.Block, !d.Disabled)
|
forks[i+1] = fmt.Sprintf("%s|%d|%v", d.Name, d.Block, !d.Disabled)
|
||||||
}
|
}
|
||||||
|
|
@ -92,5 +96,6 @@ func printStatus(status *proto.StatusResponse) string {
|
||||||
"\nForks",
|
"\nForks",
|
||||||
formatList(forks),
|
formatList(forks),
|
||||||
}
|
}
|
||||||
|
|
||||||
return strings.Join(full, "\n")
|
return strings.Join(full, "\n")
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/params"
|
"github.com/ethereum/go-ethereum/params"
|
||||||
|
|
||||||
"github.com/mitchellh/cli"
|
"github.com/mitchellh/cli"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -27,6 +28,7 @@ func (d *VersionCommand) MarkDown() string {
|
||||||
"The ```bor version``` command outputs the version of the binary.",
|
"The ```bor version``` command outputs the version of the binary.",
|
||||||
}
|
}
|
||||||
items = append(items, examples...)
|
items = append(items, examples...)
|
||||||
|
|
||||||
return strings.Join(items, "\n\n")
|
return strings.Join(items, "\n\n")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue