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