feature/db-check #21

Merged
triggermeelmo merged 8 commits from feature/db-check into development 2025-10-03 13:11:18 +02:00
8 changed files with 99 additions and 26 deletions
Showing only changes of commit 7e75f3e49e - Show all commits

View File

@@ -19,14 +19,14 @@ namespace Watcher.Controllers
private readonly ILogger<HomeController> _logger; private readonly ILogger<HomeController> _logger;
// Daten der Backgroundchecks abrufen // Daten der Backgroundchecks abrufen
private INetworkCheckStore _NetworkCheckStore; private IDashboardStore _DashboardStore;
// HomeController Constructor // HomeController Constructor
public HomeController(AppDbContext context, ILogger<HomeController> logger, INetworkCheckStore NetworkCheckStore) public HomeController(AppDbContext context, ILogger<HomeController> logger, IDashboardStore dashboardStore)
{ {
_context = context; _context = context;
_logger = logger; _logger = logger;
_NetworkCheckStore = NetworkCheckStore; _DashboardStore = dashboardStore;
} }
@@ -41,7 +41,7 @@ namespace Watcher.Controllers
.Where(u => u.Username == preferredUserName) .Where(u => u.Username == preferredUserName)
.FirstOrDefaultAsync(); .FirstOrDefaultAsync();
Console.WriteLine("Index" + _NetworkCheckStore.NetworkStatus); Console.WriteLine("Index" + _DashboardStore.NetworkStatus);
var viewModel = new DashboardViewModel var viewModel = new DashboardViewModel
{ {
ActiveServers = await _context.Servers.CountAsync(s => s.IsOnline), ActiveServers = await _context.Servers.CountAsync(s => s.IsOnline),
@@ -59,7 +59,7 @@ namespace Watcher.Controllers
Containers = await _context.Containers Containers = await _context.Containers
.OrderBy(s => s.Name) .OrderBy(s => s.Name)
.ToListAsync(), .ToListAsync(),
NetworkStatus = _NetworkCheckStore.NetworkStatus NetworkStatus = _DashboardStore.NetworkStatus
}; };
//ViewBag.NetworkConnection = _NetworkCheckStore.NetworkStatus; //ViewBag.NetworkConnection = _NetworkCheckStore.NetworkStatus;
return View(viewModel); return View(viewModel);
@@ -74,7 +74,7 @@ namespace Watcher.Controllers
var now = DateTime.UtcNow; var now = DateTime.UtcNow;
Console.WriteLine("DashboardStats" + _NetworkCheckStore.NetworkStatus); Console.WriteLine("DashboardStats" + _DashboardStore.NetworkStatus);
var model = new DashboardViewModel var model = new DashboardViewModel
{ {
@@ -92,7 +92,7 @@ namespace Watcher.Controllers
Containers = await _context.Containers Containers = await _context.Containers
.OrderBy(s => s.Name) .OrderBy(s => s.Name)
.ToListAsync(), .ToListAsync(),
NetworkStatus = _NetworkCheckStore.NetworkStatus NetworkStatus = _DashboardStore.NetworkStatus
}; };
return PartialView("_DashboardStats", model); return PartialView("_DashboardStats", model);

View File

@@ -35,10 +35,11 @@ builder.Services.AddControllersWithViews();
builder.Services.AddHttpContextAccessor(); builder.Services.AddHttpContextAccessor();
// Storage Singleton // Storage Singleton
builder.Services.AddSingleton<INetworkCheckStore, NetworkCheckStore>(); builder.Services.AddSingleton<IDashboardStore, DashboardStore>();
// Background Services // Background Services
builder.Services.AddHostedService<NetworkCheck>(); builder.Services.AddHostedService<NetworkCheck>();
builder.Services.AddHostedService<DatabaseCheck>();
// ---------- Konfiguration ---------- // ---------- Konfiguration ----------

View File

@@ -0,0 +1,8 @@
namespace Watcher.Services;
public class DashboardStore : IDashboardStore
{
public String? NetworkStatus { get; set; }
public String? DatabaseStatus { get; set; }
}

View File

@@ -0,0 +1,70 @@
using Microsoft.Data.Sqlite;
namespace Watcher.Services;
public class DatabaseCheck : BackgroundService
{
private readonly ILogger<DatabaseCheck> _logger;
private IDashboardStore _dashboardStore;
public DatabaseCheck(ILogger<DatabaseCheck> 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;
}
}

View File

@@ -0,0 +1,7 @@
namespace Watcher.Services;
public interface IDashboardStore
{
String? NetworkStatus { get; set; }
String? DatabaseStatus { get; set; }
}

View File

@@ -1,6 +0,0 @@
namespace Watcher.Services;
public interface INetworkCheckStore
{
String? NetworkStatus { get; set; }
}

View File

@@ -1,4 +1,3 @@
using System.Composition;
using System.Net.NetworkInformation; using System.Net.NetworkInformation;
namespace Watcher.Services; namespace Watcher.Services;
@@ -6,12 +5,12 @@ public class NetworkCheck : BackgroundService
{ {
private readonly ILogger<NetworkCheck> _logger; private readonly ILogger<NetworkCheck> _logger;
private INetworkCheckStore _NetworkCheckStore; private IDashboardStore _DashboardStore;
public NetworkCheck(ILogger<NetworkCheck> logger, INetworkCheckStore NetworkCheckStore) public NetworkCheck(ILogger<NetworkCheck> logger, IDashboardStore DashboardStore)
{ {
_logger = logger; _logger = logger;
_NetworkCheckStore = NetworkCheckStore; _DashboardStore = DashboardStore;
} }
@@ -41,13 +40,13 @@ public class NetworkCheck : BackgroundService
PingReply reply = p.Send(host, 3000); PingReply reply = p.Send(host, 3000);
if (reply.Status == IPStatus.Success) if (reply.Status == IPStatus.Success)
{ {
_NetworkCheckStore.NetworkStatus = "online"; _DashboardStore.NetworkStatus = "online";
_logger.LogInformation("Ping successfull. Watcher is online."); _logger.LogInformation("Ping successfull. Watcher is online.");
} }
} }
catch catch
{ {
_NetworkCheckStore.NetworkStatus = "offline"; _DashboardStore.NetworkStatus = "offline";
_logger.LogError("Ping failed. Watcher appears to have no network connection."); _logger.LogError("Ping failed. Watcher appears to have no network connection.");
} }

View File

@@ -1,6 +0,0 @@
namespace Watcher.Services;
public class NetworkCheckStore : INetworkCheckStore
{
public String? NetworkStatus { get; set; }
}