github.com/crowdsecurity/crowdsec@v1.6.1/pkg/metabase/api.go (about)

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