fix: heartbeat system_data als RawMessage — Windows/beliebige Plattformen ohne Datenverlust
This commit is contained in:
@@ -354,6 +354,52 @@ func (d *Database) RegisterAgent(agent *models.Agent) error {
|
||||
return err
|
||||
}
|
||||
|
||||
// SaveSystemDataRaw speichert rohe JSON-Systemdaten (plattformunabhaengig)
|
||||
func (d *Database) SaveSystemDataRaw(agentID string, raw json.RawMessage) error {
|
||||
now := time.Now().UTC()
|
||||
|
||||
// Leeres JSON als leeres Objekt behandeln
|
||||
if len(raw) == 0 {
|
||||
raw = json.RawMessage("{}")
|
||||
}
|
||||
|
||||
tx, err := d.db.Begin()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer tx.Rollback()
|
||||
|
||||
res, err := tx.Exec("UPDATE agents SET last_heartbeat = $1 WHERE id = $2", now, agentID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
rows, _ := res.RowsAffected()
|
||||
if rows == 0 {
|
||||
return fmt.Errorf("Agent %s nicht gefunden", agentID)
|
||||
}
|
||||
|
||||
_, err = tx.Exec(`
|
||||
INSERT INTO system_data (agent_id, data_json, updated_at)
|
||||
VALUES ($1, $2, $3)
|
||||
ON CONFLICT(agent_id) DO UPDATE SET
|
||||
data_json=EXCLUDED.data_json,
|
||||
updated_at=EXCLUDED.updated_at
|
||||
`, agentID, string(raw), now)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Metriken nur fuer OPNsense/Linux (haben bekannte Struct-Form)
|
||||
var sd models.SystemData
|
||||
if err2 := json.Unmarshal(raw, &sd); err2 == nil && sd.CPU.Threads > 0 {
|
||||
if err2 := d.writeMetrics(tx, agentID, now, &sd); err2 != nil {
|
||||
log.Printf("Metriken schreiben Warnung: %v", err2)
|
||||
}
|
||||
}
|
||||
|
||||
return tx.Commit()
|
||||
}
|
||||
|
||||
func (d *Database) SaveSystemData(agentID string, data *models.SystemData) error {
|
||||
now := time.Now().UTC()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user