rmm2/agent-bsd/client/client.go

96 lines
2.0 KiB
Go

package client
import (
"bytes"
"crypto/tls"
"encoding/json"
"fmt"
"io"
"net/http"
"time"
)
type Client struct {
baseURL string
apiKey string
httpClient *http.Client
}
func New(baseURL, apiKey string, insecure bool) *Client {
transport := &http.Transport{
TLSClientConfig: &tls.Config{
InsecureSkipVerify: insecure,
},
}
return &Client{
baseURL: baseURL,
apiKey: apiKey,
httpClient: &http.Client{
Transport: transport,
Timeout: 30 * time.Second,
},
}
}
// Register - Agent am Backend registrieren, gibt Agent-ID zurueck
func (c *Client) Register(req interface{}) (string, error) {
body, err := json.Marshal(req)
if err != nil {
return "", err
}
resp, err := c.doRequest("POST", "/api/v1/agent/register", body)
if err != nil {
return "", err
}
defer resp.Body.Close()
respBody, _ := io.ReadAll(resp.Body)
if resp.StatusCode != http.StatusCreated {
return "", fmt.Errorf("Registrierung fehlgeschlagen (HTTP %d): %s", resp.StatusCode, string(respBody))
}
var result struct {
ID string `json:"id"`
}
if err := json.Unmarshal(respBody, &result); err != nil {
return "", fmt.Errorf("Response parsen: %w", err)
}
return result.ID, nil
}
// Heartbeat - Systemdaten an Backend senden
func (c *Client) Heartbeat(req interface{}) error {
body, err := json.Marshal(req)
if err != nil {
return err
}
resp, err := c.doRequest("POST", "/api/v1/agent/heartbeat", body)
if err != nil {
return err
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
respBody, _ := io.ReadAll(resp.Body)
return fmt.Errorf("Heartbeat fehlgeschlagen (HTTP %d): %s", resp.StatusCode, string(respBody))
}
return nil
}
func (c *Client) doRequest(method, path string, body []byte) (*http.Response, error) {
req, err := http.NewRequest(method, c.baseURL+path, bytes.NewReader(body))
if err != nil {
return nil, err
}
req.Header.Set("Content-Type", "application/json")
req.Header.Set("X-API-Key", c.apiKey)
return c.httpClient.Do(req)
}