#!/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; }