zadmin/internal/server/natsHandlers.go
2025-04-07 19:28:20 +02:00

75 lines
2.1 KiB
Go

package server
import (
"encoding/json"
"strconv"
"strings"
"git.mziesel.nl/mans/zadmin/internal/models"
"github.com/nats-io/nats.go"
)
func (s *Server) registerNatsHandlers() {
s.Logger.Info("Setting up nats handlers")
s.NATS.Subscribe("c.*.stats", func(msg *nats.Msg) {
s.ProcessHostStats(msg)
})
}
func (s *Server) ProcessHostStats(msg *nats.Msg) {
hostIdString := strings.Split(msg.Subject, ".")[1]
hostId, err := strconv.Atoi(hostIdString)
if err != nil {
s.Logger.Error(err)
return
}
data := models.HostStatistics{}
err = json.Unmarshal(msg.Data, &data)
if err != nil {
s.Logger.Error(err)
return
}
s.Logger.Debugf("Stats received on [%s]", msg.Subject)
reportedStats := models.HostStatistics{}
err = json.Unmarshal(msg.Data, &reportedStats)
if err != nil {
s.Logger.Error(err)
}
// Do not let user control all fields, ensure security this way
safeStats := models.HostStatistics{
// TODO: verify hostID
HostID: hostId,
TimeCollected: reportedStats.TimeCollected,
CpuUser: reportedStats.CpuUser,
CpuSystem: reportedStats.CpuSystem,
CpuIdle: reportedStats.CpuIdle,
CpuIowait: reportedStats.CpuIowait,
CpuSteal: reportedStats.CpuSteal,
CpuCount: reportedStats.CpuCount,
MemoryTotal: reportedStats.MemoryTotal,
MemoryUsed: reportedStats.MemoryUsed,
MemoryCached: reportedStats.MemoryCached,
MemoryFree: reportedStats.MemoryFree,
MemoryAvailable: reportedStats.MemoryAvailable,
LoadAVG1: reportedStats.LoadAVG1,
LoadAVG5: reportedStats.LoadAVG5,
LoadAVG15: reportedStats.LoadAVG15,
}
safeHost := models.Host{
PublicIPv4Address: reportedStats.Host.PublicIPv4Address,
PublicIPv6Address: reportedStats.Host.PublicIPv6Address,
UptimeSeconds: reportedStats.Host.UptimeSeconds,
Hostname: reportedStats.Host.Hostname,
}
// todo, do not accept safe deleted items
h := s.DB.Model(&models.Host{}).Where("id = ?", hostId)
if h.Error != nil {
s.Logger.Error(err)
return
}
h.Updates(safeHost)
s.DB.Create(&safeStats)
}