57a65106cb
Integrate distributed monitoring agents for HTTP, PING, TCP, and DNS checks
117 lines
3.1 KiB
Go
117 lines
3.1 KiB
Go
|
|
package pocketbase
|
|
|
|
import (
|
|
"fmt"
|
|
"net/http"
|
|
"time"
|
|
)
|
|
|
|
func (c *PocketBaseClient) GetRegionalServices() ([]RegionalService, error) {
|
|
resp, err := c.httpClient.Get(fmt.Sprintf("%s/api/collections/regional_service/records", c.baseURL))
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer resp.Body.Close()
|
|
|
|
if resp.StatusCode == http.StatusForbidden {
|
|
// Collection might require authentication or doesn't exist
|
|
fmt.Printf("Warning: Cannot access regional_service collection (403). Regional monitoring will be disabled.\n")
|
|
return nil, fmt.Errorf("access denied to regional_service collection")
|
|
}
|
|
|
|
if resp.StatusCode != http.StatusOK {
|
|
return nil, fmt.Errorf("failed to get regional services: status %d", resp.StatusCode)
|
|
}
|
|
|
|
var response RegionalServicesResponse
|
|
if err := c.parseResponse(resp, &response); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return response.Items, nil
|
|
}
|
|
|
|
func (c *PocketBaseClient) GetDefaultRegionalService() (*RegionalService, error) {
|
|
services, err := c.GetRegionalServices()
|
|
if err != nil {
|
|
// Try to create a default regional service if we can't get existing ones
|
|
return c.CreateDefaultRegionalService()
|
|
}
|
|
|
|
// Look for a service with region_name "Default"
|
|
for _, service := range services {
|
|
if service.RegionName == "Default" {
|
|
return &service, nil
|
|
}
|
|
}
|
|
|
|
// If no default service found, try to create one
|
|
return c.CreateDefaultRegionalService()
|
|
}
|
|
|
|
func (c *PocketBaseClient) CreateDefaultRegionalService() (*RegionalService, error) {
|
|
defaultService := map[string]interface{}{
|
|
"region_name": "Default",
|
|
"status": "active",
|
|
"agent_id": "1",
|
|
"agent_ip_address": "127.0.0.1",
|
|
"connection": "offline",
|
|
"token": fmt.Sprintf("default-%d", time.Now().Unix()),
|
|
}
|
|
|
|
err := c.createRecord("regional_service", defaultService)
|
|
if err != nil {
|
|
fmt.Printf("Warning: Could not create default regional service: %v\n", err)
|
|
// Return a fallback service for local operations
|
|
return &RegionalService{
|
|
ID: "default",
|
|
RegionName: "Default",
|
|
Status: "active",
|
|
AgentID: "1",
|
|
AgentIPAddress: "127.0.0.1",
|
|
Connection: "offline",
|
|
Token: "default-token",
|
|
}, nil
|
|
}
|
|
|
|
// Try to fetch the created service
|
|
services, err := c.GetRegionalServices()
|
|
if err == nil {
|
|
for _, service := range services {
|
|
if service.RegionName == "Default" {
|
|
return &service, nil
|
|
}
|
|
}
|
|
}
|
|
|
|
// Return fallback if still can't get the created service
|
|
return &RegionalService{
|
|
ID: "default",
|
|
RegionName: "Default",
|
|
Status: "active",
|
|
AgentID: "1",
|
|
AgentIPAddress: "127.0.0.1",
|
|
Connection: "offline",
|
|
Token: "default-token",
|
|
}, nil
|
|
}
|
|
|
|
func (c *PocketBaseClient) UpdateRegionalServiceConnection(serviceID, connection string) error {
|
|
// Determine status based on connection
|
|
status := "inactive"
|
|
if connection == "online" {
|
|
status = "active"
|
|
}
|
|
|
|
data := map[string]interface{}{
|
|
"connection": connection,
|
|
"status": status,
|
|
}
|
|
|
|
return c.updateRecord("regional_service", serviceID, data)
|
|
}
|
|
|
|
func (c *PocketBaseClient) SaveSSLData(sslData SSLDataRecord) error {
|
|
return c.createRecord("ssl_data", sslData)
|
|
} |