Files
watcher/Watcher/Controllers/MonitoringController.cs
2025-06-25 19:51:55 +02:00

145 lines
3.8 KiB
C#

using System.ComponentModel.DataAnnotations;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.CodeAnalysis;
using Microsoft.EntityFrameworkCore;
using Microsoft.IdentityModel.Tokens;
using Watcher.Data;
using Watcher.Models;
using Watcher.ViewModels;
namespace Watcher.Controllers;
public class RegistrationDto
{
// Server Identity
[Required]
public int Id { get; set; }
[Required]
public string? IpAddress { get; set; }
// Hardware Info
[Required]
public string? CpuType { get; set; }
[Required]
public int CpuCores { get; set; }
[Required]
public string? GpuType { get; set; }
[Required]
public double RamSize { get; set; }
}
public class MetricDto
{
// Server Identity
[Required]
public int Id { get; set; }
[Required]
public string? IpAddress { get; set; }
// Metrics
// CPU Auslastung, CPU Temperatur
// GPU Auslastung, GPU Temperatur
// RAM Auslastung
// Disks?
}
[ApiController]
[Route("[controller]")]
public class MonitoringController : Controller
{
private readonly AppDbContext _context;
private readonly ILogger<MonitoringController> _logger;
public MonitoringController(AppDbContext context, ILogger<MonitoringController> logger)
{
_context = context;
_logger = logger;
}
// Endpoint, an dem sich neue Agents registrieren
[HttpPost("register")]
public async Task<IActionResult> Register([FromBody] RegistrationDto dto)
{
// Gültigkeit des Payloads prüfen
if (!ModelState.IsValid)
{
var errors = ModelState.Values
.SelectMany(v => v.Errors)
.Select(e => e.ErrorMessage)
.ToList();
_logger.LogError("Fehlerhafter Registrierungs-Payload.");
return BadRequest(new { error = "Ungültiger Payload", details = errors });
}
// Server in Datenbank finden
var server = await _context.Servers
.FirstOrDefaultAsync(s => s.IPAddress == dto.IpAddress);
if (server != null)
{
// Serverdaten in Datenbank eintragen
server.CpuType = dto.CpuType;
server.CpuCores = dto.CpuCores;
server.GpuType = dto.GpuType;
server.RamSize = dto.RamSize;
// Änderungen in Datenbank speichern
await _context.SaveChangesAsync();
// Success
_logger.LogInformation("Agent für '{server}' erfolgreich registriert.", server.Name);
return Ok();
}
_logger.LogError("Kein Server für Registrierung gefunden");
return NotFound("No Matching Server found.");
}
// Enpoint, an den Agents Ihre gesammelten Daten senden
[HttpPost("metric")]
public async Task<IActionResult> Receive([FromBody] MetricDto dto)
{
// Gültigkeit des Payloads prüfen
if (!ModelState.IsValid)
{
var errors = ModelState.Values
.SelectMany(v => v.Errors)
.Select(e => e.ErrorMessage)
.ToList();
_logger.LogError("Ungültiger Monitoring-Payload.");
return BadRequest(new { error = "Ungültiger Payload", details = errors });
}
// Server in Datenbank finden
var server = await _context.Servers
.FirstOrDefaultAsync(s => s.IPAddress == dto.IpAddress);
if (server != null)
{
// TODO: Serverdaten in Datenbank eintragen
// Success
_logger.LogInformation("Monitoring-Daten für '{server}' empfangen", server.Name);
return Ok();
}
_logger.LogError("Kein Server für eingegangenen Monitoring-Payload gefunden");
return NotFound("No Matching Server found.");
}
}