parsers.go 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. package main
  2. import (
  3. "fmt"
  4. "github.com/fatih/color"
  5. log "github.com/sirupsen/logrus"
  6. "github.com/spf13/cobra"
  7. "github.com/crowdsecurity/crowdsec/cmd/crowdsec-cli/require"
  8. "github.com/crowdsecurity/crowdsec/pkg/cwhub"
  9. )
  10. func NewParsersCmd() *cobra.Command {
  11. var cmdParsers = &cobra.Command{
  12. Use: "parsers [action] [config]",
  13. Short: "Install/Remove/Upgrade/Inspect parser(s) from hub",
  14. Example: `cscli parsers install crowdsecurity/sshd-logs
  15. cscli parsers inspect crowdsecurity/sshd-logs
  16. cscli parsers upgrade crowdsecurity/sshd-logs
  17. cscli parsers list
  18. cscli parsers remove crowdsecurity/sshd-logs
  19. `,
  20. Args: cobra.MinimumNArgs(1),
  21. Aliases: []string{"parser"},
  22. DisableAutoGenTag: true,
  23. PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
  24. if err := require.Hub(csConfig); err != nil {
  25. return err
  26. }
  27. return nil
  28. },
  29. PersistentPostRun: func(cmd *cobra.Command, args []string) {
  30. if cmd.Name() == "inspect" || cmd.Name() == "list" {
  31. return
  32. }
  33. log.Infof(ReloadMessage())
  34. },
  35. }
  36. cmdParsers.AddCommand(NewParsersInstallCmd())
  37. cmdParsers.AddCommand(NewParsersRemoveCmd())
  38. cmdParsers.AddCommand(NewParsersUpgradeCmd())
  39. cmdParsers.AddCommand(NewParsersInspectCmd())
  40. cmdParsers.AddCommand(NewParsersListCmd())
  41. return cmdParsers
  42. }
  43. func NewParsersInstallCmd() *cobra.Command {
  44. var ignoreError bool
  45. var cmdParsersInstall = &cobra.Command{
  46. Use: "install [config]",
  47. Short: "Install given parser(s)",
  48. Long: `Fetch and install given parser(s) from hub`,
  49. Example: `cscli parsers install crowdsec/xxx crowdsec/xyz`,
  50. Args: cobra.MinimumNArgs(1),
  51. DisableAutoGenTag: true,
  52. ValidArgsFunction: func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
  53. return compAllItems(cwhub.PARSERS, args, toComplete)
  54. },
  55. RunE: func(cmd *cobra.Command, args []string) error {
  56. for _, name := range args {
  57. t := cwhub.GetItem(cwhub.PARSERS, name)
  58. if t == nil {
  59. nearestItem, score := GetDistance(cwhub.PARSERS, name)
  60. Suggest(cwhub.PARSERS, name, nearestItem.Name, score, ignoreError)
  61. continue
  62. }
  63. if err := cwhub.InstallItem(csConfig, name, cwhub.PARSERS, forceAction, downloadOnly); err != nil {
  64. if !ignoreError {
  65. return fmt.Errorf("error while installing '%s': %w", name, err)
  66. }
  67. log.Errorf("Error while installing '%s': %s", name, err)
  68. }
  69. }
  70. return nil
  71. },
  72. }
  73. cmdParsersInstall.PersistentFlags().BoolVarP(&downloadOnly, "download-only", "d", false, "Only download packages, don't enable")
  74. cmdParsersInstall.PersistentFlags().BoolVar(&forceAction, "force", false, "Force install : Overwrite tainted and outdated files")
  75. cmdParsersInstall.PersistentFlags().BoolVar(&ignoreError, "ignore", false, "Ignore errors when installing multiple parsers")
  76. return cmdParsersInstall
  77. }
  78. func NewParsersRemoveCmd() *cobra.Command {
  79. cmdParsersRemove := &cobra.Command{
  80. Use: "remove [config]",
  81. Short: "Remove given parser(s)",
  82. Long: `Remove given parse(s) from hub`,
  83. Example: `cscli parsers remove crowdsec/xxx crowdsec/xyz`,
  84. Aliases: []string{"delete"},
  85. DisableAutoGenTag: true,
  86. ValidArgsFunction: func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
  87. return compInstalledItems(cwhub.PARSERS, args, toComplete)
  88. },
  89. RunE: func(cmd *cobra.Command, args []string) error {
  90. if all {
  91. cwhub.RemoveMany(csConfig, cwhub.PARSERS, "", all, purge, forceAction)
  92. return nil
  93. }
  94. if len(args) == 0 {
  95. return fmt.Errorf("specify at least one parser to remove or '--all'")
  96. }
  97. for _, name := range args {
  98. cwhub.RemoveMany(csConfig, cwhub.PARSERS, name, all, purge, forceAction)
  99. }
  100. return nil
  101. },
  102. }
  103. cmdParsersRemove.PersistentFlags().BoolVar(&purge, "purge", false, "Delete source file too")
  104. cmdParsersRemove.PersistentFlags().BoolVar(&forceAction, "force", false, "Force remove : Remove tainted and outdated files")
  105. cmdParsersRemove.PersistentFlags().BoolVar(&all, "all", false, "Delete all the parsers")
  106. return cmdParsersRemove
  107. }
  108. func NewParsersUpgradeCmd() *cobra.Command {
  109. cmdParsersUpgrade := &cobra.Command{
  110. Use: "upgrade [config]",
  111. Short: "Upgrade given parser(s)",
  112. Long: `Fetch and upgrade given parser(s) from hub`,
  113. Example: `cscli parsers upgrade crowdsec/xxx crowdsec/xyz`,
  114. DisableAutoGenTag: true,
  115. ValidArgsFunction: func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
  116. return compInstalledItems(cwhub.PARSERS, args, toComplete)
  117. },
  118. RunE: func(cmd *cobra.Command, args []string) error {
  119. if all {
  120. cwhub.UpgradeConfig(csConfig, cwhub.PARSERS, "", forceAction)
  121. } else {
  122. if len(args) == 0 {
  123. return fmt.Errorf("specify at least one parser to upgrade or '--all'")
  124. }
  125. for _, name := range args {
  126. cwhub.UpgradeConfig(csConfig, cwhub.PARSERS, name, forceAction)
  127. }
  128. }
  129. return nil
  130. },
  131. }
  132. cmdParsersUpgrade.PersistentFlags().BoolVar(&all, "all", false, "Upgrade all the parsers")
  133. cmdParsersUpgrade.PersistentFlags().BoolVar(&forceAction, "force", false, "Force upgrade : Overwrite tainted and outdated files")
  134. return cmdParsersUpgrade
  135. }
  136. func NewParsersInspectCmd() *cobra.Command {
  137. var cmdParsersInspect = &cobra.Command{
  138. Use: "inspect [name]",
  139. Short: "Inspect given parser",
  140. Long: `Inspect given parser`,
  141. Example: `cscli parsers inspect crowdsec/xxx`,
  142. DisableAutoGenTag: true,
  143. Args: cobra.MinimumNArgs(1),
  144. ValidArgsFunction: func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
  145. return compInstalledItems(cwhub.PARSERS, args, toComplete)
  146. },
  147. Run: func(cmd *cobra.Command, args []string) {
  148. InspectItem(args[0], cwhub.PARSERS)
  149. },
  150. }
  151. cmdParsersInspect.PersistentFlags().StringVarP(&prometheusURL, "url", "u", "", "Prometheus url")
  152. return cmdParsersInspect
  153. }
  154. func NewParsersListCmd() *cobra.Command {
  155. var cmdParsersList = &cobra.Command{
  156. Use: "list [name]",
  157. Short: "List all parsers or given one",
  158. Long: `List all parsers or given one`,
  159. Example: `cscli parsers list
  160. cscli parser list crowdsecurity/xxx`,
  161. DisableAutoGenTag: true,
  162. Run: func(cmd *cobra.Command, args []string) {
  163. ListItems(color.Output, []string{cwhub.PARSERS}, args, false, true, all)
  164. },
  165. }
  166. cmdParsersList.PersistentFlags().BoolVarP(&all, "all", "a", false, "List disabled items as well")
  167. return cmdParsersList
  168. }