local backups, RT#12180
authorivan <ivan>
Tue, 29 Mar 2011 00:32:20 +0000 (00:32 +0000)
committerivan <ivan>
Tue, 29 Mar 2011 00:32:20 +0000 (00:32 +0000)
FS/FS/Conf.pm
FS/FS/Cron/backup.pm
FS/bin/freeside-daily
bin/freeside-backup

index a6feffe..7c7c6ed 100644 (file)
@@ -312,7 +312,7 @@ sub delete {
 
   my($name, $agentnum) = @_;
   if ( my $cv = FS::Record::qsearchs('conf', {name => $name, agentnum => $agentnum}) ) {
-    warn "[FS::Conf] DELETE $name\n";
+    warn "[FS::Conf] DELETE $name\n" if $DEBUG;
 
     my $oldAutoCommit = $FS::UID::AutoCommit;
     local $FS::UID::AutoCommit = 0;
@@ -2201,9 +2201,16 @@ and customer address. Include units.',
   },
 
   {
+    'key'         => 'dump-localdest',
+    'section'     => '',
+    'description' => 'Destination for local database dumps (full path)',
+    'type'        => 'text',
+  },
+
+  {
     'key'         => 'dump-scpdest',
     'section'     => '',
-    'description' => 'destination for scp database dumps: user@host:/path',
+    'description' => 'Destination for scp database dumps: user@host:/path',
     'type'        => 'text',
   },
 
index 3c0d63b..5feca26 100644 (file)
@@ -3,43 +3,62 @@ package FS::Cron::backup;
 use strict;
 use vars qw( @ISA @EXPORT_OK );
 use Exporter;
+use File::Copy;
 use Date::Format;
 use FS::UID qw(driver_name datasrc);
 
 @ISA = qw( Exporter );
-@EXPORT_OK = qw( backup_scp );
+@EXPORT_OK = qw( backup );
 
-sub backup_scp {
+sub backup {
   my $conf = new FS::Conf;
-  my $dest = $conf->config('dump-scpdest');
-  if ( $dest ) {
-    $dest .= time2str('/%Y%m%d%H%M%S',time);
-    datasrc =~ /dbname=([\w\.]+)$/ or die "unparsable datasrc ". datasrc;
-    my $database = $1;
+  my $localdest = $conf->config('dump-localdest');
+  my $scpdest = $conf->config('dump-scpdest');
+  return unless $localdest || $scpdest;
+
+  my $filename = time2str('%Y%m%d%H%M%S',time);
+
+  datasrc =~ /dbname=([\w\.]+)$/ or die "unparsable datasrc ". datasrc;
+  my $database = $1;
+
+  my $ext;
+  if ( driver_name eq 'Pg' ) {
+    system("pg_dump -Fc $database >/var/tmp/$database.Pg");
+    $ext = 'Pg';
+  } elsif ( driver_name eq 'mysql' ) {
+    system("mysqldump $database >/var/tmp/$database.sql");
+    $ext = 'sql';
+  } else {
+    die "database dumps not yet supported for ". driver_name;
+  }
+  chmod 0600, "/var/tmp/$database.$ext";
+
+  if ( $conf->config('dump-pgpid') ) {
+    eval 'use GnuPG;';
+    die $@ if $@;
+    my $gpg = new GnuPG;
+    $gpg->encrypt( plaintext => "/var/tmp/$database.$ext",
+                   output    => "/var/tmp/$database.gpg",
+                   recipient => $conf->config('dump-pgpid'),
+                 );
+    unlink "/var/tmp/$database.$ext" or die $!;
+    chmod 0600, "/var/tmp/$database.gpg";
+    $ext = 'gpg';
+  }
+
+  if ( $localdest ) {
+    copy("/var/tmp/$database.$ext", "$localdest/$filename.$ext") or die $!;
+    chmod 0600, "$localdest/$filename.$ext";
+  }
+
+  if ( $scpdest ) {
     eval "use Net::SCP qw(scp);";
     die $@ if $@;
-    if ( driver_name eq 'Pg' ) {
-      system("pg_dump -Fc $database >/var/tmp/$database.Pg")
-    } else {
-      die "database dumps not yet supported for ". driver_name;
-    }
-    if ( $conf->config('dump-pgpid') ) {
-      eval 'use GnuPG;';
-      die $@ if $@;
-      my $gpg = new GnuPG;
-      $gpg->encrypt( plaintext => "/var/tmp/$database.Pg",
-                     output    => "/var/tmp/$database.gpg",
-                     recipient => $conf->config('dump-pgpid'),
-                   );
-      chmod 0600, '/var/tmp/$database.gpg';
-      scp("/var/tmp/$database.gpg", "$dest.gpg");
-      unlink "/var/tmp/$database.gpg" or die $!;
-    } else {
-      chmod 0600, '/var/tmp/$database.Pg';
-      scp("/var/tmp/$database.Pg", "$dest.Pg");
-    }
-    unlink "/var/tmp/$database.Pg" or die $!;
+    scp("/var/tmp/$database.$ext", "$scpdest/$filename.$ext");
   }
+
+  unlink "/var/tmp/$database.$ext" or die $!;
+
 }
 
 1;
index 2c9dd8b..ac0a823 100755 (executable)
@@ -51,8 +51,8 @@ if ( $opt{u} ) {
 }
 
 #you can skip this just by not having the config
-use FS::Cron::backup qw(backup_scp);
-backup_scp();
+use FS::Cron::backup qw(backup);
+backup();
 
 #same
 use FS::Cron::rt_tasks qw(rt_escalate);
index 97a4899..25e74a4 100644 (file)
@@ -9,8 +9,8 @@ my $user = shift or die &usage;
 adminsuidsetup $user;
 
 #you can skip this just by not having the config
-use FS::Cron::backup qw(backup_scp);
-backup_scp();
+use FS::Cron::backup qw(backup);
+backup();
 
 sub usage {
   die "Usage:\n\n  freeside-backup user\n";
@@ -30,7 +30,7 @@ freeside-backup - Runs a backup
 
 =head1 DESCRIPTION
 
-Runs a backup.  See the dump-scpdest configuration option.
+Runs a backup.  See the dump-scpdest and dump-localdest configuration options.
 
 =head1 BUGS