hub.go 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. package main
  2. import (
  3. "errors"
  4. "fmt"
  5. "github.com/fatih/color"
  6. log "github.com/sirupsen/logrus"
  7. "github.com/spf13/cobra"
  8. "github.com/crowdsecurity/crowdsec/cmd/crowdsec-cli/require"
  9. "github.com/crowdsecurity/crowdsec/pkg/cwhub"
  10. )
  11. func NewHubCmd() *cobra.Command {
  12. var cmdHub = &cobra.Command{
  13. Use: "hub [action]",
  14. Short: "Manage hub index",
  15. Long: `Hub management
  16. List/update parsers/scenarios/postoverflows/collections from [Crowdsec Hub](https://hub.crowdsec.net).
  17. The Hub is managed by cscli, to get the latest hub files from [Crowdsec Hub](https://hub.crowdsec.net), you need to update.`,
  18. Example: `cscli hub list
  19. cscli hub update
  20. cscli hub upgrade`,
  21. Args: cobra.ExactArgs(0),
  22. DisableAutoGenTag: true,
  23. PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
  24. if csConfig.Cscli == nil {
  25. return fmt.Errorf("you must configure cli before interacting with hub")
  26. }
  27. return nil
  28. },
  29. }
  30. cmdHub.PersistentFlags().StringVarP(&cwhub.HubBranch, "branch", "b", "", "Use given branch from hub")
  31. cmdHub.AddCommand(NewHubListCmd())
  32. cmdHub.AddCommand(NewHubUpdateCmd())
  33. cmdHub.AddCommand(NewHubUpgradeCmd())
  34. return cmdHub
  35. }
  36. func runHubList(cmd *cobra.Command, args []string) error {
  37. flags := cmd.Flags()
  38. all, err := flags.GetBool("all")
  39. if err != nil {
  40. return err
  41. }
  42. hub, err := require.Hub(csConfig)
  43. if err != nil {
  44. return err
  45. }
  46. // use LocalSync to get warnings about tainted / outdated items
  47. warn, _ := hub.LocalSync()
  48. for _, v := range warn {
  49. log.Info(v)
  50. }
  51. for line := range hub.ItemStats() {
  52. log.Info(line)
  53. }
  54. err = ListItems(color.Output, []string{
  55. cwhub.COLLECTIONS, cwhub.PARSERS, cwhub.SCENARIOS, cwhub.POSTOVERFLOWS,
  56. }, nil, true, false, all)
  57. if err != nil {
  58. return err
  59. }
  60. return nil
  61. }
  62. func NewHubListCmd() *cobra.Command {
  63. var cmdHubList = &cobra.Command{
  64. Use: "list [-a]",
  65. Short: "List all installed configurations",
  66. Args: cobra.ExactArgs(0),
  67. DisableAutoGenTag: true,
  68. RunE: runHubList,
  69. }
  70. flags := cmdHubList.Flags()
  71. flags.BoolP("all", "a", false, "List disabled items as well")
  72. return cmdHubList
  73. }
  74. func runHubUpdate(cmd *cobra.Command, args []string) error {
  75. cwhub.SetHubBranch()
  76. // don't use require.Hub because if there is no index file, it would fail
  77. hub, err := cwhub.InitHubUpdate(csConfig.Hub)
  78. if err != nil {
  79. if !errors.Is(err, cwhub.ErrIndexNotFound) {
  80. return fmt.Errorf("failed to get Hub index : %w", err)
  81. }
  82. log.Warnf("Could not find index file for branch '%s', using 'master'", cwhub.HubBranch)
  83. cwhub.HubBranch = "master"
  84. if hub, err = cwhub.InitHubUpdate(csConfig.Hub); err != nil {
  85. return fmt.Errorf("failed to get Hub index after retry: %w", err)
  86. }
  87. }
  88. // use LocalSync to get warnings about tainted / outdated items
  89. warn, _ := hub.LocalSync()
  90. for _, v := range warn {
  91. log.Info(v)
  92. }
  93. return nil
  94. }
  95. func NewHubUpdateCmd() *cobra.Command {
  96. var cmdHubUpdate = &cobra.Command{
  97. Use: "update",
  98. Short: "Download the latest index (catalog of available configurations)",
  99. Long: `
  100. Fetches the [.index.json](https://github.com/crowdsecurity/hub/blob/master/.index.json) file from hub, containing the list of available configs.
  101. `,
  102. Args: cobra.ExactArgs(0),
  103. DisableAutoGenTag: true,
  104. PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
  105. if csConfig.Cscli == nil {
  106. return fmt.Errorf("you must configure cli before interacting with hub")
  107. }
  108. return nil
  109. },
  110. RunE: runHubUpdate,
  111. }
  112. return cmdHubUpdate
  113. }
  114. func runHubUpgrade(cmd *cobra.Command, args []string) error {
  115. flags := cmd.Flags()
  116. force, err := flags.GetBool("force")
  117. if err != nil {
  118. return err
  119. }
  120. hub, err := require.Hub(csConfig)
  121. if err != nil {
  122. return err
  123. }
  124. log.Infof("Upgrading collections")
  125. if err := hub.UpgradeConfig(cwhub.COLLECTIONS, "", force); err != nil {
  126. return err
  127. }
  128. log.Infof("Upgrading parsers")
  129. if err := hub.UpgradeConfig(cwhub.PARSERS, "", force); err != nil {
  130. return err
  131. }
  132. log.Infof("Upgrading scenarios")
  133. if err := hub.UpgradeConfig(cwhub.SCENARIOS, "", force); err != nil {
  134. return err
  135. }
  136. log.Infof("Upgrading postoverflows")
  137. if err := hub.UpgradeConfig(cwhub.POSTOVERFLOWS, "", force); err != nil {
  138. return err
  139. }
  140. return nil
  141. }
  142. func NewHubUpgradeCmd() *cobra.Command {
  143. var cmdHubUpgrade = &cobra.Command{
  144. Use: "upgrade",
  145. Short: "Upgrade all configurations to their latest version",
  146. Long: `
  147. Upgrade all configs installed from Crowdsec Hub. Run 'sudo cscli hub update' if you want the latest versions available.
  148. `,
  149. Args: cobra.ExactArgs(0),
  150. DisableAutoGenTag: true,
  151. PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
  152. if csConfig.Cscli == nil {
  153. return fmt.Errorf("you must configure cli before interacting with hub")
  154. }
  155. cwhub.SetHubBranch()
  156. return nil
  157. },
  158. RunE: runHubUpgrade,
  159. }
  160. flags := cmdHubUpgrade.Flags()
  161. flags.Bool("force", false, "Force upgrade: overwrite tainted and outdated files")
  162. return cmdHubUpgrade
  163. }