5c4149501ddad4bf463321b153a951835efd17f0
[freeside.git] / bin / bind.import
1 #!/usr/bin/perl -w
2 #
3 # $Id: bind.import,v 1.1 2002-05-23 13:00:08 ivan Exp $
4
5 #need to manually put header in /usr/local/etc/freeside/export.<datasrc./bind/<machine>/named.conf.HEADER
6
7 use strict;
8 use vars qw( %d_part_svc );
9 use Term::Query qw(query);
10 #use BIND::Conf_Parser;
11 #use DNS::ZoneParse;
12
13 #use Net::SCP qw(iscp);
14 use Net::SCP qw(scp);
15 use FS::UID qw(adminsuidsetup datasrc);
16 use FS::Record qw(qsearch); #qsearchs);
17 #use FS::svc_acct_sm;
18 use FS::svc_domain;
19 use FS::domain_record;
20 #use FS::svc_acct;
21 #use FS::part_svc;
22
23 my $user = shift or die &usage;
24 adminsuidsetup $user;
25
26 $FS::domain_record::noserial_hack = 1;
27
28 use vars qw($spooldir);
29 $spooldir = "/usr/local/etc/freeside/export.". datasrc. "/bind";
30 mkdir $spooldir unless -d $spooldir;
31
32 %d_part_svc =
33   map { $_->svcpart, $_ } qsearch('part_svc',{'svcdb'=>'svc_domain'});
34
35 print "\n\n",
36       ( join "\n", map "$_: ".$d_part_svc{$_}->svc, sort keys %d_part_svc ),
37       "\n\n";
38 use vars qw($domain_svcpart);
39 $^W=0; #Term::Query isn't -w-safe
40 $domain_svcpart =
41   query "Enter part number for domains: ", 'irk', [ keys %d_part_svc ];
42 $^W=1;
43
44 print "\n\n", <<END;
45 Enter the location and name of your primary named.conf file, for example
46 "ns.isp.com:/var/named/named.conf"
47 END
48 my($named_conf)=&getvalue(":");
49   
50 use vars qw($named_machine $prefix);
51 $named_machine = (split(/:/, $named_conf))[0];
52 $prefix = "$spooldir/$named_machine";
53 mkdir $prefix unless -d $prefix;
54
55 #iscp("root\@$named_conf","$prefix/named.conf.import");
56 scp("root\@$named_conf","$prefix/named.conf.import");
57
58
59 sub getvalue {
60   my $prompt = shift;
61   $^W=0; # Term::Query isn't -w-safe
62   my $return = query $prompt, '';
63   $^W=1;
64   $return;
65 }
66
67 print "\n\n";
68
69 ##
70
71 $FS::svc_domain::whois_hack=1;
72
73 my $p = Parser->new;
74 $p->parse_file("$prefix/named.conf.import");
75
76 print "\nBIND import completed.\n";
77
78 ##
79
80 sub usage {
81   die "Usage:\n\n  svc_domain.import user\n";
82 }
83
84 ########
85 BEGIN {
86   
87   package Parser;
88   use BIND::Conf_Parser;
89   use vars qw(@ISA $named_dir);
90   @ISA = qw(BIND::Conf_Parser);
91   
92   sub handle_option {
93     my($self, $option, $argument) = @_;
94     return unless $option eq "directory";
95     $named_dir = $argument;
96   }
97   
98   sub handle_zone {
99     my($self, $name, $class, $type, $options) = @_;
100     return unless $class eq 'in';
101     return if grep { $name eq $_ }
102       ( qw( . localhost 127.in-addr.arpa 0.in-addr.arpa 255.in-addr.arpa ) );
103
104     my $domain = new FS::svc_domain( {
105       svcpart => $main::domain_svcpart,
106       domain  => $name,
107       action  => 'N',
108     } );
109     my $error = $domain->insert;
110     die $error if $error;
111
112     if ( $type eq 'slave' ) {
113
114       #use Data::Dumper;
115       #print Dumper($options);
116       #exit;
117
118       foreach my $master ( @{ $options->{masters} } ) {
119         my $domain_record = new FS::domain_record( {
120           'svcnum'  => $domain->svcnum,
121           'reczone' => '@',
122           'recaf'   => 'IN',
123           'rectype' => '_mstr',
124           'recdata' => $master,
125         } );
126         my $error = $domain_record->insert;
127         die $error if $error;
128       }
129
130     } elsif ( $type eq 'master' ) {
131
132       my $file = $options->{file};
133   
134       use File::Basename;
135       my $basefile = basename($file);
136       my $sourcefile = $file;
137       $sourcefile = "$named_dir/$sourcefile" unless $file =~ /^\//;
138       use Net::SCP qw(iscp scp);
139       scp("root\@$main::named_machine:$sourcefile",
140           "$main::prefix/$basefile.import");
141     
142       use DNS::ZoneParse;
143       my $zone = DNS::ZoneParse->new("$main::prefix/$basefile.import");
144     
145       my $dump = $zone->Dump;
146   
147       #use Data::Dumper;
148       #print "$name: ". Dumper($dump);
149       #exit;
150     
151       foreach my $rectype ( keys %$dump ) {
152         if ( $rectype =~ /^SOA$/i ) {
153           my $rec = $dump->{$rectype};
154           my $domain_record = new FS::domain_record( {
155             'svcnum'  => $domain->svcnum,
156             'reczone' => $rec->{origin},
157             'recaf'   => 'IN',
158             'rectype' => $rectype,
159             'recdata' =>
160               $rec->{primary}. ' '. $rec->{email}. ' ( '.
161              join(' ', map $rec->{$_},
162                            qw( serial refresh retry expire minimumTTL ) ).
163              ' )',
164           } );
165           my $error = $domain_record->insert;
166           die $error if $error;
167        } else {
168           #die $dump->{$rectype};
169           foreach my $rec ( @{ $dump->{$rectype} } ) {
170             my $domain_record = new FS::domain_record( {
171               'svcnum'  => $domain->svcnum,
172               'reczone' => $rec->{name},
173               'recaf'   => $rec->{class},
174               'rectype' => $rectype,
175               'recdata' => ( $rectype =~ /^MX$/i
176                                ? $rec->{priority}. ' '. $rec->{host}
177                                : $rec->{host}                      ),
178             } );
179             my $error = $domain_record->insert;
180             die $error if $error;
181           }
182         }
183       }
184
185     }
186     
187   }
188
189 }
190 #########
191