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 }