dataset.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. package cwhub
  2. import (
  3. "errors"
  4. "fmt"
  5. "io"
  6. "net/http"
  7. "os"
  8. "path/filepath"
  9. log "github.com/sirupsen/logrus"
  10. "gopkg.in/yaml.v2"
  11. "github.com/crowdsecurity/crowdsec/pkg/types"
  12. )
  13. type DataSet struct {
  14. Data []*types.DataSource `yaml:"data,omitempty"`
  15. }
  16. func downloadFile(url string, destPath string) error {
  17. log.Debugf("downloading %s in %s", url, destPath)
  18. req, err := http.NewRequest(http.MethodGet, url, nil)
  19. if err != nil {
  20. return err
  21. }
  22. resp, err := http.DefaultClient.Do(req)
  23. if err != nil {
  24. return err
  25. }
  26. defer resp.Body.Close()
  27. body, err := io.ReadAll(resp.Body)
  28. if err != nil {
  29. return err
  30. }
  31. if resp.StatusCode != http.StatusOK {
  32. return fmt.Errorf("download response 'HTTP %d' : %s", resp.StatusCode, string(body))
  33. }
  34. file, err := os.OpenFile(destPath, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0o644)
  35. if err != nil {
  36. return err
  37. }
  38. _, err = file.Write(body)
  39. if err != nil {
  40. return err
  41. }
  42. err = file.Sync()
  43. if err != nil {
  44. return err
  45. }
  46. return nil
  47. }
  48. func GetData(data []*types.DataSource, dataDir string) error {
  49. for _, dataS := range data {
  50. destPath := filepath.Join(dataDir, dataS.DestPath)
  51. log.Infof("downloading data '%s' in '%s'", dataS.SourceURL, destPath)
  52. err := downloadFile(dataS.SourceURL, destPath)
  53. if err != nil {
  54. return err
  55. }
  56. }
  57. return nil
  58. }
  59. // downloadData downloads the data files for an item
  60. func downloadData(dataFolder string, force bool, reader io.Reader) error {
  61. var err error
  62. dec := yaml.NewDecoder(reader)
  63. for {
  64. data := &DataSet{}
  65. err = dec.Decode(data)
  66. if err != nil {
  67. if errors.Is(err, io.EOF) {
  68. break
  69. }
  70. return fmt.Errorf("while reading file: %w", err)
  71. }
  72. download := false
  73. for _, dataS := range data.Data {
  74. if _, err = os.Stat(filepath.Join(dataFolder, dataS.DestPath)); os.IsNotExist(err) {
  75. download = true
  76. }
  77. }
  78. if download || force {
  79. err = GetData(data.Data, dataFolder)
  80. if err != nil {
  81. return fmt.Errorf("while getting data: %w", err)
  82. }
  83. }
  84. }
  85. return nil
  86. }