fix: Enrollment-Duplikate, IPv6-Adresse, Agent-Status

- Backend: Enroll-Upsert via MAC-Adresse (kein Duplikat bei Neustart)
  HeartbeatInterval auf 30s reduziert
- Go collector: IPv4 bevorzugen, Loopback/Teredo/ISATAP überspringen,
  Link-Local IPv6 ignorieren
- Go main.go: Enrollment nimmt beste IPv4-Schnittstelle statt Networks[0]
This commit is contained in:
Claude Agent
2026-03-19 15:29:11 +01:00
parent 544d97b1ff
commit e55640d6a7
3 changed files with 64 additions and 11 deletions

View File

@@ -29,6 +29,24 @@ public class AgentGrpcService : AgentService.AgentServiceBase
public override async Task<EnrollResponse> Enroll(EnrollRequest request, ServerCallContext context)
{
// Upsert via MAC-Adresse — verhindert Duplikate bei Agent-Neustart
var existing = !string.IsNullOrEmpty(request.MacAddress)
? await _db.Agents.FirstOrDefaultAsync(a => a.MacAddress == request.MacAddress)
: null;
if (existing is not null)
{
existing.Hostname = request.Hostname;
existing.OsVersion = request.OsVersion;
existing.IpAddress = request.IpAddress;
existing.AgentVersion = request.AgentVersion;
existing.Status = AgentStatus.Online;
existing.LastSeen = DateTime.UtcNow;
await _db.SaveChangesAsync();
_logger.LogInformation("Agent re-enrolled: {AgentId} ({Hostname})", existing.Id, existing.Hostname);
return new EnrollResponse { AgentId = existing.Id.ToString(), HeartbeatInterval = 30 };
}
var agent = new AgentModel
{
Id = Guid.NewGuid(),
@@ -47,11 +65,7 @@ public class AgentGrpcService : AgentService.AgentServiceBase
await _db.SaveChangesAsync();
_logger.LogInformation("Agent enrolled: {AgentId} ({Hostname})", agent.Id, agent.Hostname);
return new EnrollResponse
{
AgentId = agent.Id.ToString(),
HeartbeatInterval = 60
};
return new EnrollResponse { AgentId = agent.Id.ToString(), HeartbeatInterval = 30 };
}
public override async Task<HeartbeatResponse> Heartbeat(HeartbeatRequest request, ServerCallContext context)