working BIND import
[freeside.git] / bin / svc_domain.import
index 10fe5b5..95d2ead 100644 (file)
@@ -1,13 +1,17 @@
 #!/usr/bin/perl -w
 #
-# $Id: svc_domain.import,v 1.3 2001-11-05 12:07:10 ivan Exp $
+# $Id: svc_domain.import,v 1.4 2002-04-20 11:57:35 ivan Exp $
 
 use strict;
 use vars qw( %d_part_svc );
 use Term::Query qw(query);
-use Net::SCP qw(iscp);
+#use BIND::Conf_Parser;
+#use DNS::ZoneParse;
+
+#use Net::SCP qw(iscp);
+use Net::SCP qw(scp);
 use FS::UID qw(adminsuidsetup datasrc);
-#use FS::Record qw(qsearch qsearchs);
+use FS::Record qw(qsearch); #qsearchs);
 #use FS::svc_acct_sm;
 use FS::svc_domain;
 use FS::domain_record;
@@ -17,7 +21,8 @@ use FS::domain_record;
 my $user = shift or die &usage;
 adminsuidsetup $user;
 
-my($spooldir)="/usr/local/etc/freeside/export.". datasrc;
+use vars qw($spooldir);
+$spooldir = "/usr/local/etc/freeside/export.". datasrc;
 
 %d_part_svc =
   map { $_->svcpart, $_ } qsearch('part_svc',{'svcdb'=>'svc_domain'});
@@ -25,8 +30,9 @@ my($spooldir)="/usr/local/etc/freeside/export.". datasrc;
 print "\n\n",
       ( join "\n", map "$_: ".$d_part_svc{$_}->svc, sort keys %d_part_svc ),
       "\n\n";
+use vars qw($domain_svcpart);
 $^W=0; #Term::Query isn't -w-safe
-my $domain_svcpart =
+$domain_svcpart =
   query "Enter part number for domains: ", 'irk', [ keys %d_part_svc ];
 $^W=1;
 
@@ -35,9 +41,19 @@ Enter the location and name of your primary named.conf file, for example
 "ns.isp.com:/var/named/named.conf"
 END
   my($named_conf)=&getvalue(":");
-  iscp("root\@$named_conf","$spooldir/named.conf.import");
-
-my $named_machine = (split(/:/, $named_conf))[0];
+  #iscp("root\@$named_conf","$spooldir/named.conf.import");
+  scp("root\@$named_conf","$spooldir/named.conf.import");
+
+use vars qw($named_machine);
+$named_machine = (split(/:/, $named_conf))[0];
+
+sub getvalue {
+  my $prompt = shift;
+  $^W=0; # Term::Query isn't -w-safe
+  my $return = query $prompt, '';
+  $^W=1;
+  $return;
+}
 
 print "\n\n";
 
@@ -45,48 +61,120 @@ print "\n\n";
 
 $FS::svc_domain::whois_hack=1;
 
-open(NAMED_CONF,"<$spooldir/named.conf.import")
-  or die "Can't open $spooldir/named.conf.import: $!";
+my $p = Parser->new;
+$p->parse_file("$spooldir/named.conf.import");
+
+print "\nBIND import completed.\n";
+
+##
 
-while (<NAMED_CONF>) {
-  next unless /^\s*options/;
+sub usage {
+  die "Usage:\n\n  svc_domain.import user\n";
 }
-my $directory;
-while (<NAMED_CONF>) {
-  last if /^\s*directory\s+\"([\/\w+]+)\";/;
-} 
-$directory = $1 or die "can't locate directory in named.conf!";
-while (<NAMED_CONF>) {
-  next unless /^\s*zone\s+\"([\w\.\-]+)\"\s+\{/;
-  my $zone = $1;
-  while (<NAMED_CONF>) {
-    my $type;
-    if ( /^\s*type\s+(master|slave)\s*\;/ ) {
-      $type = $1;
-    }
-    if ( /^\s*file\s+\"([\w\.\-]+)\"\s*\;/ && $type eq 'master' ) {
-
-      #
-      # (add svc_domain)
-      my $file = $1;
-      iscp("root\@$named_machine:$directory/$file","$spooldir/$file.import");
-      open(ZONE,"<$spooldir/$file.import")
-        or die "Can't open $spooldir/$file.import: $!";
-      while (<ZONE>) {
-        # (add domain_record)
+
+########
+BEGIN {
+  
+  package Parser;
+  use BIND::Conf_Parser;
+  use vars qw(@ISA $named_dir);
+  @ISA = qw(BIND::Conf_Parser);
+  
+  sub handle_option {
+    my($self, $option, $argument) = @_;
+    return unless $option eq "directory";
+    $named_dir = $argument;
+  }
+  
+  sub handle_zone {
+    my($self, $name, $class, $type, $options) = @_;
+    return unless $class eq 'in';
+
+    my $domain = new FS::svc_domain( {
+      svcpart => $main::domain_svcpart,
+      domain  => $name,
+      action  => 'N',
+    } );
+    my $error = $domain->insert;
+    die $error if $error;
+
+    if ( $type eq 'slave' ) {
+
+      #use Data::Dumper;
+      #print Dumper($options);
+      #exit;
+
+      foreach my $master ( @{ $options->{masters} } ) {
+        my $domain_record = new FS::domain_record( {
+          'svcnum'  => $domain->svcnum,
+          'reczone' => '@',
+          'recaf'   => 'IN',
+          'rectype' => '_mstr',
+          'recdata' => $master,
+        } );
+        my $error = $domain_record->insert;
+        die $error if $error;
       }
 
-      #
+    } elsif ( $type eq 'master' ) {
+
+      my $file = $options->{file};
+  
+      use File::Basename;
+      my $basefile = basename($file);
+      my $sourcefile = $file;
+      $sourcefile = "$named_dir/$sourcefile" unless $file =~ /^\//;
+      use Net::SCP qw(iscp scp);
+      scp("root\@$main::named_machine:$sourcefile",
+          "$main::spooldir/$basefile.import");
+    
+      use DNS::ZoneParse;
+      my $zone = DNS::ZoneParse->new("$main::spooldir/$basefile.import");
+    
+      my $dump = $zone->Dump;
+  
+      #use Data::Dumper;
+      #print "$name: ". Dumper($dump);
+      #exit;
+    
+      foreach my $rectype ( keys %$dump ) {
+        if ( $rectype =~ /^SOA$/i ) {
+          my $rec = $dump->{$rectype};
+          my $domain_record = new FS::domain_record( {
+            'svcnum'  => $domain->svcnum,
+            'reczone' => $rec->{origin},
+            'recaf'   => 'IN',
+            'rectype' => $rectype,
+            'recdata' =>
+              $rec->{primary}. ' '. $rec->{email}. ' ( '.
+             join(' ', map $rec->{$_},
+                           qw( serial refresh retry expire minimumTTL ) ).
+             ' )',
+          } );
+          my $error = $domain_record->insert;
+          die $error if $error;
+       } else {
+          #die $dump->{$rectype};
+          foreach my $rec ( @{ $dump->{$rectype} } ) {
+            my $domain_record = new FS::domain_record( {
+              'svcnum'  => $domain->svcnum,
+              'reczone' => $rec->{name},
+              'recaf'   => $rec->{class},
+              'rectype' => $rectype,
+              'recdata' => ( $rectype =~ /^MX$/i
+                               ? $rec->{priority}. ' '. $rec->{host}
+                               : $rec->{host}                      ),
+            } );
+            my $error = $domain_record->insert;
+            die $error if $error;
+          }
+        }
+      }
 
     }
     
-    last if /^\s*\}\s*\;/;
   }
-}
-
-##
 
-sub usage {
-  die "Usage:\n\n  svc_domain.import user\n";
 }
+#########