bind export
[freeside.git] / bin / bind.export
1 #!/usr/bin/perl -w
2
3 use strict;
4 use File::Path;
5 use FS::UID qw(adminsuidsetup datasrc);
6 use FS::Record qw(qsearch qsearchs);
7 use FS::part_export;
8 use FS::cust_pkg;
9 use FS::cust_svc;
10 use FS::svc_domain;
11
12 my $user = shift or die &usage;
13 adminsuidsetup $user;
14
15 my $spooldir = "/usr/local/etc/freeside/export.". datasrc. "/bind";
16 mkdir $spooldir unless -d $spooldir;
17
18 my @exports = qsearch('part_export', { 'exporttype' => 'bind' } );
19 my @sexports = qsearch('part_export', { 'exporttype' => 'bind_slave' } );
20
21 foreach my $export ( @exports ) {
22
23   my $prefix = "$spooldir/". $export->machine;
24
25   #prevent old domain files from piling up
26   #rmtree "$prefix" or die "can't rmtree $prefix.db: $!";
27
28   mkdir $prefix unless -d $prefix;
29
30   open(NAMED_CONF,">$prefix/named.conf")
31     or die "can't open $prefix/named.conf: $!";
32
33   open(CONF_HEADER,"<$prefix/named.conf.HEADER"); #or die
34   while (<CONF_HEADER>) { print NAMED_CONF $_; }
35   close CONF_HEADER;
36
37   my $zonepath = $export->option('zonepath');
38   $zonepath =~ s/\/$//;
39
40   #false laziness with  freeside-sqlradius-reset 
41   my @svc_domain =
42     map { qsearchs('svc_domain', { 'svcnum' => $_->svcnum } ) }
43       map { qsearch('cust_svc', { 'svcpart' => $_->svcpart } ) }
44         grep { qsearch('cust_svc', { 'svcpart' => $_->svcpart } ) }
45           $export->export_svc;
46
47   foreach my $svc_domain ( @svc_domain ) {
48     my $domain = $svc_domain->domain;
49     my @masters = qsearch('domain_record', {
50       'svcnum' => $svc_domain->svcnum,
51       'rectype' => '_mstr',
52     } );
53     if ( @masters ) {
54       my $masters = join('; ', map { $_->recdata } @masters );
55
56       print NAMED_CONF <<END;
57 zone "$domain" {
58         type slave;
59         file "db.$domain";
60         masters { $masters; };
61 };
62
63 END
64
65     } else {
66
67       print NAMED_CONF <<END;
68 zone "$domain" {
69         type master;
70         file "$zonepath/db.$domain";
71 };
72
73 END
74
75       open (DB_MASTER,">$prefix/db.$domain")
76         or die "can't open $prefix/db.$domain: $!";
77
78       my @domain_records =
79         qsearch('domain_record', { 'svcnum' => $svc_domain->svcnum } );
80       foreach my $domain_record (
81         sort { $b->rectype cmp $a->rectype } @domain_records
82       ) {
83         #if ( $domain_record->rectype eq 'SOA' ) {
84         #  print DB_MASTER join("\t", $domain_record-> reczone
85         #} else {
86           print DB_MASTER join("\t",
87             map { $domain_record->getfield($_) }
88               qw( reczone recaf rectype recdata )
89           ), "\n";
90         #}
91       }
92
93       close DB_MASTER;
94
95     }
96
97   }
98
99 }
100 close NAMED_CONF;
101
102 foreach my $sexport ( @sexports ) { #false laziness with above
103
104   my $prefix = "$spooldir/". $sexport->machine;
105
106   #prevent old domain files from piling up
107   #rmtree "$prefix" or die "can't rmtree $prefix.db: $!";
108
109   mkdir $prefix unless -d $prefix;
110
111   open(NAMED_CONF,">$prefix/named.conf")
112     or die "can't open $prefix/named.conf: $!";
113
114   open(CONF_HEADER,"<$prefix/named.conf.HEADER"); #or die
115   while (<CONF_HEADER>) { print NAMED_CONF $_; }
116   close CONF_HEADER;
117
118   my $masters = $sexport->option('master');
119
120   #false laziness with  freeside-sqlradius-reset 
121   my @svc_domain =
122     map { qsearchs('svc_domain', { 'svcnum' => $_->svcnum } ) }
123       map { qsearch('cust_svc', { 'svcpart' => $_->svcpart } ) }
124         grep { qsearch('cust_svc', { 'svcpart' => $_->svcpart } ) }
125           $sexport->export_svc;
126
127   foreach my $svc_domain ( @svc_domain ) {
128     my $domain = $svc_domain->domain;
129     print NAMED_CONF <<END;
130 zone "$domain" {
131         type slave;
132         file "db.$domain";
133         masters { $masters; };
134 };
135
136 END
137
138   }
139
140 }
141 close NAMED_CONF;
142
143 # -----
144
145 sub usage {
146   die "Usage:\n  bind.export user\n"; 
147 }
148