X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=blobdiff_plain;f=FS%2FFS%2FCron%2Fbackup.pm;h=cfc8e3624d896fe3029a67a73a5e87e0e04cdb9e;hp=204069a1271c75793e2fa8f389fc3b8929ab6470;hb=9aee669886202be7035e6c6049fc71bc99dd3013;hpb=63a268637b2d51a8766412617724b9436439deb6 diff --git a/FS/FS/Cron/backup.pm b/FS/FS/Cron/backup.pm index 204069a12..cfc8e3624 100644 --- a/FS/FS/Cron/backup.pm +++ b/FS/FS/Cron/backup.pm @@ -3,41 +3,99 @@ 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); +use FS::Misc qw( send_email ); @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 ) { - 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 backup_email_and_die($conf,$filename,"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 { + backup_email_and_die($conf,$filename,"database dumps not yet supported for ". driver_name); + } + chmod 0600, "/var/tmp/$database.$ext"; + + if ( $conf->config('dump-pgpid') ) { + eval 'use GnuPG;'; + backup_email_and_die($conf,$filename,$@) 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 backup_email_and_die($conf,$filename,$!); + chmod 0600, "/var/tmp/$database.gpg"; + $ext = 'gpg'; + } + + if ( $localdest ) { + copy("/var/tmp/$database.$ext", "$localdest/$filename.$ext") + or backup_email_and_die($conf,$filename,$!); + chmod 0600, "$localdest/$filename.$ext"; + } + + if ( $scpdest ) { eval "use Net::SCP qw(scp);"; - die $@ if $@; - if ( driver_name eq 'Pg' ) { - system("pg_dump $database >/var/tmp/$database.sql") - } 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.sql", - output => "/var/tmp/$database.gpg", - recipient => $conf->config('dump-pgpid'), - ); - chmod 0600, '/var/tmp/$database.gpg'; - scp("/var/tmp/$database.gpg", $dest); - unlink "/var/tmp/$database.gpg" or die $!; - } else { - chmod 0600, '/var/tmp/$database.sql'; - scp("/var/tmp/$database.sql", $dest); - } - unlink "/var/tmp/$database.sql" or die $!; + backup_email_and_die($conf,$filename,$@) if $@; + scp("/var/tmp/$database.$ext", "$scpdest/$filename.$ext"); } + + unlink "/var/tmp/$database.$ext" or backup_email_and_die($conf,$filename,$!); #or just warn? + + backup_email($conf,$filename); + +} + +#runs backup_email and dies with same error message +sub backup_email_and_die { + my ($conf,$filename,$error) = @_; + backup_email($conf,$filename,$error); + warn "backup_email_and_die called without error message" unless $error; + die $error; +} + +#checks if email should be sent, sends it +sub backup_email { + my ($conf,$filename,$error) = @_; + my $to = $conf->config('dump-email_to'); + return unless $to; + my $result = $error ? 'FAILED' : 'succeeded'; + my $email_error = send_email( + 'from' => $conf->config('invoice_from'), #or whatever, don't think it matters + 'to' => $to, + 'subject' => 'FREESIDE NOTIFICATION: Backup ' . $result, + 'body' => [ + "This is an automatic message from your Freeside installation.\n", + "Freeside backup $filename $result", + ($error ? " with the following error:\n\n" : "\n"), + ($error || ''), + "\n", + ], + 'msgtype' => 'admin', + ); + warn $email_error if $email_error; + return; } 1;