improve behavior of != operator
[freeside.git] / bin / bind.export
index 8d6f4e3..a3bbd1a 100755 (executable)
@@ -2,6 +2,8 @@
 
 use strict;
 use File::Path;
+use File::Rsync;
+use Net::SSH qw(ssh);
 use FS::UID qw(adminsuidsetup datasrc);
 use FS::Record qw(qsearch qsearchs);
 use FS::part_export;
@@ -13,36 +15,45 @@ my $user = shift or die &usage;
 adminsuidsetup $user;
 
 my $spooldir = "/usr/local/etc/freeside/export.". datasrc. "/bind";
-mkdir $spooldir unless -d $spooldir;
+mkdir $spooldir, 0700 unless -d $spooldir;
 
 my @exports = qsearch('part_export', { 'exporttype' => 'bind' } );
 my @sexports = qsearch('part_export', { 'exporttype' => 'bind_slave' } );
 
+my $rsync = File::Rsync->new({
+  rsh     => 'ssh',
+#  dry_run => 1,
+});
+
 foreach my $export ( @exports ) {
 
-  my $prefix = "$spooldir/". $export->machine;
+  my $machine = $export->machine;
+  my $prefix = "$spooldir/$machine";
+
+  my $bind_rel = $export->option('bind_release');
+  my $ndc_cmd = $export->option('reload')
+                || ( ($bind_rel eq 'BIND9') ? 'rndc' : 'ndc' );
+  my $minttl = $export->option('bind9_minttl');
 
   #prevent old domain files from piling up
   #rmtree "$prefix" or die "can't rmtree $prefix.db: $!";
 
-  mkdir $prefix unless -d $prefix;
+  mkdir $prefix, 0700 unless -d $prefix;
 
   open(NAMED_CONF,">$prefix/named.conf")
     or die "can't open $prefix/named.conf: $!";
 
-  open(CONF_HEADER,"<$prefix/named.conf.HEADER"); #or die
-  while (<CONF_HEADER>) { print NAMED_CONF $_; }
-  close CONF_HEADER;
+  if ( -e "$prefix/named.conf.HEADER" ) {
+    open(CONF_HEADER,"<$prefix/named.conf.HEADER")
+      or die "can't open $prefix/named.conf.HEADER: $!";
+    while (<CONF_HEADER>) { print NAMED_CONF $_; }
+    close CONF_HEADER;
+  }
 
   my $zonepath = $export->option('zonepath');
   $zonepath =~ s/\/$//;
 
-  #false laziness with  freeside-sqlradius-reset 
-  my @svc_domain =
-    map { qsearchs('svc_domain', { 'svcnum' => $_->svcnum } ) }
-      map { qsearch('cust_svc', { 'svcpart' => $_->svcpart } ) }
-        grep { qsearch('cust_svc', { 'svcpart' => $_->svcpart } ) }
-          $export->export_svc;
+  my @svc_domain = $export->svc_x;
 
   foreach my $svc_domain ( @svc_domain ) {
     my $domain = $svc_domain->domain;
@@ -61,6 +72,7 @@ zone "$domain" {
 };
 
 END
+      unlink "$prefix/db.$domain" if -e "$prefix/db.$domain";
 
     } else {
 
@@ -75,6 +87,10 @@ END
       open (DB_MASTER,">$prefix/db.$domain")
         or die "can't open $prefix/db.$domain: $!";
 
+      if ($bind_rel eq 'BIND9') {
+        print DB_MASTER "\$TTL $minttl\n\$ORIGIN $domain.\n";
+      }
+
       my @domain_records =
         qsearch('domain_record', { 'svcnum' => $svc_domain->svcnum } );
       foreach my $domain_record (
@@ -96,24 +112,48 @@ END
 
   }
 
+  $rsync->exec( {
+    src       => "$prefix/",
+    recursive => 1,
+    dest      => "root\@$machine:$zonepath/",
+    exclude   => [qw( *.import named.conf.HEADER named.conf )],
+  } ) or die "rsync to $machine failed: ". join(" / ", $rsync->err);
+ # warn $rsync->out;
+
+  $rsync->exec( {
+    src     => "$prefix/named.conf",
+    dest    => "root\@$machine:". $export->option('named_conf'),
+  } ) or die "rsync to $machine failed: ". join(" / ", $rsync->err);
+#  warn $rsync->out;
+
+  ssh("root\@$machine", "$ndc_cmd reload");
+
 }
+
 close NAMED_CONF;
 
 foreach my $sexport ( @sexports ) { #false laziness with above
 
-  my $prefix = "$spooldir/". $sexport->machine;
+  my $machine = $sexport->machine;
+  my $prefix = "$spooldir/$machine";
+
+  my $bind_rel = $sexport->option('bind_release');
+  my $ndc_cmd = ($bind_rel eq 'BIND9') ? 'rndc' : 'ndc';
 
   #prevent old domain files from piling up
   #rmtree "$prefix" or die "can't rmtree $prefix.db: $!";
 
-  mkdir $prefix unless -d $prefix;
+  mkdir $prefix, 0700 unless -d $prefix;
 
   open(NAMED_CONF,">$prefix/named.conf")
     or die "can't open $prefix/named.conf: $!";
 
-  open(CONF_HEADER,"<$prefix/named.conf.HEADER"); #or die
-  while (<CONF_HEADER>) { print NAMED_CONF $_; }
-  close CONF_HEADER;
+  if ( -e "$prefix/named.conf.HEADER" ) {
+    open(CONF_HEADER,"<$prefix/named.conf.HEADER")
+      or die "can't open $prefix/named.conf.HEADER: $!";
+    while (<CONF_HEADER>) { print NAMED_CONF $_; }
+    close CONF_HEADER;
+  }
 
   my $masters = $sexport->option('master');
 
@@ -137,6 +177,14 @@ END
 
   }
 
+  $rsync->exec( {
+    src     => "$prefix/named.conf",
+    dest    => "root\@$machine:". $sexport->option('named_conf'),
+  } ) or die "rsync to $machine failed: ". join(" / ", $rsync->err);
+#  warn $rsync->out;
+
+  ssh("root\@$machine", "$ndc_cmd reload");
+
 }
 close NAMED_CONF;