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  }