This commit was generated by cvs2svn to compensate for changes in r3241,
[freeside.git] / bin / bind.import
1 #!/usr/bin/perl -w
2 #
3 # $Id: bind.import,v 1.4 2004-02-12 10:44:11 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 0.81;
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::svc_Common::noexport_hack = 1;
27 $FS::domain_record::noserial_hack = 1;
28
29 use vars qw($spooldir);
30 $spooldir = "/usr/local/etc/freeside/export.". datasrc. "/bind";
31 mkdir $spooldir unless -d $spooldir;
32
33 %d_part_svc =
34   map { $_->svcpart, $_ } qsearch('part_svc',{'svcdb'=>'svc_domain'});
35
36 print "\n\n",
37       ( join "\n", map "$_: ".$d_part_svc{$_}->svc, sort keys %d_part_svc ),
38       "\n\n";
39 use vars qw($domain_svcpart);
40 $^W=0; #Term::Query isn't -w-safe
41 $domain_svcpart =
42   query "Enter part number for domains: ", 'irk', [ keys %d_part_svc ];
43 $^W=1;
44
45 print "\n\n", <<END;
46 Enter the location and name of your primary named.conf file, for example
47 "ns.isp.com:/var/named/named.conf"
48 END
49 my($named_conf)=&getvalue(":");
50   
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;
55
56 #iscp("root\@$named_conf","$prefix/named.conf.import");
57 scp("root\@$named_conf","$prefix/named.conf.import");
58
59
60 sub getvalue {
61   my $prompt = shift;
62   $^W=0; # Term::Query isn't -w-safe
63   my $return = query $prompt, '';
64   $^W=1;
65   $return;
66 }
67
68 print "\n\n";
69
70 ##
71
72 $FS::svc_domain::whois_hack=1;
73
74 my $p = Parser->new;
75 $p->parse_file("$prefix/named.conf.import");
76
77 print "\nBIND import completed.\n";
78
79 ##
80
81 sub usage {
82   die "Usage:\n\n  bind.import user\n";
83 }
84
85 ########
86 BEGIN {
87   
88   package Parser;
89   use BIND::Conf_Parser;
90   use vars qw(@ISA $named_dir);
91   @ISA = qw(BIND::Conf_Parser);
92   
93   sub handle_option {
94     my($self, $option, $argument) = @_;
95     return unless $option eq "directory";
96     $named_dir = $argument;
97   }
98   
99   sub handle_zone {
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 ) );
104
105     my $domain = new FS::svc_domain( {
106       svcpart => $main::domain_svcpart,
107       domain  => $name,
108       action  => 'N',
109     } );
110     my $error = $domain->insert;
111     die $error if $error;
112
113     if ( $type eq 'slave' ) {
114
115       #use Data::Dumper;
116       #print Dumper($options);
117       #exit;
118
119       foreach my $master ( @{ $options->{masters} } ) {
120         my $domain_record = new FS::domain_record( {
121           'svcnum'  => $domain->svcnum,
122           'reczone' => '@',
123           'recaf'   => 'IN',
124           'rectype' => '_mstr',
125           'recdata' => $master,
126         } );
127         my $error = $domain_record->insert;
128         die $error if $error;
129       }
130
131     } elsif ( $type eq 'master' ) {
132
133       my $file = $options->{file};
134   
135       use File::Basename;
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");
142     
143       use DNS::ZoneParse 0.81;
144       my $zone = DNS::ZoneParse->new("$main::prefix/$basefile.import");
145     
146       my $dump = $zone->Dump;
147   
148       #use Data::Dumper;
149       #print "$name: ". Dumper($dump);
150       #exit;
151     
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},
158             'recaf'   => 'IN',
159             'rectype' => $rectype,
160             'recdata' =>
161               $rec->{primary}. ' '. $rec->{email}. ' ( '.
162              join(' ', map $rec->{$_},
163                            qw( serial refresh retry expire minimumTTL ) ).
164              ' )',
165           } );
166           my $error = $domain_record->insert;
167           die $error if $error;
168        } else {
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}
178                                : $rec->{host}                      ),
179             } );
180             my $error = $domain_record->insert;
181             die $error if $error;
182           }
183         }
184       }
185
186     }
187     
188   }
189
190 }
191 #########
192