github.com/kaisenlinux/docker.io@v0.0.0-20230510090727-ea55db55fac7/swarmkit/cmd/swarm-rafttool/main.go (about) 1 package main 2 3 import ( 4 "errors" 5 "fmt" 6 "os" 7 8 "github.com/docker/swarmkit/cmd/swarmd/defaults" 9 "github.com/spf13/cobra" 10 ) 11 12 var ( 13 mainCmd = &cobra.Command{ 14 Use: os.Args[0], 15 Short: "Tool to translate and decrypt the raft logs of a swarm manager", 16 } 17 18 decryptCmd = &cobra.Command{ 19 Use: "decrypt <output directory>", 20 Short: "Decrypt a swarm manager's raft logs to an optional directory", 21 RunE: func(cmd *cobra.Command, args []string) error { 22 if len(args) > 0 { 23 return fmt.Errorf("%s command does not take any arguments", os.Args[0]) 24 } 25 26 outDir, err := cmd.Flags().GetString("output-dir") 27 if err != nil { 28 return err 29 } 30 31 stateDir, err := cmd.Flags().GetString("state-dir") 32 if err != nil { 33 return err 34 } 35 36 unlockKey, err := cmd.Flags().GetString("unlock-key") 37 if err != nil { 38 return err 39 } 40 41 return decryptRaftData(stateDir, outDir, unlockKey) 42 }, 43 } 44 45 dumpWALCmd = &cobra.Command{ 46 Use: "dump-wal", 47 Short: "Display entries from the Raft log", 48 RunE: func(cmd *cobra.Command, args []string) error { 49 stateDir, err := cmd.Flags().GetString("state-dir") 50 if err != nil { 51 return err 52 } 53 54 unlockKey, err := cmd.Flags().GetString("unlock-key") 55 if err != nil { 56 return err 57 } 58 59 start, err := cmd.Flags().GetUint64("start") 60 if err != nil { 61 return err 62 } 63 64 end, err := cmd.Flags().GetUint64("end") 65 if err != nil { 66 return err 67 } 68 69 redact, err := cmd.Flags().GetBool("redact") 70 if err != nil { 71 return err 72 } 73 74 return dumpWAL(stateDir, unlockKey, start, end, redact) 75 }, 76 } 77 78 dumpSnapshotCmd = &cobra.Command{ 79 Use: "dump-snapshot", 80 Short: "Display entries from the latest Raft snapshot", 81 RunE: func(cmd *cobra.Command, args []string) error { 82 stateDir, err := cmd.Flags().GetString("state-dir") 83 if err != nil { 84 return err 85 } 86 87 unlockKey, err := cmd.Flags().GetString("unlock-key") 88 if err != nil { 89 return err 90 } 91 92 redact, err := cmd.Flags().GetBool("redact") 93 if err != nil { 94 return err 95 } 96 97 return dumpSnapshot(stateDir, unlockKey, redact) 98 }, 99 } 100 101 dumpObjectCmd = &cobra.Command{ 102 Use: "dump-object [type]", 103 Short: "Display an object from the Raft snapshot/WAL", 104 RunE: func(cmd *cobra.Command, args []string) error { 105 if len(args) != 1 { 106 return errors.New("dump-object subcommand takes exactly 1 argument") 107 } 108 109 stateDir, err := cmd.Flags().GetString("state-dir") 110 if err != nil { 111 return err 112 } 113 114 unlockKey, err := cmd.Flags().GetString("unlock-key") 115 if err != nil { 116 return err 117 } 118 119 selector := objSelector{all: true} 120 121 id, err := cmd.Flags().GetString("id") 122 if err != nil { 123 return err 124 } 125 if id != "" { 126 selector.id = id 127 selector.all = false 128 } 129 130 name, err := cmd.Flags().GetString("name") 131 if err != nil { 132 return err 133 } 134 if name != "" { 135 selector.name = name 136 selector.all = false 137 } 138 139 return dumpObject(stateDir, unlockKey, args[0], selector) 140 }, 141 } 142 143 downgradeKeyCmd = &cobra.Command{ 144 Use: "downgrade-key", 145 Short: "Downgrade swarm node key from PKCS8 to PKCS1", 146 RunE: func(cmd *cobra.Command, args []string) error { 147 stateDir, err := cmd.Flags().GetString("state-dir") 148 if err != nil { 149 return err 150 } 151 152 unlockKey, err := cmd.Flags().GetString("unlock-key") 153 if err != nil { 154 return err 155 } 156 157 return downgradeKey(stateDir, unlockKey) 158 }, 159 } 160 ) 161 162 func init() { 163 mainCmd.PersistentFlags().StringP("state-dir", "d", defaults.StateDir, "State directory") 164 mainCmd.PersistentFlags().String("unlock-key", "", "Unlock key, if raft logs are encrypted") 165 decryptCmd.Flags().StringP("output-dir", "o", "plaintext_raft", "Output directory for decrypted raft logs") 166 mainCmd.AddCommand( 167 decryptCmd, 168 dumpWALCmd, 169 dumpSnapshotCmd, 170 dumpObjectCmd, 171 downgradeKeyCmd, 172 ) 173 174 dumpSnapshotCmd.Flags().Bool("redact", false, "Redact the values of secrets, configs, and environment variables") 175 176 dumpWALCmd.Flags().Uint64("start", 0, "Start of index range to dump") 177 dumpWALCmd.Flags().Uint64("end", 0, "End of index range to dump") 178 dumpWALCmd.Flags().Bool("redact", false, "Redact the values of secrets, configs, and environment variables") 179 180 dumpObjectCmd.Flags().String("id", "", "Look up object by ID") 181 dumpObjectCmd.Flags().String("name", "", "Look up object by name") 182 } 183 184 func main() { 185 if _, err := mainCmd.ExecuteC(); err != nil { 186 os.Exit(-1) 187 } 188 }