From 7e75f3e49e4fefc55811d2d0f09c6d448a067e01 Mon Sep 17 00:00:00 2001 From: daniel-hbn Date: Thu, 2 Oct 2025 17:12:29 +0200 Subject: [PATCH 1/6] Background Service erstellt --- Watcher/Controllers/HomeController.cs | 14 +++--- Watcher/Program.cs | 3 +- Watcher/Services/DashboardStore.cs | 8 +++ Watcher/Services/DatabaseCheck.cs | 70 ++++++++++++++++++++++++++ Watcher/Services/IDashboardStore.cs | 7 +++ Watcher/Services/INetworkCheckStore.cs | 6 --- Watcher/Services/NetworkCheck.cs | 11 ++-- Watcher/Services/NetworkCheckStore.cs | 6 --- 8 files changed, 99 insertions(+), 26 deletions(-) create mode 100644 Watcher/Services/DashboardStore.cs create mode 100644 Watcher/Services/DatabaseCheck.cs create mode 100644 Watcher/Services/IDashboardStore.cs delete mode 100644 Watcher/Services/INetworkCheckStore.cs delete mode 100644 Watcher/Services/NetworkCheckStore.cs diff --git a/Watcher/Controllers/HomeController.cs b/Watcher/Controllers/HomeController.cs index 2fa4629..5c4b002 100644 --- a/Watcher/Controllers/HomeController.cs +++ b/Watcher/Controllers/HomeController.cs @@ -19,14 +19,14 @@ namespace Watcher.Controllers private readonly ILogger _logger; // Daten der Backgroundchecks abrufen - private INetworkCheckStore _NetworkCheckStore; + private IDashboardStore _DashboardStore; // HomeController Constructor - public HomeController(AppDbContext context, ILogger logger, INetworkCheckStore NetworkCheckStore) + public HomeController(AppDbContext context, ILogger logger, IDashboardStore dashboardStore) { _context = context; _logger = logger; - _NetworkCheckStore = NetworkCheckStore; + _DashboardStore = dashboardStore; } @@ -41,7 +41,7 @@ namespace Watcher.Controllers .Where(u => u.Username == preferredUserName) .FirstOrDefaultAsync(); - Console.WriteLine("Index" + _NetworkCheckStore.NetworkStatus); + Console.WriteLine("Index" + _DashboardStore.NetworkStatus); var viewModel = new DashboardViewModel { ActiveServers = await _context.Servers.CountAsync(s => s.IsOnline), @@ -59,7 +59,7 @@ namespace Watcher.Controllers Containers = await _context.Containers .OrderBy(s => s.Name) .ToListAsync(), - NetworkStatus = _NetworkCheckStore.NetworkStatus + NetworkStatus = _DashboardStore.NetworkStatus }; //ViewBag.NetworkConnection = _NetworkCheckStore.NetworkStatus; return View(viewModel); @@ -74,7 +74,7 @@ namespace Watcher.Controllers var now = DateTime.UtcNow; - Console.WriteLine("DashboardStats" + _NetworkCheckStore.NetworkStatus); + Console.WriteLine("DashboardStats" + _DashboardStore.NetworkStatus); var model = new DashboardViewModel { @@ -92,7 +92,7 @@ namespace Watcher.Controllers Containers = await _context.Containers .OrderBy(s => s.Name) .ToListAsync(), - NetworkStatus = _NetworkCheckStore.NetworkStatus + NetworkStatus = _DashboardStore.NetworkStatus }; return PartialView("_DashboardStats", model); diff --git a/Watcher/Program.cs b/Watcher/Program.cs index 847fe08..60e3133 100644 --- a/Watcher/Program.cs +++ b/Watcher/Program.cs @@ -35,10 +35,11 @@ builder.Services.AddControllersWithViews(); builder.Services.AddHttpContextAccessor(); // Storage Singleton -builder.Services.AddSingleton(); +builder.Services.AddSingleton(); // Background Services builder.Services.AddHostedService(); +builder.Services.AddHostedService(); // ---------- Konfiguration ---------- diff --git a/Watcher/Services/DashboardStore.cs b/Watcher/Services/DashboardStore.cs new file mode 100644 index 0000000..1dc1559 --- /dev/null +++ b/Watcher/Services/DashboardStore.cs @@ -0,0 +1,8 @@ +namespace Watcher.Services; + +public class DashboardStore : IDashboardStore +{ + public String? NetworkStatus { get; set; } + + public String? DatabaseStatus { get; set; } +} \ No newline at end of file diff --git a/Watcher/Services/DatabaseCheck.cs b/Watcher/Services/DatabaseCheck.cs new file mode 100644 index 0000000..33d8fe7 --- /dev/null +++ b/Watcher/Services/DatabaseCheck.cs @@ -0,0 +1,70 @@ +using Microsoft.Data.Sqlite; + +namespace Watcher.Services; + +public class DatabaseCheck : BackgroundService +{ + private readonly ILogger _logger; + + private IDashboardStore _dashboardStore; + + public DatabaseCheck(ILogger logger, IDashboardStore dashboardStore) + { + _logger = logger; + _dashboardStore = dashboardStore; + } + + protected override async Task ExecuteAsync(CancellationToken stoppingToken) + { + var timer = new PeriodicTimer(TimeSpan.FromSeconds(30)); + + while (await timer.WaitForNextTickAsync(stoppingToken)) + { + // Hintergrundprozess abwarten + // await checkDatabaseConnection(); + await checkDatabaseIntegrity(); + // 5 Sekdunden Offset + await Task.Delay(TimeSpan.FromSeconds(5), stoppingToken); + } + } + + public Task checkDatabaseConnection() + { + return Task.CompletedTask; + } + + public Task checkDatabaseIntegrity(String sqliteConnectionString) + { + using var conn = new SqliteConnection(sqliteConnectionString); + _logger.LogInformation("Sqlite Integrity-Check started..."); + + try + { + conn.Open(); + + using var command = conn.CreateCommand(); + command.CommandText = """ + SELECT integrity_check FROM pragma_integrity_check; + """; + + using var reader = command.ExecuteReader(); + + while (reader.Read()) + { + string status = reader.GetString(0); + _dashboardStore.DatabaseStatus = status; + _logger.LogInformation("Sqlite DatabaseIntegrity: ${status}", status); + } + + conn.Close(); + } + catch (SqliteException e) + { + conn.Close(); + _logger.LogError(e.Message); + } + + _logger.LogInformation("Database Integrity-Check finished."); + return Task.CompletedTask; + } +} \ No newline at end of file diff --git a/Watcher/Services/IDashboardStore.cs b/Watcher/Services/IDashboardStore.cs new file mode 100644 index 0000000..b74336e --- /dev/null +++ b/Watcher/Services/IDashboardStore.cs @@ -0,0 +1,7 @@ +namespace Watcher.Services; + +public interface IDashboardStore +{ + String? NetworkStatus { get; set; } + String? DatabaseStatus { get; set; } +} diff --git a/Watcher/Services/INetworkCheckStore.cs b/Watcher/Services/INetworkCheckStore.cs deleted file mode 100644 index 996246d..0000000 --- a/Watcher/Services/INetworkCheckStore.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Watcher.Services; - -public interface INetworkCheckStore -{ - String? NetworkStatus { get; set; } -} diff --git a/Watcher/Services/NetworkCheck.cs b/Watcher/Services/NetworkCheck.cs index 6d34802..c88ffaa 100644 --- a/Watcher/Services/NetworkCheck.cs +++ b/Watcher/Services/NetworkCheck.cs @@ -1,4 +1,3 @@ -using System.Composition; using System.Net.NetworkInformation; namespace Watcher.Services; @@ -6,12 +5,12 @@ public class NetworkCheck : BackgroundService { private readonly ILogger _logger; - private INetworkCheckStore _NetworkCheckStore; + private IDashboardStore _DashboardStore; - public NetworkCheck(ILogger logger, INetworkCheckStore NetworkCheckStore) + public NetworkCheck(ILogger logger, IDashboardStore DashboardStore) { _logger = logger; - _NetworkCheckStore = NetworkCheckStore; + _DashboardStore = DashboardStore; } @@ -41,13 +40,13 @@ public class NetworkCheck : BackgroundService PingReply reply = p.Send(host, 3000); if (reply.Status == IPStatus.Success) { - _NetworkCheckStore.NetworkStatus = "online"; + _DashboardStore.NetworkStatus = "online"; _logger.LogInformation("Ping successfull. Watcher is online."); } } catch { - _NetworkCheckStore.NetworkStatus = "offline"; + _DashboardStore.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 deleted file mode 100644 index 66e73e7..0000000 --- a/Watcher/Services/NetworkCheckStore.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Watcher.Services; - -public class NetworkCheckStore : INetworkCheckStore -{ - public String? NetworkStatus { get; set; } -} \ No newline at end of file From 2e9d41fe602de63d02b91a7ee143731da0bde070 Mon Sep 17 00:00:00 2001 From: triggermeelmo Date: Thu, 2 Oct 2025 17:55:06 +0200 Subject: [PATCH 2/6] Sqlite Data Source angepasst --- Watcher/Services/DatabaseCheck.cs | 15 ++++++--------- Watcher/Services/NetworkCheck.cs | 2 ++ 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/Watcher/Services/DatabaseCheck.cs b/Watcher/Services/DatabaseCheck.cs index 33d8fe7..35b4069 100644 --- a/Watcher/Services/DatabaseCheck.cs +++ b/Watcher/Services/DatabaseCheck.cs @@ -16,26 +16,21 @@ public class DatabaseCheck : BackgroundService protected override async Task ExecuteAsync(CancellationToken stoppingToken) { - var timer = new PeriodicTimer(TimeSpan.FromSeconds(30)); + var timer = new PeriodicTimer(TimeSpan.FromSeconds(1800)); while (await timer.WaitForNextTickAsync(stoppingToken)) { // Hintergrundprozess abwarten - // await checkDatabaseConnection(); await checkDatabaseIntegrity(); // 5 Sekdunden Offset await Task.Delay(TimeSpan.FromSeconds(5), stoppingToken); } } - public Task checkDatabaseConnection() + // String sqliteConnectionString als Argument übergeben + public Task checkDatabaseIntegrity() { - return Task.CompletedTask; - } - - public Task checkDatabaseIntegrity(String sqliteConnectionString) - { - using var conn = new SqliteConnection(sqliteConnectionString); + using var conn = new SqliteConnection("Data Source=./persistence/watcher.db"); _logger.LogInformation("Sqlite Integrity-Check started..."); try @@ -62,6 +57,8 @@ public class DatabaseCheck : BackgroundService { conn.Close(); _logger.LogError(e.Message); + + // TODO: LogEvent erstellen } _logger.LogInformation("Database Integrity-Check finished."); diff --git a/Watcher/Services/NetworkCheck.cs b/Watcher/Services/NetworkCheck.cs index c88ffaa..7c45fc5 100644 --- a/Watcher/Services/NetworkCheck.cs +++ b/Watcher/Services/NetworkCheck.cs @@ -48,6 +48,8 @@ public class NetworkCheck : BackgroundService { _DashboardStore.NetworkStatus = "offline"; _logger.LogError("Ping failed. Watcher appears to have no network connection."); + + // LogEvent erstellen } _logger.LogInformation("Networkcheck finished."); From 69dd73a0796a3638849b52285db1c5188af85f4e Mon Sep 17 00:00:00 2001 From: triggermeelmo Date: Fri, 3 Oct 2025 01:39:15 +0200 Subject: [PATCH 3/6] UI Anpassungen --- Watcher/Controllers/HomeController.cs | 6 +++-- Watcher/Services/DatabaseCheck.cs | 2 +- Watcher/ViewModels/DashboardViewModel.cs | 1 + Watcher/Views/Home/_DashboardStats.cshtml | 29 +++++++++++++++++++---- 4 files changed, 31 insertions(+), 7 deletions(-) diff --git a/Watcher/Controllers/HomeController.cs b/Watcher/Controllers/HomeController.cs index 5c4b002..1cd917e 100644 --- a/Watcher/Controllers/HomeController.cs +++ b/Watcher/Controllers/HomeController.cs @@ -59,7 +59,8 @@ namespace Watcher.Controllers Containers = await _context.Containers .OrderBy(s => s.Name) .ToListAsync(), - NetworkStatus = _DashboardStore.NetworkStatus + NetworkStatus = _DashboardStore.NetworkStatus, + DatabaseStatus = _DashboardStore.DatabaseStatus }; //ViewBag.NetworkConnection = _NetworkCheckStore.NetworkStatus; return View(viewModel); @@ -92,7 +93,8 @@ namespace Watcher.Controllers Containers = await _context.Containers .OrderBy(s => s.Name) .ToListAsync(), - NetworkStatus = _DashboardStore.NetworkStatus + NetworkStatus = _DashboardStore.NetworkStatus, + DatabaseStatus = _DashboardStore.DatabaseStatus }; return PartialView("_DashboardStats", model); diff --git a/Watcher/Services/DatabaseCheck.cs b/Watcher/Services/DatabaseCheck.cs index 35b4069..d09d598 100644 --- a/Watcher/Services/DatabaseCheck.cs +++ b/Watcher/Services/DatabaseCheck.cs @@ -16,7 +16,7 @@ public class DatabaseCheck : BackgroundService protected override async Task ExecuteAsync(CancellationToken stoppingToken) { - var timer = new PeriodicTimer(TimeSpan.FromSeconds(1800)); + var timer = new PeriodicTimer(TimeSpan.FromSeconds(30)); while (await timer.WaitForNextTickAsync(stoppingToken)) { diff --git a/Watcher/ViewModels/DashboardViewModel.cs b/Watcher/ViewModels/DashboardViewModel.cs index c2cb489..25c10e2 100644 --- a/Watcher/ViewModels/DashboardViewModel.cs +++ b/Watcher/ViewModels/DashboardViewModel.cs @@ -15,6 +15,7 @@ namespace Watcher.ViewModels public List Containers { get; set; } = new(); public String? NetworkStatus { get; set; } = "?"; + public String? DatabaseStatus { get; set; } = "?"; } } diff --git a/Watcher/Views/Home/_DashboardStats.cshtml b/Watcher/Views/Home/_DashboardStats.cshtml index f0a8861..5803cb3 100644 --- a/Watcher/Views/Home/_DashboardStats.cshtml +++ b/Watcher/Views/Home/_DashboardStats.cshtml @@ -81,10 +81,31 @@ } } -
- Datenbank - OK -
+ @if (!Model.DatabaseStatus.IsNullOrEmpty()) + { + @if (Model.DatabaseStatus == "$ok") + { +
+ Datenbank + OK +
+ } else + { +
+ Datenbank + Big Problem +
+ } + } else + { +
+ Datenbank + + Missing Data +
+ } + +
From 281e9c686b94e73205276bafdb9a4c149a607499 Mon Sep 17 00:00:00 2001 From: daniel-hbn Date: Fri, 3 Oct 2025 12:48:05 +0200 Subject: [PATCH 4/6] Ui Anzeige fixed --- Watcher/Views/Home/_DashboardStats.cshtml | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/Watcher/Views/Home/_DashboardStats.cshtml b/Watcher/Views/Home/_DashboardStats.cshtml index 5803cb3..dc201ff 100644 --- a/Watcher/Views/Home/_DashboardStats.cshtml +++ b/Watcher/Views/Home/_DashboardStats.cshtml @@ -83,17 +83,17 @@ @if (!Model.DatabaseStatus.IsNullOrEmpty()) { - @if (Model.DatabaseStatus == "$ok") + @if (Model.DatabaseStatus == "ok") {
Datenbank - OK + healthy
} else {
Datenbank - Big Problem + unhealthy
} } else @@ -134,6 +134,7 @@ + + From b8626cb8eab54819fce920dce3a63e65d81b6106 Mon Sep 17 00:00:00 2001 From: daniel-hbn Date: Fri, 3 Oct 2025 13:02:36 +0200 Subject: [PATCH 5/6] Debug Logs entfernt --- Watcher/Controllers/HomeController.cs | 3 --- 1 file changed, 3 deletions(-) diff --git a/Watcher/Controllers/HomeController.cs b/Watcher/Controllers/HomeController.cs index 1cd917e..07cdd11 100644 --- a/Watcher/Controllers/HomeController.cs +++ b/Watcher/Controllers/HomeController.cs @@ -41,7 +41,6 @@ namespace Watcher.Controllers .Where(u => u.Username == preferredUserName) .FirstOrDefaultAsync(); - Console.WriteLine("Index" + _DashboardStore.NetworkStatus); var viewModel = new DashboardViewModel { ActiveServers = await _context.Servers.CountAsync(s => s.IsOnline), @@ -75,8 +74,6 @@ namespace Watcher.Controllers var now = DateTime.UtcNow; - Console.WriteLine("DashboardStats" + _DashboardStore.NetworkStatus); - var model = new DashboardViewModel { ActiveServers = await _context.Servers.CountAsync(s => s.IsOnline), From 0e72287c6bacf6719f5318d1364010ae8d9f3160 Mon Sep 17 00:00:00 2001 From: daniel-hbn Date: Fri, 3 Oct 2025 13:10:56 +0200 Subject: [PATCH 6/6] Cache aktiviert --- .gitea/workflows/development-build.yaml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.gitea/workflows/development-build.yaml b/.gitea/workflows/development-build.yaml index c369463..b3e7bac 100644 --- a/.gitea/workflows/development-build.yaml +++ b/.gitea/workflows/development-build.yaml @@ -10,11 +10,12 @@ env: DOCKER_IMAGE_NAME: 'watcher-server' REGISTRY_URL: 'git.triggermeelmo.com/watcher' DOCKER_PLATFORMS: 'linux/amd64,linux/arm64' - RUNNER_TOOL_CACHE: /toolcache # Runner Tool Cache jobs: build-and-test: runs-on: ubuntu-latest + env: + RUNNER_TOOL_CACHE: /toolcache # Runner Tool Cache steps: - name: Checkout code uses: actions/checkout@v3 @@ -39,6 +40,8 @@ jobs: docker-build-and-push: runs-on: ubuntu-latest + env: + RUNNER_TOOL_CACHE: /toolcache # Runner Tool Cache needs: build-and-test steps: - name: Checkout code