# Conflicts: # account/Makefile # account/go.mod # docs/account-admin-settings.md # docs/account-svc-plus.md
70 lines
1.9 KiB
Go
70 lines
1.9 KiB
Go
package api
|
|
|
|
import (
|
|
"net/http"
|
|
"time"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
|
|
"account/internal/agentserver"
|
|
)
|
|
|
|
type agentStatusReader interface {
|
|
Statuses() []agentserver.StatusSnapshot
|
|
}
|
|
|
|
type agentStatusEntry struct {
|
|
ID string `json:"id"`
|
|
Name string `json:"name,omitempty"`
|
|
Groups []string `json:"groups,omitempty"`
|
|
Healthy bool `json:"healthy"`
|
|
Message string `json:"message,omitempty"`
|
|
Users int `json:"users"`
|
|
SyncRevision string `json:"syncRevision,omitempty"`
|
|
UpdatedAt time.Time `json:"updatedAt"`
|
|
Xray agentXraySummary `json:"xray"`
|
|
}
|
|
|
|
type agentXraySummary struct {
|
|
Running bool `json:"running"`
|
|
Clients int `json:"clients"`
|
|
LastSync *time.Time `json:"lastSync,omitempty"`
|
|
}
|
|
|
|
func (h *handler) adminAgentStatus(c *gin.Context) {
|
|
if h.agentStatusReader == nil {
|
|
respondError(c, http.StatusServiceUnavailable, "agent_status_unavailable", "agent registry is not configured")
|
|
return
|
|
}
|
|
|
|
if _, ok := h.requireAdminOrOperator(c); !ok {
|
|
return
|
|
}
|
|
|
|
snapshots := h.agentStatusReader.Statuses()
|
|
entries := make([]agentStatusEntry, 0, len(snapshots))
|
|
for _, snapshot := range snapshots {
|
|
entry := agentStatusEntry{
|
|
ID: snapshot.Agent.ID,
|
|
Name: snapshot.Agent.Name,
|
|
Groups: append([]string(nil), snapshot.Agent.Groups...),
|
|
Healthy: snapshot.Report.Healthy,
|
|
Message: snapshot.Report.Message,
|
|
Users: snapshot.Report.Users,
|
|
SyncRevision: snapshot.Report.SyncRevision,
|
|
UpdatedAt: snapshot.UpdatedAt,
|
|
Xray: agentXraySummary{
|
|
Running: snapshot.Report.Xray.Running,
|
|
Clients: snapshot.Report.Xray.Clients,
|
|
},
|
|
}
|
|
if snapshot.Report.Xray.LastSync != nil {
|
|
last := *snapshot.Report.Xray.LastSync
|
|
entry.Xray.LastSync = &last
|
|
}
|
|
entries = append(entries, entry)
|
|
}
|
|
|
|
c.JSON(http.StatusOK, gin.H{"agents": entries})
|
|
}
|