#!/usr/bin/perl -w 
#
# multilog.pl: receive NOTIFY queries from trusted hosts
# install to /usr/local/sbin and call from tinydns/log/run:
# exec setuidgid dnslog /usr/local/sbin/multilog.pl
# -- anti@spin.de 2002-06-12

use strict;

# add allowed primaries here:
my $axfr= {
	   '127.0.0.1'     => 'any',
	   '10.0.23.23'  => [ 'dom1.xy', 'dom2.yz'],
	  };

# where zone data is stored:
my $zonedir= '/tmp';

open ( MLOG, "| multilog t ./main" ) or die "Can't fork multilog: $!";
select MLOG; $|=1;

while ( <> )
{
  print; chomp;
  my ( $ip_port_qid, $sid, $qtype, $domain)= split / /;
  next unless defined $ip_port_qid and defined $sid and defined $qtype 
    and defined $domain;
  next unless $sid eq 'I' and $qtype eq '0006';
  my ( $hexip, $hexport, $qid )= split /:/, $ip_port_qid;
  my $ip= join(".", unpack("C*", pack("H8", $hexip)));
  next unless defined $axfr->{$ip};

  if ($axfr->{$ip} eq 'any' or grep( /^$domain$/, @{$axfr->{$ip}} ))
  {
    `logger -t axfr-watch "rcvd NTFY $ip ($domain)"`;
    `logger -t axfr-watch "send AXFR $ip ($domain)"`;
    chdir $zonedir;
    `tcpclient $ip 53 axfr-get $domain $domain.data $domain.tmp`;
    # call method to update your data.cdb here...
  }
  else
  {
    `logger -t axfr-watch "nvld NTFY $ip ($ip_port_qid $sid $qtype $domain)"`;
  }
}

close MLOG;
