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