AllKnowingDNS
view release on metacpan or search on metacpan
lib/App/AllKnowingDNS/Handler.pm view on Meta::CPAN
# vim:ts=4:sw=4:expandtab
package App::AllKnowingDNS::Handler;
use strict;
use warnings;
use base 'Exporter';
use Net::DNS;
use NetAddr::IP::Util qw(ipv6_aton);
use App::AllKnowingDNS::Config;
use App::AllKnowingDNS::Zone;
use POSIX qw(strftime);
use v5.10;
=head1 NAME
App::AllKnowingDNS::Handler - main code of AllKnowingDNS
=head1 DESCRIPTION
Note: User documentation is in L<all-knowing-dns>(1).
This module contains the C<Net::DNS::Nameserver> handler function.
=head1 FUNCTIONS
=cut
our @EXPORT = qw(reply_handler);
sub handle_ptr_query {
my ($querylog, $zone, $qname, $qclass, $qtype) = @_;
# Forward this query to our upstream DNS first, if any.
if (defined($zone->upstream_dns) &&
$zone->upstream_dns ne '') {
my $resolver = Net::DNS::Resolver->new(
nameservers => [ $zone->upstream_dns ],
recurse => 0,
);
my $result = $resolver->query($qname . '.upstream', 'PTR');
# If the upstream query was successful, relay the response, otherwise
# generate a reply.
if (defined($result) && $result->header->rcode eq 'NOERROR') {
if ($querylog) {
say strftime('%x %X %z', localtime) . " - Relaying upstream answer for $qname";
}
my @answer = $result->answer;
for my $answer (@answer) {
my $name = $answer->name;
$name =~ s/\.upstream$//;
$answer->name($name);
}
return ('NOERROR', [ $result->answer ], [], [], { aa => 1 });
}
}
my $ttl = 3600;
my $fullname = $qname;
substr($fullname, -1 * length($zone->ptrzone)) = '';
my $hostpart = join '', reverse split /\./, $fullname;
( run in 1.096 second using v1.01-cache-2.11-cpan-97f6503c9c8 )