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) }