diff --git a/Watcher/Controllers/MonitoringController.cs b/Watcher/Controllers/MonitoringController.cs index 0e60c8b..7ca3fe9 100644 --- a/Watcher/Controllers/MonitoringController.cs +++ b/Watcher/Controllers/MonitoringController.cs @@ -185,52 +185,60 @@ public class MonitoringController : Controller return BadRequest(new { error = "Ungültiger Payload", details = errors }); } - // Server in Datenbank finden - var server = await _context.Servers - .FirstOrDefaultAsync(s => s.Id == dto.ServerId); + // Debug-Logging + _logger.LogDebug("Metric Request empfangen: ServerId={ServerId}, IpAddress={IpAddress}", + dto.ServerId, dto.IpAddress ?? "null"); - if (server != null) + // Server in Datenbank finden (priorisiert IP-Adresse, dann ID) + _logger.LogInformation("ServerID: {ServerId}", dto.ServerId); + var server = await FindServerByIpOrId(dto.ServerId); + + if (server == null) { - // neues Metric-Objekt erstellen - var newMetric = new Metric - { - Timestamp = DateTime.UtcNow, - ServerId = dto.ServerId, - CPU_Load = SanitizeInput(dto.CPU_Load), - CPU_Temp = SanitizeInput(dto.CPU_Temp), - GPU_Load = SanitizeInput(dto.GPU_Load), - GPU_Temp = SanitizeInput(dto.GPU_Temp), - GPU_Vram_Size = CalculateGigabyte(dto.GPU_Vram_Size), - GPU_Vram_Usage = SanitizeInput(dto.GPU_Vram_Load), - RAM_Load = SanitizeInput(dto.RAM_Load), - RAM_Size = CalculateGigabyte(dto.RAM_Size), - DISK_Size = CalculateGigabyte(dto.DISK_Size), - DISK_Usage = CalculateGigabyte(dto.DISK_Usage), - DISK_Temp = SanitizeInput(dto.DISK_Temp), - NET_In = CalculateMegabit(dto.NET_In), - NET_Out = CalculateMegabit(dto.NET_Out) - }; - try - { - // Metric Objekt in Datenbank einfügen - _context.Metrics.Add(newMetric); - await _context.SaveChangesAsync(); - - _logger.LogInformation("Monitoring-Daten für '{server}' empfangen", server.Name); - return Ok(); - } - catch - { - // Alert triggern - - _logger.LogError("Metric für {server} konnte nicht in Datenbank geschrieben werden.", server.Name); - return BadRequest(); - } + _logger.LogError("Kein Server mit IP '{IpAddress}' oder ID {ServerId} gefunden", + dto.IpAddress, dto.ServerId); + return NotFound(new { + error = "Server not found", + details = $"Server mit ID {dto.ServerId} existiert nicht. Bitte zuerst registrieren." + }); } - _logger.LogError("Kein Server für eingegangenen Monitoring-Payload gefunden"); - return NotFound("No Matching Server found."); + // neues Metric-Objekt erstellen + var newMetric = new Metric + { + Timestamp = DateTime.UtcNow, + ServerId = server.Id, // Verwende die tatsächliche Server-ID aus der DB + CPU_Load = SanitizeInput(dto.CPU_Load), + CPU_Temp = SanitizeInput(dto.CPU_Temp), + GPU_Load = SanitizeInput(dto.GPU_Load), + GPU_Temp = SanitizeInput(dto.GPU_Temp), + GPU_Vram_Size = CalculateGigabyte(dto.GPU_Vram_Size), + GPU_Vram_Usage = SanitizeInput(dto.GPU_Vram_Load), + RAM_Load = SanitizeInput(dto.RAM_Load), + RAM_Size = CalculateGigabyte(dto.RAM_Size), + DISK_Size = CalculateGigabyte(dto.DISK_Size), + DISK_Usage = CalculateGigabyte(dto.DISK_Usage), + DISK_Temp = SanitizeInput(dto.DISK_Temp), + NET_In = CalculateMegabit(dto.NET_In), + NET_Out = CalculateMegabit(dto.NET_Out) + }; + try + { + // Metric Objekt in Datenbank einfügen + _context.Metrics.Add(newMetric); + await _context.SaveChangesAsync(); + + _logger.LogInformation("Monitoring-Daten für Server '{ServerName}' (ID: {ServerId}) in Datenbank geschrieben", + server.Name, server.Id); + return Ok(); + } + catch (Exception ex) + { + _logger.LogError(ex, "Metric für Server '{ServerName}' (ID: {ServerId}) konnte nicht gespeichert werden", + server.Name, server.Id); + return StatusCode(500, new { error = "Database error", details = ex.Message }); + } } // Endpoint, an dem Agents Ihre laufenden Services registrieren @@ -253,25 +261,17 @@ public class MonitoringController : Controller _logger.LogDebug("Service-Discovery Request empfangen: Server_id={ServerId}, IpAddress={IpAddress}", dto.Server_id, dto.IpAddress ?? "null"); - // Server anhand IP-Adresse oder ID finden - Server? server = null; - - // Zuerst versuchen, Server anhand der IP-Adresse zu finden (bevorzugte Methode) - if (!string.IsNullOrEmpty(dto.IpAddress)) - { - server = await _context.Servers.FirstOrDefaultAsync(s => s.IPAddress == dto.IpAddress); - } - // Falls keine IP-Adresse übergeben wurde oder Server nicht gefunden, versuche es mit der ID - // WICHTIG: >= 0 da Server-IDs bei 0 starten können - else if (dto.Server_id >= 0) - { - server = await _context.Servers.FirstOrDefaultAsync(s => s.Id == dto.Server_id); - } + // Server in Datenbank finden (priorisiert IP-Adresse, dann ID) + var server = await FindServerByIpOrId(dto.Server_id); if (server == null) { - _logger.LogError("Server with IP '{IpAddress}' or ID {ServerId} does not exist.", dto.IpAddress, dto.Server_id); - return BadRequest(new { error = "Server not found", details = $"Server with IP '{dto.IpAddress}' or ID {dto.Server_id} does not exist. Please register the server first." }); + _logger.LogError("Server with IP '{IpAddress}' or ID {ServerId} does not exist.", + dto.IpAddress, dto.Server_id); + return BadRequest(new { + error = "Server not found", + details = $"Server with IP '{dto.IpAddress}' or ID {dto.Server_id} does not exist. Please register the server first." + }); } // Server ID für die weitere Verarbeitung setzen @@ -541,6 +541,40 @@ public class MonitoringController : Controller return Math.Round(metricInput, 2); } + // ==================== HELPER METHODS ==================== + + /// + /// Findet einen Server anhand IP-Adresse oder ID. + /// Priorisiert IP-Adresse, fällt dann auf ID zurück. + /// + /// IP-Adresse des Servers (bevorzugt) + /// Server-ID (Fallback) + /// Server-Objekt oder null wenn nicht gefunden + private async Task FindServerByIpOrId(int serverId) + { + // WICHTIG: >= 0 da Server-IDs bei 0 starten können + if (serverId >= 0) + { + var server = await _context.Servers + .FirstOrDefaultAsync(s => s.Id == serverId); + + if (server != null) + { + _logger.LogDebug("Server gefunden via ID: {ServerName}", server.Name); + return server; + } else { + // Server nicht gefunden + _logger.LogWarning("Server nicht gefunden: ID={ServerId}", serverId); + return null; + } + } else { + _logger.LogWarning("Ungültige ID abgefragt!"); + return null; + } + + + } + private List ParseServiceDiscoveryInput(int serverId, List containers) { List containerList = new List(); diff --git a/Watcher/Controllers/UserController.cs b/Watcher/Controllers/UserController.cs index 3e9197c..891d601 100644 --- a/Watcher/Controllers/UserController.cs +++ b/Watcher/Controllers/UserController.cs @@ -1,5 +1,6 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; +using Microsoft.EntityFrameworkCore; using Watcher.Data; using Watcher.ViewModels; @@ -20,12 +21,12 @@ public class UserController : Controller // Anzeigen der User-Informationen [Authorize] - public IActionResult Info() + public async Task Info() { var claims = User.Claims.Select(c => new { c.Type, c.Value }).ToList(); var Identity_User = User.Identity?.Name; - var user = _context.Users.FirstOrDefaultAsync(u => u.Username == Identity_User); + var user = await _context.Users.FirstOrDefaultAsync(u => u.Username == Identity_User); if (user == null) return NotFound(); // Anzeigedaten @@ -39,7 +40,7 @@ public class UserController : Controller ViewBag.Name = username; ViewBag.Mail = mail; ViewBag.Id = Id; - + return View(); } @@ -47,10 +48,10 @@ public class UserController : Controller // Edit-Form anzeigen [Authorize] [HttpGet] - public IActionResult Edit() + public async Task Edit() { var username = User.Identity?.Name; - var user = _context.Users.FirstOrDefaultAsync(u => u.Username == username); + var user = await _context.Users.FirstOrDefaultAsync(u => u.Username == username); if (user == null) return NotFound(); @@ -65,12 +66,12 @@ public class UserController : Controller [Authorize] [HttpPost] [ValidateAntiForgeryToken] - public IActionResult Edit(EditUserViewModel model) + public async Task Edit(EditUserViewModel model) { if (!ModelState.IsValid) return View(model); var username = User.Identity?.Name; - var user = _context.Users.FirstOrDefaultAsync(u => u.Username == username); + var user = await _context.Users.FirstOrDefaultAsync(u => u.Username == username); if (user == null) return NotFound(); user.Username = model.Username; @@ -80,7 +81,7 @@ public class UserController : Controller user.Password = BCrypt.Net.BCrypt.HashPassword(model.NewPassword); } - _context.SaveChanges(); + await _context.SaveChangesAsync(); // Eventuell hier das Auth-Cookie erneuern, wenn Username sich ändert @@ -93,12 +94,12 @@ public class UserController : Controller [Authorize] [HttpPost] [ValidateAntiForgeryToken] - public IActionResult UserSettings(EditUserViewModel model) + public async Task UserSettings(EditUserViewModel model) { if (!ModelState.IsValid) return View(model); var username = User.Identity?.Name; - var user = _context.Users.FirstOrDefault(u => u.Username == username); + var user = await _context.Users.FirstOrDefaultAsync(u => u.Username == username); if (user == null) return NotFound(); var databaseProvider = _context.Database.ProviderName; @@ -111,7 +112,7 @@ public class UserController : Controller user.Password = BCrypt.Net.BCrypt.HashPassword(model.NewPassword); } - _context.SaveChanges(); + await _context.SaveChangesAsync(); // Eventuell hier das Auth-Cookie erneuern, wenn Username sich ändert