From 29ab1fa8a50db8aa16c5d707f1cab7dc201a4053 Mon Sep 17 00:00:00 2001
From: Jeffrey Wilcke <geffobscura@gmail.com>
Date: Wed, 1 Jul 2015 00:52:44 +0200
Subject: core, cmd/geth: recover by number

---
 cmd/geth/main.go | 24 ++++++++++++++++++++++++
 1 file changed, 24 insertions(+)

(limited to 'cmd')

diff --git a/cmd/geth/main.go b/cmd/geth/main.go
index c46343a60..a7d3a73ef 100644
--- a/cmd/geth/main.go
+++ b/cmd/geth/main.go
@@ -39,6 +39,7 @@ import (
 	"github.com/ethereum/go-ethereum/common"
 	"github.com/ethereum/go-ethereum/eth"
 	"github.com/ethereum/go-ethereum/logger"
+	"github.com/ethereum/go-ethereum/logger/glog"
 	"github.com/ethereum/go-ethereum/metrics"
 	"github.com/ethereum/go-ethereum/rpc/codec"
 	"github.com/ethereum/go-ethereum/rpc/comms"
@@ -68,6 +69,15 @@ func init() {
 	app.Action = run
 	app.HideVersion = true // we have a command to print the version
 	app.Commands = []cli.Command{
+		{
+			Action: blockRecovery,
+			Name:   "recover",
+			Usage:  "attempts to recover a corrupted database by setting a new block head by number",
+			Description: `
+The recover commands will attempt to read out the last
+block based on that.
+`,
+		},
 		blocktestCommand,
 		importCommand,
 		exportCommand,
@@ -439,6 +449,20 @@ func unlockAccount(ctx *cli.Context, am *accounts.Manager, account string) (pass
 	return
 }
 
+func blockRecovery(ctx *cli.Context) {
+	num := ctx.Args().First()
+	if len(ctx.Args()) < 1 {
+		glog.Fatal("recover requires block number")
+	}
+
+	cfg := utils.MakeEthConfig(ClientIdentifier, nodeNameVersion, ctx)
+	ethereum, err := eth.New(cfg)
+	if err != nil {
+		utils.Fatalf("%v", err)
+	}
+	ethereum.ChainManager().Recover(common.String2Big(num).Uint64())
+}
+
 func startEth(ctx *cli.Context, eth *eth.Ethereum) {
 	// Start Ethereum itself
 
-- 
cgit v1.2.3