api.go 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. package metabase
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "net/http"
  6. "time"
  7. "github.com/crowdsecurity/go-cs-lib/version"
  8. "github.com/dghubble/sling"
  9. log "github.com/sirupsen/logrus"
  10. )
  11. type MBClient struct {
  12. CTX *sling.Sling
  13. Client *http.Client
  14. }
  15. const (
  16. sessionEndpoint = "login"
  17. scanEndpoint = "scan"
  18. resetPasswordEndpoint = "reset_password"
  19. userEndpoint = "user"
  20. databaseEndpoint = "database"
  21. )
  22. var (
  23. routes = map[string]string{
  24. sessionEndpoint: "api/session",
  25. scanEndpoint: "api/database/2/rescan_values",
  26. resetPasswordEndpoint: "api/user/1/password",
  27. userEndpoint: "api/user/1",
  28. databaseEndpoint: "api/database/2",
  29. }
  30. )
  31. func NewMBClient(url string) (*MBClient, error) {
  32. httpClient := &http.Client{Timeout: 20 * time.Second}
  33. return &MBClient{
  34. CTX: sling.New().Client(httpClient).Base(url).Set("User-Agent", fmt.Sprintf("crowdsec/%s", version.String())),
  35. Client: httpClient,
  36. }, nil
  37. }
  38. func (h *MBClient) Do(method string, route string, body interface{}) (interface{}, interface{}, error) {
  39. var Success interface{}
  40. var Error interface{}
  41. var resp *http.Response
  42. var err error
  43. var data []byte
  44. if body != nil {
  45. data, _ = json.Marshal(body)
  46. }
  47. switch method {
  48. case "POST":
  49. log.Debugf("POST /%s", route)
  50. log.Debugf("%s", string(data))
  51. resp, err = h.CTX.New().Post(route).BodyJSON(body).Receive(&Success, &Error)
  52. case "GET":
  53. log.Debugf("GET /%s", route)
  54. resp, err = h.CTX.New().Get(route).Receive(&Success, &Error)
  55. case "PUT":
  56. log.Debugf("PUT /%s", route)
  57. log.Debugf("%s", string(data))
  58. resp, err = h.CTX.New().Put(route).BodyJSON(body).Receive(&Success, &Error)
  59. case "DELETE":
  60. default:
  61. return nil, nil, fmt.Errorf("unsupported method '%s'", method)
  62. }
  63. if Error != nil {
  64. return Success, Error, fmt.Errorf("http error: %v", Error)
  65. }
  66. if resp != nil && resp.StatusCode != 200 && resp.StatusCode != 202 {
  67. return Success, Error, fmt.Errorf("bad status code '%d': (success: %+v) | (error: %+v)", resp.StatusCode, Success, Error)
  68. }
  69. return Success, Error, err
  70. }
  71. // Set headers as key:value
  72. func (h *MBClient) Set(key string, value string) {
  73. h.CTX = h.CTX.Set(key, value)
  74. }