Index: /trunk/DNSDB.pm
===================================================================
--- /trunk/DNSDB.pm	(revision 32)
+++ /trunk/DNSDB.pm	(revision 33)
@@ -15,4 +15,5 @@
 use Exporter;
 use DBI;
+use Net::DNS;
 #use Net::SMTP;
 #use NetAddr::IP qw( Compact );
@@ -811,4 +812,79 @@
 
 
+## DNSDB::importAXFR
+# Import a domain via AXFR
+sub importAXFR {
+  my $dbh = shift;
+  my $ifrom = shift;
+  my $domain = shift;
+  my $group = shift;
+  my $status = shift || 1;
+  my $rwsoa = shift || 0;
+  my $rwns = shift || 0;
+##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;
+
+  # Allow transactions, and raise an exception on errors so we can catch it later.
+  # Use local to make sure these get "reset" properly on exiting this block
+  local $dbh->{AutoCommit} = 0;
+  local $dbh->{RaiseError} = 1;
+
+  eval {
+    # can't do this, can't nest transactions.  sigh.
+    #my ($dcode, $dmsg) = addDomain($dbh, $domain, $group, $status);
+
+##fixme:  serial
+    my $sth = $dbh->prepare("INSERT INTO domains (domain,group_id,status) VALUES (?,?,?)");
+    $sth->execute($domain,$group,$state);
+
+    # get domain id so we can do the records
+    $sth = $dbh->prepare("select domain_id from domains where domain='$domain'");
+    $sth->execute;
+    ($dom_id) = $sth->fetchrow_array();
+
+    while (my $rr = $res->axfr_next) {
+      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 $vallen = "?,?,?,?,?";
+      my $host,$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') {
+	$sql .= ",distance";
+	$vallen .= ",?";
+	$sql .= ",weight,port" if $type eq 'SRV';
+	$vallen .= ",?,?" if $type eq 'SRV';
+      }
+$sth = $dbh->prepare($sql.") VALUES (".$vallen.")");
+$sth->execute(@vallist);
+
+      #print $rr->rdata."\n";
+    }
+  };
+
+  if ($@) {
+    my $msg = $@;
+    eval { $dbh->rollback; };
+    return ('FAIL',$msg);
+  } else {
+    return ('OK',"ook");
+  }
+
+  return ('WARN',"
+} # end importAXFR()
+
+
 # shut Perl up
 1;
Index: /trunk/dns.cgi
===================================================================
--- /trunk/dns.cgi	(revision 32)
+++ /trunk/dns.cgi	(revision 33)
@@ -601,6 +601,34 @@
   $page->param(rwsoa => $webvar{rwsoa}) if $webvar{rwsoa};
   $page->param(rwns => $webvar{rwns}) if $webvar{rwns};
+  $page->param(dominactive => 1) unless $webvar{domactive};
   $page->param(importdoms => $webvar{importdoms}) if $webvar{importdoms};
 ##work
+
+##fixme: check group too?
+  if ($webvar{doit} eq 'y' && !$webvar{ifrom}) {
+    $page->param(errmsg => "Need to set host to import from");
+  } elsif ($webvar{doit} eq 'y' && !$webvar{importdoms}) {
+    $page->param(errmsg => "Need domains to import");
+  } else {
+    my @domlist = split /\s+/, $webvar{importdoms};
+    my @results;
+my $rnum = 0;
+    foreach my $domain (@domlist) {
+      # 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;
+    }
+    $page->param(axfrresults => \@results);
+  }
+
   push @debugbits, "<pre>$webvar{importdoms}</pre>";
 }
Index: /trunk/templates/axfr.tmpl
===================================================================
--- /trunk/templates/axfr.tmpl	(revision 32)
+++ /trunk/templates/axfr.tmpl	(revision 33)
@@ -5,5 +5,5 @@
 <td align="center">
 
-<TMPL_IF errmsg><div class="errmsg">Query error: <TMPL_VARNAME=errmsg></div></TMPL_IF>
+<TMPL_IF errmsg><div class="errmsg">Error: <TMPL_VARNAME=errmsg></div></TMPL_IF>
 
 <form action="dns.cgi" method="POST">
@@ -35,4 +35,8 @@
 </tr>
 <tr class="datalinelight">
+	<td>Import as active?</td>
+	<td><input type=checkbox name="domactive"<TMPL_UNLESS dominactive> checked</TMPL_UNLESS>></td>
+</tr>
+<tr class="datalinelight">
 	<td valign="top">Domains to import:<br />(one per line)</td>
 	<td><textarea name="importdoms" rows=10><TMPL_IF importdoms><TMPL_VAR NAME=importdoms></TMPL_IF></textarea></td>
@@ -46,19 +50,15 @@
 
 <TMPL_IF axfrresults>
+<br />
 <table>
 <tr class="tableheader"><td colspan=2>AXFR Import Results</td></tr>
 <TMPL_LOOP NAME=axfrresults>
-<TMPL_IF domok><tr class="tableheader"><td><TMPL_VAR NAME=domain></td><td>Imported OK</td></tr>
-<TMPL_ELSE><tr class="tableheader"><td><TMPL_VAR NAME=domain></td><td>Failed: <TMPL_VAR NAME=domerr></td></tr>
 <tr class="datalinelight">
-	<td>Try again?</td>
-	<td>
-		<input type=radio name=try<TMPL_VAR NAME=row> value="0">No/Discard<br />
-		<input type=radio name=try<TMPL_VAR NAME=row> value="R">Replace<br />
-		<input type=radio name=try<TMPL_VAR NAME=row> value="M">Merge + Overwrite<br />
-		<input type=radio name=try<TMPL_VAR NAME=row> value="M">Merge only new records
-	</td>
+	<td><TMPL_VAR NAME=domain></td>
+<TMPL_IF domok>	<td>Imported OK</td>
+<TMPL_ELSE><TMPL_IF domwarn>	<td class="warn">Warning: <TMPL_VAR NAME=domwarn></td>
+<TMPL_ELSE>	<td class="err">Failed: <TMPL_VAR NAME=domerr></td>
+</TMPL_IF></TMPL_IF>
 </tr>
-</TMPL_IF>
 </TMPL_LOOP>
 </table>
Index: /trunk/templates/dns.css
===================================================================
--- /trunk/templates/dns.css	(revision 32)
+++ /trunk/templates/dns.css	(revision 33)
@@ -70,4 +70,15 @@
 	background-color: #DDDDDD;
 }
+td.err {
+	border: solid 2px #FF0000;
+	color: red;
+	background-color: #e0e0e0;
+}
+td.warn {
+	border: solid 2px #FFFF00;
+	color: #333300;
+	background-color: #e0e0e0;
+}
+
 .meat {
 	align: center;
