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)
This commit is contained in:
cynfo3000
2026-02-28 13:13:13 +01:00
parent 5d7a3cbcc1
commit c72b791796
7 changed files with 337 additions and 3 deletions
+19 -1
View File
@@ -26,6 +26,9 @@ type Hub struct {
// Response-Waiters: Command-ID -> Response-Channel
responseWaiters map[string]chan map[string]interface{}
waitersMux sync.RWMutex
// Event-Callback fuer DB-Events bei Connect/Disconnect
eventCallback func(agentID, eventType, message string)
}
func NewHub() *Hub {
@@ -41,6 +44,11 @@ func NewHub() *Hub {
return hub
}
// SetEventCallback setzt die Callback-Funktion fuer Connect/Disconnect Events
func (h *Hub) SetEventCallback(cb func(agentID, eventType, message string)) {
h.eventCallback = cb
}
func (h *Hub) Run() {
log.Println("WebSocket Hub startet...")
@@ -79,6 +87,11 @@ func (h *Hub) registerAgent(agent *AgentConnection) {
agent.LastSeen = time.Now()
log.Printf("Agent %s: WebSocket-Verbindung registriert", agent.AgentID)
// Event schreiben
if h.eventCallback != nil {
go h.eventCallback(agent.AgentID, "connected", "WebSocket-Verbindung hergestellt")
}
}
func (h *Hub) unregisterAgent(agent *AgentConnection) {
@@ -89,7 +102,12 @@ func (h *Hub) unregisterAgent(agent *AgentConnection) {
delete(h.agents, agent.AgentID)
existing.Connection.Close()
log.Printf("Agent %s: WebSocket-Verbindung entfernt", agent.AgentID)
// Event schreiben
if h.eventCallback != nil {
go h.eventCallback(agent.AgentID, "disconnected", "WebSocket-Verbindung getrennt")
}
// Alle Tunnel für diesen Agent schließen
h.tunnelManager.CloseAgentTunnels(agent.AgentID)
}