ka
This commit is contained in:
@@ -185,17 +185,29 @@ public class MonitoringController : Controller
|
|||||||
return BadRequest(new { error = "Ungültiger Payload", details = errors });
|
return BadRequest(new { error = "Ungültiger Payload", details = errors });
|
||||||
}
|
}
|
||||||
|
|
||||||
// Server in Datenbank finden
|
// Debug-Logging
|
||||||
var server = await _context.Servers
|
_logger.LogDebug("Metric Request empfangen: ServerId={ServerId}, IpAddress={IpAddress}",
|
||||||
.FirstOrDefaultAsync(s => s.Id == dto.ServerId);
|
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)
|
||||||
{
|
{
|
||||||
|
_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."
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
// neues Metric-Objekt erstellen
|
// neues Metric-Objekt erstellen
|
||||||
var newMetric = new Metric
|
var newMetric = new Metric
|
||||||
{
|
{
|
||||||
Timestamp = DateTime.UtcNow,
|
Timestamp = DateTime.UtcNow,
|
||||||
ServerId = dto.ServerId,
|
ServerId = server.Id, // Verwende die tatsächliche Server-ID aus der DB
|
||||||
CPU_Load = SanitizeInput(dto.CPU_Load),
|
CPU_Load = SanitizeInput(dto.CPU_Load),
|
||||||
CPU_Temp = SanitizeInput(dto.CPU_Temp),
|
CPU_Temp = SanitizeInput(dto.CPU_Temp),
|
||||||
GPU_Load = SanitizeInput(dto.GPU_Load),
|
GPU_Load = SanitizeInput(dto.GPU_Load),
|
||||||
@@ -210,29 +222,25 @@ public class MonitoringController : Controller
|
|||||||
NET_In = CalculateMegabit(dto.NET_In),
|
NET_In = CalculateMegabit(dto.NET_In),
|
||||||
NET_Out = CalculateMegabit(dto.NET_Out)
|
NET_Out = CalculateMegabit(dto.NET_Out)
|
||||||
};
|
};
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
// Metric Objekt in Datenbank einfügen
|
// Metric Objekt in Datenbank einfügen
|
||||||
_context.Metrics.Add(newMetric);
|
_context.Metrics.Add(newMetric);
|
||||||
await _context.SaveChangesAsync();
|
await _context.SaveChangesAsync();
|
||||||
|
|
||||||
_logger.LogInformation("Monitoring-Daten für '{server}' empfangen", server.Name);
|
_logger.LogInformation("Monitoring-Daten für Server '{ServerName}' (ID: {ServerId}) in Datenbank geschrieben",
|
||||||
|
server.Name, server.Id);
|
||||||
return Ok();
|
return Ok();
|
||||||
}
|
}
|
||||||
catch
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
// Alert triggern
|
_logger.LogError(ex, "Metric für Server '{ServerName}' (ID: {ServerId}) konnte nicht gespeichert werden",
|
||||||
|
server.Name, server.Id);
|
||||||
_logger.LogError("Metric für {server} konnte nicht in Datenbank geschrieben werden.", server.Name);
|
return StatusCode(500, new { error = "Database error", details = ex.Message });
|
||||||
return BadRequest();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_logger.LogError("Kein Server für eingegangenen Monitoring-Payload gefunden");
|
|
||||||
return NotFound("No Matching Server found.");
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Endpoint, an dem Agents Ihre laufenden Services registrieren
|
// Endpoint, an dem Agents Ihre laufenden Services registrieren
|
||||||
[HttpPost("service-discovery")]
|
[HttpPost("service-discovery")]
|
||||||
public async Task<IActionResult> ServiceDetection([FromBody] DockerServiceDto dto)
|
public async Task<IActionResult> ServiceDetection([FromBody] DockerServiceDto dto)
|
||||||
@@ -253,25 +261,17 @@ public class MonitoringController : Controller
|
|||||||
_logger.LogDebug("Service-Discovery Request empfangen: Server_id={ServerId}, IpAddress={IpAddress}",
|
_logger.LogDebug("Service-Discovery Request empfangen: Server_id={ServerId}, IpAddress={IpAddress}",
|
||||||
dto.Server_id, dto.IpAddress ?? "null");
|
dto.Server_id, dto.IpAddress ?? "null");
|
||||||
|
|
||||||
// Server anhand IP-Adresse oder ID finden
|
// Server in Datenbank finden (priorisiert IP-Adresse, dann ID)
|
||||||
Server? server = null;
|
var server = await FindServerByIpOrId(dto.Server_id);
|
||||||
|
|
||||||
// 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);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (server == null)
|
if (server == null)
|
||||||
{
|
{
|
||||||
_logger.LogError("Server with IP '{IpAddress}' or ID {ServerId} does not exist.", dto.IpAddress, dto.Server_id);
|
_logger.LogError("Server with IP '{IpAddress}' or ID {ServerId} does not exist.",
|
||||||
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." });
|
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
|
// Server ID für die weitere Verarbeitung setzen
|
||||||
@@ -541,6 +541,40 @@ public class MonitoringController : Controller
|
|||||||
return Math.Round(metricInput, 2);
|
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)
|
private List<Container> ParseServiceDiscoveryInput(int serverId, List<Container> containers)
|
||||||
{
|
{
|
||||||
List<Container> containerList = new List<Container>();
|
List<Container> containerList = new List<Container>();
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
using Microsoft.AspNetCore.Authorization;
|
using Microsoft.AspNetCore.Authorization;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
using Watcher.Data;
|
using Watcher.Data;
|
||||||
using Watcher.ViewModels;
|
using Watcher.ViewModels;
|
||||||
|
|
||||||
@@ -20,12 +21,12 @@ public class UserController : Controller
|
|||||||
|
|
||||||
// Anzeigen der User-Informationen
|
// Anzeigen der User-Informationen
|
||||||
[Authorize]
|
[Authorize]
|
||||||
public IActionResult Info()
|
public async Task<IActionResult> Info()
|
||||||
{
|
{
|
||||||
var claims = User.Claims.Select(c => new { c.Type, c.Value }).ToList();
|
var claims = User.Claims.Select(c => new { c.Type, c.Value }).ToList();
|
||||||
var Identity_User = User.Identity?.Name;
|
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();
|
if (user == null) return NotFound();
|
||||||
|
|
||||||
// Anzeigedaten
|
// Anzeigedaten
|
||||||
@@ -47,10 +48,10 @@ public class UserController : Controller
|
|||||||
// Edit-Form anzeigen
|
// Edit-Form anzeigen
|
||||||
[Authorize]
|
[Authorize]
|
||||||
[HttpGet]
|
[HttpGet]
|
||||||
public IActionResult Edit()
|
public async Task<IActionResult> Edit()
|
||||||
{
|
{
|
||||||
var username = User.Identity?.Name;
|
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();
|
if (user == null) return NotFound();
|
||||||
|
|
||||||
|
|
||||||
@@ -65,12 +66,12 @@ public class UserController : Controller
|
|||||||
[Authorize]
|
[Authorize]
|
||||||
[HttpPost]
|
[HttpPost]
|
||||||
[ValidateAntiForgeryToken]
|
[ValidateAntiForgeryToken]
|
||||||
public IActionResult Edit(EditUserViewModel model)
|
public async Task<IActionResult> Edit(EditUserViewModel model)
|
||||||
{
|
{
|
||||||
if (!ModelState.IsValid) return View(model);
|
if (!ModelState.IsValid) return View(model);
|
||||||
|
|
||||||
var username = User.Identity?.Name;
|
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();
|
if (user == null) return NotFound();
|
||||||
|
|
||||||
user.Username = model.Username;
|
user.Username = model.Username;
|
||||||
@@ -80,7 +81,7 @@ public class UserController : Controller
|
|||||||
user.Password = BCrypt.Net.BCrypt.HashPassword(model.NewPassword);
|
user.Password = BCrypt.Net.BCrypt.HashPassword(model.NewPassword);
|
||||||
}
|
}
|
||||||
|
|
||||||
_context.SaveChanges();
|
await _context.SaveChangesAsync();
|
||||||
|
|
||||||
// Eventuell hier das Auth-Cookie erneuern, wenn Username sich ändert
|
// Eventuell hier das Auth-Cookie erneuern, wenn Username sich ändert
|
||||||
|
|
||||||
@@ -93,12 +94,12 @@ public class UserController : Controller
|
|||||||
[Authorize]
|
[Authorize]
|
||||||
[HttpPost]
|
[HttpPost]
|
||||||
[ValidateAntiForgeryToken]
|
[ValidateAntiForgeryToken]
|
||||||
public IActionResult UserSettings(EditUserViewModel model)
|
public async Task<IActionResult> UserSettings(EditUserViewModel model)
|
||||||
{
|
{
|
||||||
if (!ModelState.IsValid) return View(model);
|
if (!ModelState.IsValid) return View(model);
|
||||||
|
|
||||||
var username = User.Identity?.Name;
|
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();
|
if (user == null) return NotFound();
|
||||||
|
|
||||||
var databaseProvider = _context.Database.ProviderName;
|
var databaseProvider = _context.Database.ProviderName;
|
||||||
@@ -111,7 +112,7 @@ public class UserController : Controller
|
|||||||
user.Password = BCrypt.Net.BCrypt.HashPassword(model.NewPassword);
|
user.Password = BCrypt.Net.BCrypt.HashPassword(model.NewPassword);
|
||||||
}
|
}
|
||||||
|
|
||||||
_context.SaveChanges();
|
await _context.SaveChangesAsync();
|
||||||
|
|
||||||
// Eventuell hier das Auth-Cookie erneuern, wenn Username sich ändert
|
// Eventuell hier das Auth-Cookie erneuern, wenn Username sich ändert
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user