05e448935cb2d6ab08c24257f6536362d3496512Evan Hunt#!/usr/bin/env perl
5d35f07318456d6ca01d3866c89ae9e50ab029b0Tinderbox User#
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews# Copyright (C) 2014, 2016 Internet Systems Consortium, Inc. ("ISC")
5d35f07318456d6ca01d3866c89ae9e50ab029b0Tinderbox User#
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews# This Source Code Form is subject to the terms of the Mozilla Public
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews# License, v. 2.0. If a copy of the MPL was not distributed with this
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews# file, You can obtain one at http://mozilla.org/MPL/2.0/.
05e448935cb2d6ab08c24257f6536362d3496512Evan Hunt
05e448935cb2d6ab08c24257f6536362d3496512Evan Huntuse strict;
05e448935cb2d6ab08c24257f6536362d3496512Evan Huntuse warnings;
05e448935cb2d6ab08c24257f6536362d3496512Evan Hunt
05e448935cb2d6ab08c24257f6536362d3496512Evan Huntuse IO::File;
05e448935cb2d6ab08c24257f6536362d3496512Evan Huntuse Getopt::Long;
05e448935cb2d6ab08c24257f6536362d3496512Evan Huntuse Net::DNS::Nameserver;
05e448935cb2d6ab08c24257f6536362d3496512Evan Hunt
05e448935cb2d6ab08c24257f6536362d3496512Evan Huntmy $pidf = new IO::File "ans.pid", "w" or die "cannot open pid file: $!";
05e448935cb2d6ab08c24257f6536362d3496512Evan Huntprint $pidf "$$\n" or die "cannot write pid file: $!";
05e448935cb2d6ab08c24257f6536362d3496512Evan Hunt$pidf->close or die "cannot close pid file: $!";
05e448935cb2d6ab08c24257f6536362d3496512Evan Huntsub rmpid { unlink "ans.pid"; exit 1; };
05e448935cb2d6ab08c24257f6536362d3496512Evan Hunt
05e448935cb2d6ab08c24257f6536362d3496512Evan Hunt$SIG{INT} = \&rmpid;
05e448935cb2d6ab08c24257f6536362d3496512Evan Hunt$SIG{TERM} = \&rmpid;
05e448935cb2d6ab08c24257f6536362d3496512Evan Hunt
05e448935cb2d6ab08c24257f6536362d3496512Evan Huntmy $count = 0;
05e448935cb2d6ab08c24257f6536362d3496512Evan Hunt
05e448935cb2d6ab08c24257f6536362d3496512Evan Huntmy $localaddr = "10.53.0.7";
05e448935cb2d6ab08c24257f6536362d3496512Evan Huntmy $localport = 5300;
05e448935cb2d6ab08c24257f6536362d3496512Evan Huntmy $verbose = 0;
05e448935cb2d6ab08c24257f6536362d3496512Evan Hunt
05e448935cb2d6ab08c24257f6536362d3496512Evan Huntsub reply_handler {
05e448935cb2d6ab08c24257f6536362d3496512Evan Hunt my ($qname, $qclass, $qtype, $peerhost, $query, $conn) = @_;
05e448935cb2d6ab08c24257f6536362d3496512Evan Hunt my ($rcode, @ans, @auth, @add);
05e448935cb2d6ab08c24257f6536362d3496512Evan Hunt
05e448935cb2d6ab08c24257f6536362d3496512Evan Hunt print ("request: $qname/$qtype\n");
05e448935cb2d6ab08c24257f6536362d3496512Evan Hunt STDOUT->flush();
05e448935cb2d6ab08c24257f6536362d3496512Evan Hunt
05e448935cb2d6ab08c24257f6536362d3496512Evan Hunt $count += 1;
05e448935cb2d6ab08c24257f6536362d3496512Evan Hunt
05e448935cb2d6ab08c24257f6536362d3496512Evan Hunt if ($qname eq "count" ) {
05e448935cb2d6ab08c24257f6536362d3496512Evan Hunt if ($qtype eq "TXT") {
05e448935cb2d6ab08c24257f6536362d3496512Evan Hunt my ($ttl, $rdata) = (0, "$count");
05e448935cb2d6ab08c24257f6536362d3496512Evan Hunt my $rr = new Net::DNS::RR("$qname $ttl $qclass $qtype $rdata");
05e448935cb2d6ab08c24257f6536362d3496512Evan Hunt push @ans, $rr;
05e448935cb2d6ab08c24257f6536362d3496512Evan Hunt print ("\tcount: $count\n");
05e448935cb2d6ab08c24257f6536362d3496512Evan Hunt }
05e448935cb2d6ab08c24257f6536362d3496512Evan Hunt $rcode = "NOERROR";
05e448935cb2d6ab08c24257f6536362d3496512Evan Hunt } elsif ($qname eq "reset") {
05e448935cb2d6ab08c24257f6536362d3496512Evan Hunt $count = 0;
05e448935cb2d6ab08c24257f6536362d3496512Evan Hunt $rcode = "NOERROR";
05e448935cb2d6ab08c24257f6536362d3496512Evan Hunt } else {
05e448935cb2d6ab08c24257f6536362d3496512Evan Hunt $rcode = "REFUSED";
05e448935cb2d6ab08c24257f6536362d3496512Evan Hunt }
05e448935cb2d6ab08c24257f6536362d3496512Evan Hunt
05e448935cb2d6ab08c24257f6536362d3496512Evan Hunt # mark the answer as authoritive (by setting the 'aa' flag
05e448935cb2d6ab08c24257f6536362d3496512Evan Hunt return ($rcode, \@ans, \@auth, \@add, { aa => 1 });
05e448935cb2d6ab08c24257f6536362d3496512Evan Hunt}
05e448935cb2d6ab08c24257f6536362d3496512Evan Hunt
05e448935cb2d6ab08c24257f6536362d3496512Evan HuntGetOptions(
05e448935cb2d6ab08c24257f6536362d3496512Evan Hunt 'port=i' => \$localport,
05e448935cb2d6ab08c24257f6536362d3496512Evan Hunt 'verbose!' => \$verbose,
05e448935cb2d6ab08c24257f6536362d3496512Evan Hunt);
05e448935cb2d6ab08c24257f6536362d3496512Evan Hunt
05e448935cb2d6ab08c24257f6536362d3496512Evan Huntmy $ns = Net::DNS::Nameserver->new(
05e448935cb2d6ab08c24257f6536362d3496512Evan Hunt LocalAddr => $localaddr,
05e448935cb2d6ab08c24257f6536362d3496512Evan Hunt LocalPort => $localport,
05e448935cb2d6ab08c24257f6536362d3496512Evan Hunt ReplyHandler => \&reply_handler,
05e448935cb2d6ab08c24257f6536362d3496512Evan Hunt Verbose => $verbose,
05e448935cb2d6ab08c24257f6536362d3496512Evan Hunt);
05e448935cb2d6ab08c24257f6536362d3496512Evan Hunt
05e448935cb2d6ab08c24257f6536362d3496512Evan Hunt$ns->main_loop;