using Microsoft.Extensions.Diagnostics.HealthChecks; using Microsoft.Extensions.Options; using ZB.MOM.WW.ScadaBridge.Transport; using ZB.MOM.WW.ScadaBridge.Transport.Signing; namespace ZB.MOM.WW.ScadaBridge.Host.Health; /// /// /health/ready entry (ScadaBridge#110): Degraded while a cluster marked /// Transport:Signing:ProductionBoundary still accepts unsigned bundles. Degraded maps /// to HTTP 200 in the shared health tier, so it is visible on the Overview dashboard without /// taking the node out of rotation. Exposes only booleans — never key material. /// public sealed class BundleSigningPolicyHealthCheck : IHealthCheck { private readonly IOptionsMonitor _options; /// Initializes the check. /// Transport options. public BundleSigningPolicyHealthCheck(IOptionsMonitor options) { _options = options ?? throw new ArgumentNullException(nameof(options)); } /// public Task CheckHealthAsync( HealthCheckContext context, CancellationToken cancellationToken = default) { var signing = _options.CurrentValue.Signing; var data = new Dictionary(StringComparer.Ordinal) { ["productionBoundary"] = signing.ProductionBoundary, ["requireSignedBundles"] = signing.RequireSignedBundles, ["signingEnabled"] = signing.Enabled, ["trustedKeys"] = signing.TrustedKeys.Count, }; var advisory = BundleSigningPolicyAdvisory.Evaluate(signing); return Task.FromResult(advisory is null ? HealthCheckResult.Healthy("Bundle signing policy OK.", data) : HealthCheckResult.Degraded(advisory, data: data)); } }