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 diff --git a/Watcher/Controllers/HomeController.cs b/Watcher/Controllers/HomeController.cs index 2fa4629..07cdd11 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,6 @@ 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), @@ -59,7 +58,8 @@ namespace Watcher.Controllers Containers = await _context.Containers .OrderBy(s => s.Name) .ToListAsync(), - NetworkStatus = _NetworkCheckStore.NetworkStatus + NetworkStatus = _DashboardStore.NetworkStatus, + DatabaseStatus = _DashboardStore.DatabaseStatus }; //ViewBag.NetworkConnection = _NetworkCheckStore.NetworkStatus; return View(viewModel); @@ -74,8 +74,6 @@ namespace Watcher.Controllers var now = DateTime.UtcNow; - Console.WriteLine("DashboardStats" + _NetworkCheckStore.NetworkStatus); - var model = new DashboardViewModel { ActiveServers = await _context.Servers.CountAsync(s => s.IsOnline), @@ -92,7 +90,8 @@ namespace Watcher.Controllers Containers = await _context.Containers .OrderBy(s => s.Name) .ToListAsync(), - NetworkStatus = _NetworkCheckStore.NetworkStatus + NetworkStatus = _DashboardStore.NetworkStatus, + DatabaseStatus = _DashboardStore.DatabaseStatus }; 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..d09d598 --- /dev/null +++ b/Watcher/Services/DatabaseCheck.cs @@ -0,0 +1,67 @@ +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 checkDatabaseIntegrity(); + // 5 Sekdunden Offset + await Task.Delay(TimeSpan.FromSeconds(5), stoppingToken); + } + } + + // String sqliteConnectionString als Argument übergeben + public Task checkDatabaseIntegrity() + { + using var conn = new SqliteConnection("Data Source=./persistence/watcher.db"); + _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); + + // TODO: LogEvent erstellen + } + + _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..7c45fc5 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,14 +40,16 @@ 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."); + + // LogEvent erstellen } _logger.LogInformation("Networkcheck finished."); 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 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..dc201ff 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 + healthy +
+ } else + { +
+ Datenbank + unhealthy +
+ } + } else + { +
+ Datenbank + + Missing Data +
+ } + +
@@ -113,6 +134,7 @@ + +