On 8/5/21 3:36 PM, Robert Earl wrote:
> Hi folks,
> I have a large number of abandoned volumes with no data, no associated
> file, and haven't been written in years. I believe they are the obstacle
> to automatic labeling of new volumes; my Maximum Volumes for this pool
> is 120.
> 
> Alarmingly, I just found a "Full" volume whose mtime is April 9, 2021
> but Baculum's "Last Written" record is Feb. 28, 2019.
> 
> I also have 10 old volumes that are outdated and I can purge/recycle.
> 
> I am looking at batch-processing a large number of volumes, though, so
> this is unwieldy through the GUI, and I'm dense on the niceties of
> bconsole. What would be the procedure for a set of mass operations like
> this from a script/command line?



Robert,
You might try something like the following example.  This configuration
sets all purged volumes to be automatically moved into the Scratch pool,
then the Job "Clean Expired Volumes" periodically invokes the
clean_volumes script in order to scan the Scratch pool, delete the
volumes from the catalog, and delete the physical files from disk.



Pool {
  Name = Scratch
  Pool Type = Backup
}

Pool {
  Name = Full-Disk
  ...
  RecyclePool = Scratch
}

Pool {
  Name = Diff-Disk
  ...
  RecyclePool = Scratch
}

[and so on]


Job {
  Name = "Clean Expired Volumes"
  Type = Admin
  Enabled = Yes
  Pool = Scratch
  Storage = asgard-file
  FileSet = Dummy
  Client = asgard
  Level = Full
  RunBeforeJob = "/etc/bacula/clean_volumes -v"
  Messages = Daemon
  Priority = 20
  Rerun Failed Levels = yes
  Allow Duplicate Jobs = no
  Cancel Queued Duplicates = yes
  Schedule = "Volume Cleanup"
}


#!/usr/bin/perl
use strict;
use Getopt::Long;
use IPC::Open2;
use IO::Handle;


my $bconsole = '/usr/sbin/bconsole';
my (%opts, @purged, $pid);

GetOptions(\%opts,
           'verbose|v',
           'test');

my ($IN, $OUT) = (IO::Handle->new(), IO::Handle->new());

$pid = open2($OUT, $IN, $bconsole) || die "Unable to open bconsole";

if (scalar (@purged = check_volumes()))
{
    printf("Bacula reports the following purged volumes:\n\t%s\n",
           join("\n\t", @purged)) if ($opts{verbose});
    my $deleted = delete_volumes(@purged);
    print "$deleted volumes deleted.\n" if ($opts{verbose});
}
elsif ($opts{verbose})
{
    print "No purged volumes found to delete.\n";
}

print $IN "exit\n";
waitpid($pid, 0);

exit (0);


sub check_volumes
{
    my $dividers = 0;
    my (@purged, @row);

    print $IN "list volumes pool=Scratch\n";
    for (;;)
    {
        my $resp = <$OUT>;
        last if ($resp =~ /No results to list./);
        $dividers++ if ($resp =~ /^[\+\-]+$/);
        last if ($dividers == 3);
        @row = split(/\s+/, $resp);
        push (@purged, $row[3]) if ($row[5] eq 'Purged');
    }

    return (@purged);
}


sub delete_volumes
{
    my $volume_dir = '/spool/bacula/';
    my $count = 0;

    foreach my $vol (@_)
    {
        my $l;
        my $file = $volume_dir.$vol;

        print "Deleting volume $vol from catalog ... " if ($opts{verbose});
        print $IN "delete volume=$vol yes\n";
        $l = <$OUT>;
        $l = <$OUT>;
        print "Done.\nDeleting volume $file from disk ... " if
($opts{verbose});
        if (-f $file)
        {
            $count++;
            unlink ($file);
        }
        print "Done.\n" if ($opts{verbose});
    }

    return ($count);
}




-- 
  Phil Stracchino
  Babylon Communications
  ph...@caerllewys.net
  p...@co.ordinate.org
  Landline: +1.603.293.8485
  Mobile:   +1.603.998.6958


_______________________________________________
Bacula-users mailing list
Bacula-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/bacula-users

Reply via email to