diff -ruN e-smith-backup-2.4.0.old/root/etc/e-smith/events/actions/workstation-backup-dar e-smith-backup-2.4.0/root/etc/e-smith/events/actions/workstation-backup-dar --- e-smith-backup-2.4.0.old/root/etc/e-smith/events/actions/workstation-backup-dar 2014-02-02 16:18:57.000000000 -0800 +++ e-smith-backup-2.4.0/root/etc/e-smith/events/actions/workstation-backup-dar 2014-02-02 20:28:48.000000000 -0800 @@ -248,98 +248,7 @@ } # update dar_manager catalog -my %backupfiles = (); -my $mntbkdir; -my $mounted; -my $key; - -my $setbackuplist = sub { - if ( $_ =~ /\.dar/ ) - { - my $dir = $File::Find::dir; - my $backupref; - $dir =~ s/$mntbkdir\///; - $_ =~ s/\..*\.dar//; - $backupref = $_; - $_ =~ s/.*-//; - @{$backupfiles{$_}}[0] = $dir; - @{$backupfiles{$_}}[1] = $backupref; - } -}; - -$mntbkdir = $mntdir . '/' . $id; - -my $catalog = "$mntbkdir/dar-catalog"; -unless ( -e $catalog) # Create an empty catalog if none found -{ - system("/usr/bin/dar_manager", "-Q", "-C", "$catalog") == 0 - or ldie("Unable to create dar_manager catalog.\n"); -} - -# sleep added to ensure the creation of a valid catalog -sleep 1; - -# find available backups for the server - -find { wanted => \&$setbackuplist, untaint => 1 }, $mntbkdir ; - -# find backups in current catalog - -my $i = 0; -my @bknum; -my @setd; -my @bkname; -open(DAR_LIST, "/usr/bin/dar_manager -Q -B \"$catalog\" -l |"); - -while () -{ - next unless ($_ =~ /set/); - chomp; - ($bknum[$i], $setd[$i], $bkname[$i]) = split(' ', $_, 3); - $i++; -} -close (DAR_LIST); - -# delete from catalog old removed backups - -my $j = $i; -while ($j) -{ - unless (-e "$setd[$j-1]/$bkname[$j-1]\.1\.dar") - { - my $del = $bknum[$j-1]; - if ($del =~ /^(.*)$/) - { - $del = $1; - } - system("/usr/bin/dar_manager", "-Q", "-B", "$catalog", "-D", "$del") == 0 - or ldie("Failed to delete set $del from catalog.\n"); - } - $j--; -} - -# add to catalog new backups - -foreach $key (sort keys %backupfiles) -{ - my $exists = 0; - my $rf; - foreach $rf (@bkname) - { - $exists = 1 if ($rf eq $backupfiles{$key}[1]); - last if $exists; - } - do - { - my $add = "$mntbkdir/$backupfiles{$key}[0]/$backupfiles{$key}[1]"; - if ($add =~ /^(.*)$/) - { - $add = $1; - } - system("/usr/bin/dar_manager", "-Q", "-B", "$catalog", "-A", "$add") == 0 - or ldie("Failed to add set $add to catalog.\n"); - } unless $exists; -} +&updateDarCatalog ("$mntdir/$id"); # Check free disk space my $df = qx(/bin/df -Ph \"$mntdir\"); @@ -539,3 +448,59 @@ ldie("Error while creating $tree : $@. Maybe insufficient rights directory.\n") if $@; } } + +sub updateDarCatalog () +{ + # update dar_manager catalog + my $mntbkdir = shift; + my $catalog = "$mntbkdir/dar-catalog"; + my %backupfiles = (); # hash of backup files found on the disk. + + unless ( -e $catalog) # Create an empty catalog if none found + { + system("/usr/bin/dar_manager", "-Q", "-C", "$catalog") == 0 + or ldie("Unable to create dar_manager catalog.\n"); + } + + # sleep added to ensure the creation of a valid catalog + sleep 1; + + # find available backups for the server + my $setbackuplist = sub {if($_ =~ /([\w|-]+)-(\d+)\..*\.dar/){$backupfiles{$2} = $File::Find::dir."/$1-$2";}}; + find { wanted => \&$setbackuplist, untaint => 1 }, $mntbkdir ; + + my $pid = open (DAR_LIST, "-|", "/usr/bin/dar_manager", "-Q", "-B", "$catalog", "-l") or ldie ("Cannot start : $!"); + my $catalogIndex; # Dar refers to each backup by an index + my $oldkey=0; # The key for %backupfiles is the timestamp + + while () + { + next unless ($_ =~ /set/); + chomp; + $_ =~ /(\d+).*\s[\w|-]+-(\d+)/; + ($catalogIndex, $oldkey) = ($1,$2); + + if (defined($backupfiles{$oldkey})) # found on disk and in catalog + { + delete $backupfiles{$oldkey}; # so that it will not be added in the next step. + } + else + { + system("/usr/bin/dar_manager", "-Q", "-B", "$catalog", "-D", "$catalogIndex") == 0 + or ldie("Failed to delete set $catalogIndex from catalog.\n"); + } + } + waitpid ($pid, 0); + $err = WEXITSTATUS($?); + close (DAR_LIST); + ldie ("Catalog error : $err") if $err; + + # Now add backups that were missing from the catalog in chronological order + foreach my $key (sort keys %backupfiles) + { + next unless ($key > $oldkey); # prevent adding old backups to the catalog + system("/usr/bin/dar_manager", "-Q", "-B", "$catalog", "-A", "$backupfiles{$key}") == 0 + or ldie("Failed to add set $backupfiles{$key} to catalog.\n"); + } +} +