Background Service erstellt

This commit is contained in:
2025-10-02 17:12:29 +02:00
parent 8e362f7271
commit 7e75f3e49e
8 changed files with 99 additions and 26 deletions

View File

@@ -19,14 +19,14 @@ namespace Watcher.Controllers
private readonly ILogger<HomeController> _logger;
// Daten der Backgroundchecks abrufen
private INetworkCheckStore _NetworkCheckStore;
private IDashboardStore _DashboardStore;
// HomeController Constructor
public HomeController(AppDbContext context, ILogger<HomeController> logger, INetworkCheckStore NetworkCheckStore)
public HomeController(AppDbContext context, ILogger<HomeController> 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);

View File

@@ -35,10 +35,11 @@ builder.Services.AddControllersWithViews();
builder.Services.AddHttpContextAccessor();
// Storage Singleton
builder.Services.AddSingleton<INetworkCheckStore, NetworkCheckStore>();
builder.Services.AddSingleton<IDashboardStore, DashboardStore>();
// Background Services
builder.Services.AddHostedService<NetworkCheck>();
builder.Services.AddHostedService<DatabaseCheck>();
// ---------- 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;
namespace Watcher.Services;
@@ -6,12 +5,12 @@ public class NetworkCheck : BackgroundService
{
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;
_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.");
}

View File

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