cleanup audit start
[pxelator] / lib / PXElator / dnsd.pm
index 063c504..0255fd1 100644 (file)
@@ -6,6 +6,7 @@ use strict;
 use Net::DNS::Nameserver;
 use Net::DNS::Resolver;
 use Data::Dump qw/dump/;
+use CouchDB;
 
 use server;
 our $debug = server::debug;
@@ -30,7 +31,14 @@ sub reply_handler {
        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$};
@@ -38,12 +46,15 @@ sub reply_handler {
 
        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";
                }
@@ -54,12 +65,14 @@ sub reply_handler {
                        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";
@@ -71,6 +84,17 @@ warn "## ",dump( $ptr_cache );
 
        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 });
 }
@@ -82,6 +106,7 @@ sub start {
                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;