diff --git a/Watcher/Controllers/HomeController.cs b/Watcher/Controllers/HomeController.cs index 2032eb2..2fa4629 100644 --- a/Watcher/Controllers/HomeController.cs +++ b/Watcher/Controllers/HomeController.cs @@ -4,8 +4,8 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; // Local Namespaces using Watcher.Data; -using Watcher.Models; using Watcher.ViewModels; +using Watcher.Services; namespace Watcher.Controllers { @@ -18,11 +18,16 @@ namespace Watcher.Controllers // Logging einbinden private readonly ILogger _logger; + // Daten der Backgroundchecks abrufen + private INetworkCheckStore _NetworkCheckStore; + // HomeController Constructor - public HomeController(AppDbContext context, ILogger logger) + public HomeController(AppDbContext context, ILogger logger, INetworkCheckStore NetworkCheckStore) { _context = context; _logger = logger; + _NetworkCheckStore = NetworkCheckStore; + } // Dashboard unter /home/index @@ -36,6 +41,7 @@ namespace Watcher.Controllers .Where(u => u.Username == preferredUserName) .FirstOrDefaultAsync(); + Console.WriteLine("Index" + _NetworkCheckStore.NetworkStatus); var viewModel = new DashboardViewModel { ActiveServers = await _context.Servers.CountAsync(s => s.IsOnline), @@ -52,9 +58,10 @@ namespace Watcher.Controllers .ToListAsync(), Containers = await _context.Containers .OrderBy(s => s.Name) - .ToListAsync() + .ToListAsync(), + NetworkStatus = _NetworkCheckStore.NetworkStatus }; - + //ViewBag.NetworkConnection = _NetworkCheckStore.NetworkStatus; return View(viewModel); } @@ -67,6 +74,8 @@ namespace Watcher.Controllers var now = DateTime.UtcNow; + Console.WriteLine("DashboardStats" + _NetworkCheckStore.NetworkStatus); + var model = new DashboardViewModel { ActiveServers = await _context.Servers.CountAsync(s => s.IsOnline), @@ -82,11 +91,17 @@ namespace Watcher.Controllers .ToListAsync(), Containers = await _context.Containers .OrderBy(s => s.Name) - .ToListAsync() + .ToListAsync(), + NetworkStatus = _NetworkCheckStore.NetworkStatus }; return PartialView("_DashboardStats", model); } + public String ReturnNetworkStatus() + { + return "OK"; + } + } } diff --git a/Watcher/Program.cs b/Watcher/Program.cs index c20d108..847fe08 100644 --- a/Watcher/Program.cs +++ b/Watcher/Program.cs @@ -5,6 +5,7 @@ using Serilog; using Watcher.Data; using Watcher.Models; +using Watcher.Services; //using Watcher.Services; //using Watcher.Workers; @@ -15,7 +16,7 @@ var builder = WebApplication.CreateBuilder(args); // Serilog konfigurieren – nur Logs, die nicht von Microsoft stammen Log.Logger = new LoggerConfiguration() .MinimumLevel.Information() - .MinimumLevel.Override("Microsoft", Serilog.Events.LogEventLevel.Warning) // <-- + .MinimumLevel.Override("Microsoft", Serilog.Events.LogEventLevel.Warning) .Enrich.FromLogContext() .WriteTo.File( "logs/watcher-.log", @@ -33,6 +34,12 @@ builder.Services.AddControllersWithViews(); // HttpContentAccessor builder.Services.AddHttpContextAccessor(); +// Storage Singleton +builder.Services.AddSingleton(); + +// Background Services +builder.Services.AddHostedService(); + // ---------- Konfiguration ---------- DotNetEnv.Env.Load(); @@ -214,4 +221,4 @@ app.MapControllerRoute( pattern: "{controller=Home}/{action=Index}/{id?}" ); -app.Run(); +app.Run(); \ No newline at end of file diff --git a/Watcher/Services/INetworkCheckStore.cs b/Watcher/Services/INetworkCheckStore.cs new file mode 100644 index 0000000..996246d --- /dev/null +++ b/Watcher/Services/INetworkCheckStore.cs @@ -0,0 +1,6 @@ +namespace Watcher.Services; + +public interface INetworkCheckStore +{ + String? NetworkStatus { get; set; } +} diff --git a/Watcher/Services/NetworkCheck.cs b/Watcher/Services/NetworkCheck.cs new file mode 100644 index 0000000..6d34802 --- /dev/null +++ b/Watcher/Services/NetworkCheck.cs @@ -0,0 +1,58 @@ +using System.Composition; +using System.Net.NetworkInformation; + +namespace Watcher.Services; +public class NetworkCheck : BackgroundService +{ + private readonly ILogger _logger; + + private INetworkCheckStore _NetworkCheckStore; + + public NetworkCheck(ILogger logger, INetworkCheckStore NetworkCheckStore) + { + _logger = logger; + _NetworkCheckStore = NetworkCheckStore; + + } + + protected override async Task ExecuteAsync(CancellationToken stoppingToken) + { + var timer = new PeriodicTimer(TimeSpan.FromSeconds(30)); + + while (await timer.WaitForNextTickAsync(stoppingToken)) + { + // Hintergrundprozess abwarten + await checkConnectionAsync(); + + // 5 Sekdunden Offset + await Task.Delay(TimeSpan.FromSeconds(5), stoppingToken); + } + } + + public Task checkConnectionAsync() + { + _logger.LogInformation("Networkcheck started."); + + string host = "8.8.8.8"; + Ping p = new Ping(); + + try + { + PingReply reply = p.Send(host, 3000); + if (reply.Status == IPStatus.Success) + { + _NetworkCheckStore.NetworkStatus = "online"; + _logger.LogInformation("Ping successfull. Watcher is online."); + } + } + catch + { + _NetworkCheckStore.NetworkStatus = "offline"; + _logger.LogError("Ping failed. Watcher appears to have no network connection."); + } + + _logger.LogInformation("Networkcheck finished."); + + return Task.CompletedTask; + } +} \ No newline at end of file diff --git a/Watcher/Services/NetworkCheckStore.cs b/Watcher/Services/NetworkCheckStore.cs new file mode 100644 index 0000000..66e73e7 --- /dev/null +++ b/Watcher/Services/NetworkCheckStore.cs @@ -0,0 +1,6 @@ +namespace Watcher.Services; + +public class NetworkCheckStore : INetworkCheckStore +{ + public String? NetworkStatus { get; set; } +} \ No newline at end of file diff --git a/Watcher/ViewModels/DashboardViewModel.cs b/Watcher/ViewModels/DashboardViewModel.cs index 624c9bd..c2cb489 100644 --- a/Watcher/ViewModels/DashboardViewModel.cs +++ b/Watcher/ViewModels/DashboardViewModel.cs @@ -14,5 +14,7 @@ namespace Watcher.ViewModels public List RecentEvents { get; set; } = new(); public List Containers { get; set; } = new(); + public String? NetworkStatus { get; set; } = "?"; + } } diff --git a/Watcher/Views/Home/_DashboardStats.cshtml b/Watcher/Views/Home/_DashboardStats.cshtml index 3e23ccb..f0a8861 100644 --- a/Watcher/Views/Home/_DashboardStats.cshtml +++ b/Watcher/Views/Home/_DashboardStats.cshtml @@ -1,3 +1,4 @@ +@using Microsoft.IdentityModel.Tokens @model Watcher.ViewModels.DashboardViewModel @{ @@ -57,13 +58,28 @@
Systemstatus
-
- Netzwerk - OK -
-
-
-
+ @if (!Model.NetworkStatus.IsNullOrEmpty()) + { + @if (Model.NetworkStatus == "online") + { +
+ Netzwerk + @Model.NetworkStatus +
+
+
+
+ } else if (Model.NetworkStatus == "offline") + { +
+ Netzwerk + @Model.NetworkStatus +
+
+
+
+ } + }
Datenbank @@ -123,10 +139,10 @@ {
  • @server.Name - + CPU: 30.45% - + RAM: 65.09% diff --git a/Watcher/persistence/watcher.db-shm b/Watcher/persistence/watcher.db-shm deleted file mode 100644 index fe9ac28..0000000 Binary files a/Watcher/persistence/watcher.db-shm and /dev/null differ diff --git a/Watcher/persistence/watcher.db-wal b/Watcher/persistence/watcher.db-wal deleted file mode 100644 index e69de29..0000000