X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=gui%2Fbrestore%2Fbrestore.pl;h=bfcbeaba63c3454302aa8a646baa5f7c497cd1b9;hb=d3274117ad14dba7550c289e353405dc1821dfdd;hp=f39d6f6360126d7ab3ac11c9973acee5d1d339eb;hpb=59d106bea77adc57b422d2c7df43362d661a3e4d;p=bacula%2Fbacula diff --git a/gui/brestore/brestore.pl b/gui/brestore/brestore.pl index f39d6f6360..bfcbeaba63 100755 --- a/gui/brestore/brestore.pl +++ b/gui/brestore/brestore.pl @@ -71,7 +71,7 @@ use Gtk2::SimpleList; # easy wrapper for list views use Gtk2::Gdk::Keysyms; # keyboard code constants use Data::Dumper qw/Dumper/; my $debug=0; # can be on brestore.conf -our ($VERSION) = ('$Revision$' =~ /(\d+\.\d+)/); +our ($VERSION) = ('$Revision$' =~ /(\d+)/); package Pref; use DBI; @@ -404,7 +404,7 @@ sub on_cancelbutton_clicked 1; ################################################################ - +# Display all file revision in a separated window package DlgFileVersion; sub on_versions_close_clicked @@ -423,15 +423,18 @@ sub fileview_data_get my ($self, $widget, $context, $data, $info, $time,$string) = @_; DlgResto::drag_set_info($widget, - $self->{cwd}, + $self->{pwd}, $data); } +# +# new DlgFileVersion(Bvfs, "client", pathid, fileid, "/path/to/", "filename"); +# sub new { - my ($class, $bvfs, $client, $path, $file, $cwd, $fn) = @_; + my ($class, $bvfs, $client, $pathid, $fileid, $path, $fn) = @_; my $self = bless { - cwd => $cwd, + pwd => $path, version => undef, # main window }; @@ -442,7 +445,7 @@ sub new $glade_box->signal_autoconnect_from_package($self); $glade_box->get_widget("version_label") - ->set_markup("File revisions : $client:$cwd$fn"); + ->set_markup("File revisions : $client:$path$fn"); my $widget = $glade_box->get_widget('version_fileview'); my $fileview = Gtk2::SimpleList->new_from_treeview( @@ -462,8 +465,8 @@ sub new ); DlgResto::init_drag_drop($fileview); - my @v = $bvfs->get_all_file_versions($path, - $file, + my @v = $bvfs->get_all_file_versions($pathid, + $fileid, $client, 1); for my $ver (@v) { @@ -490,6 +493,7 @@ sub on_forward_keypress 1; ################################################################ +# Display a warning message package DlgWarn; sub new @@ -551,9 +555,9 @@ sub new my $self = bless { bsr_file => $arg{bsr_file}, # /path/to/bsr on director - pref => $arg{pref}, # Pref ref - glade => undef, # GladeXML ref - bconsole => undef, # Bconsole ref + pref => $arg{pref}, # Pref ref + glade => undef, # GladeXML ref + bconsole => undef, # Bconsole ref }; my $console = $self->{bconsole} = get_bconsole($arg{pref}); @@ -656,12 +660,89 @@ To follow it, you must use bconsole (or install/configure bweb)"); } } +sub on_use_regexp_toggled +{ + my ($self,$widget) = @_; + my $act = $widget->get_active(); + + foreach my $w ('entry_launch_where') { + $self->{glade}->get_widget($w)->set_sensitive(!$act); + } + + foreach my $w ('entry_add_prefix', 'entry_strip_prefix', + 'entry_add_suffix','entry_rwhere','chk_use_regexp') + { + $self->{glade}->get_widget($w)->set_sensitive($act); + } + + if ($act) { # if we activate file relocation, we reset use_regexp + $self->{glade}->get_widget('entry_rwhere')->set_sensitive(0); + $self->{glade}->get_widget('chk_use_regexp')->set_active(0); + } +} + + +sub on_use_rwhere_toggled +{ + my ($self,$widget) = @_; + my $act = $widget->get_active(); + + foreach my $w ('entry_rwhere') { + $self->{glade}->get_widget($w)->set_sensitive($act); + } + + foreach my $w ('entry_add_prefix', 'entry_strip_prefix', + 'entry_add_suffix') + { + $self->{glade}->get_widget($w)->set_sensitive(!$act); + } +} + sub on_cancel_resto_clicked { my ($self) = @_ ; $self->{glade}->get_widget('dlg_launch')->destroy(); } +sub get_where +{ + my ($self) = @_ ; + + if ($self->{glade}->get_widget('chk_file_relocation')->get_active()) { + # using regexp + if ($self->{glade}->get_widget('chk_use_regexp')->get_active()) { + + return ('regexwhere', + $self->{glade}->get_widget('entry_rwhere')->get_active()); + } + + # using regexp utils + my @ret; + my ($strip_prefix, $add_prefix, $add_suffix) = + ($self->{glade}->get_widget('entry_strip_prefix')->get_text(), + $self->{glade}->get_widget('entry_add_prefix')->get_text(), + $self->{glade}->get_widget('entry_add_suffix')->get_text()); + + if ($strip_prefix) { + push @ret,"!$strip_prefix!!i"; + } + + if ($add_prefix) { + push @ret,"!^!$add_prefix!"; + } + + if ($add_suffix) { + push @ret,"!([^/])\$!\$1$add_suffix!"; + } + + return ('regexwhere', join(',', @ret)); + + } else { # using where + return ('where', + $self->{glade}->get_widget('entry_launch_where')->get_text()); + } +} + sub on_submit_resto_clicked { my ($self) = @_ ; @@ -680,7 +761,8 @@ sub on_submit_resto_clicked my $storage = $glade->get_widget('combo_launch_storage') ->get_active_text(); - my $where = $glade->get_widget('entry_launch_where')->get_text(); + my ($where_cmd, $where) = $self->get_where(); + print "$where_cmd => $where\n"; my $job = $glade->get_widget('combo_launch_job') ->get_active_text(); @@ -707,7 +789,7 @@ sub on_submit_resto_clicked client => $client, storage => $storage, fileset => $fileset, - where => $where, + $where_cmd => $where, replace => $replace, priority=> $prio, bootstrap => $r); @@ -884,7 +966,7 @@ sub fill_combo # display Mb/Gb/Kb sub human { - my @unit = qw(b Kb Mb Gb Tb); + my @unit = qw(B KB MB GB TB); my $val = shift; my $i=0; my $format = '%i %s'; @@ -965,13 +1047,13 @@ sub new fileattrib => {}, # cache file fileview => undef, # fileview widget SimpleList fileinfo => undef, # fileinfo widget SimpleList - cwd => '/', + cwd => '/', client_combobox => undef, # client_combobox widget restore_backup_combobox => undef, # date combobox widget list_client => undef, # Gtk2::ListStore list_backup => undef, # Gtk2::ListStore cache_ppathid => {}, # - bvfs => undef, + bvfs => undef, # Bfvs object }; $self->{bvfs} = new Bvfs(conf => $pref); @@ -1073,7 +1155,9 @@ sub new if ($pref->{dbh}) { $self->init_server_backup_combobox(); - $self->{bvfs}->create_brestore_tables(); + if ($self->{bvfs}->create_brestore_tables()) { + new DlgWarn("brestore can't find brestore_xxx tables on your database. I will create them."); + } } $self->set_status($pref->{error}); @@ -1397,7 +1481,7 @@ sub refresh_fileview $file_count++; # $file = [filenameid,listfiles.id,listfiles.Name,File.LStat,File.JobId] listview_push($fileview, - $bvfs->{cwd}, + $bvfs->{cwdid}, $file->[0], $file->[2], $file->[4], @@ -1774,7 +1858,7 @@ sub context_add_to_filelist foreach my $i (@sel) { my ($pid, $fid, $file, $jobid, $type, undef) = @{$i}; - $file = $self->{cwd} . '/' . $file; + $file = $self->{cwd} . $file; $self->add_selected_file_to_list($pid, $fid, $file, $jobid, $type); } } @@ -1955,8 +2039,6 @@ WHERE Job.JobId = JobMedia.JobId AND Path.Path LIKE (SELECT ". $self->dbh_strcat('Path',"'\%'") ." FROM Path WHERE PathId IN ($dirid) - UNION - SELECT " . $self->dbh_strcat('Path',"'\%'") ." FROM brestore_missing_path WHERE PathId IN ($dirid) ) AND File.JobId IN ($inclause) )"; push @select_queries,($query); @@ -2067,7 +2149,7 @@ WHERE Job.JobId = JobMedia.JobId # path, volsessiontime DESC (get the most recent file...) # The array rows look like this : # complete_path,is_dir,fileindex, - # ref->(jobid,VolsessionId,VolsessionTime,File,FirstIndex, + # ref->(jobid,VolsessionId,VolsessionTime,File,FirstIndex, # LastIndex,StartBlock-EndBlock,VolIndex,Volumename,MediaType) @temp_list = sort {$a->[0] cmp $b->[0] || $b->[3]->[2] <=> $a->[3]->[2] @@ -2175,11 +2257,11 @@ WHERE Job.JobId = JobMedia.JobId or $prev_volfile ne $volfile) { # We have to create a new section in the bsr... - # We print the previous one ... + #Â We print the previous one ... # (before that, save the current range ...) if ($first_of_current_range != $prev_fileindex) { - # we are in a range + #Â we are in a range push @fileindex_ranges, ("$first_of_current_range-$prev_fileindex"); } @@ -2292,11 +2374,9 @@ sub get_pathid { my ($self, $dir) = @_; my $query = - "SELECT PathId FROM Path WHERE Path = ? - UNION - SELECT PathId FROM brestore_missing_path WHERE Path = ?"; + "SELECT PathId FROM Path WHERE Path = ?"; my $sth = $self->dbh_prepare($query); - $sth->execute($dir,$dir); + $sth->execute($dir); my $result = $sth->fetchall_arrayref(); $sth->finish(); @@ -2308,10 +2388,36 @@ sub update_cache { my ($self) = @_; - my $query = "SELECT JobId from Job WHERE JobId NOT IN (SELECT JobId FROM brestore_knownjobid) order by JobId"; + $self->{conf}->{dbh}->begin_work(); + + my $query = " + SELECT JobId from Job + WHERE JobId NOT IN (SELECT JobId FROM brestore_knownjobid) AND JobStatus IN ('T', 'f', 'A') ORDER BY JobId"; my $jobs = $self->dbh_selectall_arrayref($query); $self->update_brestore_table(map { $_->[0] } @$jobs); + + $self->{conf}->{dbh}->commit(); + $self->{conf}->{dbh}->begin_work(); + + print STDERR "Cleaning path visibility\n"; + + my $nb = $self->dbh_do(" + DELETE FROM brestore_pathvisibility + WHERE NOT EXISTS + (SELECT 1 FROM Job WHERE JobId=brestore_pathvisibility.JobId)"); + + print STDERR "$nb rows affected\n"; + print STDERR "Cleaning known jobid\n"; + + $nb = $self->dbh_do(" + DELETE FROM brestore_knownjobid + WHERE NOT EXISTS + (SELECT 1 FROM Job WHERE JobId=brestore_knownjobid.JobId)"); + + print STDERR "$nb rows affected\n"; + + $self->{conf}->{dbh}->commit(); } sub get_root @@ -2323,28 +2429,30 @@ sub get_root sub ch_dir { my ($self, $pathid) = @_; - $self->{cwd} = $pathid; + $self->{cwdid} = $pathid; } sub up_dir { my ($self) = @_ ; - my $query = - "SELECT PPathId FROM brestore_pathhierarchy WHERE PathId IN ($self->{cwd}) "; + my $query = " + SELECT PPathId + FROM brestore_pathhierarchy + WHERE PathId IN ($self->{cwdid}) "; my $all = $self->dbh_selectall_arrayref($query); return unless ($all); # already at root my $dir = join(',', map { $_->[0] } @$all); if ($dir) { - $self->{cwd} = $dir; + $self->ch_dir($dir); } } sub pwd { my ($self) = @_; - return $self->get_path($self->{cwd}); + return $self->get_path($self->{cwdid}); } sub get_path @@ -2352,11 +2460,10 @@ sub get_path my ($self, $pathid) = @_; $self->debug("Call with pathid = $pathid"); my $query = - "SELECT Path FROM Path WHERE PathId IN (?) - UNION - SELECT Path FROM brestore_missing_path WHERE PathId IN (?)"; + "SELECT Path FROM Path WHERE PathId IN (?)"; + my $sth = $self->dbh_prepare($query); - $sth->execute($pathid,$pathid); + $sth->execute($pathid); my $result = $sth->fetchrow_arrayref(); $sth->finish(); return $result->[0]; @@ -2376,7 +2483,7 @@ sub ls_files return undef unless ($self->{curjobids}); my $inclause = $self->{curjobids}; - my $inlistpath = $self->{cwd}; + my $inlistpath = $self->{cwdid}; my $query = "SELECT File.FilenameId, listfiles.id, listfiles.Name, File.LStat, File.JobId @@ -2406,7 +2513,7 @@ sub ls_dirs return undef unless ($self->{curjobids}); - my $pathid = $self->{cwd}; + my $pathid = $self->{cwdid}; my $jobclause = $self->{curjobids}; # Let's retrieve the list of the visible dirs in this dir ... @@ -2419,7 +2526,6 @@ sub ls_dirs my $dir_filenameid = $result->[0]; # Then we get all the dir entries from File ... - # It's ugly because there are records in brestore_missing_path ... $query = " SELECT PathId, Path, JobId, Lstat FROM ( @@ -2440,25 +2546,7 @@ SELECT PathId, Path, JobId, Lstat FROM ( WHERE File1.FilenameId = $dir_filenameid AND File1.JobId IN ($jobclause)) AS listfile1 ON (listpath1.PathId = listfile1.PathId) - UNION - SELECT brestore_missing_path1.PathId, brestore_missing_path1.Path, - lower(brestore_missing_path1.Path), listfile2.JobId, listfile2.Lstat - FROM ( - SELECT DISTINCT brestore_pathhierarchy2.PathId - FROM brestore_pathhierarchy AS brestore_pathhierarchy2 - JOIN brestore_missing_path AS brestore_missing_path2 - ON (brestore_pathhierarchy2.PathId = brestore_missing_path2.PathId) - JOIN brestore_pathvisibility AS brestore_pathvisibility2 - ON (brestore_pathhierarchy2.PathId = brestore_pathvisibility2.PathId) - WHERE brestore_pathhierarchy2.PPathId = $pathid - AND brestore_pathvisibility2.jobid IN ($jobclause)) AS listpath2 - JOIN brestore_missing_path AS brestore_missing_path1 ON (listpath2.PathId = brestore_missing_path1.PathId) - LEFT JOIN ( - SELECT File2.PathId, File2.JobId, File2.Lstat FROM File AS File2 - WHERE File2.FilenameId = $dir_filenameid - AND File2.JobId IN ($jobclause)) AS listfile2 - ON (listpath2.PathId = listfile2.PathId) - ) AS A ORDER BY 2,3 DESC + ) AS A ORDER BY 2,3 DESC "; $self->debug($query); $sth=$self->dbh_prepare($query); @@ -2572,8 +2660,6 @@ sub estimate_restore_size AND File.JobId = Job.JobId AND Path.Path LIKE (SELECT " . $self->dbh_strcat('Path',"'\%'") . " FROM Path WHERE PathId IN ($dir) - UNION - SELECT " . $self->dbh_strcat('Path',"'\%'") . " FROM brestore_missing_path WHERE PathId IN ($dir) ) AND File.JobId IN ($inclause) ORDER BY Path.Path, File.FilenameId, Job.StartTime DESC"; @@ -2695,7 +2781,7 @@ sub get_all_file_versions if ($ref->[8]) { # The file has a md5. We compare his md5 to other known md5... - # We take size into account. It may happen that 2 files + # We take size into account. It may happen that 2 files # have the same md5sum and are different. size is a supplementary # criterion @@ -2796,32 +2882,6 @@ sub update_brestore_table } } -sub cleanup_brestore_table -{ - my ($self) = @_; - - my $query = "SELECT JobId from brestore_knownjobid"; - my @jobs = @{$self->dbh_selectall_arrayref($query)}; - - foreach my $jobentry (@jobs) - { - my $job = $jobentry->[0]; - $query = "SELECT FileId from File WHERE JobId = $job LIMIT 1"; - my $result = $self->dbh_selectall_arrayref($query); - if (scalar(@{$result})) - { - # There are still files for this jobid - print STDERR "$job still exists. Not cleaning...\n"; - - } else { - $query = "DELETE FROM brestore_pathvisibility WHERE JobId = $job"; - $self->dbh_do($query); - $query = "DELETE FROM brestore_knownjobid WHERE JobId = $job"; - $self->dbh_do($query); - } - } -} - sub parent_dir { my ($path) = @_; @@ -2894,12 +2954,11 @@ sub build_path_hierarchy sub return_pathid_from_path { my ($self, $path) = @_; - my $query = "SELECT PathId FROM Path WHERE Path = ? - UNION - SELECT PathId FROM brestore_missing_path WHERE Path = ?"; + my $query = "SELECT PathId FROM Path WHERE Path = ?"; + #print STDERR $query,"\n" if $debug; my $sth = $self->{conf}->{dbh}->prepare_cached($query); - $sth->execute($path,$path); + $sth->execute($path); my $result =$sth->fetchrow_arrayref(); $sth->finish(); if (defined $result) @@ -2907,7 +2966,7 @@ sub return_pathid_from_path return $result->[0]; } else { - # A bit dirty : we insert into path AND missing_path, to be sure + # A bit dirty : we insert into path, and we have to be sure # we aren't deleted by a purge. We still need to insert into path to get # the pathid, because of mysql $query = "INSERT INTO Path (Path) VALUES (?)"; @@ -2916,18 +2975,7 @@ sub return_pathid_from_path $sth->execute($path); $sth->finish(); - $query = " INSERT INTO brestore_missing_path (PathId,Path) - SELECT PathId,Path FROM Path WHERE Path = ?"; - #print STDERR $query,"\n" if $debug; - $sth = $self->{conf}->{dbh}->prepare_cached($query); - $sth->execute($path); - $sth->finish(); - $query = " DELETE FROM Path WHERE Path = ?"; - #print STDERR $query,"\n" if $debug; - $sth = $self->{conf}->{dbh}->prepare_cached($query); - $sth->execute($path); - $sth->finish(); - $query = "SELECT PathId FROM brestore_missing_path WHERE Path = ?"; + $query = "SELECT PathId FROM Path WHERE Path = ?"; #print STDERR $query,"\n" if $debug; $sth = $self->{conf}->{dbh}->prepare_cached($query); $sth->execute($path); @@ -2941,13 +2989,12 @@ sub return_pathid_from_path sub create_brestore_tables { my ($self) = @_; - + my $ret = 0; my $verif = "SELECT 1 FROM brestore_knownjobid LIMIT 1"; unless ($self->dbh_do($verif)) { - new DlgWarn("brestore can't find brestore_xxx tables on your database. I will create them."); + $ret=1; - $self->{error} = "Creating internal brestore tables"; my $req = " CREATE TABLE brestore_knownjobid ( @@ -2959,6 +3006,7 @@ sub create_brestore_tables $verif = "SELECT 1 FROM brestore_pathhierarchy LIMIT 1"; unless ($self->dbh_do($verif)) { + $ret=1; my $req = " CREATE TABLE brestore_pathhierarchy ( @@ -2976,6 +3024,7 @@ sub create_brestore_tables $verif = "SELECT 1 FROM brestore_pathvisibility LIMIT 1"; unless ($self->dbh_do($verif)) { + $ret=1; my $req = " CREATE TABLE brestore_pathvisibility ( @@ -2991,24 +3040,7 @@ sub create_brestore_tables ON brestore_pathvisibility (JobId)"; $self->dbh_do($req); } - - $verif = "SELECT 1 FROM brestore_missing_path LIMIT 1"; - unless ($self->dbh_do($verif)) { - my $req = " - CREATE TABLE brestore_missing_path - ( - PathId int4 NOT NULL, - Path text NOT NULL, - CONSTRAINT brestore_missing_path_pkey PRIMARY KEY (PathId) - )"; - $self->dbh_do($req); - - my $len = ($self->{conf}->{is_mysql} == 1)?'(255)':''; - - $req = "CREATE INDEX brestore_missing_path_path - ON brestore_missing_path (Path$len)"; - $self->dbh_do($req); - } + return $ret; } # Get metadata @@ -3182,9 +3214,10 @@ sub run client => $arg{client}, storage => $arg{storage} || '', fileset => $arg{fileset} || '', - where => $arg{where}, - replace => $arg{replace}, + where => $arg{where} || '', + regexwhere => $arg{regexwhere} || '', priority=> $arg{prio} || '', + replace => $arg{replace}, action => 'run', timeout => 10, bootstrap => [$arg{bootstrap}], @@ -3233,6 +3266,7 @@ sub list_client } 1; +################################################################ package main; @@ -3244,7 +3278,7 @@ sub HELP_MESSAGE exit 1; } -my $file_conf = "$ENV{HOME}/.brestore.conf" ; +my $file_conf = (exists $ENV{HOME})? "$ENV{HOME}/.brestore.conf" : undef ; my $batch_mod; GetOptions("conf=s" => \$file_conf, @@ -3252,6 +3286,11 @@ GetOptions("conf=s" => \$file_conf, "debug" => \$debug, "help" => \&HELP_MESSAGE) ; +if (! defined $file_conf) { + print STDERR "Could not detect default config and no config file specified\n"; + HELP_MESSAGE(); +} + my $p = new Pref($file_conf); if (! -f $file_conf) { @@ -3261,12 +3300,15 @@ if (! -f $file_conf) { if ($batch_mod) { my $vfs = new Bvfs(conf => $p); if ($p->connect_db()) { + if ($vfs->create_brestore_tables()) { + print "Creating brestore tables\n"; + } $vfs->update_cache(); } exit (0); } -$glade_file = $p->{glade_file}; +$glade_file = $p->{glade_file} || $glade_file; foreach my $path ('','.','/usr/share/brestore','/usr/local/share/brestore') { if (-f "$path/$glade_file") { @@ -3321,4 +3363,4 @@ my $dirs = $bvfs->ls_dirs(); $bvfs->ch_dir(123496); $dirs = $bvfs->ls_dirs(); $bvfs->ls_files(); -map { $bvfs->debug($_) } $bvfs->get_all_file_versions($bvfs->{cwd},312433, "exw3srv3", 1); +map { $bvfs->debug($_) } $bvfs->get_all_file_versions($bvfs->{cwdid},312433, "exw3srv3", 1);