145 lines
3.8 KiB
C#
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.");
|
|
|
|
}
|
|
} |