main.go 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. package main
  2. import (
  3. "fmt"
  4. "os"
  5. "path"
  6. "path/filepath"
  7. "strings"
  8. "github.com/confluentinc/bincover"
  9. "github.com/crowdsecurity/crowdsec/pkg/csconfig"
  10. "github.com/crowdsecurity/crowdsec/pkg/cwhub"
  11. "github.com/crowdsecurity/crowdsec/pkg/cwversion"
  12. "github.com/crowdsecurity/crowdsec/pkg/database"
  13. log "github.com/sirupsen/logrus"
  14. "github.com/spf13/cobra"
  15. "github.com/spf13/cobra/doc"
  16. )
  17. var bincoverTesting = ""
  18. var trace_lvl, dbg_lvl, nfo_lvl, wrn_lvl, err_lvl bool
  19. var ConfigFilePath string
  20. var csConfig *csconfig.Config
  21. var dbClient *database.Client
  22. var OutputFormat string
  23. var downloadOnly bool
  24. var forceAction bool
  25. var purge bool
  26. var all bool
  27. var restoreOldBackup bool
  28. var prometheusURL string
  29. func initConfig() {
  30. var err error
  31. if trace_lvl {
  32. log.SetLevel(log.TraceLevel)
  33. } else if dbg_lvl {
  34. log.SetLevel(log.DebugLevel)
  35. } else if nfo_lvl {
  36. log.SetLevel(log.InfoLevel)
  37. } else if wrn_lvl {
  38. log.SetLevel(log.WarnLevel)
  39. } else if err_lvl {
  40. log.SetLevel(log.ErrorLevel)
  41. }
  42. logFormatter := &log.TextFormatter{TimestampFormat: "02-01-2006 03:04:05 PM", FullTimestamp: true}
  43. log.SetFormatter(logFormatter)
  44. if !inSlice(os.Args[1], NoNeedConfig) {
  45. csConfig, err = csconfig.NewConfig(ConfigFilePath, false, false)
  46. if err != nil {
  47. log.Fatalf(err.Error())
  48. }
  49. log.Debugf("Using %s as configuration file", ConfigFilePath)
  50. if err := csConfig.LoadCSCLI(); err != nil {
  51. log.Fatalf(err.Error())
  52. }
  53. } else {
  54. csConfig = csconfig.NewDefaultConfig()
  55. }
  56. if csConfig.Cscli == nil {
  57. log.Fatalf("missing 'cscli' configuration in '%s', exiting", ConfigFilePath)
  58. }
  59. if cwhub.HubBranch == "" && csConfig.Cscli.HubBranch != "" {
  60. cwhub.HubBranch = csConfig.Cscli.HubBranch
  61. }
  62. if OutputFormat != "" {
  63. csConfig.Cscli.Output = OutputFormat
  64. if OutputFormat != "json" && OutputFormat != "raw" && OutputFormat != "human" {
  65. log.Fatalf("output format %s unknown", OutputFormat)
  66. }
  67. }
  68. if csConfig.Cscli.Output == "" {
  69. csConfig.Cscli.Output = "human"
  70. }
  71. if csConfig.Cscli.Output == "json" {
  72. log.SetFormatter(&log.JSONFormatter{})
  73. log.SetLevel(log.ErrorLevel)
  74. } else if csConfig.Cscli.Output == "raw" {
  75. log.SetLevel(log.ErrorLevel)
  76. }
  77. }
  78. var validArgs = []string{
  79. "scenarios", "parsers", "collections", "capi", "lapi", "postoverflows", "machines",
  80. "metrics", "bouncers", "alerts", "decisions", "simulation", "hub", "dashboard",
  81. "config", "completion", "version", "console", "notifications", "support",
  82. }
  83. func prepender(filename string) string {
  84. const header = `---
  85. id: %s
  86. title: %s
  87. ---
  88. `
  89. name := filepath.Base(filename)
  90. base := strings.TrimSuffix(name, path.Ext(name))
  91. return fmt.Sprintf(header, base, strings.Replace(base, "_", " ", -1))
  92. }
  93. func linkHandler(name string) string {
  94. return fmt.Sprintf("/cscli/%s", name)
  95. }
  96. var (
  97. NoNeedConfig = []string{
  98. "help",
  99. "completion",
  100. "version",
  101. "hubtest",
  102. }
  103. )
  104. func main() {
  105. var rootCmd = &cobra.Command{
  106. Use: "cscli",
  107. Short: "cscli allows you to manage crowdsec",
  108. Long: `cscli is the main command to interact with your crowdsec service, scenarios & db.
  109. It is meant to allow you to manage bans, parsers/scenarios/etc, api and generally manage you crowdsec setup.`,
  110. ValidArgs: validArgs,
  111. DisableAutoGenTag: true,
  112. SilenceErrors: true,
  113. SilenceUsage: true,
  114. /*TBD examples*/
  115. }
  116. var cmdDocGen = &cobra.Command{
  117. Use: "doc",
  118. Short: "Generate the documentation in `./doc/`. Directory must exist.",
  119. Args: cobra.ExactArgs(0),
  120. Hidden: true,
  121. DisableAutoGenTag: true,
  122. Run: func(cmd *cobra.Command, args []string) {
  123. if err := doc.GenMarkdownTreeCustom(rootCmd, "./doc/", prepender, linkHandler); err != nil {
  124. log.Fatalf("Failed to generate cobra doc: %s", err)
  125. }
  126. },
  127. }
  128. rootCmd.AddCommand(cmdDocGen)
  129. /*usage*/
  130. var cmdVersion = &cobra.Command{
  131. Use: "version",
  132. Short: "Display version and exit.",
  133. Args: cobra.ExactArgs(0),
  134. DisableAutoGenTag: true,
  135. Run: func(cmd *cobra.Command, args []string) {
  136. cwversion.Show()
  137. },
  138. }
  139. rootCmd.AddCommand(cmdVersion)
  140. rootCmd.PersistentFlags().StringVarP(&ConfigFilePath, "config", "c", csconfig.DefaultConfigPath("config.yaml"), "path to crowdsec config file")
  141. rootCmd.PersistentFlags().StringVarP(&OutputFormat, "output", "o", "", "Output format : human, json, raw.")
  142. rootCmd.PersistentFlags().BoolVar(&dbg_lvl, "debug", false, "Set logging to debug.")
  143. rootCmd.PersistentFlags().BoolVar(&nfo_lvl, "info", false, "Set logging to info.")
  144. rootCmd.PersistentFlags().BoolVar(&wrn_lvl, "warning", false, "Set logging to warning.")
  145. rootCmd.PersistentFlags().BoolVar(&err_lvl, "error", false, "Set logging to error.")
  146. rootCmd.PersistentFlags().BoolVar(&trace_lvl, "trace", false, "Set logging to trace.")
  147. rootCmd.PersistentFlags().StringVar(&cwhub.HubBranch, "branch", "", "Override hub branch on github")
  148. if err := rootCmd.PersistentFlags().MarkHidden("branch"); err != nil {
  149. log.Fatalf("failed to hide flag: %s", err)
  150. }
  151. if len(os.Args) > 1 {
  152. cobra.OnInitialize(initConfig)
  153. }
  154. /*don't sort flags so we can enforce order*/
  155. rootCmd.Flags().SortFlags = false
  156. rootCmd.PersistentFlags().SortFlags = false
  157. rootCmd.AddCommand(NewConfigCmd())
  158. rootCmd.AddCommand(NewHubCmd())
  159. rootCmd.AddCommand(NewMetricsCmd())
  160. rootCmd.AddCommand(NewDashboardCmd())
  161. rootCmd.AddCommand(NewDecisionsCmd())
  162. rootCmd.AddCommand(NewAlertsCmd())
  163. // rootCmd.AddCommand(NewInspectCmd())
  164. rootCmd.AddCommand(NewSimulationCmds())
  165. rootCmd.AddCommand(NewBouncersCmd())
  166. rootCmd.AddCommand(NewMachinesCmd())
  167. rootCmd.AddCommand(NewParsersCmd())
  168. rootCmd.AddCommand(NewScenariosCmd())
  169. rootCmd.AddCommand(NewCollectionsCmd())
  170. rootCmd.AddCommand(NewPostOverflowsCmd())
  171. rootCmd.AddCommand(NewCapiCmd())
  172. rootCmd.AddCommand(NewLapiCmd())
  173. rootCmd.AddCommand(NewCompletionCmd())
  174. rootCmd.AddCommand(NewConsoleCmd())
  175. rootCmd.AddCommand(NewExplainCmd())
  176. rootCmd.AddCommand(NewHubTestCmd())
  177. rootCmd.AddCommand(NewNotificationsCmd())
  178. rootCmd.AddCommand(NewSupportCmd())
  179. if err := rootCmd.Execute(); err != nil {
  180. if bincoverTesting != "" {
  181. log.Debug("coverage report is enabled")
  182. }
  183. exitCode := 1
  184. log.NewEntry(log.StandardLogger()).Log(log.FatalLevel, err)
  185. if bincoverTesting == "" {
  186. os.Exit(exitCode)
  187. }
  188. bincover.ExitCode = exitCode
  189. }
  190. }