3 # $Id: bind.import,v 1.3.4.1 2004-02-12 10:44:13 ivan Exp $
5 #need to manually put header in /usr/local/etc/freeside/export.<datasrc./bind/<machine>/named.conf.HEADER
8 use vars qw( %d_part_svc );
9 use Term::Query qw(query);
10 #use BIND::Conf_Parser;
11 #use DNS::ZoneParse 0.81;
13 #use Net::SCP qw(iscp);
15 use FS::UID qw(adminsuidsetup datasrc);
16 use FS::Record qw(qsearch); #qsearchs);
19 use FS::domain_record;
23 my $user = shift or die &usage;
26 $FS::svc_Common::noexport_hack = 1;
27 $FS::domain_record::noserial_hack = 1;
29 use vars qw($spooldir);
30 $spooldir = "/usr/local/etc/freeside/export.". datasrc. "/bind";
31 mkdir $spooldir unless -d $spooldir;
34 map { $_->svcpart, $_ } qsearch('part_svc',{'svcdb'=>'svc_domain'});
37 ( join "\n", map "$_: ".$d_part_svc{$_}->svc, sort keys %d_part_svc ),
39 use vars qw($domain_svcpart);
40 $^W=0; #Term::Query isn't -w-safe
42 query "Enter part number for domains: ", 'irk', [ keys %d_part_svc ];
46 Enter the location and name of your primary named.conf file, for example
47 "ns.isp.com:/var/named/named.conf"
49 my($named_conf)=&getvalue(":");
51 use vars qw($named_machine $prefix);
52 $named_machine = (split(/:/, $named_conf))[0];
53 $prefix = "$spooldir/$named_machine";
54 mkdir $prefix unless -d $prefix;
56 #iscp("root\@$named_conf","$prefix/named.conf.import");
57 scp("root\@$named_conf","$prefix/named.conf.import");
62 $^W=0; # Term::Query isn't -w-safe
63 my $return = query $prompt, '';
72 $FS::svc_domain::whois_hack=1;
75 $p->parse_file("$prefix/named.conf.import");
77 print "\nBIND import completed.\n";
82 die "Usage:\n\n bind.import user\n";
89 use BIND::Conf_Parser;
90 use vars qw(@ISA $named_dir);
91 @ISA = qw(BIND::Conf_Parser);
94 my($self, $option, $argument) = @_;
95 return unless $option eq "directory";
96 $named_dir = $argument;
100 my($self, $name, $class, $type, $options) = @_;
101 return unless $class eq 'in';
102 return if grep { $name eq $_ }
103 ( qw( . localhost 127.in-addr.arpa 0.in-addr.arpa 255.in-addr.arpa ) );
105 my $domain = new FS::svc_domain( {
106 svcpart => $main::domain_svcpart,
110 my $error = $domain->insert;
111 die $error if $error;
113 if ( $type eq 'slave' ) {
116 #print Dumper($options);
119 foreach my $master ( @{ $options->{masters} } ) {
120 my $domain_record = new FS::domain_record( {
121 'svcnum' => $domain->svcnum,
124 'rectype' => '_mstr',
125 'recdata' => $master,
127 my $error = $domain_record->insert;
128 die $error if $error;
131 } elsif ( $type eq 'master' ) {
133 my $file = $options->{file};
136 my $basefile = basename($file);
137 my $sourcefile = $file;
138 $sourcefile = "$named_dir/$sourcefile" unless $file =~ /^\//;
139 use Net::SCP qw(iscp scp);
140 scp("root\@$main::named_machine:$sourcefile",
141 "$main::prefix/$basefile.import");
143 use DNS::ZoneParse 0.81;
144 my $zone = DNS::ZoneParse->new("$main::prefix/$basefile.import");
146 my $dump = $zone->Dump;
149 #print "$name: ". Dumper($dump);
152 foreach my $rectype ( keys %$dump ) {
153 if ( $rectype =~ /^SOA$/i ) {
154 my $rec = $dump->{$rectype};
155 my $domain_record = new FS::domain_record( {
156 'svcnum' => $domain->svcnum,
157 'reczone' => $rec->{origin},
159 'rectype' => $rectype,
161 $rec->{primary}. ' '. $rec->{email}. ' ( '.
162 join(' ', map $rec->{$_},
163 qw( serial refresh retry expire minimumTTL ) ).
166 my $error = $domain_record->insert;
167 die $error if $error;
169 #die $dump->{$rectype};
170 foreach my $rec ( @{ $dump->{$rectype} } ) {
171 my $domain_record = new FS::domain_record( {
172 'svcnum' => $domain->svcnum,
173 'reczone' => $rec->{name},
174 'recaf' => $rec->{class},
175 'rectype' => $rectype,
176 'recdata' => ( $rectype =~ /^MX$/i
177 ? $rec->{priority}. ' '. $rec->{host}
180 my $error = $domain_record->insert;
181 die $error if $error;