diff -Nur -x '*.orig' -x '*.rej' e-smith-base-4.18.0/root/usr/lib/perl5/site_perl/esmith/console/perform_backup.pm mezzanine_patched_e-smith-base-4.18.0/root/usr/lib/perl5/site_perl/esmith/console/perform_backup.pm --- e-smith-base-4.18.0/root/usr/lib/perl5/site_perl/esmith/console/perform_backup.pm 2007-06-28 08:33:59.000000000 -0600 +++ mezzanine_patched_e-smith-base-4.18.0/root/usr/lib/perl5/site_perl/esmith/console/perform_backup.pm 2007-06-28 08:33:19.000000000 -0600 @@ -36,6 +36,94 @@ } +sub make_backup_callback +{ + my $device = shift; + return sub { + my $fh = shift; + my @backup_list = esmith::Backup->restore_list; + + unless (open(DU, "-|")) + { + open(STDERR, ">/dev/null"); + exec qw(/usr/bin/du -sb), map { "/$_" } @backup_list; + } + my $backup_size = 0; + while () + { + next unless (/^(\d+)/); + $backup_size += $1; + } + close DU; + + open(OLDSTDOUT, ">&STDOUT"); + unless (open(STDOUT, ">/$device/smeserver.tgz")) + { + return gettext("Could not create backup file on device").": $!\n"; + } + + open(OLDSTDERR, ">&STDERR"); + my $logger = open(STDERR, "|-"); + die "Can't fork: $!\n" unless defined $logger; + + unless ($logger) + { + exec qw(/usr/bin/logger -p local1.info -t console_backup); + } + + my $status = 0; + + my $gzip = open(GZIP, "|-"); + return "could not run gzip" unless defined $gzip; + unless ($gzip) + { + close $fh; + exec "gzip", "-9"; + } + + my $pv = open(PV, "|-"); + return "could not run pv" unless defined $pv; + unless ($pv) + { + open(STDOUT, ">&GZIP"); + close GZIP; + open(STDERR, ">&$fh"); + exec qw(pv -i 0.2 -n -s), $backup_size + } + + my $tar = fork; + return "could not run tar" unless defined $tar; + unless ($tar) + { + open(STDOUT, ">&PV"); + close PV; + close GZIP; + close $fh; + chdir "/"; + exec qw(tar cf -), grep { -e $_ } @backup_list; + } + waitpid($tar, 0); + $status |= $?; + #warn "status from tar is $status\n" if $status; + unless (close PV) + { + $status |= $! ? $! : $?; + warn "status from pv is $status\n" if $status; + } + unless (close GZIP) + { + $status |= $! ? $! : $?; + warn "status from gzip is $status\n" if $status; + } + + open(STDOUT, ">&OLDSTDOUT"); + open(STDERR, ">&OLDSTDERR"); + close(OLDSTDERR); + close(OLDSTDOUT); + return $status ? gettext("Backup returned non-zero") : gettext("Success"); + }; +} + sub doit { my ($self, $console, $db) = @_; @@ -130,11 +218,9 @@ $backup_size += $1; } close DU; + + $console->gauge(make_backup_callback($device), 'title' => 'Creating backup file'); - system("(cd / ; tar cf - " . join(' ', @backup_list) . " | - pv -i 0.2 -n -s $backup_size | - gzip -9 > /$device/smeserver.tgz ) 2>&1 | - dialog --backtitle 'Creating backup file' --guage 'Progress' 7 70"); system("/bin/umount", "$device"); system("/sbin/e-smith/signal-event", "post-backup"); ($rc, $choice) = $console->message_page