From 685c07ffbb5b56289aed1efc4cf9731366ca0b33 Mon Sep 17 00:00:00 2001 From: Ilia Ross Date: Fri, 22 May 2026 01:16:39 +0200 Subject: [PATCH] Fix Bacula restore browsing with Bacula 11+ catalogs #1520 --- bacula-backup/bacula-backup-lib.pl | 18 +++++++++++++++++- bacula-backup/list.cgi | 24 +++++++++++++++--------- 2 files changed, 32 insertions(+), 10 deletions(-) diff --git a/bacula-backup/bacula-backup-lib.pl b/bacula-backup/bacula-backup-lib.pl index 3fff828b1..b83766b2d 100755 --- a/bacula-backup/bacula-backup-lib.pl +++ b/bacula-backup/bacula-backup-lib.pl @@ -58,6 +58,23 @@ $testcmd->finish(); return $dbh; } +# bacula_catalog_table_exists(&dbh, table) +# Returns 1 if the Bacula catalog contains a table, 0 if not +sub bacula_catalog_table_exists +{ +local ($dbh, $table) = @_; +$table =~ /^\w+\z/ || die "Illegal catalog table name"; +local $dbh->{'PrintError'} = 0; +local $dbh->{'RaiseError'} = 0; +my $cmd = eval { $dbh->prepare("SELECT 1 FROM $table WHERE 1 = 0") }; +my $ok; +if ($cmd) { + $ok = eval { $cmd->execute() }; + $cmd->finish(); + } +return $ok ? 1 : 0; +} + # read_config_file(file) # Parses a bacula config file sub read_config_file @@ -1678,4 +1695,3 @@ return ( \%tags, $run ); } 1; - diff --git a/bacula-backup/list.cgi b/bacula-backup/list.cgi index e46fa8cfe..6bde3c99e 100755 --- a/bacula-backup/list.cgi +++ b/bacula-backup/list.cgi @@ -78,6 +78,12 @@ $cmd->finish(); @rv = &unique(@rv); +my $filename_table = &bacula_catalog_table_exists($dbh, "Filename"); +my $filename_col = $filename_table ? "Filename.Name" : "File.Filename"; +my $filename_from = $filename_table ? ", Filename" : ""; +my $filename_join = $filename_table ? + "AND File.FilenameId = Filename.FilenameId" : ""; + # Build the nodes structure for folders foreach $f (@rv) { $f =~ /([^\/]+)\/\Z/; @@ -92,16 +98,16 @@ foreach $f (@rv) { if ($in{'volume'}) { # Files in directory, that are on this volume $cmd = $dbh->prepare(" - SELECT Filename.Name - FROM File, Filename, Job, JobMedia, Media - WHERE File.FilenameId = Filename.FilenameId - AND File.JobId = Job.JobId + SELECT $filename_col + FROM File$filename_from, Job, JobMedia, Media + WHERE File.JobId = Job.JobId AND Job.JobId = JobMedia.JobId AND JobMedia.MediaId = Media.MediaId AND File.PathId = ? AND Media.VolumeName = ? + $filename_join $jobsql - ORDER BY Filename.Name + ORDER BY $filename_col "); $cmd->execute($pid, $in{'volume'}) || die "db error: ".$dbh->errstr; @@ -109,13 +115,13 @@ if ($in{'volume'}) { else { # Files in directory $cmd = $dbh->prepare(" - SELECT Filename.Name - FROM Job, File, Filename + SELECT $filename_col + FROM Job, File$filename_from WHERE Job.JobId = File.JobId - AND File.FilenameId = Filename.FilenameId AND File.PathId = ? + $filename_join $jobsql - ORDER BY Filename.Name + ORDER BY $filename_col "); $cmd->execute($pid) || die "db error: ".$dbh->errstr;