3 # -s: import slave zones as master. useful if you need to recreate your
4 # primary nameserver from a secondary
5 # -c chroot_dir: import data from chrooted bind (corrects the path for
6 # downloading zone files
8 # need to manually put header in
9 # /usr/local/etc/freeside/export.<datasrc./bind/<machine>/named.conf.HEADER
12 use vars qw( %d_part_svc );
14 use Term::Query qw(query);
15 #use BIND::Conf_Parser;
16 #use DNS::ZoneParse 0.81;
18 #use Net::SCP qw(iscp);
20 use FS::UID qw(adminsuidsetup datasrc);
21 use FS::Record qw(qsearch); #qsearchs);
24 use FS::domain_record;
28 use vars qw($opt_s $opt_c);
31 my $user = shift or die &usage;
34 $FS::svc_Common::noexport_hack = 1;
35 $FS::domain_record::noserial_hack = 1;
37 use vars qw($spooldir);
38 $spooldir = "/usr/local/etc/freeside/export.". datasrc. "/bind";
39 mkdir $spooldir unless -d $spooldir;
42 map { $_->svcpart, $_ } qsearch('part_svc',{'svcdb'=>'svc_domain'});
45 ( join "\n", map "$_: ".$d_part_svc{$_}->svc, sort keys %d_part_svc ),
47 use vars qw($domain_svcpart);
48 $^W=0; #Term::Query isn't -w-safe
50 query "Enter part number for domains: ", 'irk', [ keys %d_part_svc ];
54 Enter the location and name of your primary named.conf file, for example
55 "ns.isp.com:/var/named/named.conf"
57 my($named_conf)=&getvalue(":");
59 use vars qw($named_machine $prefix);
60 $named_machine = (split(/:/, $named_conf))[0];
61 $prefix = "$spooldir/$named_machine";
62 mkdir $prefix unless -d $prefix;
64 #iscp("root\@$named_conf","$prefix/named.conf.import");
65 scp("root\@$named_conf","$prefix/named.conf.import");
70 $^W=0; # Term::Query isn't -w-safe
71 my $return = query $prompt, '';
80 $FS::svc_domain::whois_hack=1;
83 $p->parse_file("$prefix/named.conf.import");
85 print "\nBIND import completed.\n";
90 die "Usage:\n\n bind.import user\n";
97 use BIND::Conf_Parser;
98 use vars qw(@ISA $named_dir);
99 @ISA = qw(BIND::Conf_Parser);
102 my($self, $option, $argument) = @_;
103 return unless $option eq "directory";
104 $named_dir = $argument;
108 my($self, $name, $class, $type, $options) = @_;
109 return unless $class eq 'in';
110 return if grep { $name eq $_ } (qw(
111 . localhost 127.in-addr.arpa 0.in-addr.arpa 255.in-addr.arpa
112 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa
113 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.int
116 use FS::Record qw(qsearchs);
120 qsearchs('svc_domain', { 'domain' => $name } )
121 || new FS::svc_domain( {
122 svcpart => $main::domain_svcpart,
126 unless ( $domain->svcnum ) {
127 my $error = $domain->insert;
128 die $error if $error;
131 if ( $type eq 'slave' && !$main::opt_s ) {
134 #print Dumper($options);
137 foreach my $master ( @{ $options->{masters} } ) {
138 my $domain_record = new FS::domain_record( {
139 'svcnum' => $domain->svcnum,
142 'rectype' => '_mstr',
143 'recdata' => $master,
145 my $error = $domain_record->insert;
146 die $error if $error;
149 } elsif ( $type eq 'master' || ( $type eq 'slave' && $main::opt_s ) ) {
151 my $file = $options->{file};
154 my $basefile = basename($file);
155 my $sourcefile = $file;
156 $sourcefile = "$named_dir/$sourcefile" unless $file =~ /^\//;
157 $sourcefile = "$main::opt_c/$sourcefile" if $main::opt_c;
159 use Net::SCP qw(iscp scp);
160 scp("root\@$main::named_machine:$sourcefile",
161 "$main::prefix/$basefile.import");
163 use DNS::ZoneParse 0.84;
164 my $zone = DNS::ZoneParse->new("$main::prefix/$basefile.import");
166 my $dump = $zone->dump;
169 #print "$name: ". Dumper($dump);
172 foreach my $rectype ( keys %$dump ) {
173 if ( $rectype =~ /^SOA$/i ) {
174 my $rec = $dump->{$rectype};
175 my $domain_record = new FS::domain_record( {
176 'svcnum' => $domain->svcnum,
177 'reczone' => $rec->{origin},
179 'rectype' => $rectype,
181 $rec->{primary}. ' '. $rec->{email}. ' ( '.
182 join(' ', map $rec->{$_},
183 qw( serial refresh retry expire minimumTTL ) ).
186 my $error = $domain_record->insert;
187 die $error if $error;
189 #die $dump->{$rectype};
190 foreach my $rec ( @{ $dump->{$rectype} } ) {
191 my $domain_record = new FS::domain_record( {
192 'svcnum' => $domain->svcnum,
193 'reczone' => $rec->{name},
194 'recaf' => $rec->{class},
195 'rectype' => $rectype,
196 'recdata' => ( $rectype =~ /^MX$/i
197 ? $rec->{priority}. ' '. $rec->{host}
200 my $error = $domain_record->insert;
201 die $error if $error;
207 # die "unrecognized type $type\n";