Changeset 33 for trunk/DNSDB.pm


Ignore:
Timestamp:
11/10/09 17:51:55 (15 years ago)
Author:
Kris Deugau
Message:

/trunk

checkpoint, fleshing out axfr import

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/DNSDB.pm

    r29 r33  
    1515use Exporter;
    1616use DBI;
     17use Net::DNS;
    1718#use Net::SMTP;
    1819#use NetAddr::IP qw( Compact );
     
    811812
    812813
     814## DNSDB::importAXFR
     815# Import a domain via AXFR
     816sub importAXFR {
     817  my $dbh = shift;
     818  my $ifrom = shift;
     819  my $domain = shift;
     820  my $group = shift;
     821  my $status = shift || 1;
     822  my $rwsoa = shift || 0;
     823  my $rwns = shift || 0;
     824##fixme:  add mode to delete&replace, merge+overwrite, merge new?
     825
     826  my $res = Net::DNS::Resolver->new;
     827$res->axfr_start($domain);
     828my $nrecs = 0;
     829my $flags = 0;
     830
     831  # Allow transactions, and raise an exception on errors so we can catch it later.
     832  # Use local to make sure these get "reset" properly on exiting this block
     833  local $dbh->{AutoCommit} = 0;
     834  local $dbh->{RaiseError} = 1;
     835
     836  eval {
     837    # can't do this, can't nest transactions.  sigh.
     838    #my ($dcode, $dmsg) = addDomain($dbh, $domain, $group, $status);
     839
     840##fixme:  serial
     841    my $sth = $dbh->prepare("INSERT INTO domains (domain,group_id,status) VALUES (?,?,?)");
     842    $sth->execute($domain,$group,$state);
     843
     844    # get domain id so we can do the records
     845    $sth = $dbh->prepare("select domain_id from domains where domain='$domain'");
     846    $sth->execute;
     847    ($dom_id) = $sth->fetchrow_array();
     848
     849    while (my $rr = $res->axfr_next) {
     850      my $type = $rr->type;
     851# nasty big ugly case-like thing here, since we have to do *some* different
     852# processing depending on the record.  le sigh.
     853      my $sql = "INSERT INTO records (domain_id,host,type,val,ttl";
     854      my $vallen = "?,?,?,?,?";
     855      my $host,$val;
     856
     857##work
     858# gnnnnnh.  going to need to (rr->string)  ->  split  ->  <localvars>
     859my @vallist;
     860      if ($type eq 'SOA') {
     861        $host = $rr->mname.":".$rr->rname;
     862        $val = $rr->refresh.":".$rr->retry.":".$rr->expire.":".$rr->minimum;
     863      }
     864      if ($type eq 'MX' || $type eq 'SRV') {
     865        $sql .= ",distance";
     866        $vallen .= ",?";
     867        $sql .= ",weight,port" if $type eq 'SRV';
     868        $vallen .= ",?,?" if $type eq 'SRV';
     869      }
     870$sth = $dbh->prepare($sql.") VALUES (".$vallen.")");
     871$sth->execute(@vallist);
     872
     873      #print $rr->rdata."\n";
     874    }
     875  };
     876
     877  if ($@) {
     878    my $msg = $@;
     879    eval { $dbh->rollback; };
     880    return ('FAIL',$msg);
     881  } else {
     882    return ('OK',"ook");
     883  }
     884
     885  return ('WARN',"
     886} # end importAXFR()
     887
     888
    813889# shut Perl up
    8148901;
Note: See TracChangeset for help on using the changeset viewer.