main.go 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. package main
  2. import (
  3. "github.com/crowdsecurity/crowdsec/pkg/csconfig"
  4. "github.com/crowdsecurity/crowdsec/pkg/cwhub"
  5. "github.com/crowdsecurity/crowdsec/pkg/cwversion"
  6. "github.com/crowdsecurity/crowdsec/pkg/database"
  7. log "github.com/sirupsen/logrus"
  8. "github.com/spf13/cobra"
  9. "github.com/spf13/cobra/doc"
  10. )
  11. var trace_lvl, dbg_lvl, nfo_lvl, wrn_lvl, err_lvl bool
  12. var ConfigFilePath string
  13. var csConfig *csconfig.Config
  14. var dbClient *database.Client
  15. var OutputFormat string
  16. var downloadOnly bool
  17. var forceAction bool
  18. var purge bool
  19. var all bool
  20. var restoreOldBackup bool
  21. var prometheusURL string
  22. func initConfig() {
  23. var err error
  24. if trace_lvl {
  25. log.SetLevel(log.TraceLevel)
  26. } else if dbg_lvl {
  27. log.SetLevel(log.DebugLevel)
  28. } else if nfo_lvl {
  29. log.SetLevel(log.InfoLevel)
  30. } else if wrn_lvl {
  31. log.SetLevel(log.WarnLevel)
  32. } else if err_lvl {
  33. log.SetLevel(log.ErrorLevel)
  34. }
  35. logFormatter := &log.TextFormatter{TimestampFormat: "02-01-2006 03:04:05 PM", FullTimestamp: true}
  36. log.SetFormatter(logFormatter)
  37. csConfig, err = csconfig.NewConfig(ConfigFilePath, false, false)
  38. if err != nil {
  39. log.Fatalf(err.Error())
  40. }
  41. log.Debugf("Using %s as configuration file", ConfigFilePath)
  42. if err := csConfig.LoadCSCLI(); err != nil {
  43. log.Fatalf(err.Error())
  44. }
  45. if csConfig.Cscli == nil {
  46. log.Fatalf("missing 'cscli' configuration in '%s', exiting", ConfigFilePath)
  47. }
  48. if cwhub.HubBranch == "" && csConfig.Cscli.HubBranch != "" {
  49. cwhub.HubBranch = csConfig.Cscli.HubBranch
  50. }
  51. if OutputFormat != "" {
  52. csConfig.Cscli.Output = OutputFormat
  53. if OutputFormat != "json" && OutputFormat != "raw" && OutputFormat != "human" {
  54. log.Fatalf("output format %s unknown", OutputFormat)
  55. }
  56. }
  57. if csConfig.Cscli.Output == "" {
  58. csConfig.Cscli.Output = "human"
  59. }
  60. if csConfig.Cscli.Output == "json" {
  61. log.SetFormatter(&log.JSONFormatter{})
  62. log.SetLevel(log.ErrorLevel)
  63. } else if csConfig.Cscli.Output == "raw" {
  64. log.SetLevel(log.ErrorLevel)
  65. }
  66. }
  67. var validArgs = []string{
  68. "scenarios", "parsers", "collections", "capi", "lapi", "postoverflows", "machines",
  69. "metrics", "bouncers", "alerts", "decisions", "simulation", "hub", "dashboard",
  70. "config", "completion", "version", "console",
  71. }
  72. func main() {
  73. var rootCmd = &cobra.Command{
  74. Use: "cscli",
  75. Short: "cscli allows you to manage crowdsec",
  76. Long: `cscli is the main command to interact with your crowdsec service, scenarios & db.
  77. It is meant to allow you to manage bans, parsers/scenarios/etc, api and generally manage you crowdsec setup.`,
  78. ValidArgs: validArgs,
  79. /*TBD examples*/
  80. }
  81. var cmdDocGen = &cobra.Command{
  82. Use: "doc",
  83. Short: "Generate the documentation in `./doc/`. Directory must exist.",
  84. Args: cobra.ExactArgs(0),
  85. Hidden: true,
  86. Run: func(cmd *cobra.Command, args []string) {
  87. if err := doc.GenMarkdownTree(rootCmd, "./doc/"); err != nil {
  88. log.Fatalf("Failed to generate cobra doc: %s", err.Error())
  89. }
  90. },
  91. }
  92. rootCmd.AddCommand(cmdDocGen)
  93. /*usage*/
  94. var cmdVersion = &cobra.Command{
  95. Use: "version",
  96. Short: "Display version and exit.",
  97. Args: cobra.ExactArgs(0),
  98. Run: func(cmd *cobra.Command, args []string) {
  99. cwversion.Show()
  100. },
  101. }
  102. rootCmd.AddCommand(cmdVersion)
  103. rootCmd.PersistentFlags().StringVarP(&ConfigFilePath, "config", "c", "/etc/crowdsec/config.yaml", "path to crowdsec config file")
  104. rootCmd.PersistentFlags().StringVarP(&OutputFormat, "output", "o", "", "Output format : human, json, raw.")
  105. rootCmd.PersistentFlags().BoolVar(&dbg_lvl, "debug", false, "Set logging to debug.")
  106. rootCmd.PersistentFlags().BoolVar(&nfo_lvl, "info", false, "Set logging to info.")
  107. rootCmd.PersistentFlags().BoolVar(&wrn_lvl, "warning", false, "Set logging to warning.")
  108. rootCmd.PersistentFlags().BoolVar(&err_lvl, "error", false, "Set logging to error.")
  109. rootCmd.PersistentFlags().BoolVar(&trace_lvl, "trace", false, "Set logging to trace.")
  110. rootCmd.PersistentFlags().StringVar(&cwhub.HubBranch, "branch", "", "Override hub branch on github")
  111. if err := rootCmd.PersistentFlags().MarkHidden("branch"); err != nil {
  112. log.Fatalf("failed to make branch hidden : %s", err)
  113. }
  114. cobra.OnInitialize(initConfig)
  115. /*don't sort flags so we can enforce order*/
  116. rootCmd.Flags().SortFlags = false
  117. rootCmd.PersistentFlags().SortFlags = false
  118. rootCmd.AddCommand(NewConfigCmd())
  119. rootCmd.AddCommand(NewHubCmd())
  120. rootCmd.AddCommand(NewMetricsCmd())
  121. rootCmd.AddCommand(NewDashboardCmd())
  122. rootCmd.AddCommand(NewDecisionsCmd())
  123. rootCmd.AddCommand(NewAlertsCmd())
  124. // rootCmd.AddCommand(NewInspectCmd())
  125. rootCmd.AddCommand(NewSimulationCmds())
  126. rootCmd.AddCommand(NewBouncersCmd())
  127. rootCmd.AddCommand(NewMachinesCmd())
  128. rootCmd.AddCommand(NewParsersCmd())
  129. rootCmd.AddCommand(NewScenariosCmd())
  130. rootCmd.AddCommand(NewCollectionsCmd())
  131. rootCmd.AddCommand(NewPostOverflowsCmd())
  132. rootCmd.AddCommand(NewCapiCmd())
  133. rootCmd.AddCommand(NewLapiCmd())
  134. rootCmd.AddCommand(NewCompletionCmd())
  135. rootCmd.AddCommand(NewConsoleCmd())
  136. if err := rootCmd.Execute(); err != nil {
  137. log.Fatalf("While executing root command : %s", err)
  138. }
  139. }