This commit is contained in:
2025-12-03 15:02:12 +01:00
parent 6eec58b8e7
commit 4903187a37
2 changed files with 103 additions and 68 deletions

View File

@@ -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 ====================
/// <summary>
/// Findet einen Server anhand IP-Adresse oder ID.
/// Priorisiert IP-Adresse, fällt dann auf ID zurück.
/// </summary>
/// <param name="ipAddress">IP-Adresse des Servers (bevorzugt)</param>
/// <param name="serverId">Server-ID (Fallback)</param>
/// <returns>Server-Objekt oder null wenn nicht gefunden</returns>
private async Task<Server> 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<Container> ParseServiceDiscoveryInput(int serverId, List<Container> containers)
{
List<Container> containerList = new List<Container>();

View File

@@ -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<IActionResult> 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
@@ -47,10 +48,10 @@ public class UserController : Controller
// Edit-Form anzeigen
[Authorize]
[HttpGet]
public IActionResult Edit()
public async Task<IActionResult> 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<IActionResult> 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<IActionResult> 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