File: //kunden/lib/susshi/exec/backup
#!/usr/bin/perl
use warnings;
use strict;
use lib '/usr/lib/susshi/exec';
use Susshi;
use File::Temp qw( tempfile );
use IPC::Run qw( run timeout );
my ($dump_fh, $dump_filename);
my $susshi = Susshi->new( -read_input => 1 );
umask(0077);
my ($backupdir, $filename) = $susshi->get_backuppath;
! -f $filename
or error_die "File already exists: $filename\n";
my $directory = $susshi->get_directory( 'directory' );
my $database = $susshi->get_database( 'database' );
if (! $database && ! $directory) {
error_die "Please provide 'database' and/or 'directory' data.\n";
}
# Build TAR command
my @tar_cmd = ('tar', '-czf', $filename);
# Database backup requested?
if ($database) {
my @cmd=( '/usr/bin/mysqldump', $database->get_mysql_args);
my (undef, $tables) = $database->get_tables();
push @cmd, @$tables;
eval {
($dump_fh, $dump_filename) = tempfile( '.database.dump.XXXX', UNLINK => 1);
};
error_die ($@) if $@;
eval {
my $err='';
run \@cmd, '>', $dump_fh, '2>', \$err, timeout (3600) or die $err;
};
error_die ($@) if $@;
push @tar_cmd, ('--transform', "s,$dump_filename,database.dump,", $dump_filename);
}
# Directory backup requested?
if ($directory) {
push @tar_cmd, ('--transform', 's,^\.,files,', '-C', $directory, '.');
}
eval {
my $err='';
if ( ! run \@tar_cmd, '2>', \$err, timeout (3600) ) {
if ($? == 256) {
info("tar exit status 1: $err");
} else {
die $err;
}
}
};
if ($@) {
unlink $filename;
error_die "Could not create archive: $@";
}
info "Created backup $filename";
send_json_output({size => -s $filename});
exit 0;