github.com/prysmaticlabs/prysm@v1.4.4/beacon-chain/db/restore.go (about)

     1  package db
     2  
     3  import (
     4  	"os"
     5  	"path"
     6  	"strings"
     7  
     8  	"github.com/pkg/errors"
     9  	"github.com/prysmaticlabs/prysm/beacon-chain/db/kv"
    10  	"github.com/prysmaticlabs/prysm/shared/cmd"
    11  	"github.com/prysmaticlabs/prysm/shared/fileutil"
    12  	"github.com/prysmaticlabs/prysm/shared/promptutil"
    13  	"github.com/urfave/cli/v2"
    14  )
    15  
    16  const dbExistsYesNoPrompt = "A database file already exists in the target directory. " +
    17  	"Are you sure that you want to overwrite it? [y/n]"
    18  
    19  // Restore a beacon chain database.
    20  func Restore(cliCtx *cli.Context) error {
    21  	sourceFile := cliCtx.String(cmd.RestoreSourceFileFlag.Name)
    22  	targetDir := cliCtx.String(cmd.RestoreTargetDirFlag.Name)
    23  
    24  	restoreDir := path.Join(targetDir, kv.BeaconNodeDbDirName)
    25  	if fileutil.FileExists(path.Join(restoreDir, kv.DatabaseFileName)) {
    26  		resp, err := promptutil.ValidatePrompt(
    27  			os.Stdin, dbExistsYesNoPrompt, promptutil.ValidateYesOrNo,
    28  		)
    29  		if err != nil {
    30  			return errors.Wrap(err, "could not validate choice")
    31  		}
    32  		if strings.EqualFold(resp, "n") {
    33  			log.Info("Restore aborted")
    34  			return nil
    35  		}
    36  	}
    37  	if err := fileutil.MkdirAll(restoreDir); err != nil {
    38  		return err
    39  	}
    40  	if err := fileutil.CopyFile(sourceFile, path.Join(restoreDir, kv.DatabaseFileName)); err != nil {
    41  		return err
    42  	}
    43  
    44  	log.Info("Restore completed successfully")
    45  	return nil
    46  }