Files
git.stella-ops.org/src/__Libraries/StellaOps.Doctor.Plugins.Sources/SourcesPlugin.cs

79 lines
2.3 KiB
C#

// -----------------------------------------------------------------------------
// SourcesPlugin.cs
// Sprint: SPRINT_20260114_SOURCES_SETUP
// Task: 12.1 - Sources Doctor Plugin
// Description: Doctor plugin providing advisory source connectivity diagnostics
// -----------------------------------------------------------------------------
using Microsoft.Extensions.DependencyInjection;
using StellaOps.Concelier.Core.Sources;
using StellaOps.Doctor.Models;
using StellaOps.Doctor.Plugins;
using StellaOps.Doctor.Plugins.Sources.Checks;
namespace StellaOps.Doctor.Plugins.Sources;
/// <summary>
/// Doctor plugin for advisory data source diagnostics.
/// Provides connectivity checks for all configured CVE/advisory data sources.
/// </summary>
public sealed class SourcesPlugin : IDoctorPlugin
{
/// <inheritdoc />
public string PluginId => "stellaops.doctor.sources";
/// <inheritdoc />
public string DisplayName => "Advisory Sources";
/// <inheritdoc />
public DoctorCategory Category => DoctorCategory.Sources;
/// <inheritdoc />
public Version Version => new(1, 0, 0);
/// <inheritdoc />
public Version MinEngineVersion => new(1, 0, 0);
/// <inheritdoc />
public bool IsAvailable(IServiceProvider services)
{
// Plugin is available if ISourceRegistry is registered
return services.GetService<ISourceRegistry>() is not null;
}
/// <inheritdoc />
public IReadOnlyList<IDoctorCheck> GetChecks(DoctorPluginContext context)
{
var registry = context.Services.GetService<ISourceRegistry>();
if (registry is null)
{
return [];
}
var checks = new List<IDoctorCheck>
{
// Overall source mode configuration check
new SourceModeConfiguredCheck(),
// Mirror server checks
new MirrorServerAuthCheck(),
new MirrorServerRateLimitCheck()
};
// Generate dynamic checks for each registered source
foreach (var source in registry.GetAllSources())
{
checks.Add(new SourceConnectivityCheck(source.Id, source.DisplayName));
}
return checks;
}
/// <inheritdoc />
public Task InitializeAsync(DoctorPluginContext context, CancellationToken ct)
{
// No initialization required
return Task.CompletedTask;
}
}