From 1c1aadb69c7fd9497aa040d475ab8bcc9fcffe23 Mon Sep 17 00:00:00 2001 From: AliveDevil Date: Fri, 29 Dec 2023 20:04:16 +0100 Subject: [PATCH] Move DhcpLeaseChange to DnsRecord translation to DhcpQueueWorker --- src/pdns-dhcp/Dns/DnsRepository.cs | 38 +++++++------------ src/pdns-dhcp/Program.cs | 2 +- src/pdns-dhcp/Services/DhcpQueueWorker.cs | 45 +++++++++++++++++++++++ src/pdns-dhcp/Services/DnsQueueWorker.cs | 31 ---------------- 4 files changed, 60 insertions(+), 56 deletions(-) create mode 100644 src/pdns-dhcp/Services/DhcpQueueWorker.cs delete mode 100644 src/pdns-dhcp/Services/DnsQueueWorker.cs diff --git a/src/pdns-dhcp/Dns/DnsRepository.cs b/src/pdns-dhcp/Dns/DnsRepository.cs index 1b2f8be..4c121de 100644 --- a/src/pdns-dhcp/Dns/DnsRepository.cs +++ b/src/pdns-dhcp/Dns/DnsRepository.cs @@ -40,37 +40,23 @@ public class DnsRepository cancellationToken, TaskCreationOptions.DenyChildAttach, TaskScheduler.Default); } - public async ValueTask Record(DhcpLeaseChange leaseChange, CancellationToken cancellationToken = default) + public async ValueTask Record(DnsRecord record, CancellationToken cancellationToken = default) { // just lock that thing. using (await _recordLock.AcquireLockAsync(cancellationToken).ConfigureAwait(false)) { - RecordContinuation(leaseChange); + RecordContinuation(record); } - void RecordContinuation(DhcpLeaseChange leaseChange) + void RecordContinuation(DnsRecord record) { - var search = Matches(leaseChange); + var search = Matches(record); bool lockEntered = false; try { lockEntered = _recordLock.TryEnterWriteLock(Timeout.Infinite); - DnsRecordIdentifier identifier = leaseChange.Identifier switch - { - DhcpLeaseClientIdentifier clientId => new DnsRecordClientIdentifier(clientId.ClientId), - DhcpLeaseHWAddrIdentifier hwAddr => new DnsRecordHWAddrIdentifier(hwAddr.HWAddr), - _ => throw new ArgumentException(nameof(leaseChange.Identifier)) - }; - TimeSpan lifetime = leaseChange.Lifetime.TotalSeconds switch - { - <= 1800 => TimeSpan.FromSeconds(Lifetimes[0]), - >= 10800 => TimeSpan.FromSeconds(Lifetimes[1]), - { } seconds => TimeSpan.FromSeconds(seconds / 3) - }; - - var record = new DnsRecord(leaseChange.Address, leaseChange.FQDN, identifier, lifetime); if (search.First is { } node) { search.RemoveFirst(); @@ -102,25 +88,29 @@ public class DnsRepository } } - LinkedList Matches(DhcpLeaseChange query) + LinkedList Matches(DnsRecord query) { LinkedList list = []; for (int i = 0; i < _records.Count; i++) { var record = _records[i]; - if (record.RecordType != query.LeaseType) + if (record.RecordType != query.RecordType) { continue; } switch ((record.Identifier, query.Identifier)) { - case (DnsRecordClientIdentifier recordClientId, DhcpLeaseClientIdentifier queryClientId) - when StringComparer.InvariantCultureIgnoreCase.Equals(recordClientId.ClientId, queryClientId.ClientId): + case ( + DnsRecordClientIdentifier { ClientId: { } recordClientId }, + DnsRecordClientIdentifier { ClientId: { } queryClientId } + ) when StringComparer.InvariantCultureIgnoreCase.Equals(recordClientId, queryClientId): - case (DnsRecordHWAddrIdentifier recordHWAddr, DhcpLeaseHWAddrIdentifier queryHWAddr) - when EqualityComparer.Default.Equals(recordHWAddr.HWAddr, queryHWAddr.HWAddr): + case ( + DnsRecordHWAddrIdentifier { HWAddr: { } recordHWAddr }, + DnsRecordHWAddrIdentifier { HWAddr: { } queryHWAddr } + ) when EqualityComparer.Default.Equals(recordHWAddr, queryHWAddr): list.AddLast(i); continue; diff --git a/src/pdns-dhcp/Program.cs b/src/pdns-dhcp/Program.cs index 405219b..c3e73f1 100644 --- a/src/pdns-dhcp/Program.cs +++ b/src/pdns-dhcp/Program.cs @@ -24,7 +24,7 @@ builder.Services.Configure(builder.Configuration.GetRequiredSection builder.Services.Configure(builder.Configuration.GetRequiredSection("PowerDns")); builder.Services.AddHostedService(); -builder.Services.AddHostedService(); +builder.Services.AddHostedService(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); diff --git a/src/pdns-dhcp/Services/DhcpQueueWorker.cs b/src/pdns-dhcp/Services/DhcpQueueWorker.cs new file mode 100644 index 0000000..e79eb84 --- /dev/null +++ b/src/pdns-dhcp/Services/DhcpQueueWorker.cs @@ -0,0 +1,45 @@ +using System.Threading.Channels; + +using Microsoft.Extensions.Hosting; + +using pdns_dhcp.Dhcp; +using pdns_dhcp.Dns; + +namespace pdns_dhcp.Services; + +public class DhcpQueueWorker : BackgroundService +{ + private readonly ChannelReader _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); + } + } + } +} diff --git a/src/pdns-dhcp/Services/DnsQueueWorker.cs b/src/pdns-dhcp/Services/DnsQueueWorker.cs deleted file mode 100644 index ca94e34..0000000 --- a/src/pdns-dhcp/Services/DnsQueueWorker.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System.Threading.Channels; - -using Microsoft.Extensions.Hosting; - -using pdns_dhcp.Dhcp; -using pdns_dhcp.Dns; - -namespace pdns_dhcp.Services; - -public class DnsQueueWorker : BackgroundService -{ - private readonly ChannelReader _channelReader; - private readonly DnsRepository _repository; - - public DnsQueueWorker(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)) - { - await _repository.Record(default, stoppingToken).ConfigureAwait(false); - } - } - } -}