Index: /trunk/DNSDB.pm
===================================================================
--- /trunk/DNSDB.pm	(revision 33)
+++ /trunk/DNSDB.pm	(revision 34)
@@ -30,5 +30,5 @@
 	&getSOA	&getRecLine &getDomRecs
 	&addRec &updateRec &delRec
-	&domStatus
+	&domStatus &importAXFR
 	%typemap %reverse_typemap
 	);
@@ -42,5 +42,5 @@
 		&getSOA &getRecLine &getDomRecs
 		&addRec &updateRec &delRec
-		&domStatus
+		&domStatus &importAXFR
 		%typemap %reverse_typemap
 		)]
@@ -824,8 +824,8 @@
 ##fixme:  add mode to delete&replace, merge+overwrite, merge new?
 
-  my $res = Net::DNS::Resolver->new;
-$res->axfr_start($domain);
+
 my $nrecs = 0;
 my $flags = 0;
+my $warnmsg;
 
   # Allow transactions, and raise an exception on errors so we can catch it later.
@@ -834,4 +834,6 @@
   local $dbh->{RaiseError} = 1;
 
+  my $dom_id;
+
   eval {
     # can't do this, can't nest transactions.  sigh.
@@ -840,5 +842,6 @@
 ##fixme:  serial
     my $sth = $dbh->prepare("INSERT INTO domains (domain,group_id,status) VALUES (?,?,?)");
-    $sth->execute($domain,$group,$state);
+$warnmsg = "trying lokido... (".$dbh->{AutoCommit}."), (".$dbh->{RaiseError}.")" if $domain eq 'waslokido.com';
+    $sth->execute($domain,$group,$status);
 
     # get domain id so we can do the records
@@ -846,28 +849,97 @@
     $sth->execute;
     ($dom_id) = $sth->fetchrow_array();
+$warnmsg .= " [domid $dom_id]";
+
+    my $res = Net::DNS::Resolver->new;
+    unless ($res->axfr_start($domain)) {
+      $dbh->rollback;
+      die "Couldn't begin AXFR\n";
+    }
+
+#die "just started AXFR\n";
 
     while (my $rr = $res->axfr_next) {
+$warnmsg = $rr->string;
       my $type = $rr->type;
 # nasty big ugly case-like thing here, since we have to do *some* different
 # processing depending on the record.  le sigh.
-      my $sql = "INSERT INTO records (domain_id,host,type,val,ttl";
+      my $sql = "INSERT INTO records (domain_id,host,type,ttl,val";
       my $vallen = "?,?,?,?,?";
-      my $host,$val;
+#      my $host = $rr->name;
+#      my $ttl = $rr->ttl;
+#      my $val;
 
 ##work
-# gnnnnnh.  going to need to (rr->string)  ->  split  ->  <localvars>
-my @vallist;
-      if ($type eq 'SOA') {
-	$host = $rr->mname.":".$rr->rname;
-	$val = $rr->refresh.":".$rr->retry.":".$rr->expire.":".$rr->minimum;
-      }
-      if ($type eq 'MX' || $type eq 'SRV') {
+# gnnnnnh.  going to need to (rr->string)  ->  split  ->  <localvars>  ?
+my @vallist = ($dom_id, $rr->name, $reverse_typemap{$type}, $rr->ttl);
+
+# "Primary" types:
+# A, NS, CNAME, SOA, PTR(warn in forward), MX, TXT, AAAA, SRV, A6(ob), SPF
+# maybe KEY
+
+      if ($type eq 'A') {
+	push @vallist, $rr->address;
+      } elsif ($type eq 'NS') {
+	push @vallist, $rr->nsdname;
+      } elsif ($type eq 'CNAME') {
+	push @vallist, $rr->cname;
+      } elsif ($type eq 'SOA') {
+	$vallist[1] = $rr->mname.":".$rr->rname;
+	push @vallist, ($rr->refresh.":".$rr->retry.":".$rr->expire.":".$rr->minimum);
+      } elsif ($type eq 'PTR') {
+	# hmm.  PTR records should not be in forward zones.
+      } elsif ($type eq 'MX') {
 	$sql .= ",distance";
 	$vallen .= ",?";
-	$sql .= ",weight,port" if $type eq 'SRV';
-	$vallen .= ",?,?" if $type eq 'SRV';
+	push @vallist, $rr->exchange;
+	push @vallist, $rr->preference;
+      } elsif ($type eq 'TXT') {
+##fixme:  Net::DNS docs say this should be deprecated for rdatastr() or char_str_list(),
+## but don't really seem enthusiastic about it.
+	push @vallist, $rr->txtdata;
+      } elsif ($type eq 'SPF') {
+##fixme: and the same caveat here, since it is apparently a clone of ::TXT
+	push @vallist, $rr->txtdata;
+      } elsif ($type eq 'AAAA') {
+	push @vallist, $rr->address;
+      } elsif ($type eq 'SRV') {
+	$sql .= ",distance,weight,port" if $type eq 'SRV';
+	$vallen .= ",?,?,?" if $type eq 'SRV';
+	push @vallist, $rr->priority;
+	push @vallist, $rr->weight;
+	push @vallist, $rr->port;
+      } elsif ($type eq 'KEY') {
+	push @vallist, ($rr->flags.":".$rr->protocol.":".$rr->algorithm.":".$rr->key.":".$rr->keytag.":".$rr->privatekeyname);
       }
-$sth = $dbh->prepare($sql.") VALUES (".$vallen.")");
-$sth->execute(@vallist);
+
+$warnmsg = $rr->string;
+$dbh->rollback if $domain eq 'waslokido.com';
+die "first record: ".$rr->string."\n" if $domain eq 'waslokido.com';
+
+# BIND supports:
+# A CNAME HINFO MB(ex) MD(ob) MF(ob) MG(ex) MINFO(ex) MR(ex) MX NS NULL
+# PTR SOA TXT WKS AFSDB(ex) ISDN(ex) RP(ex) RT(ex) X25(ex) PX
+# ... if one can ever find the right magic to format them correctly
+
+# Net::DNS supports:
+# RRSIG SIG NSAP NS NIMLOC NAPTR MX MR MINFO MG MB LOC ISDN IPSECKEY HINFO
+# EID DNAME CNAME CERT APL AFSDB AAAA A DS NXT NSEC3PARAM NSEC3 NSEC KEY
+# DNSKEY DLV X25 TXT TSIG TKEY SSHFP SRV SPF SOA RT RP PX PTR NULL APL::AplItem
+
+# MX and SRV have known extras to stuff in.
+      if ($type eq 'MX') {
+	push @vallist, $rr->preference;
+      }
+      if ($type eq 'SRV') {
+      }
+
+      $sth = $dbh->prepare($sql.") VALUES (".$vallen.")");
+      $sth->execute(@vallist) or die "failed to insert ".$rr->string.": ".$sth->errstr."\n" if $sth->err;
+
+      if ($type eq 'SOA') {
+      }
+
+$dbh->rollback;
+#die "die.die.die!\n";
 
       #print $rr->rdata."\n";
@@ -878,10 +950,12 @@
     my $msg = $@;
     eval { $dbh->rollback; };
-    return ('FAIL',$msg);
+    return ('FAIL',$msg." $warnmsg");
   } else {
+    return ('WARN', "OOOK!  Ooooook.  Ook. ($warnmsg)") if $domain eq 'deepnet.cx';
+    return ('WARN', "Funky Things Happened: $warnmsg") if $domain eq 'waslokido.com';
     return ('OK',"ook");
   }
 
-  return ('WARN',"
+  return ('WARN',"OOOK!");
 } # end importAXFR()
 
Index: /trunk/dns.cgi
===================================================================
--- /trunk/dns.cgi	(revision 33)
+++ /trunk/dns.cgi	(revision 34)
@@ -615,15 +615,14 @@
 my $rnum = 0;
     foreach my $domain (@domlist) {
+      my %row;
+      my ($code,$msg) = importAXFR($dbh, $webvar{ifrom}, $domain, $webvar{group},
+	$webvar{domstatus}, $webvar{rwsoa}, $webvar{rwns});
+  $row{domok} = 1 if $code eq 'OK';
+  $row{domwarn} = $msg if $code eq 'WARN';
+  $row{domerr} = $msg if $code eq 'FAIL';
+push @debugbits, "$domain: $code<br>\n";
       # do stuff!  DNSDB::importAXFR($webvar{ifrom}, $webvar{rwsoa}, $webvar{rwns}, $domain, <flags>)
-      my %row;
       $row{domain} = $domain;
 #      $row{row} = $rnum++;
-      if ($domain eq 'deepnet.cx' || $domain eq 'wh-int') {
-	$row{domok} = 0;  $row{domerr} = "foo!  hahahaha!";
-      } elsif ($domain eq 'waslokido.com') {
-	$row{domwarn} = 0;  $row{domwarn} = "foo!  hahahaha!";
-      } else {
-	$row{domok} = 1;
-      }
       push @results, \%row;
     }
Index: /trunk/templates/axfr.tmpl
===================================================================
--- /trunk/templates/axfr.tmpl	(revision 33)
+++ /trunk/templates/axfr.tmpl	(revision 34)
@@ -4,6 +4,4 @@
 
 <td align="center">
-
-<TMPL_IF errmsg><div class="errmsg">Error: <TMPL_VARNAME=errmsg></div></TMPL_IF>
 
 <form action="dns.cgi" method="POST">
@@ -13,4 +11,5 @@
 
 <table>
+<TMPL_IF errmsg><tr><td class="errhead" colspan=2>Error: <TMPL_VARNAME=errmsg></td></tr></TMPL_IF>
 <tr class="tableheader"><td align="center" colspan=2>Import domains via AXFR</td></tr>
 <tr class="datalinelight">
Index: /trunk/templates/dns.css
===================================================================
--- /trunk/templates/dns.css	(revision 33)
+++ /trunk/templates/dns.css	(revision 34)
@@ -69,4 +69,13 @@
 td.defaults {
 	background-color: #DDDDDD;
+}
+td.errhead {
+	font-weight: bold;
+	font-size: 110%;
+	color: red;
+	background-color: #404040;
+	text-align: center;
+	padding: 3px;
+	border: solid 2px #FF0000;
 }
 td.err {
