rmm2/backend/models/agent.go
cynfo3000 c72b791796 Agent-Status und Inaktivitaets-Erkennung implementiert
- Status wird aus last_heartbeat berechnet (online/stale/offline/unknown)
- GET /agents und GET /agents/{id} liefern status Feld
- agent_events Tabelle fuer Event-Tracking (Migration automatisch)
- Inaktivitaets-Monitor als Goroutine (prueft alle 60s, schreibt Events bei Statuswechsel)
- WebSocket Connect/Disconnect Events werden automatisch geschrieben
- API-Endpoints: GET /agents/events und GET /agents/{id}/events (?limit=N&type=X)
- DB-Methoden: InsertAgentEvent, GetAgentEvents, GetAllAgentEvents, GetAgentStatus
- README aktualisiert (Status-Doku, Events API, Dateistruktur)
2026-02-28 13:13:13 +01:00

61 lines
1.6 KiB
Go

package models
import "time"
// Agent repraesentiert einen registrierten OPNsense-Agent
type Agent struct {
ID string `json:"id"`
Name string `json:"name"`
Hostname string `json:"hostname"`
IP string `json:"ip"`
OPNsenseVersion string `json:"opnsense_version"`
RegisteredAt time.Time `json:"registered_at"`
LastHeartbeat *time.Time `json:"last_heartbeat,omitempty"`
}
// AgentResponse erweitert Agent um den berechneten Status
type AgentResponse struct {
Agent
Status string `json:"status"`
}
// AgentEvent repraesentiert ein Event in der agent_events Tabelle
type AgentEvent struct {
ID int `json:"id"`
AgentID string `json:"agent_id"`
EventType string `json:"event_type"`
Message string `json:"message,omitempty"`
CreatedAt time.Time `json:"created_at"`
}
// CalculateAgentStatus berechnet den Status aus dem letzten Heartbeat
func CalculateAgentStatus(lastHeartbeat *time.Time) string {
if lastHeartbeat == nil {
return "unknown"
}
age := time.Since(*lastHeartbeat)
switch {
case age < 2*time.Minute:
return "online"
case age < 5*time.Minute:
return "stale"
default:
return "offline"
}
}
// RegisterRequest - Agent-Registrierung
type RegisterRequest struct {
AgentID string `json:"agent_id,omitempty"`
Name string `json:"name"`
Hostname string `json:"hostname"`
IP string `json:"ip"`
OPNsenseVersion string `json:"opnsense_version"`
}
// RegisterResponse
type RegisterResponse struct {
ID string `json:"id"`
Message string `json:"message"`
}