From: Štěpán Balážik Date: Fri, 16 Jan 2026 09:14:30 +0000 (+0100) Subject: Reimplement 'reclimit/ans7' server using AsyncDnsServer X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=0c30f6dad2bb1ce11e67f2363859679551d894b0;p=thirdparty%2Fbind9.git Reimplement 'reclimit/ans7' server using AsyncDnsServer Replace the Perl implementation with a Python one. The old server's query counter doesn't work properly. Make no attempt at imitating this. --- diff --git a/bin/tests/system/reclimit/ans7/ans.pl b/bin/tests/system/reclimit/ans7/ans.pl deleted file mode 100644 index 52110f1802a..00000000000 --- a/bin/tests/system/reclimit/ans7/ans.pl +++ /dev/null @@ -1,88 +0,0 @@ -#!/usr/bin/env perl - -# Copyright (C) Internet Systems Consortium, Inc. ("ISC") -# -# SPDX-License-Identifier: MPL-2.0 -# -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, you can obtain one at https://mozilla.org/MPL/2.0/. -# -# See the COPYRIGHT file distributed with this work for additional -# information regarding copyright ownership. - -use strict; -use warnings; - -use IO::File; -use Getopt::Long; -use Net::DNS::Nameserver; - -my $pidf = new IO::File "ans.pid", "w" or die "cannot open pid file: $!"; -print $pidf "$$\n" or die "cannot write pid file: $!"; -$pidf->close or die "cannot close pid file: $!"; -sub rmpid { unlink "ans.pid"; exit 1; }; -sub term { }; - -$SIG{INT} = \&rmpid; -if ($Net::DNS::VERSION >= 1.42) { - $SIG{TERM} = \&term; -} else { - $SIG{TERM} = \&rmpid; -} - -my $count = 0; - -my $localaddr = "10.53.0.7"; -my $localport = int($ENV{'PORT'}); -if (!$localport) { $localport = 5300; } -my $verbose = 0; - -sub reply_handler { - my ($qname, $qclass, $qtype, $peerhost, $query, $conn) = @_; - my ($rcode, @ans, @auth, @add); - - print ("request: $qname/$qtype\n"); - STDOUT->flush(); - - $count += 1; - - if ($qname eq "count" ) { - if ($qtype eq "TXT") { - my ($ttl, $rdata) = (0, "$count"); - my $rr = new Net::DNS::RR("$qname $ttl $qclass $qtype $rdata"); - push @ans, $rr; - print ("\tcount: $count\n"); - } - $rcode = "NOERROR"; - } elsif ($qname eq "reset") { - $count = 0; - $rcode = "NOERROR"; - } else { - $rcode = "REFUSED"; - } - - # mark the answer as authoritative (by setting the 'aa' flag - return ($rcode, \@ans, \@auth, \@add, { aa => 1 }); -} - -GetOptions( - 'port=i' => \$localport, - 'verbose!' => \$verbose, -); - -my $ns = Net::DNS::Nameserver->new( - LocalAddr => $localaddr, - LocalPort => $localport, - ReplyHandler => \&reply_handler, - Verbose => $verbose, -); - -if ($Net::DNS::VERSION >= 1.42) { - $ns->start_server(); - select(undef, undef, undef, undef); - $ns->stop_server(); - unlink "ans.pid"; -} else { - $ns->main_loop; -} diff --git a/bin/tests/system/reclimit/ans7/ans.py b/bin/tests/system/reclimit/ans7/ans.py new file mode 100644 index 00000000000..bf7c1eab089 --- /dev/null +++ b/bin/tests/system/reclimit/ans7/ans.py @@ -0,0 +1,41 @@ +""" +Copyright (C) Internet Systems Consortium, Inc. ("ISC") + +SPDX-License-Identifier: MPL-2.0 + +This Source Code Form is subject to the terms of the Mozilla Public +License, v. 2.0. If a copy of the MPL was not distributed with this +file, you can obtain one at https://mozilla.org/MPL/2.0/. + +See the COPYRIGHT file distributed with this work for additional +information regarding copyright ownership. +""" + +from collections.abc import AsyncGenerator + +import dns.rcode + +from isctest.asyncserver import AsyncDnsServer, DnsResponseSend, QueryContext + +from ..reclimit_ans import ReclimitHandler, ReclimitStateHandler + + +class FallbackRefusedHandler(ReclimitHandler): + async def _get_counted_responses( + self, qctx: QueryContext + ) -> AsyncGenerator[DnsResponseSend, None]: + qctx.response.set_rcode(dns.rcode.REFUSED) + yield DnsResponseSend(qctx.response) + + +def main() -> None: + server = AsyncDnsServer(default_aa=True, default_rcode=dns.rcode.NOERROR) + server.install_response_handlers( + state_handler := ReclimitStateHandler(), + FallbackRefusedHandler(state_handler), + ) + server.run() + + +if __name__ == "__main__": + main()