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