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:
+19
-1
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user