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