You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

168 lines
5.1 KiB

8 years ago
  1. package commands
  2. import (
  3. "os"
  4. "path/filepath"
  5. "github.com/spf13/cobra"
  6. "github.com/tendermint/tendermint/config"
  7. "github.com/tendermint/tendermint/libs/log"
  8. tmos "github.com/tendermint/tendermint/libs/os"
  9. "github.com/tendermint/tendermint/privval"
  10. "github.com/tendermint/tendermint/types"
  11. )
  12. // MakeResetAllCommand constructs a command that removes the database of
  13. // the specified Tendermint core instance.
  14. func MakeResetAllCommand(conf *config.Config, logger log.Logger) *cobra.Command {
  15. var keyType string
  16. cmd := &cobra.Command{
  17. Use: "unsafe-reset-all",
  18. Short: "(unsafe) Remove all the data and WAL, reset this node's validator to genesis state",
  19. RunE: func(cmd *cobra.Command, args []string) error {
  20. return resetAll(conf.DBDir(), conf.PrivValidator.KeyFile(),
  21. conf.PrivValidator.StateFile(), logger, keyType)
  22. },
  23. }
  24. cmd.Flags().StringVar(&keyType, "key", types.ABCIPubKeyTypeEd25519,
  25. "Key type to generate privval file with. Options: ed25519, secp256k1")
  26. return cmd
  27. }
  28. // MakeResetStateCommand constructs a command that removes the database of
  29. // the specified Tendermint core instance.
  30. func MakeResetStateCommand(conf *config.Config, logger log.Logger) *cobra.Command {
  31. var keyType string
  32. return &cobra.Command{
  33. Use: "reset-state",
  34. Short: "Remove all the data and WAL",
  35. RunE: func(cmd *cobra.Command, args []string) error {
  36. return resetState(conf.DBDir(), logger, keyType)
  37. },
  38. }
  39. }
  40. func MakeResetPrivateValidatorCommand(conf *config.Config, logger log.Logger) *cobra.Command {
  41. var keyType string
  42. cmd := &cobra.Command{
  43. Use: "unsafe-reset-priv-validator",
  44. Short: "(unsafe) Reset this node's validator to genesis state",
  45. RunE: func(cmd *cobra.Command, args []string) error {
  46. return resetFilePV(conf.PrivValidator.KeyFile(), conf.PrivValidator.StateFile(), logger, keyType)
  47. },
  48. }
  49. cmd.Flags().StringVar(&keyType, "key", types.ABCIPubKeyTypeEd25519,
  50. "Key type to generate privval file with. Options: ed25519, secp256k1")
  51. return cmd
  52. }
  53. // XXX: this is totally unsafe.
  54. // it's only suitable for testnets.
  55. // XXX: this is totally unsafe.
  56. // it's only suitable for testnets.
  57. // resetAll removes address book files plus all data, and resets the privValdiator data.
  58. func resetAll(dbDir, privValKeyFile, privValStateFile string, logger log.Logger, keyType string) error {
  59. if err := os.RemoveAll(dbDir); err == nil {
  60. logger.Info("Removed all blockchain history", "dir", dbDir)
  61. } else {
  62. logger.Error("error removing all blockchain history", "dir", dbDir, "err", err)
  63. }
  64. return resetFilePV(privValKeyFile, privValStateFile, logger, keyType)
  65. }
  66. // resetState removes address book files plus all databases.
  67. func resetState(dbDir string, logger log.Logger, keyType string) error {
  68. blockdb := filepath.Join(dbDir, "blockstore.db")
  69. state := filepath.Join(dbDir, "state.db")
  70. wal := filepath.Join(dbDir, "cs.wal")
  71. evidence := filepath.Join(dbDir, "evidence.db")
  72. txIndex := filepath.Join(dbDir, "tx_index.db")
  73. peerstore := filepath.Join(dbDir, "peerstore.db")
  74. if tmos.FileExists(blockdb) {
  75. if err := os.RemoveAll(blockdb); err == nil {
  76. logger.Info("Removed all blockstore.db", "dir", blockdb)
  77. } else {
  78. logger.Error("error removing all blockstore.db", "dir", blockdb, "err", err)
  79. }
  80. }
  81. if tmos.FileExists(state) {
  82. if err := os.RemoveAll(state); err == nil {
  83. logger.Info("Removed all state.db", "dir", state)
  84. } else {
  85. logger.Error("error removing all state.db", "dir", state, "err", err)
  86. }
  87. }
  88. if tmos.FileExists(wal) {
  89. if err := os.RemoveAll(wal); err == nil {
  90. logger.Info("Removed all cs.wal", "dir", wal)
  91. } else {
  92. logger.Error("error removing all cs.wal", "dir", wal, "err", err)
  93. }
  94. }
  95. if tmos.FileExists(evidence) {
  96. if err := os.RemoveAll(evidence); err == nil {
  97. logger.Info("Removed all evidence.db", "dir", evidence)
  98. } else {
  99. logger.Error("error removing all evidence.db", "dir", evidence, "err", err)
  100. }
  101. }
  102. if tmos.FileExists(txIndex) {
  103. if err := os.RemoveAll(txIndex); err == nil {
  104. logger.Info("Removed tx_index.db", "dir", txIndex)
  105. } else {
  106. logger.Error("error removing tx_index.db", "dir", txIndex, "err", err)
  107. }
  108. }
  109. if tmos.FileExists(peerstore) {
  110. if err := os.RemoveAll(peerstore); err == nil {
  111. logger.Info("Removed peerstore.db", "dir", peerstore)
  112. } else {
  113. logger.Error("error removing peerstore.db", "dir", peerstore, "err", err)
  114. }
  115. }
  116. if err := tmos.EnsureDir(dbDir, 0700); err != nil {
  117. logger.Error("unable to recreate dbDir", "err", err)
  118. }
  119. return nil
  120. }
  121. func resetFilePV(privValKeyFile, privValStateFile string, logger log.Logger, keyType string) error {
  122. if _, err := os.Stat(privValKeyFile); err == nil {
  123. pv, err := privval.LoadFilePVEmptyState(privValKeyFile, privValStateFile)
  124. if err != nil {
  125. return err
  126. }
  127. if err := pv.Reset(); err != nil {
  128. return err
  129. }
  130. logger.Info("Reset private validator file to genesis state", "keyFile", privValKeyFile,
  131. "stateFile", privValStateFile)
  132. } else {
  133. pv, err := privval.GenFilePV(privValKeyFile, privValStateFile, keyType)
  134. if err != nil {
  135. return err
  136. }
  137. if err := pv.Save(); err != nil {
  138. return err
  139. }
  140. logger.Info("Generated private validator file", "keyFile", privValKeyFile,
  141. "stateFile", privValStateFile)
  142. }
  143. return nil
  144. }