7 use FS::UID qw(adminsuidsetup datasrc);
8 use FS::Record qw(qsearch qsearchs);
14 my $user = shift or die &usage;
17 my $spooldir = "/usr/local/etc/freeside/export.". datasrc. "/bind";
18 mkdir $spooldir, 0700 unless -d $spooldir;
20 my @exports = qsearch('part_export', { 'exporttype' => 'bind' } );
21 my @sexports = qsearch('part_export', { 'exporttype' => 'bind_slave' } );
23 my $rsync = File::Rsync->new({
28 foreach my $export ( @exports ) {
30 my $machine = $export->machine;
31 my $prefix = "$spooldir/$machine";
33 #prevent old domain files from piling up
34 #rmtree "$prefix" or die "can't rmtree $prefix.db: $!";
36 mkdir $prefix, 0700 unless -d $prefix;
38 open(NAMED_CONF,">$prefix/named.conf")
39 or die "can't open $prefix/named.conf: $!";
41 open(CONF_HEADER,"<$prefix/named.conf.HEADER")
42 or die "can't open $prefix/named.conf.HEADER: $!"
43 while (<CONF_HEADER>) { print NAMED_CONF $_; }
46 my $zonepath = $export->option('zonepath');
49 #false laziness with freeside-sqlradius-reset and shell.export
51 map { qsearchs('svc_domain', { 'svcnum' => $_->svcnum } ) }
52 map { qsearch('cust_svc', { 'svcpart' => $_->svcpart } ) }
53 grep { qsearch('cust_svc', { 'svcpart' => $_->svcpart } ) }
56 foreach my $svc_domain ( @svc_domain ) {
57 my $domain = $svc_domain->domain;
58 my @masters = qsearch('domain_record', {
59 'svcnum' => $svc_domain->svcnum,
63 my $masters = join('; ', map { $_->recdata } @masters );
65 print NAMED_CONF <<END;
69 masters { $masters; };
76 print NAMED_CONF <<END;
79 file "$zonepath/db.$domain";
84 open (DB_MASTER,">$prefix/db.$domain")
85 or die "can't open $prefix/db.$domain: $!";
88 qsearch('domain_record', { 'svcnum' => $svc_domain->svcnum } );
89 foreach my $domain_record (
90 sort { $b->rectype cmp $a->rectype } @domain_records
92 #if ( $domain_record->rectype eq 'SOA' ) {
93 # print DB_MASTER join("\t", $domain_record-> reczone
95 print DB_MASTER join("\t",
96 map { $domain_record->getfield($_) }
97 qw( reczone recaf rectype recdata )
111 dest => "root\@$machine:$zonepath/",
112 exclude => [qw( *.import named.conf.HEADER named.conf )],
113 } ) or die "rsync to $machine failed: ". join(" / ", $rsync->err);
117 src => "$prefix/named.conf",
118 dest => "root\@$machine:". $export->option('named_conf'),
119 } ) or die "rsync to $machine failed: ". join(" / ", $rsync->err);
122 ssh("root\@$machine", 'ndc reload');
128 foreach my $sexport ( @sexports ) { #false laziness with above
130 my $machine = $sexport->machine;
131 my $prefix = "$spooldir/$machine";
133 #prevent old domain files from piling up
134 #rmtree "$prefix" or die "can't rmtree $prefix.db: $!";
136 mkdir $prefix, 0700 unless -d $prefix;
138 open(NAMED_CONF,">$prefix/named.conf")
139 or die "can't open $prefix/named.conf: $!";
141 open(CONF_HEADER,"<$prefix/named.conf.HEADER")
142 or die "can't open $prefix/named.conf.HEADER: $!"
143 while (<CONF_HEADER>) { print NAMED_CONF $_; }
146 my $masters = $sexport->option('master');
148 #false laziness with freeside-sqlradius-reset
150 map { qsearchs('svc_domain', { 'svcnum' => $_->svcnum } ) }
151 map { qsearch('cust_svc', { 'svcpart' => $_->svcpart } ) }
152 grep { qsearch('cust_svc', { 'svcpart' => $_->svcpart } ) }
153 $sexport->export_svc;
155 foreach my $svc_domain ( @svc_domain ) {
156 my $domain = $svc_domain->domain;
157 print NAMED_CONF <<END;
161 masters { $masters; };
169 src => "$prefix/named.conf",
170 dest => "root\@$machine:". $sexport->option('named_conf'),
171 } ) or die "rsync to $machine failed: ". join(" / ", $rsync->err);
174 ssh("root\@$machine", 'ndc reload');
182 die "Usage:\n bind.export user\n";