From 6248fad147e8a8eca6e402b3986a928f648cd27d Mon Sep 17 00:00:00 2001 From: daniel-hbn Date: Wed, 1 Oct 2025 08:14:36 +0200 Subject: [PATCH 1/2] =?UTF-8?q?Background=20Service=20l=C3=A4uft=20im=2060?= =?UTF-8?q?=20Sekunden=20Rythmus.=20Ergebnis=20wird=20noch=20nciht=20gespe?= =?UTF-8?q?ichert?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Watcher/Controllers/HomeController.cs | 11 ++-- Watcher/Program.cs | 6 ++- Watcher/Services/NetworkCheck.cs | 59 ++++++++++++++++++++++ Watcher/Views/Home/_DashboardStats.cshtml | 2 +- Watcher/persistence/watcher.db-shm | Bin 32768 -> 0 bytes Watcher/persistence/watcher.db-wal | 0 6 files changed, 73 insertions(+), 5 deletions(-) create mode 100644 Watcher/Services/NetworkCheck.cs delete mode 100644 Watcher/persistence/watcher.db-shm delete mode 100644 Watcher/persistence/watcher.db-wal diff --git a/Watcher/Controllers/HomeController.cs b/Watcher/Controllers/HomeController.cs index 2032eb2..5579444 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 { @@ -52,9 +52,9 @@ namespace Watcher.Controllers .ToListAsync(), Containers = await _context.Containers .OrderBy(s => s.Name) - .ToListAsync() + .ToListAsync(), }; - + //ViewBag.NetworkConnection = ReturnNetworkStatus(); return View(viewModel); } @@ -88,5 +88,10 @@ namespace Watcher.Controllers return PartialView("_DashboardStats", model); } + public String ReturnNetworkStatus() + { + return "OK"; + } + } } diff --git a/Watcher/Program.cs b/Watcher/Program.cs index c20d108..fd948b8 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,9 @@ builder.Services.AddControllersWithViews(); // HttpContentAccessor builder.Services.AddHttpContextAccessor(); +// Background Services +builder.Services.AddHostedService(); + // ---------- Konfiguration ---------- DotNetEnv.Env.Load(); diff --git a/Watcher/Services/NetworkCheck.cs b/Watcher/Services/NetworkCheck.cs new file mode 100644 index 0000000..a4baf03 --- /dev/null +++ b/Watcher/Services/NetworkCheck.cs @@ -0,0 +1,59 @@ +using System.Composition; +using System.Net.NetworkInformation; + +namespace Watcher.Services; +public class NetworkCheck : BackgroundService +{ + private readonly ILogger _logger; + + public static String networkCheckResult + { + get { return networkCheckResult; } + set { networkCheckResult = value; } + + } + + public NetworkCheck(ILogger logger) + { + _logger = logger; + } + + 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) + { + _logger.LogInformation("Ping successfull. Watcher is online."); + } + } + catch + { + _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/Views/Home/_DashboardStats.cshtml b/Watcher/Views/Home/_DashboardStats.cshtml index 3e23ccb..ee6e81c 100644 --- a/Watcher/Views/Home/_DashboardStats.cshtml +++ b/Watcher/Views/Home/_DashboardStats.cshtml @@ -59,7 +59,7 @@
Netzwerk - OK + NetworkConnection
diff --git a/Watcher/persistence/watcher.db-shm b/Watcher/persistence/watcher.db-shm deleted file mode 100644 index fe9ac2845eca6fe6da8a63cd096d9cf9e24ece10..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32768 zcmeIuAr62r3 Date: Wed, 1 Oct 2025 10:15:50 +0200 Subject: [PATCH 2/2] Live Anzeige des Netzwerkstatus funktioniert --- Watcher/Controllers/HomeController.cs | 16 +++++++++-- Watcher/Program.cs | 5 +++- Watcher/Services/INetworkCheckStore.cs | 6 ++++ Watcher/Services/NetworkCheck.cs | 13 ++++----- Watcher/Services/NetworkCheckStore.cs | 6 ++++ Watcher/ViewModels/DashboardViewModel.cs | 2 ++ Watcher/Views/Home/_DashboardStats.cshtml | 34 +++++++++++++++++------ 7 files changed, 62 insertions(+), 20 deletions(-) create mode 100644 Watcher/Services/INetworkCheckStore.cs create mode 100644 Watcher/Services/NetworkCheckStore.cs diff --git a/Watcher/Controllers/HomeController.cs b/Watcher/Controllers/HomeController.cs index 5579444..2fa4629 100644 --- a/Watcher/Controllers/HomeController.cs +++ b/Watcher/Controllers/HomeController.cs @@ -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), @@ -53,8 +59,9 @@ namespace Watcher.Controllers Containers = await _context.Containers .OrderBy(s => s.Name) .ToListAsync(), + NetworkStatus = _NetworkCheckStore.NetworkStatus }; - //ViewBag.NetworkConnection = ReturnNetworkStatus(); + //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,7 +91,8 @@ namespace Watcher.Controllers .ToListAsync(), Containers = await _context.Containers .OrderBy(s => s.Name) - .ToListAsync() + .ToListAsync(), + NetworkStatus = _NetworkCheckStore.NetworkStatus }; return PartialView("_DashboardStats", model); diff --git a/Watcher/Program.cs b/Watcher/Program.cs index fd948b8..847fe08 100644 --- a/Watcher/Program.cs +++ b/Watcher/Program.cs @@ -34,6 +34,9 @@ builder.Services.AddControllersWithViews(); // HttpContentAccessor builder.Services.AddHttpContextAccessor(); +// Storage Singleton +builder.Services.AddSingleton(); + // Background Services builder.Services.AddHostedService(); @@ -218,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 index a4baf03..6d34802 100644 --- a/Watcher/Services/NetworkCheck.cs +++ b/Watcher/Services/NetworkCheck.cs @@ -6,16 +6,13 @@ public class NetworkCheck : BackgroundService { private readonly ILogger _logger; - public static String networkCheckResult - { - get { return networkCheckResult; } - set { networkCheckResult = value; } + private INetworkCheckStore _NetworkCheckStore; - } - - public NetworkCheck(ILogger logger) + public NetworkCheck(ILogger logger, INetworkCheckStore NetworkCheckStore) { _logger = logger; + _NetworkCheckStore = NetworkCheckStore; + } protected override async Task ExecuteAsync(CancellationToken stoppingToken) @@ -44,11 +41,13 @@ public class NetworkCheck : BackgroundService 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."); } 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 ee6e81c..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 - NetworkConnection -
-
-
-
+ @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% -- 2.49.1