75 lines
2.1 KiB
Go
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)
|
|
}
|