]> git.sur5r.net Git - bacula/bacula/commitdiff
ebl Add brestore_xxx tables to sql scripts
authorEric Bollengier <eric@eb.homelinux.org>
Sat, 24 Nov 2007 00:08:52 +0000 (00:08 +0000)
committerEric Bollengier <eric@eb.homelinux.org>
Sat, 24 Nov 2007 00:08:52 +0000 (00:08 +0000)
ebl  Add a batch=1 option to bresto.pl to fill bresto tables
ebl  Adapt Bconsole.pm to run a restore job
ebl  Make bresto.html/js working (you can restore files now)

git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@5971 91ce42f0-d328-0410-95d8-f526ca767f89

gui/bweb/cgi/bresto.pl
gui/bweb/html/bresto.js
gui/bweb/lib/Bconsole.pm
gui/bweb/script/bweb-mysql.sql
gui/bweb/script/bweb-postgresql.sql
gui/bweb/technotes-2.3

index a8f28dbfb6d351f7069f4adf889d7021b698f916..6a77af6c630ef39574ce10e67f01e938e838a1e1 100755 (executable)
@@ -178,12 +178,13 @@ sub update_brestore_table
 
        print STDERR "Creating missing recursion paths for $job\n";
 
-       $query = "SELECT brestore_pathvisibility.PathId, Path FROM brestore_pathvisibility
-                 JOIN Path ON( brestore_pathvisibility.PathId = Path.PathId)
-                 LEFT JOIN brestore_pathhierarchy ON (brestore_pathvisibility.PathId = brestore_pathhierarchy.PathId)
-                 WHERE brestore_pathvisibility.JobId = $job
-                 AND brestore_pathhierarchy.PathId IS NULL
-                 ORDER BY Path";
+       $query = "
+SELECT brestore_pathvisibility.PathId, Path FROM brestore_pathvisibility
+  JOIN Path ON( brestore_pathvisibility.PathId = Path.PathId)
+       LEFT JOIN brestore_pathhierarchy ON (brestore_pathvisibility.PathId = brestore_pathhierarchy.PathId)
+ WHERE brestore_pathvisibility.JobId = $job
+   AND brestore_pathhierarchy.PathId IS NULL
+ ORDER BY Path";
 
        my $sth = $self->dbh_prepare($query);
        $sth->execute();
@@ -200,19 +201,17 @@ sub update_brestore_table
        # This query gives all parent pathids for a given jobid that aren't stored.
        # It has to be called until no record is updated ...
        $query = "
-       INSERT INTO brestore_pathvisibility (PathId, JobId) (
-       SELECT a.PathId,$job
-       FROM
-               (SELECT DISTINCT h.PPathId AS PathId
-               FROM brestore_pathhierarchy AS h
-               JOIN  brestore_pathvisibility AS p ON (h.PathId=p.PathId)
-               WHERE p.JobId=$job) AS a
-               LEFT JOIN
-               (SELECT PathId
-               FROM brestore_pathvisibility
-               WHERE JobId=$job) AS b
-               ON (a.PathId = b.PathId)
-       WHERE b.PathId IS NULL)";
+INSERT INTO brestore_pathvisibility (PathId, JobId) (
+ SELECT a.PathId,$job
+   FROM (
+     SELECT DISTINCT h.PPathId AS PathId
+       FROM brestore_pathhierarchy AS h
+       JOIN  brestore_pathvisibility AS p ON (h.PathId=p.PathId)
+      WHERE p.JobId=$job) AS a LEFT JOIN
+       (SELECT PathId
+          FROM brestore_pathvisibility
+         WHERE JobId=$job) AS b ON (a.PathId = b.PathId)
+  WHERE b.PathId IS NULL)";
 
         my $rows_affected;
        while (($rows_affected = $self->dbh_do($query)) and ($rows_affected !~ /^0/))
@@ -338,16 +337,15 @@ sub ls_files
 
     my $query =
 "SELECT File.FilenameId, listfiles.id, listfiles.Name, File.LStat, File.JobId
- FROM
-       (SELECT Filename.Name, max(File.FileId) as id
+ FROM File, (
+       SELECT Filename.Name, max(File.FileId) as id
         FROM File, Filename
-        WHERE File.FilenameId = Filename.FilenameId
-          AND Filename.Name != ''
-          AND File.PathId IN ($inlistpath)
-          AND File.JobId IN ($inclause)
-        GROUP BY Filename.Name
-        ORDER BY Filename.Name) AS listfiles,
-File
+       WHERE File.FilenameId = Filename.FilenameId
+          AND Filename.Name != ''
+          AND File.PathId IN ($inlistpath)
+          AND File.JobId IN ($inclause)
+        GROUP BY Filename.Name
+        ORDER BY Filename.Name) AS listfiles
 WHERE File.FileId = listfiles.id";
 
     $self->debug($query);
@@ -453,14 +451,16 @@ sub set_job_ids_for_date
     # incrementals and differentials until we have found a full so it goes
     # like this : store all incrementals until we have found a differential
     # or a full, then find the full
-    my $query = "SELECT JobId, FileSet, Level, JobStatus
-               FROM Job JOIN FileSet USING (FileSetId)
-                         JOIN Client USING (ClientId) $filter
-               WHERE EndTime <= $date
-               AND Client.Name = '$client'
-               AND Type IN ('B')
-               AND JobStatus IN ('T')
-               ORDER BY FileSet, JobTDate DESC";
+    my $query = "
+SELECT JobId, FileSet, Level, JobStatus
+  FROM Job 
+       JOIN FileSet USING (FileSetId)
+       JOIN Client USING (ClientId) $filter
+ WHERE EndTime <= $date
+   AND Client.Name = '$client'
+   AND Type IN ('B')
+   AND JobStatus IN ('T')
+ ORDER BY FileSet, JobTDate DESC";
 
     my @CurrentJobIds;
     my $result = $self->dbh_selectall_arrayref($query);
@@ -738,9 +738,13 @@ my $action = CGI::param('action') || '';
 my $args = $bvfs->get_form('pathid', 'filenameid', 'fileid', 'qdate',
                           'limit', 'offset', 'client');
 
-print CGI::header('application/x-javascript');
+if (CGI::param('batch')) {
+    $bvfs->update_cache();
+    exit 0;
+}
 
 if ($action eq 'list_client') {
+    print CGI::header('application/x-javascript');
 
   my $filter = $bvfs->get_client_filter();
   my $q = "SELECT Name FROM Client $filter";
@@ -752,6 +756,7 @@ if ($action eq 'list_client') {
   exit 0;
 
 } elsif ($action eq 'list_job') {
+    print CGI::header('application/x-javascript');
 
     my $filter = $bvfs->get_client_filter();
     my $query = "
@@ -766,12 +771,13 @@ if ($action eq 'list_client') {
     print "[";
 
     print join(',', map {
-      "[$_->[4], '$_->[0]', '$_->[0] $_->[1] $_->[2] ($_->[3])']"
+      "[$_->[4], '$_->[0]', '$_->[0] $_->[1] $_->[2] ($_->[3]) $_->[4]']"
       } @$result);
 
     print "]\n";
     exit 0;
 } elsif ($action eq 'list_storage') { # TODO: use .storage hier
+    print CGI::header('application/x-javascript');
 
     my $q="SELECT Name FROM Storage";
     my $lst = $bvfs->dbh_selectall_arrayref($q);
@@ -781,7 +787,7 @@ if ($action eq 'list_client') {
     exit 0;
 }
 
-my @jobid = $bvfs->get_jobids(grep { /^\d+$/ } CGI::param('jobid'));
+my @jobid = $bvfs->get_jobids(grep { /^\d+(,\d+)*$/ } CGI::param('jobid'));
 if (!scalar(@jobid) and $args->{qdate} and $args->{client}) {
     @jobid = $bvfs->set_job_ids_for_date($args->{client}, $args->{qdate});
 }
@@ -809,6 +815,75 @@ if ($pathid =~ /^(\d+)$/) {
 
 $bvfs->ch_dir($pathid);
 
+if ($action eq 'restore') {
+
+    # TODO: pouvoir choisir le replace et le jobname
+    my $arg = $bvfs->get_form(qw/client storage regexwhere where/);
+
+    if (!$arg->{client}) {
+       print "ERROR: missing client\n";
+       exit 1;
+    }
+
+    my $fileid = join(',', grep { /^\d+$/ } CGI::param('fileid'));
+    my @dirid = grep { /^\d+$/ } CGI::param('dirid');
+    my $inclause = join(',', @jobid);
+
+    my @union;
+
+    if ($fileid) {
+      push @union,
+      "(SELECT JobId, FileIndex, FilenameId, PathId FROM File WHERE FileId IN ($fileid))";
+    }
+
+    # using this is not good because the sql engine doesn't know
+    # what LIKE will use. It will be better to get Path% in perl
+    # but it doesn't work with accents... :(
+    foreach my $dirid (@dirid) {
+      push @union, "
+  (SELECT File.JobId, File.FileIndex, File.FilenameId, File.PathId
+    FROM Path JOIN File USING (PathId)
+   WHERE Path.Path LIKE
+        (SELECT ". $bvfs->dbh_strcat('Path',"'\%'") ." FROM Path
+          WHERE PathId = $dirid
+        )
+     AND File.JobId IN ($inclause))";
+    }
+
+    return unless scalar(@union);
+
+    my $u = join(" UNION ", @union);
+
+    $bvfs->dbh_do("CREATE TEMPORARY TABLE btemp AS ($u)");
+    # TODO: remove FilenameId et PathId
+    $bvfs->dbh_do("CREATE TABLE b2$$ AS (
+SELECT btemp.JobId, btemp.FileIndex, btemp.FilenameId, btemp.PathId
+  FROM btemp,
+       (SELECT max(JobId) as JobId, PathId, FilenameId
+          FROM btemp
+      GROUP BY PathId, FilenameId
+      ORDER BY JobId DESC) AS a
+  WHERE a.JobId = btemp.JobId
+    AND a.PathId= btemp.PathId
+    AND a.FilenameId = btemp.FilenameId
+)");
+    my $bconsole = $bvfs->get_bconsole();
+    # TODO: pouvoir choisir le replace et le jobname
+    my $jobid = $bconsole->run(client    => $arg->{client},
+                              storage   => $arg->{storage},
+                              where     => $arg->{where},
+                              regexwhere=> $arg->{regexwhere},
+                              restore   => 1,
+                              file      => "?b2$$");
+    
+    $bvfs->dbh_do("DROP TABLE b2$$");
+    sleep(2);
+    print CGI::redirect("bweb.pl?action=dsp_cur_job;jobid=$jobid") ;
+    exit 0;
+}
+
+print CGI::header('application/x-javascript');
+
 if ($action eq 'list_files') {
     print "[";
     my $files = $bvfs->ls_files();
@@ -816,7 +891,7 @@ if ($action eq 'list_files') {
 #   File.FilenameId, listfiles.id, listfiles.Name, File.LStat, File.JobId
 
     print join(',',
-              map { "[$_->[1], $_->[0], $pathid, \"$_->[2]\", 10, \"2007-01-01 00:00:00\"]" }
+              map { "[$_->[1], $_->[0], $pathid, $_->[4], \"$_->[2]\", 10, \"2007-01-01 00:00:00\"]" }
               @$files);
     print "]\n";
 
@@ -827,7 +902,7 @@ if ($action eq 'list_files') {
        # return ($dirid,$dir_basename,$lstat,$jobid)
 
     print join(',',
-              map { "{ 'id': '$_->[0]', 'text': '$_->[1]', 'cls':'folder'}" }
+              map { "{ 'jobid': '$bvfs->{curjobids}', 'id': '$_->[0]', 'text': '$_->[1]', 'cls':'folder'}" }
               @$dirs);
 
     print "]\n";
@@ -856,7 +931,7 @@ if ($action eq 'list_files') {
  SELECT DISTINCT VolumeName, InChanger
    FROM File,
     ( -- Get all media from this job
-      SELECT MAX(FirstIndex) AS FirstIndex, MIN(LastIndex) AS LastIndex,
+      SELECT MIN(FirstIndex) AS FirstIndex, MAX(LastIndex) AS LastIndex,
              VolumeName, Inchanger
         FROM JobMedia JOIN Media USING (MediaId)
        WHERE JobId IN ($jobid)
@@ -864,57 +939,13 @@ if ($action eq 'list_files') {
     ) AS allmedia
   WHERE File.FileId IN ($fileid)
     AND File.FileIndex >= allmedia.FirstIndex
-    AND File.FileIndex <= allmedia.LastIndex;
+    AND File.FileIndex <= allmedia.LastIndex
 ";
     my $lst = $bvfs->dbh_selectall_arrayref($q);
     print "[";
     print join(',', map { "[ '$_->[0]', $_->[1]]" } @$lst);
     print "]\n";
 
-} elsif ($action eq 'restore') {
-    my $fileid = join(',', grep { /^\d+$/ } CGI::param('fileid'));
-    my @dirid = grep { /^\d+$/ } CGI::param('dirid');
-    my $inclause = join(',', @jobid);
-
-    my @union;
-
-    if ($fileid) {
-      push @union, "(SELECT JobId, FileIndex FROM File WHERE FileId IN ($fileid))";
-    }
-
-    # using this is not good because the sql engine doesn't know
-    # what LIKE will use. It will be better to get Path% in perl
-    # but it doesn't work with accents... :(
-    foreach my $dirid (@dirid) {
-      push @union, "
-  (SELECT File.JobId, File.FileIndex, File.FilenameId, File.PathId
-    FROM Path JOIN File USING (PathId)
-   WHERE Path.Path LIKE
-        (SELECT ". $bvfs->dbh_strcat('Path',"'\%'") ." FROM Path
-          WHERE PathId = $dirid
-        )
-     AND File.JobId IN ($inclause))";
-    }
-
-    return unless scalar(@union);
-
-    my $u = join(" UNION ", @union);
-
-    $bvfs->dbh_do("CREATE TEMP TABLE btemp AS ($u)");
-    # TODO: remove FilenameId et PathId
-    $bvfs->dbh_do("CREATE TABLE b2$$ AS (
-SELECT btemp.JobId, btemp.FileIndex, btemp.FilenameId, btemp.PathId
-  FROM btemp,
-       (SELECT max(JobId) as JobId, PathId, FilenameId
-          FROM btemp
-      GROUP BY PathId, FilenameId
-      ORDER BY JobId DESC) AS a
-  WHERE a.JobId = btemp.JobId
-    AND a.PathId= btemp.PathId
-    AND a.FilenameId = btemp.FilenameId
-)");
-
-    print "restore file=?b2$$ done\n";
 }
 
 __END__
index b4c2701a344ebd4b21ab45bceb6e6c447a851976..e2ff595a9dceb78cd5eba193ca43a702dcf21843 100644 (file)
@@ -49,12 +49,15 @@ Ext.namespace('Ext.brestore');
 Ext.brestore.jobid=0;            // selected jobid
 Ext.brestore.jobdate='';         // selected date
 Ext.brestore.client='';          // selected client
+Ext.brestore.rclient='';         // selected client for resto
+Ext.brestore.storage='';         // selected storage for resto
 Ext.brestore.path='';            // current path (without user location)
 Ext.brestore.root_path='';       // user location
 
 Ext.brestore.option_vosb = false;
 Ext.brestore.option_vafv = false;
 Ext.brestore.dlglaunch;
+Ext.BLANK_IMAGE_URL = '/bweb/ext/resources/images/aero/s.gif';  // 1.1
 
 function get_node_path(node)
 {
@@ -109,6 +112,7 @@ function ext_init()
         id:'source'
     });
     tree.setRootNode(root);
+    Ext.brestore.tree = root;
 
     // render the tree
     tree.render();
@@ -145,6 +149,7 @@ function ext_init()
    {name: 'fileid'    },
    {name: 'filenameid'},
    {name: 'pathid'    },
+   {name: 'jobid'     },
    {name: 'name'      },
    {name: 'size',     type: 'int'  },
    {name: 'mtime',    type: 'date', dateFormat: 'Y-m-d h:i:s'}
@@ -175,6 +180,9 @@ function ext_init()
         },{
            dataIndex: 'fileid',
            hidden: true
+        },{
+           dataIndex: 'jobid',
+           hidden: true
         }
         ]);
 
@@ -251,13 +259,15 @@ function ext_init()
            width:     100
         },{
            dataIndex: 'pathid',
-           hidden: true
+          header: 'PathId'
+//           hidden: true
         },{
            dataIndex: 'filenameid',
            hidden: true
         },{
            dataIndex: 'fileid',
-           hidden: true
+          header: 'FileId'
+//           hidden: true
         }
         ]);
 
@@ -295,13 +305,13 @@ function ext_init()
              if (data.grid.id == 'div-files') {
                  for(var i=0;i<data.selections.length;i++) {
                     r = new file_selection_record({
-                      jobid:     Ext.brestore.jobid,
+                      jobid:     data.selections[0].json[3],
                       fileid:    data.selections[i].json[0],
                       filenameid:data.selections[i].json[1],
                       pathid:    data.selections[i].json[2],
-                      name: Ext.brestore.path + data.selections[i].json[3],
-                      size:      data.selections[i].json[4],
-                      mtime:     data.selections[i].json[5]
+                      name: Ext.brestore.path + data.selections[i].json[4],
+                      size:      data.selections[i].json[5],
+                      mtime:     data.selections[i].json[6]
                     });
                     file_selection_store.add(r)
                  }
@@ -324,7 +334,7 @@ function ext_init()
            if (data.node) {
               var path= get_node_path(data.node);
               r = new file_selection_record({
-                      jobid:     Ext.brestore.jobid,
+                      jobid:     data.node.attributes.jobid,
                       fileid:    0,
                       filenameid:0,
                       pathid:    data.node.id,
@@ -540,34 +550,6 @@ function ext_init()
 
     // create the primary toolbar
     var tb2 = new Ext.Toolbar('div-tb-sel');
-    tb2.add({
-        id:'save',
-        text:'Save',
-        disabled:true,
-//        handler:save,
-        cls:'x-btn-text-icon save',
-        tooltip:'Saves all components to the server'
-    },'-', {
-        id:'add',
-        text:'Component',
-//        handler:addComponent,
-        cls:'x-btn-text-icon add-cmp',
-        tooltip:'Add a new Component to the dependency builder'
-    }, {
-        id:'option',
-        text:'Option',
-        disabled:true,
-//        handler:addOption,
-        cls:'x-btn-text-icon add-opt',
-        tooltip:'Add a new optional dependency to the selected component'
-    },'-',{
-        id:'remove',
-        text:'Remove',
-        disabled:true,
-//        handler:removeNode,
-        cls:'x-btn-text-icon remove',
-        tooltip:'Remove the selected item'
-    });
 
     var where_field = new Ext.form.TextField({
             fieldLabel: 'Location',
@@ -633,16 +615,44 @@ function ext_init()
 //                             alwaysShowTabs: true
                        }
                 });
-               var dialog = Ext.brestore.dlglaunch;
-                dialog.addKeyListener(27, dialog.hide, dialog);
-                dialog.addButton('Submit', dialog.hide, dialog);
-                dialog.addButton('Close', dialog.hide, dialog);
 
     var fs = new Ext.form.Form({
         labelAlign: 'right',
         labelWidth: 80
     });
 
+//    var resto_store = new Ext.data.Store({
+//        proxy: new Ext.data.HttpProxy({
+//            url: '/cgi-bin/bweb/bresto.pl',
+//            method: 'GET',
+//            params:{action:'list_resto'}
+//        }),
+//
+//        reader: new Ext.data.ArrayReader({
+//        }, Ext.data.Record.create([
+//           {name: 'name' }
+//        ]))
+//    });
+
+    var rclient_combo = new Ext.form.ComboBox({
+            value: Ext.brestore.client,
+            fieldLabel: 'client',
+            hiddenName:'client',
+            store: client_store,
+            displayField:'name',
+            typeAhead: true,
+            mode: 'local',
+            triggerAction: 'all',
+            emptyText:'Select a client...',
+            selectOnFocus:true,
+            width:190
+        });
+    var where_text = new Ext.form.TextField({
+            fieldLabel: 'Where',
+            name: 'where',
+            value: '/tmp/bacula-restore',
+            width:190
+        });
     var storage_store = new Ext.data.Store({
         proxy: new Ext.data.HttpProxy({
             url: '/cgi-bin/bweb/bresto.pl',
@@ -655,70 +665,7 @@ function ext_init()
            {name: 'name' }
         ]))
     });
-
-    var resto_store = new Ext.data.Store({
-        proxy: new Ext.data.HttpProxy({
-            url: '/cgi-bin/bweb/bresto.pl',
-            method: 'GET',
-            params:{action:'list_resto'}
-        }),
-
-        reader: new Ext.data.ArrayReader({
-        }, Ext.data.Record.create([
-           {name: 'name' }
-        ]))
-    });
-
-    fs.fieldset(
-        {legend:'Restore job'},
-        new Ext.form.ComboBox({
-            fieldLabel: 'Replace',
-            hiddenName:'replace',
-            store: new Ext.data.SimpleStore({
-                fields: ['replace'],
-                data : [['always'],['never'],['if newer']]
-           }),
-            displayField:'replace',
-            typeAhead: true,
-            mode: 'local',
-            triggerAction: 'all',
-            emptyText:'never',
-            selectOnFocus:true,
-            width:190
-        }),
-
-        new Ext.form.ComboBox({
-            fieldLabel: 'job',
-            hiddenName:'job',
-            store: resto_store,
-            displayField:'name',
-            typeAhead: true,
-            mode: 'local',
-            triggerAction: 'all',
-            emptyText:'Select a job...',
-            selectOnFocus:true,
-            width:190
-        })
-       ,
-        new Ext.form.TextField({
-            fieldLabel: 'Where',
-            name: 'where',
-            width:190
-        }),
-
-        new Ext.form.ComboBox({
-            fieldLabel: 'client',
-            hiddenName:'client',
-            store: client_store,
-            displayField:'name',
-            typeAhead: true,
-            mode: 'local',
-            triggerAction: 'all',
-            emptyText:'Select a client...',
-            selectOnFocus:true,
-            width:190
-        }),
-        new Ext.form.ComboBox({
+    var storage_combo = new Ext.form.ComboBox({
             fieldLabel: 'storage',
             hiddenName:'storage',
             store: storage_store,
@@ -729,10 +676,44 @@ function ext_init()
             emptyText:'Select a storage...',
             selectOnFocus:true,
             width:190
-        })
+        });
+    fs.fieldset(
+        {legend:'Restore job'},
+//        new Ext.form.ComboBox({
+//            fieldLabel: 'Replace',
+//            hiddenName:'replace',
+//            store: new Ext.data.SimpleStore({
+//              fields: ['replace'],
+//              data : [['always'],['never'],['if newer']]
+//         }),
+//            displayField:'replace',
+//            typeAhead: true,
+//            mode: 'local',
+//            triggerAction: 'all',
+//            emptyText:'never',
+//            selectOnFocus:true,
+//            width:190
+//        }),
+//
+//        new Ext.form.ComboBox({
+//            fieldLabel: 'job',
+//            hiddenName:'job',
+//            store: resto_store,
+//            displayField:'name',
+//            typeAhead: true,
+//            mode: 'local',
+//            triggerAction: 'all',
+//            emptyText:'Select a job...',
+//            selectOnFocus:true,
+//            width:190
+//        }),
+
+        rclient_combo,
+        where_text,
+        storage_combo
     );
     storage_store.load({params:{action: 'list_storage'}});
-    resto_store.load({params:{action: 'list_resto'}});
+//  resto_store.load({params:{action: 'list_resto'}});
     fs.render('div-resto-form');
 
 //      var f = new Ext.form.BasicForm('div-resto-form', {url: '/bweb/test', method: 'GET',
@@ -740,12 +721,39 @@ function ext_init()
 //                                                    }
 //                                     );
 
-               var layout = dialog.getLayout();
-                layout.beginUpdate();
-               layout.add('center', new Ext.ContentPanel('div-resto-form', {
+    var launch_restore = function() {
+       var items = file_selection_store.data.items;
+       var tab_fileid=new Array();
+       var tab_dirid=new Array();
+       var tab_jobid=new Array();
+        for(var i=0;i<items.length;i++) {
+               if (items[i].data['fileid']) {
+                       tab_fileid.push(items[i].data['fileid']);
+               } else {
+                       tab_dirid.push(items[i].data['pathid']);
+               }
+               tab_jobid.push(items[i].data['jobid']);
+       }
+       var res = ';fileid=' + tab_fileid.join(";fileid=");
+       var res2 = ';dirid=' + tab_dirid.join(";dirid=");
+       var res3 = ';jobid=' + tab_jobid.join(";jobid=");
+
+       var res4 = ';client=' + rclient_combo.getValue() + ';storage=' + storage_combo.getValue() + ';where=' + where_text.getValue();
+
+       window.location='/cgi-bin/bweb/bresto.pl?action=restore' + res + res2 + res3 + res4;
+    }
+       var dialog = Ext.brestore.dlglaunch;
+        dialog.addKeyListener(27, dialog.hide, dialog);
+        dialog.addButton('Submit', launch_restore);
+        dialog.addButton('Close', dialog.hide, dialog);
+
+        var layout = dialog.getLayout();
+        layout.beginUpdate();
+       layout.add('center', new Ext.ContentPanel('div-resto-form', {
                                     autoCreate:true, title: 'Third Tab', closable:true, background:true}));
-               layout.endUpdate();
-               dialog.show();
+       layout.endUpdate();
+       dialog.show();
+
            }
        }
     ]);
index 45ec5d4183c0ce8c5952a92985d0ad2643c7aea0..beae967be4a97d3c4a19a1cb0d32f27de9668435 100644 (file)
@@ -66,6 +66,14 @@ sub run
     my ($self, %arg) = @_;
 
     my $cmd = 'run ';
+    my $go  = 'yes';
+
+    if ($arg{restore}) {
+       $cmd = 'restore ';
+       $go  = 'done yes';
+       delete $arg{restore};
+    }
+
     for my $key (keys %arg) {
        if ($arg{$key}) {
            $arg{$key} =~ tr/""/  /;
@@ -77,9 +85,9 @@ sub run
        return 0;
     }
 
-    print STDERR "===> $cmd yes\n";
+    print STDERR "===> $cmd $go\n";
     $self->{bconsole}->clear_accum();
-    $self->send("$cmd yes\n");
+    $self->send("$cmd $go\n");
     $self->expect_it('-re',qr/^[*]/);
     my $ret = $self->before();
     if ($ret =~ /jobid=(\d+)/is) {
index 65a31806ddc74f870fbec5b3136b368cc175bb1b..601d569c48ac121bd919986efea09327e64b0561 100644 (file)
@@ -1,3 +1,38 @@
+-- --------------------------------------------------
+-- Upgrade from 2.2
+-- --------------------------------------------------
+
+-- New tables for bresto (same as brestore)
+
+CREATE TABLE brestore_knownjobid
+(
+     JobId integer NOT NULL,
+     CONSTRAINT brestore_knownjobid_pkey PRIMARY KEY (JobId)
+);
+
+CREATE TABLE brestore_pathhierarchy
+(
+     PathId integer NOT NULL,
+     PPathId integer NOT NULL,
+     CONSTRAINT brestore_pathhierarchy_pkey PRIMARY KEY (PathId)
+);
+
+CREATE INDEX brestore_pathhierarchy_ppathid 
+                          ON brestore_pathhierarchy (PPathId);
+
+CREATE TABLE brestore_pathvisibility
+(
+      PathId integer NOT NULL,
+      JobId integer NOT NULL,
+      Size int8 DEFAULT 0,
+      Files int4 DEFAULT 0,
+      CONSTRAINT brestore_pathvisibility_pkey PRIMARY KEY (JobId, PathId)
+);
+
+CREATE INDEX brestore_pathvisibility_jobid
+                          ON brestore_pathvisibility (JobId);
+
+
 CREATE TABLE bweb_user
 (
        userid       serial not null,
@@ -53,6 +88,10 @@ CREATE TABLE  bweb_client_group_acl
 );
 
 
+-- --------------------------------------------------
+-- Upgrade from 2.0
+-- --------------------------------------------------
+
 -- Manage Client groups in bweb
 -- Works with postgresql and mysql5 
 
index d02572f2f7978853b28642309cf4e369f962bbf0..7bab62c00b8b62d0268582088c6c1ba2434a97b3 100644 (file)
@@ -3,6 +3,40 @@
 -- Upgrade from 2.2
 -- --------------------------------------------------
 
+
+-- New tables for bresto (same as brestore)
+
+CREATE TABLE brestore_knownjobid
+(
+     JobId integer NOT NULL,
+     CONSTRAINT brestore_knownjobid_pkey PRIMARY KEY (JobId)
+);
+
+CREATE TABLE brestore_pathhierarchy
+(
+     PathId integer NOT NULL,
+     PPathId integer NOT NULL,
+     CONSTRAINT brestore_pathhierarchy_pkey PRIMARY KEY (PathId)
+);
+
+CREATE INDEX brestore_pathhierarchy_ppathid 
+                          ON brestore_pathhierarchy (PPathId);
+
+CREATE TABLE brestore_pathvisibility
+(
+      PathId integer NOT NULL,
+      JobId integer NOT NULL,
+      Size int8 DEFAULT 0,
+      Files int4 DEFAULT 0,
+      CONSTRAINT brestore_pathvisibility_pkey PRIMARY KEY (JobId, PathId)
+);
+
+CREATE INDEX brestore_pathvisibility_jobid
+                          ON brestore_pathvisibility (JobId);
+
+
+-- New job log view
+
 CREATE FUNCTION concat (text, text) RETURNS text AS '
 DECLARE
 result text;
index 91e31053990531b39108ae05c66baaccf4f6dfbd..e96d3bac45921d1dc913334f4e13967bb9c5f69e 100644 (file)
@@ -1,2 +1,6 @@
 23Nov07
+ebl  Add brestore_xxx tables to sql scripts
+ebl  Add a batch=1 option to bresto.pl to fill bresto tables
+ebl  Adapt Bconsole.pm to run a restore job
+ebl  Make bresto.html/js working (you can restore files now)
 ebl  Improve run job from scheduled view and missing view