use Net::DNS::Nameserver;
use Net::DNS::Resolver;
use Data::Dump qw/dump/;
+use CouchDB;
use server;
our $debug = server::debug;
server->refresh;
$debug = server::debug;
- print "$qname $qclass $qtype $peerhost to ". $conn->{"sockhost"}. "\n";
+ CouchDB::audit( 'request', {
+ qname => $qname,
+ qclass => $qclass,
+ qtype => $qtype,
+ peerhost => $peerhost,
+ sockhost => $conn->{"sockhost"}
+ });
+
$query->print if $debug;
my $local = $1 if $qname =~ m{^(.+)\.\Q$server::domain_name\E$};
my $ttl = 3600;
+ my $audit = { source => 'unknown' };
+
if ( $local ) {
warn "local[$local] $qname $qtype";
$rcode = "NOERROR";
my $rdata;
if ( $qtype eq "A" && $local eq "server" ) {
- $rdata = name_ip( $local, '172.16.10.1' );
+ $rdata = name_ip( $local, $server::ip );
+ $audit->{source} = 'local';
} else {
$rcode = "NXDOMAIN";
}
if ( my $rdata = $ptr_cache->{$1} ) {
$rdata .= '.' . $server::domain_name;
push @ans, Net::DNS::RR->new("$qname $ttl $qclass $qtype $rdata");
+ $audit->{source} = 'PTR';
} else {
warn "## ",dump( $ptr_cache );
$rcode = "NXDOMAIN";
}
} elsif ( my $packet = $res->query( $qname, $qtype ) ) {
+ $audit->{source} = 'upstream';
$packet->print;
push @ans, $_ foreach $packet->answer;
$rcode = "NOERROR";
warn "rcode: $rcode ",dump( @ans );
+ $audit->{rcode} = $rcode;
+ $audit->{ans} = [ map {
+ my $data;
+ foreach my $n ( keys %$_ ) {
+ $data->{$n} = $_->{$n};
+ }
+ $data;
+ } @ans ];
+
+ CouchDB::audit( 'response', $audit );
+
# mark the answer as authoritive (by setting the 'aa' flag
return ($rcode, \@ans, \@auth, \@add, { aa => 1 });
}
Verbose => $debug,
) || die "couldn't create nameserver object\n";
+ CouchDB::audit('start', { port => 53, domain_name => $server::domain_name });
warn "DNS $server::domain_name";
$ns->main_loop;