using System.Reflection; using System.Runtime.InteropServices; using DnsmasqWebUI.Infrastructure.Services.Registration.Abstractions; using DnsmasqWebUI.Models.Config; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; namespace DnsmasqWebUI.Infrastructure.Services.Logs; /// Logs application start and stop with runtime and configuration context. public sealed class ApplicationLifecycleLoggingHostedService : IApplicationHostedService { private readonly ILogger _logger; private readonly IHostEnvironment _env; private readonly DnsmasqOptions _dnsmasq; private readonly DateTimeOffset _startedAt; public ApplicationLifecycleLoggingHostedService( ILogger logger, IHostEnvironment env, IOptions dnsmasq) { _logger = logger; _env = env; _dnsmasq = dnsmasq.Value; _startedAt = DateTimeOffset.UtcNow; } public Task StartAsync(CancellationToken cancellationToken) { var version = typeof(ApplicationLifecycleLoggingHostedService).Assembly .GetCustomAttribute()?.InformationalVersion ?? "?"; var mainDir = Path.GetDirectoryName(Path.GetFullPath(_dnsmasq.MainConfigPath)) ?? ""; var managedConfigPath = Path.Combine(mainDir, _dnsmasq.ManagedFileName); var managedHostsPath = Path.Combine(mainDir, _dnsmasq.ManagedHostsFileName); _logger.LogInformation( "Application started: version={Version}, env={Environment}, os={OS}, arch={Arch}. " + "MainConfig={MainConfig}, managedConfig={ManagedConfig}, managedHosts={ManagedHosts}, systemHosts={SystemHosts}. " + "ReloadCommand={ReloadCmd}, StatusCommand={StatusCmd}", version, _env.EnvironmentName, RuntimeInformation.OSDescription.Trim(), RuntimeInformation.OSArchitecture, _dnsmasq.MainConfigPath, managedConfigPath, managedHostsPath, _dnsmasq.SystemHostsPath ?? "(not set)", string.IsNullOrWhiteSpace(_dnsmasq.ReloadCommand) ? "(not set)" : _dnsmasq.ReloadCommand, string.IsNullOrWhiteSpace(_dnsmasq.StatusCommand) ? "(not set)" : _dnsmasq.StatusCommand); return Task.CompletedTask; } public Task StopAsync(CancellationToken cancellationToken) { var uptime = DateTimeOffset.UtcNow - _startedAt; _logger.LogInformation("Application stopping: uptime={Uptime:F1}s", uptime.TotalSeconds); return Task.CompletedTask; } }