diff -Nur e-smith-backup-2.6.0/root/usr/share/perl5/vendor_perl/esmith.old/Backup.pm e-smith-backup-2.6.0/root/usr/share/perl5/vendor_perl/esmith/Backup.pm --- e-smith-backup-2.6.0/root/usr/share/perl5/vendor_perl/esmith.old/Backup.pm 2017-02-17 20:37:15.000000000 +0100 +++ e-smith-backup-2.6.0/root/usr/share/perl5/vendor_perl/esmith/Backup.pm 2017-04-12 11:41:41.000000000 +0200 @@ -12,10 +12,12 @@ use File::Copy; use Unix::PasswdFile; use Passwd::Unix; +use esmith::lockfile; use vars qw($VERSION @ISA @EXPORT_OK); use constant ESMITH_RESTORE_CACHE => '/var/cache/e-smith/restore'; +use constant ESMITH_BACKUP_LOCK_FILE => "/var/lock/subsys/backup-running"; @ISA = qw(Exporter); @@ -531,6 +533,32 @@ return $dir =~ m:^/(home/e-smith|noexistingpath): ; } +=head2 + +set_lock - set lock before running backup +see bug #9217 + +=cut + +sub set_lock +{ + return esmith::lockfile::LockFileOrReturn(ESMITH_BACKUP_LOCK_FILE); +} + + +=head2 + +remove_lock - remove lock after running backup + +=cut + +sub remove_lock +{ + esmith::lockfile::UnlockFile(shift); +} + + + =head1 AUTHOR SME Server Developers diff -Nur e-smith-backup-2.6.0/root/sbin/e-smith.old/do_backup e-smith-backup-2.6.0/root/sbin/e-smith/do_backup --- e-smith-backup-2.6.0/root/sbin/e-smith.old/do_backup 2013-02-13 16:21:37.000000000 +0100 +++ e-smith-backup-2.6.0/root/sbin/e-smith/do_backup 2017-04-12 16:18:32.000000000 +0200 @@ -23,10 +23,22 @@ use strict; use esmith::ConfigDB; use esmith::BackupHistoryDB; +use esmith::Backup; +#use esmith::lockfile; + +# lock file.. see bug 9127 +my $backup_lock; $ENV{PATH} = "/sbin/e-smith:/sbin:/bin:/usr/bin"; my $conf = esmith::ConfigDB->open || die("Could not open config db\n"); + +# set lock.. if not, exit +unless (SetLock()) { + die "Error: failed to create lock file.. is a backup already running?"; +} + + my $backup = $conf->get('backup'); my $status = $backup->prop('status') || 'disabled'; my $program = $backup->prop('Program') || 'flexbackup'; @@ -64,6 +76,8 @@ $now = time(); $backup_rec->set_prop('EndEpochTime', "$now"); $backup_rec->set_prop('Result', "$status"); +# remove lock +RemoveLock(); exit 0; sub bad_exit @@ -74,5 +88,26 @@ warn("Backup terminated: $phase failed - status: $status\n"); $backup_rec->set_prop('EndEpochTime', "$now"); $backup_rec->set_prop('Result', "$phase:$status"); + # remove lock + RemoveLock(); return $status / 256; } + +# subs to set and remove lock on backup + +sub SetLock +{ + print "Setting backup lock file\n"; + $backup_lock = esmith::Backup::set_lock; + return $backup_lock; +} + +sub RemoveLock +{ + if (defined($backup_lock)) + { + print "Removing backup lock file\n"; + esmith::Backup::remove_lock($backup_lock); + $backup_lock = undef; + } +} diff -Nur e-smith-backup-2.6.0/root/usr/share/perl5/vendor_perl/esmith.old/console/perform_backup.pm e-smith-backup-2.6.0/root/usr/share/perl5/vendor_perl/esmith/console/perform_backup.pm --- e-smith-backup-2.6.0/root/usr/share/perl5/vendor_perl/esmith.old/console/perform_backup.pm 2017-04-12 22:20:17.000000000 +0200 +++ e-smith-backup-2.6.0/root/usr/share/perl5/vendor_perl/esmith/console/perform_backup.pm 2017-04-13 18:33:32.000000000 +0200 @@ -15,6 +15,9 @@ my $EMPTY = q{}; +# lock file.. see bug 9127 +my $backup_lock; + sub new { my $class = shift; @@ -42,6 +45,26 @@ } +# subs to set and remove lock on backup + +sub SetLock +{ + print "Setting backup lock file\n"; + $backup_lock = esmith::Backup::set_lock; + return $backup_lock; +} + +sub RemoveLock +{ + if (defined($backup_lock)) + { + print "Removing backup lock file\n"; + esmith::Backup::remove_lock($backup_lock); + $backup_lock = undef; + } +} + + sub make_backup_callback { my ($device, $CompressionLevel) = @_; @@ -50,6 +73,11 @@ my @backup_list = esmith::Backup->restore_list; my @backup_excludes = esmith::Backup->excludes; my $backup_size = backupSize (@backup_list); + + # set lock.. if not, exit + unless (SetLock()) { + die "Error: failed to create lock file.. is a backup already running?"; + } open(OLDSTDOUT, ">&STDOUT"); unless (open(STDOUT, ">$device/smeserver.tgz")) @@ -118,6 +146,7 @@ open(STDERR, ">&OLDSTDERR"); close(OLDSTDERR); close(OLDSTDOUT); + RemoveLock(); return $status ? gettext("Backup failed. Look at the log files for more details.") : gettext("Backup successfully created."); }; } @@ -230,6 +259,7 @@ $devices->destroy; system("/sbin/e-smith/signal-event", 'post-backup'); + RemoveLock(); $console->message_page ( title => gettext('Backup complete'),