main.go 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. package main
  2. import (
  3. "os/user"
  4. "path/filepath"
  5. "strings"
  6. "github.com/crowdsecurity/crowdsec/pkg/csconfig"
  7. "github.com/crowdsecurity/crowdsec/pkg/cwhub"
  8. "github.com/crowdsecurity/crowdsec/pkg/cwversion"
  9. log "github.com/sirupsen/logrus"
  10. "github.com/spf13/cobra"
  11. "github.com/spf13/cobra/doc"
  12. )
  13. var dbg_lvl, nfo_lvl, wrn_lvl, err_lvl bool
  14. var config cliConfig
  15. func initConfig() {
  16. if dbg_lvl {
  17. log.SetLevel(log.DebugLevel)
  18. } else if nfo_lvl {
  19. log.SetLevel(log.InfoLevel)
  20. } else if wrn_lvl {
  21. log.SetLevel(log.WarnLevel)
  22. } else if err_lvl {
  23. log.SetLevel(log.ErrorLevel)
  24. }
  25. if config.output == "json" {
  26. log.SetLevel(log.WarnLevel)
  27. log.SetFormatter(&log.JSONFormatter{})
  28. } else if config.output == "raw" {
  29. log.SetLevel(log.ErrorLevel)
  30. }
  31. csConfig := csconfig.NewCrowdSecConfig()
  32. if err := csConfig.GetCliConfig(&config.ConfigFilePath); err != nil {
  33. log.Fatalf(err.Error())
  34. }
  35. config.configFolder = filepath.Clean(csConfig.CsCliFolder)
  36. if strings.HasPrefix(config.configFolder, "~/") {
  37. usr, err := user.Current()
  38. if err != nil {
  39. log.Fatalf("failed to resolve path ~/ : %s", err)
  40. }
  41. config.configFolder = usr.HomeDir + "/" + config.configFolder[2:]
  42. }
  43. /*read config*/
  44. config.InstallFolder = filepath.Clean(csConfig.ConfigFolder)
  45. config.HubFolder = filepath.Clean(config.configFolder + "/hub/")
  46. config.BackendPluginFolder = filepath.Clean(csConfig.OutputConfig.BackendFolder)
  47. config.DataFolder = filepath.Clean(csConfig.DataFolder)
  48. //
  49. cwhub.Installdir = config.InstallFolder
  50. cwhub.Cfgdir = config.configFolder
  51. cwhub.Hubdir = config.HubFolder
  52. config.configured = true
  53. }
  54. func main() {
  55. var rootCmd = &cobra.Command{
  56. Use: "cscli",
  57. Short: "cscli allows you to manage crowdsec",
  58. Long: `cscli is the main command to interact with your crowdsec service, scenarios & db.
  59. It is meant to allow you to manage bans, parsers/scenarios/etc, api and generally manage you crowdsec setup.`,
  60. Example: `View/Add/Remove bans:
  61. - cscli ban list
  62. - cscli ban add ip 1.2.3.4 24h 'go away'
  63. - cscli ban del 1.2.3.4
  64. View/Add/Upgrade/Remove scenarios and parsers:
  65. - cscli list
  66. - cscli install collection crowdsec/linux-web
  67. - cscli remove scenario crowdsec/ssh_enum
  68. - cscli upgrade --all
  69. API interaction:
  70. - cscli api pull
  71. - cscli api register
  72. `}
  73. /*TODO : add a remediation type*/
  74. var cmdDocGen = &cobra.Command{
  75. Use: "doc",
  76. Short: "Generate the documentation in `./doc/`. Directory must exist.",
  77. Args: cobra.ExactArgs(0),
  78. Hidden: true,
  79. Run: func(cmd *cobra.Command, args []string) {
  80. if err := doc.GenMarkdownTree(rootCmd, "./doc/"); err != nil {
  81. log.Fatalf("Failed to generate cobra doc")
  82. }
  83. },
  84. }
  85. rootCmd.AddCommand(cmdDocGen)
  86. /*usage*/
  87. var cmdVersion = &cobra.Command{
  88. Use: "version",
  89. Short: "Display version and exit.",
  90. Args: cobra.ExactArgs(0),
  91. Hidden: true,
  92. Run: func(cmd *cobra.Command, args []string) {
  93. cwversion.Show()
  94. },
  95. }
  96. rootCmd.AddCommand(cmdVersion)
  97. //rootCmd.PersistentFlags().BoolVarP(&config.simulation, "simulate", "s", false, "No action; perform a simulation of events that would occur based on the current arguments.")
  98. rootCmd.PersistentFlags().StringVarP(&config.ConfigFilePath, "config", "c", "/etc/crowdsec/config/default.yaml", "path to crowdsec config file (default: /etc/crowdsec/config/default.yaml)")
  99. rootCmd.PersistentFlags().StringVarP(&config.output, "output", "o", "human", "Output format : human, json, raw.")
  100. rootCmd.PersistentFlags().BoolVar(&dbg_lvl, "debug", false, "Set logging to debug.")
  101. rootCmd.PersistentFlags().BoolVar(&nfo_lvl, "info", false, "Set logging to info.")
  102. rootCmd.PersistentFlags().BoolVar(&wrn_lvl, "warning", false, "Set logging to warning.")
  103. rootCmd.PersistentFlags().BoolVar(&err_lvl, "error", false, "Set logging to error.")
  104. rootCmd.PersistentFlags().StringVar(&cwhub.HubBranch, "branch", "master", "Override hub branch on github")
  105. if err := rootCmd.PersistentFlags().MarkHidden("branch"); err != nil {
  106. log.Fatalf("failed to make branch hidden : %s", err)
  107. }
  108. cobra.OnInitialize(initConfig)
  109. /*don't sort flags so we can enforce order*/
  110. rootCmd.Flags().SortFlags = false
  111. rootCmd.PersistentFlags().SortFlags = false
  112. rootCmd.AddCommand(NewBanCmds())
  113. rootCmd.AddCommand(NewConfigCmd())
  114. rootCmd.AddCommand(NewInstallCmd())
  115. rootCmd.AddCommand(NewListCmd())
  116. rootCmd.AddCommand(NewRemoveCmd())
  117. rootCmd.AddCommand(NewUpdateCmd())
  118. rootCmd.AddCommand(NewUpgradeCmd())
  119. rootCmd.AddCommand(NewAPICmd())
  120. rootCmd.AddCommand(NewMetricsCmd())
  121. rootCmd.AddCommand(NewBackupCmd())
  122. rootCmd.AddCommand(NewDashboardCmd())
  123. rootCmd.AddCommand(NewInspectCmd())
  124. if err := rootCmd.Execute(); err != nil {
  125. log.Fatalf("While executing root command : %s", err)
  126. }
  127. }