#!/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.5 2002-04-30 05:43:34 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;
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. "/bind";
+mkdir $spooldir unless -d $spooldir;
%d_part_svc =
map { $_->svcpart, $_ } qsearch('part_svc',{'svcdb'=>'svc_domain'});
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;
- print "\n\n", <<END;
+print "\n\n", <<END;
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];
+my($named_conf)=&getvalue(":");
+
+use vars qw($named_machine $prefix);
+$named_machine = (split(/:/, $named_conf))[0];
+$prefix = "$spooldir/$named_machine";
+mkdir $prefix unless -d $prefix;
+
+#iscp("root\@$named_conf","$prefix/named.conf.import");
+scp("root\@$named_conf","$prefix/named.conf.import");
+
+
+sub getvalue {
+ my $prompt = shift;
+ $^W=0; # Term::Query isn't -w-safe
+ my $return = query $prompt, '';
+ $^W=1;
+ $return;
+}
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("$prefix/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';
+ return if grep { $name eq $_ }
+ ( qw( . localhost 127.in-addr.arpa 0.in-addr.arpa 255.in-addr.arpa ) );
+
+ 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::prefix/$basefile.import");
+
+ use DNS::ZoneParse;
+ my $zone = DNS::ZoneParse->new("$main::prefix/$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";
}
+#########