Some checks failed
Docs CI / lint-and-preview (push) Has been cancelled
AOC Guard CI / aoc-guard (push) Has been cancelled
AOC Guard CI / aoc-verify (push) Has been cancelled
Concelier Attestation Tests / attestation-tests (push) Has been cancelled
Export Center CI / export-ci (push) Has been cancelled
Notify Smoke Test / Notify Unit Tests (push) Has been cancelled
Notify Smoke Test / Notifier Service Tests (push) Has been cancelled
Notify Smoke Test / Notification Smoke Test (push) Has been cancelled
Policy Lint & Smoke / policy-lint (push) Has been cancelled
Scanner Analyzers / Discover Analyzers (push) Has been cancelled
Scanner Analyzers / Build Analyzers (push) Has been cancelled
Scanner Analyzers / Test Language Analyzers (push) Has been cancelled
Scanner Analyzers / Validate Test Fixtures (push) Has been cancelled
Scanner Analyzers / Verify Deterministic Output (push) Has been cancelled
Signals CI & Image / signals-ci (push) Has been cancelled
Signals Reachability Scoring & Events / reachability-smoke (push) Has been cancelled
Signals Reachability Scoring & Events / sign-and-upload (push) Has been cancelled
42 lines
1.2 KiB
C#
42 lines
1.2 KiB
C#
using System.Collections.Concurrent;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using System.Threading;
|
|
|
|
namespace StellaOps.Cli.Plugins;
|
|
|
|
internal sealed class RestartOnlyCliPluginGuard
|
|
{
|
|
private readonly ConcurrentDictionary<string, byte> _plugins = new(StringComparer.OrdinalIgnoreCase);
|
|
private bool _sealed;
|
|
|
|
public IReadOnlyCollection<string> KnownPlugins => _plugins.Keys.ToArray();
|
|
|
|
public bool IsSealed => Volatile.Read(ref _sealed);
|
|
|
|
public void EnsureRegistrationAllowed(string pluginPath)
|
|
{
|
|
ArgumentException.ThrowIfNullOrWhiteSpace(pluginPath);
|
|
|
|
var normalized = Normalize(pluginPath);
|
|
if (IsSealed && !_plugins.ContainsKey(normalized))
|
|
{
|
|
throw new InvalidOperationException($"Plug-in '{pluginPath}' cannot be registered after startup. Restart required.");
|
|
}
|
|
|
|
_plugins.TryAdd(normalized, 0);
|
|
}
|
|
|
|
public void Seal()
|
|
{
|
|
Volatile.Write(ref _sealed, true);
|
|
}
|
|
|
|
private static string Normalize(string path)
|
|
{
|
|
var full = Path.GetFullPath(path);
|
|
return full.TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar);
|
|
}
|
|
}
|