main.go 4.4 KB

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