1
0
Fork 0
netddi/Services/Dhcp/DhcpQueueWorker.cs

45 lines
1.3 KiB
C#
Raw Permalink Normal View History

2025-01-29 23:53:57 +01:00
using System.Threading.Channels;
using DotNetDDI.Services.Dns;
using Microsoft.Extensions.Hosting;
namespace DotNetDDI.Services.Dhcp;
public class DhcpQueueWorker : BackgroundService
{
private readonly ChannelReader<DhcpLeaseChange> _channelReader;
private readonly DnsRepository _repository;
public DhcpQueueWorker(DhcpLeaseQueue queue, DnsRepository repository)
{
_channelReader = queue.Reader;
_repository = repository;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (await _channelReader.WaitToReadAsync(stoppingToken).ConfigureAwait(false))
{
while (_channelReader.TryRead(out var lease))
{
DnsRecordIdentifier identifier = lease.Identifier switch
{
DhcpLeaseClientIdentifier clientId => new DnsRecordClientIdentifier(clientId.ClientId),
DhcpLeaseHWAddrIdentifier hwAddr => new DnsRecordHWAddrIdentifier(hwAddr.HWAddr),
_ => throw new ArgumentException(nameof(lease.Identifier))
};
TimeSpan lifetime = lease.Lifetime.TotalSeconds switch
{
<= 1800 => TimeSpan.FromSeconds(600),
>= 10800 => TimeSpan.FromSeconds(3600),
{ } seconds => TimeSpan.FromSeconds(seconds / 3)
};
await _repository.Record(new DnsRecord(lease.Address, lease.FQDN, identifier, lifetime), stoppingToken).ConfigureAwait(false);
}
}
}
}