From fe41bd6fe854248d9937ba24e58baeaf672cf94e Mon Sep 17 00:00:00 2001 From: Taylor Gerring Date: Mon, 18 May 2015 10:54:15 -0500 Subject: [PATCH 1/4] Add "removedb" command to Geth Removes the state and blockchain databases --- cmd/geth/main.go | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/cmd/geth/main.go b/cmd/geth/main.go index b0970212e..b10347781 100644 --- a/cmd/geth/main.go +++ b/cmd/geth/main.go @@ -230,6 +230,11 @@ JavaScript API. See https://github.com/ethereum/go-ethereum/wiki/Javascipt-Conso Name: "upgradedb", Usage: "upgrade chainblock database", }, + { + Action: removeDb, + Name: "removedb", + Usage: "Remove blockchain and state databases", + }, } app.Flags = []cli.Flag{ utils.IdentityFlag, @@ -543,6 +548,16 @@ func exportchain(ctx *cli.Context) { return } +func removeDb(ctx *cli.Context) { + fmt.Println("Removing chain and state databases...") + start := time.Now() + + os.RemoveAll(filepath.Join(ctx.GlobalString(utils.DataDirFlag.Name), "blockchain")) + os.RemoveAll(filepath.Join(ctx.GlobalString(utils.DataDirFlag.Name), "state")) + + fmt.Printf("Removed in %v\n", time.Since(start)) +} + func upgradeDb(ctx *cli.Context) { fmt.Println("Upgrade blockchain DB") From 36a4ba32485fb6605ea23f03896ae8d7c4cc44ae Mon Sep 17 00:00:00 2001 From: Taylor Gerring Date: Mon, 18 May 2015 12:04:35 -0500 Subject: [PATCH 2/4] Add user confirmation for removedb --- cmd/geth/main.go | 45 ++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 40 insertions(+), 5 deletions(-) diff --git a/cmd/geth/main.go b/cmd/geth/main.go index b10347781..7db175eb9 100644 --- a/cmd/geth/main.go +++ b/cmd/geth/main.go @@ -549,13 +549,22 @@ func exportchain(ctx *cli.Context) { } func removeDb(ctx *cli.Context) { - fmt.Println("Removing chain and state databases...") - start := time.Now() + confirm, err := readConfirm("Remove local databases?") + if err != nil { + utils.Fatalf("%v", err) + } - os.RemoveAll(filepath.Join(ctx.GlobalString(utils.DataDirFlag.Name), "blockchain")) - os.RemoveAll(filepath.Join(ctx.GlobalString(utils.DataDirFlag.Name), "state")) + if confirm { + fmt.Println("Removing chain and state databases...") + start := time.Now() - fmt.Printf("Removed in %v\n", time.Since(start)) + os.RemoveAll(filepath.Join(ctx.GlobalString(utils.DataDirFlag.Name), "blockchain")) + os.RemoveAll(filepath.Join(ctx.GlobalString(utils.DataDirFlag.Name), "state")) + + fmt.Printf("Removed in %v\n", time.Since(start)) + } else { + fmt.Println("Operation aborted") + } } func upgradeDb(ctx *cli.Context) { @@ -682,6 +691,32 @@ func hashish(x string) bool { return err != nil } +func readConfirm(prompt string) (bool, error) { + var ( + input string + err error + ) + prompt = prompt + " [y/N] " + + if liner.TerminalSupported() { + lr := liner.NewLiner() + defer lr.Close() + input, err = lr.Prompt(prompt) + } else { + fmt.Print(prompt) + input, err = bufio.NewReader(os.Stdin).ReadString('\n') + fmt.Println() + } + + if len(input) > 0 && strings.ToUpper(input[:1]) == "Y" { + return true, nil + } else { + return false, nil + } + + return false, err +} + func readPassword(prompt string, warnTerm bool) (string, error) { if liner.TerminalSupported() { lr := liner.NewLiner() From f14feea43683fee58e26a48a51145e72d3ae7ad8 Mon Sep 17 00:00:00 2001 From: Taylor Gerring Date: Mon, 18 May 2015 12:24:30 -0500 Subject: [PATCH 3/4] Refactor user prompts into utils --- cmd/geth/admin.go | 6 +++--- cmd/geth/main.go | 49 +++-------------------------------------------- cmd/utils/cmd.go | 44 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 50 insertions(+), 49 deletions(-) diff --git a/cmd/geth/admin.go b/cmd/geth/admin.go index ebdf3512a..53dd0e6ad 100644 --- a/cmd/geth/admin.go +++ b/cmd/geth/admin.go @@ -383,7 +383,7 @@ func (js *jsre) unlock(call otto.FunctionCall) otto.Value { var passphrase string if arg.IsUndefined() { fmt.Println("Please enter a passphrase now.") - passphrase, err = readPassword("Passphrase: ", true) + passphrase, err = utils.PromptPassword("Passphrase: ", true) if err != nil { fmt.Println(err) return otto.FalseValue() @@ -410,12 +410,12 @@ func (js *jsre) newAccount(call otto.FunctionCall) otto.Value { if arg.IsUndefined() { fmt.Println("The new account will be encrypted with a passphrase.") fmt.Println("Please enter a passphrase now.") - auth, err := readPassword("Passphrase: ", true) + auth, err := utils.PromptPassword("Passphrase: ", true) if err != nil { fmt.Println(err) return otto.FalseValue() } - confirm, err := readPassword("Repeat Passphrase: ", false) + confirm, err := utils.PromptPassword("Repeat Passphrase: ", false) if err != nil { fmt.Println(err) return otto.FalseValue() diff --git a/cmd/geth/main.go b/cmd/geth/main.go index 7db175eb9..df0af3e79 100644 --- a/cmd/geth/main.go +++ b/cmd/geth/main.go @@ -21,7 +21,6 @@ package main import ( - "bufio" "fmt" "io" "io/ioutil" @@ -44,7 +43,6 @@ import ( "github.com/ethereum/go-ethereum/logger" "github.com/mattn/go-colorable" "github.com/mattn/go-isatty" - "github.com/peterh/liner" ) import _ "net/http/pprof" @@ -426,12 +424,12 @@ func getPassPhrase(ctx *cli.Context, desc string, confirmation bool) (passphrase passfile := ctx.GlobalString(utils.PasswordFileFlag.Name) if len(passfile) == 0 { fmt.Println(desc) - auth, err := readPassword("Passphrase: ", true) + auth, err := utils.PromptPassword("Passphrase: ", true) if err != nil { utils.Fatalf("%v", err) } if confirmation { - confirm, err := readPassword("Repeat Passphrase: ", false) + confirm, err := utils.PromptPassword("Repeat Passphrase: ", false) if err != nil { utils.Fatalf("%v", err) } @@ -549,7 +547,7 @@ func exportchain(ctx *cli.Context) { } func removeDb(ctx *cli.Context) { - confirm, err := readConfirm("Remove local databases?") + confirm, err := utils.PromptConfirm("Remove local databases?") if err != nil { utils.Fatalf("%v", err) } @@ -690,44 +688,3 @@ func hashish(x string) bool { _, err := strconv.Atoi(x) return err != nil } - -func readConfirm(prompt string) (bool, error) { - var ( - input string - err error - ) - prompt = prompt + " [y/N] " - - if liner.TerminalSupported() { - lr := liner.NewLiner() - defer lr.Close() - input, err = lr.Prompt(prompt) - } else { - fmt.Print(prompt) - input, err = bufio.NewReader(os.Stdin).ReadString('\n') - fmt.Println() - } - - if len(input) > 0 && strings.ToUpper(input[:1]) == "Y" { - return true, nil - } else { - return false, nil - } - - return false, err -} - -func readPassword(prompt string, warnTerm bool) (string, error) { - if liner.TerminalSupported() { - lr := liner.NewLiner() - defer lr.Close() - return lr.PasswordPrompt(prompt) - } - if warnTerm { - fmt.Println("!! Unsupported terminal, password will be echoed.") - } - fmt.Print(prompt) - input, err := bufio.NewReader(os.Stdin).ReadString('\n') - fmt.Println() - return input, err -} diff --git a/cmd/utils/cmd.go b/cmd/utils/cmd.go index fb55a64af..62d350066 100644 --- a/cmd/utils/cmd.go +++ b/cmd/utils/cmd.go @@ -22,11 +22,13 @@ package utils import ( + "bufio" "fmt" "io" "os" "os/signal" "regexp" + "strings" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" @@ -35,6 +37,7 @@ import ( "github.com/ethereum/go-ethereum/logger" "github.com/ethereum/go-ethereum/logger/glog" "github.com/ethereum/go-ethereum/rlp" + "github.com/peterh/liner" ) var interruptCallbacks = []func(os.Signal){} @@ -85,6 +88,47 @@ func confirm(message string) bool { return r == "y" } +func PromptConfirm(prompt string) (bool, error) { + var ( + input string + err error + ) + prompt = prompt + " [y/N] " + + if liner.TerminalSupported() { + lr := liner.NewLiner() + defer lr.Close() + input, err = lr.Prompt(prompt) + } else { + fmt.Print(prompt) + input, err = bufio.NewReader(os.Stdin).ReadString('\n') + fmt.Println() + } + + if len(input) > 0 && strings.ToUpper(input[:1]) == "Y" { + return true, nil + } else { + return false, nil + } + + return false, err +} + +func PromptPassword(prompt string, warnTerm bool) (string, error) { + if liner.TerminalSupported() { + lr := liner.NewLiner() + defer lr.Close() + return lr.PasswordPrompt(prompt) + } + if warnTerm { + fmt.Println("!! Unsupported terminal, password will be echoed.") + } + fmt.Print(prompt) + input, err := bufio.NewReader(os.Stdin).ReadString('\n') + fmt.Println() + return input, err +} + func initDataDir(Datadir string) { _, err := os.Stat(Datadir) if err != nil { From 0864f1fc8e281bdfd87daaa24881f9f96d6bd10c Mon Sep 17 00:00:00 2001 From: Taylor Gerring Date: Mon, 18 May 2015 12:25:33 -0500 Subject: [PATCH 4/4] Remove unused confirm() method --- cmd/utils/cmd.go | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/cmd/utils/cmd.go b/cmd/utils/cmd.go index 62d350066..39b4e46da 100644 --- a/cmd/utils/cmd.go +++ b/cmd/utils/cmd.go @@ -74,20 +74,6 @@ func openLogFile(Datadir string, filename string) *os.File { return file } -func confirm(message string) bool { - fmt.Println(message, "Are you sure? (y/n)") - var r string - fmt.Scanln(&r) - for ; ; fmt.Scanln(&r) { - if r == "n" || r == "y" { - break - } else { - fmt.Printf("Yes or no? (%s)", r) - } - } - return r == "y" -} - func PromptConfirm(prompt string) (bool, error) { var ( input string