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