pdns-dhcp/src/pdns-dhcp/Kea/KeaService.cs

50 lines
1.3 KiB
C#

using System.Collections.Immutable;
using Microsoft.Extensions.Hosting;
using pdns_dhcp.Options;
namespace pdns_dhcp.Kea;
public class KeaService : IHostedService
{
private readonly ImmutableArray<IHostedService> _services;
public KeaService(KeaDhcpOptions options, IKeaFactory factory)
{
if (options.Dhcp4 is { } dhcp4Options)
{
_services.Add(factory.CreateWatcher(factory.CreateHandler4(), dhcp4Options));
}
if (options.Dhcp6 is { } dhcp6Options)
{
_services.Add(factory.CreateWatcher(factory.CreateHandler6(), dhcp6Options));
}
}
public Task StartAsync(CancellationToken cancellationToken = default)
{
Task[] tasks = new Task[_services.Length];
for (int i = 0; i < tasks.Length; i++)
{
tasks[i] = _services[i].StartAsync(cancellationToken);
}
return Task.WhenAll(tasks);
}
public async Task StopAsync(CancellationToken cancellationToken = default)
{
Task[] tasks = new Task[_services.Length];
for (int i = 0; i < tasks.Length; i++)
{
tasks[i] = _services[i].StopAsync(cancellationToken);
}
var waitTask = Task.WhenAll(tasks);
TaskCompletionSource taskCompletionSource = new();
using var registration = cancellationToken.Register(s => ((TaskCompletionSource)s!).SetCanceled(), taskCompletionSource);
await Task.WhenAny(waitTask, taskCompletionSource.Task).ConfigureAwait(continueOnCapturedContext: false);
}
}