upgrade.go 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. package main
  2. import (
  3. "fmt"
  4. "github.com/crowdsecurity/crowdsec/pkg/cwhub"
  5. "github.com/enescakir/emoji"
  6. log "github.com/sirupsen/logrus"
  7. "github.com/spf13/cobra"
  8. )
  9. var upgrade_all, force_upgrade bool
  10. func UpgradeConfig(ttype string, name string) {
  11. var err error
  12. var updated int
  13. var found bool
  14. for _, v := range cwhub.HubIdx[ttype] {
  15. //name mismatch
  16. if name != "" && name != v.Name {
  17. continue
  18. }
  19. if !v.Installed {
  20. log.Debugf("skip %s, not installed", v.Name)
  21. continue
  22. }
  23. if !v.Downloaded {
  24. log.Warningf("%s : not downloaded, please install.", v.Name)
  25. continue
  26. }
  27. found = true
  28. if v.UpToDate {
  29. log.Infof("%s : up-to-date", v.Name)
  30. continue
  31. }
  32. v, err = cwhub.DownloadLatest(v, cwhub.Hubdir, force_upgrade)
  33. if err != nil {
  34. log.Fatalf("%s : download failed : %v", v.Name, err)
  35. }
  36. if !v.UpToDate {
  37. if v.Tainted {
  38. log.Infof("%v %s is tainted, --force to overwrite", emoji.Warning, v.Name)
  39. } else if v.Local {
  40. log.Infof("%v %s is local", emoji.Prohibited, v.Name)
  41. }
  42. } else {
  43. log.Infof("%v %s : updated", emoji.Package, v.Name)
  44. updated += 1
  45. }
  46. cwhub.HubIdx[ttype][v.Name] = v
  47. }
  48. if !found {
  49. log.Errorf("Didn't find %s", name)
  50. } else if updated == 0 && found {
  51. log.Errorf("Nothing to update")
  52. } else if updated != 0 {
  53. log.Infof("Upgraded %d items", updated)
  54. }
  55. }
  56. func NewUpgradeCmd() *cobra.Command {
  57. var cmdUpgrade = &cobra.Command{
  58. Use: "upgrade [type] [config]",
  59. Short: "Upgrade configuration(s)",
  60. Long: `
  61. Upgrade configuration from the CrowdSec Hub.
  62. In order to upgrade latest versions of configuration,
  63. the Hub cache should be [updated](./cscli_update.md).
  64. Tainted configuration will not be updated (use --force to update them).
  65. [type] must be parser, scenario, postoverflow, collection.
  66. [config_name] must be a valid config name from [Crowdsec Hub](https://hub.crowdsec.net).
  67. `,
  68. Example: `cscli upgrade [type] [config_name]
  69. cscli upgrade --all # Upgrade all configurations types
  70. cscli upgrade --force # Overwrite tainted configuration
  71. `,
  72. Args: cobra.MinimumNArgs(0),
  73. PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
  74. if !config.configured {
  75. return fmt.Errorf("you must configure cli before interacting with hub")
  76. }
  77. return nil
  78. },
  79. Run: func(cmd *cobra.Command, args []string) {
  80. if !upgrade_all && len(args) < 2 {
  81. _ = cmd.Help()
  82. return
  83. }
  84. if err := cwhub.GetHubIdx(); err != nil {
  85. log.Fatalf("Failed to get Hub index : %v", err)
  86. }
  87. if upgrade_all && len(args) == 0 {
  88. log.Warningf("Upgrade all : parsers, scenarios, collections.")
  89. UpgradeConfig(cwhub.PARSERS, "")
  90. UpgradeConfig(cwhub.PARSERS_OVFLW, "")
  91. UpgradeConfig(cwhub.SCENARIOS, "")
  92. UpgradeConfig(cwhub.COLLECTIONS, "")
  93. }
  94. //fmt.Println("upgrade all ?!: " + strings.Join(args, " "))
  95. },
  96. }
  97. cmdUpgrade.PersistentFlags().BoolVar(&upgrade_all, "all", false, "Upgrade all configuration in scope")
  98. cmdUpgrade.PersistentFlags().BoolVar(&force_upgrade, "force", false, "Overwrite existing files, even if tainted")
  99. var cmdUpgradeParser = &cobra.Command{
  100. Use: "parser [config]",
  101. Short: "Upgrade parser configuration(s)",
  102. Long: `Upgrade one or more parser configurations`,
  103. Example: ` - cscli upgrade parser crowdsec/apache-logs
  104. - cscli upgrade parser -all
  105. - cscli upgrade parser crowdsec/apache-logs --force`,
  106. Args: cobra.MinimumNArgs(0),
  107. Run: func(cmd *cobra.Command, args []string) {
  108. if err := cwhub.GetHubIdx(); err != nil {
  109. log.Fatalf("Failed to get Hub index : %v", err)
  110. }
  111. if len(args) == 1 {
  112. UpgradeConfig(cwhub.PARSERS, args[0])
  113. //UpgradeConfig(cwhub.PARSERS_OVFLW, "")
  114. } else if upgrade_all {
  115. UpgradeConfig(cwhub.PARSERS, "")
  116. } else {
  117. _ = cmd.Help()
  118. }
  119. },
  120. }
  121. cmdUpgrade.AddCommand(cmdUpgradeParser)
  122. var cmdUpgradeScenario = &cobra.Command{
  123. Use: "scenario [config]",
  124. Short: "Upgrade scenario configuration(s)",
  125. Long: `Upgrade one or more scenario configurations`,
  126. Example: ` - cscli upgrade scenario -all
  127. - cscli upgrade scenario crowdsec/http-404 --force `,
  128. Args: cobra.MinimumNArgs(0),
  129. Run: func(cmd *cobra.Command, args []string) {
  130. if err := cwhub.GetHubIdx(); err != nil {
  131. log.Fatalf("Failed to get Hub index : %v", err)
  132. }
  133. if len(args) == 1 {
  134. UpgradeConfig(cwhub.SCENARIOS, args[0])
  135. } else if upgrade_all {
  136. UpgradeConfig(cwhub.SCENARIOS, "")
  137. } else {
  138. _ = cmd.Help()
  139. }
  140. },
  141. }
  142. cmdUpgrade.AddCommand(cmdUpgradeScenario)
  143. var cmdUpgradeCollection = &cobra.Command{
  144. Use: "collection [config]",
  145. Short: "Upgrade collection configuration(s)",
  146. Long: `Upgrade one or more collection configurations`,
  147. Example: ` - cscli upgrade collection crowdsec/apache-lamp
  148. - cscli upgrade collection -all
  149. - cscli upgrade collection crowdsec/apache-lamp --force`,
  150. Args: cobra.MinimumNArgs(0),
  151. Run: func(cmd *cobra.Command, args []string) {
  152. if err := cwhub.GetHubIdx(); err != nil {
  153. log.Fatalf("Failed to get Hub index : %v", err)
  154. }
  155. if len(args) == 1 {
  156. UpgradeConfig(cwhub.COLLECTIONS, args[0])
  157. } else if upgrade_all {
  158. UpgradeConfig(cwhub.COLLECTIONS, "")
  159. } else {
  160. _ = cmd.Help()
  161. }
  162. },
  163. }
  164. cmdUpgrade.AddCommand(cmdUpgradeCollection)
  165. var cmdUpgradePostoverflow = &cobra.Command{
  166. Use: "postoverflow [config]",
  167. Short: "Upgrade postoverflow parser configuration(s)",
  168. Long: `Upgrade one or more postoverflow parser configurations`,
  169. Example: ` - cscli upgrade postoverflow crowdsec/enrich-rdns
  170. - cscli upgrade postoverflow -all
  171. - cscli upgrade postoverflow crowdsec/enrich-rdns --force`,
  172. Args: cobra.MinimumNArgs(0),
  173. Run: func(cmd *cobra.Command, args []string) {
  174. if err := cwhub.GetHubIdx(); err != nil {
  175. log.Fatalf("Failed to get Hub index : %v", err)
  176. }
  177. if len(args) == 1 {
  178. UpgradeConfig(cwhub.PARSERS_OVFLW, args[0])
  179. } else if upgrade_all {
  180. UpgradeConfig(cwhub.PARSERS_OVFLW, "")
  181. } else {
  182. _ = cmd.Help()
  183. }
  184. },
  185. }
  186. cmdUpgrade.AddCommand(cmdUpgradePostoverflow)
  187. return cmdUpgrade
  188. }