1 // Bweb - A Bacula web interface
2 // Bacula® - The Network Backup Solution
4 // Copyright (C) 2000-2009 Free Software Foundation Europe e.V.
6 // The main author of Bweb is Eric Bollengier.
7 // The main author of Bacula is Kern Sibbald, with contributions from
8 // many others, a complete list can be found in the file AUTHORS.
10 // This program is Free Software; you can redistribute it and/or
11 // modify it under the terms of version two of the GNU General Public
12 // License as published by the Free Software Foundation plus additions
13 // that are listed in the file LICENSE.
15 // This program is distributed in the hope that it will be useful, but
16 // WITHOUT ANY WARRANTY; without even the implied warranty of
17 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 // General Public License for more details.
20 // You should have received a copy of the GNU General Public License
21 // along with this program; if not, write to the Free Software
22 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
25 // Bacula® is a registered trademark of Kern Sibbald.
26 // The licensor of Bacula is the Free Software Foundation Europe
27 // (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zurich,
28 // Switzerland, email:ftf@fsfeurope.org.
30 // render if vol is online/offline
31 function rd_vol_is_online(val)
33 return '<img src="inflag' + val + '.png">';
36 // TODO: fichier ou rep
37 function rd_file_or_dir(val)
40 return '<img src="file_f.png">';
42 return '<img src="file_d.png">';
48 Ext.brestore.path_stack.push(Ext.brestore.path);
49 Ext.brestore.pathid_stack.push(Ext.brestore.pathid);
50 Ext.ComponentMgr.get('prevbp').enable();
54 var pathid = Ext.brestore.pathid_stack.pop();
55 var path = Ext.brestore.path_stack.pop();
57 Ext.ComponentMgr.get('prevbp').disable();
60 Ext.ComponentMgr.get('wherefield').setValue(path);
62 Ext.brestore.pathid = pathid;
63 Ext.brestore.path = path;
67 function dirname(path) {
68 var a = path.match( /(^.*\/).+\// );
75 Ext.namespace('Ext.brestore');
76 Ext.brestore.jobid=0; // selected jobid
77 Ext.brestore.jobdate=''; // selected date
78 Ext.brestore.client=''; // selected client
79 Ext.brestore.rclient=''; // selected client for resto
80 Ext.brestore.storage=''; // selected storage for resto
81 Ext.brestore.path=''; // current path (without user location)
82 Ext.brestore.pathid=0; // current pathid
83 Ext.brestore.root_path=''; // user location
84 Ext.brestore.media_store; // media store
85 Ext.brestore.option_vosb = false;
86 Ext.brestore.option_vafv = false;
87 Ext.brestore.option_vcopies = false;
88 Ext.brestore.dlglaunch;
89 Ext.brestore.fpattern;
90 Ext.brestore.use_filerelocation=false;
91 Ext.brestore.limit = 500;
92 Ext.brestore.offset = 0;
93 Ext.brestore.force_reload = 0;
94 Ext.brestore.path_stack = Array();
95 Ext.brestore.pathid_stack = Array();
97 function get_node_path(node)
100 for (var p = node; p; p = p.parentNode) {
103 temp = p.text + temp;
105 temp = p.text + '/' + temp;
109 return Ext.brestore.root_path + temp;
112 function init_params(baseParams)
114 baseParams['client']= Ext.brestore.client;
116 if (Ext.brestore.option_vosb) {
117 baseParams['jobid'] = Ext.brestore.jobid;
119 baseParams['date'] = Ext.brestore.jobdate;
121 baseParams['offset'] = Ext.brestore.offset;
122 baseParams['limit'] = Ext.brestore.limit;
123 if (Ext.brestore.fpattern) {
124 if (RegExp(Ext.brestore.fpattern)) {
125 baseParams['pattern'] = Ext.brestore.fpattern;
131 function captureEvents(observable) {
132 Ext.util.Observable.capture(
134 function(eventName) {
135 console.info(eventName);
141 ////////////////////////////////////////////////////////////////
143 Ext.BLANK_IMAGE_URL = 'ext/resources/images/default/s.gif';
144 Ext.onReady(function(){
145 if (!Ext.version || Ext.version < 2.2) {
146 alert("You must upgrade your extjs version to 2.2");
150 Ext.QuickTips.init();
152 // Init tree for directory selection
153 var tree_loader = new Ext.tree.TreeLoader({
155 dataUrl:'/cgi-bin/bweb/bresto.pl'
158 var tree = new Ext.tree.TreePanel({
162 enableDragDrop: true,
163 containerScroll: true,
164 title: 'Directories',
169 var root = new Ext.tree.AsyncTreeNode({
170 text: 'Select a client then a job',
174 tree.setRootNode(root);
175 Ext.brestore.tree = root; // shortcut
177 var click_cb = function(node, event) {
180 Ext.brestore.path = get_node_path(node);
181 Ext.brestore.pathid = node.id;
182 Ext.brestore.offset=0;
183 Ext.brestore.fpattern = Ext.get('txt-file-pattern').getValue();
184 where_field.setValue(Ext.brestore.path);
186 file_store.load({params:init_params({action: 'list_files_dirs',
187 path:Ext.brestore.path,
193 tree.on('click', click_cb);
195 tree.on('beforeload', function(e,b) {
197 // file_store.removeAll();
200 tree.on('load', function(n,e) {
207 ////////////////////////////////////////////////////////////////
209 var file_store = new Ext.data.Store({
210 proxy: new Ext.data.HttpProxy({
211 url: '/cgi-bin/bweb/bresto.pl',
216 reader: new Ext.data.ArrayReader({},
217 Ext.data.Record.create([
219 {name: 'filenameid'},
223 {name: 'size', type: 'int' },
224 {name: 'mtime', type: 'date', dateFormat: 'Y-m-d h:i:s'},
229 Ext.brestore.file_store=file_store;
230 var cm = new Ext.grid.ColumnModel([{
233 dataIndex: 'filenameid',
235 css: 'white-space:normal;',
236 renderer: rd_file_or_dir
238 id: 'cm-id', // id assigned so we can apply custom css
239 // (e.g. .x-grid-col-topic b { color:#333 })
243 css: 'white-space:normal;'
247 renderer: human_size,
252 renderer: Ext.util.Format.dateRenderer('Y-m-d h:i'),
259 header: "FilenameId",
260 dataIndex: 'filenameid',
272 // by default columns are sortable
273 cm.defaultSortable = true;
276 function update_limits() {
277 Ext.get('txt-file-offset').dom.value = Ext.brestore.offset;
278 Ext.get('txt-file-limit').dom.value = Ext.brestore.offset + Ext.brestore.limit;
281 // get limits from user input
282 function update_user_limits() {
283 var off = parseInt(Ext.get('txt-file-offset').getValue());
284 var lim = parseInt(Ext.get('txt-file-limit').getValue());
285 if (off >= 0 && lim >= 0 && off < lim) {
286 Ext.brestore.offset = off;
287 Ext.brestore.limit = lim - off;
291 Ext.brestore.fpattern = Ext.get('txt-file-pattern').getValue();
294 var file_paging_next = new Ext.Toolbar.Button({
296 icon: 'ext/resources/images/default/grid/page-next.gif',
299 handler: function(a,b,c) {
300 update_user_limits();
301 if (file_store.getCount() >= Ext.brestore.limit) {
302 Ext.brestore.offset += Ext.brestore.limit;
303 file_store.removeAll();
304 file_versions_store.removeAll();
305 file_store.load({params:init_params({action: 'list_files_dirs',
306 path:Ext.brestore.path,
307 node:Ext.brestore.pathid})
312 var file_paging_prev = new Ext.Toolbar.Button({
314 icon: 'ext/resources/images/default/grid/page-prev.gif',
317 handler: function() {
318 update_user_limits();
319 if (Ext.brestore.offset > 0) {
320 Ext.brestore.offset -= Ext.brestore.limit;
321 if (Ext.brestore.offset < 0) {
322 Ext.brestore.offset=0;
324 file_store.removeAll();
325 file_versions_store.removeAll();
326 file_store.load({params:init_params({action: 'list_files_dirs',
327 path:Ext.brestore.path,
328 node:Ext.brestore.pathid})
333 var file_paging_pattern = new Ext.form.TextField({
334 enableKeyEvents: true,
335 id: 'txt-file-pattern',
338 file_paging_pattern.on('keyup', function(a, e) {
339 if (e.getKey() == e. ENTER) {
341 var pattern = file_paging_pattern.getValue();
343 re = new RegExp(pattern, "i");
346 file_store.filter('name', re);
348 file_store.clearFilter(false);
352 var file_paging = new Ext.Toolbar({
353 items: [file_paging_prev, {
354 id: 'txt-file-offset',
355 xtype: 'numberfield',
357 value: Ext.brestore.offset
362 id: 'txt-file-limit',
363 xtype: 'numberfield',
365 value: Ext.brestore.limit
366 }, file_paging_next, '->', file_paging_pattern, {
368 icon: 'ext/resources/images/default/grid/refresh.gif',
371 handler: function(a,b,c) {
372 update_user_limits();
373 file_store.removeAll();
374 file_versions_store.removeAll();
375 file_store.load({params:init_params({action: 'list_files_dirs',
376 path:Ext.brestore.path,
377 node:Ext.brestore.pathid})
382 var file_grid = new Ext.grid.GridPanel({
387 enableDragDrop: true,
388 selModel: new Ext.grid.RowSelectionModel(),
390 autoSizeColumns: true,
393 title: 'Directory content',
396 Ext.brestore.file_grid=file_grid;
397 // when we reload the view,
398 // we clear the file version box
399 file_store.on('beforeload', function(e) {
400 file_store.removeAll();
401 file_versions_store.removeAll();
405 // If we have more than limit elements, we can
406 // display the next button
407 file_store.on('load', function(e,o) {
409 if (e.getCount() >= Ext.brestore.limit) {
410 file_paging_next.enable();
412 file_paging_next.disable();
415 if (Ext.brestore.offset) {
416 file_paging_prev.enable();
418 file_paging_prev.disable();
424 * file_store.on('loadexception', function(obj, options, response, e){
425 * console.info('store loadexception, arguments:', arguments);
426 * console.info('error = ', e);
429 * file_store.on('load', function(store, records, options){
430 * //store is loaded, now you can work with it's records, etc.
431 * console.info('store load, arguments:', arguments);
432 * console.info('Store count = ', store.getCount());
435 file_grid.on('celldblclick', function(e) {
436 var r = e.selModel.getSelected();
438 if (r.json[1] == 0) { // select a directory
441 if (r.json[4] == '..') {
442 Ext.brestore.path = dirname(Ext.brestore.path);
443 } else if (r.json[4] == '/') {
444 Ext.brestore.path = '/';
445 } else if (r.json[4] != '.') {
446 Ext.brestore.path = Ext.brestore.path + r.json[4] + '/';
448 Ext.brestore.pathid = r.json[2];
449 Ext.brestore.filename = '';
450 Ext.brestore.offset=0;
451 Ext.brestore.fpattern = Ext.get('txt-file-pattern').getValue();
452 where_field.setValue(Ext.brestore.path);
454 file_store.load({params:init_params({action: 'list_files_dirs',
455 path:Ext.brestore.path,
456 node:Ext.brestore.pathid})
461 // TODO: selection only when using dblclick
462 file_grid.selModel.on('rowselect', function(e,i,r) {
463 if (r.json[1] == 0) { // select a directory
467 Ext.brestore.filename = r.json[4];
468 file_versions_store.load({
469 params:init_params({action: 'list_versions',
470 vafv: Ext.brestore.option_vafv,
471 vcopies: Ext.brestore.option_vcopies,
473 filenameid: r.json[1]
479 ////////////////////////////////////////////////////////////////
481 var file_selection_store = new Ext.data.Store({
482 proxy: new Ext.data.MemoryProxy(),
484 reader: new Ext.data.ArrayReader({},
485 Ext.data.Record.create([
488 {name: 'filenameid'},
491 {name: 'size', type: 'int' },
492 {name: 'mtime'}//, type: 'date', dateFormat: 'Y-m-d h:i:s'}
496 var file_selection_cm = new Ext.grid.ColumnModel([
498 id: 'file-selection-id',
509 renderer: human_size,
514 // renderer: Ext.util.Format.dateRenderer('Y-m-d h:i'),
521 header: 'Filenameid',
522 dataIndex: 'filenameid',
532 var file_selection_grid = new Ext.grid.GridPanel({
533 colModel: file_selection_cm,
534 store: file_selection_store,
536 enableDragDrop: false,
537 selModel: new Ext.grid.RowSelectionModel(),
546 var file_selection_record = Ext.data.Record.create(
549 {name: 'filenameid'},
554 // captureEvents(file_selection_grid);
555 // captureEvents(file_selection_store);
557 func1 = function(e,b,c) {
558 if (e.browserEvent.keyCode == 46) {
559 var m = file_selection_grid.getSelections();
561 for(var i = 0, len = m.length; i < len; i++){
562 file_selection_store.remove(m[i]);
567 file_selection_grid.on('keypress', func1);
569 ////////////////////////////////////////////////////////////////
571 var file_versions_store = new Ext.data.Store({
572 proxy: new Ext.data.HttpProxy({
573 url: '/cgi-bin/bweb/bresto.pl',
575 params:{offset:0, limit:50 }
578 reader: new Ext.data.ArrayReader({},
579 Ext.data.Record.create([
581 {name: 'filenameid'},
585 {name: 'inchanger' },
587 {name: 'size', type: 'int' },
588 {name: 'mtime', type: 'date', dateFormat: 'Y-m-d h:i:s'}
592 var file_versions_cm = new Ext.grid.ColumnModel([{
593 id: 'file-version-id',
598 dataIndex: 'inchanger',
600 renderer: rd_vol_is_online
612 renderer: human_size,
617 renderer: Ext.util.Format.dateRenderer('Y-m-d h:i'),
628 header: "filenameid",
629 dataIndex: 'filenameid',
637 // by default columns are sortable
638 file_versions_cm.defaultSortable = true;
641 var file_versions_grid = new Ext.grid.GridPanel({
642 id: 'div-file-versions',
643 store: file_versions_store,
644 colModel: file_versions_cm,
646 enableDragDrop: true,
647 selModel: new Ext.grid.RowSelectionModel(),
651 title: 'File version',
655 file_versions_grid.on('rowdblclick', function(e) {
656 alert(e) ; file_versions_store.removeAll(); return true;
660 ////////////////////////////////////////////////////////////////
662 var client_store = new Ext.data.Store({
663 proxy: new Ext.data.HttpProxy({
664 url: '/cgi-bin/bweb/bresto.pl',
666 params:{action:'list_client'}
669 reader: new Ext.data.ArrayReader({
670 }, Ext.data.Record.create([
675 var client_combo = new Ext.form.ComboBox({
676 fieldLabel: 'Clients',
681 triggerAction: 'all',
682 emptyText:'Select a client...',
684 forceSelection: true,
688 var replace_store = new Ext.data.SimpleStore({
689 fields: ['value', 'text'],
690 data : [['never', 'Never'],['always', 'Always']]
693 var replace_combo = new Ext.form.ComboBox({
694 fieldLabel: 'Replace',
695 store: replace_store,
699 triggerAction: 'all',
700 emptyText:'Replace mode...',
702 forceSelection: true,
706 client_combo.on('valid', function(e) {
707 Ext.brestore.client = e.getValue();
708 Ext.brestore.jobid=0;
709 Ext.brestore.jobdate = '';
710 Ext.brestore.root_path='';
711 Ext.brestore.offset=0;
712 job_combo.clearValue();
713 file_store.removeAll();
714 file_versions_store.removeAll();
715 root.collapse(false, false);
716 while(root.firstChild){
717 root.removeChild(root.firstChild);
719 job_store.load( {params:{action: 'list_job',
720 client:Ext.brestore.client}});
724 //////////////////////////////////////////////////////////////:
726 var job_store = new Ext.data.Store({
727 proxy: new Ext.data.HttpProxy({
728 url: '/cgi-bin/bweb/bresto.pl',
730 params:{offset:0, limit:50 }
733 reader: new Ext.data.ArrayReader({
734 }, Ext.data.Record.create([
741 var job_combo = new Ext.form.ComboBox({
744 displayField: 'jobname',
746 triggerAction: 'all',
747 emptyText: 'Select a job...',
751 forceSelection: true,
755 job_combo.on('select', function(e,c) {
756 Ext.brestore.jobid = c.json[0];
757 Ext.brestore.jobdate = c.json[1];
758 root.setText("Root");
759 tree_loader.baseParams = init_params({init:1, action: 'list_dirs'});
762 file_store.load({params:init_params({action: 'list_files_dirs',
763 path:Ext.brestore.path,
764 node:Ext.brestore.pathid})
768 var where_field = new Ext.form.TextField({
769 fieldLabel: 'Location',
776 function sel_option(item, check)
778 if (item.id == 'id_vosb') {
779 Ext.brestore.option_vosb = check;
781 if (item.id == 'id_vafv') {
782 Ext.brestore.option_vafv = check;
784 if (item.id == 'id_vcopies') {
785 Ext.brestore.option_vcopies = check;
789 var menu = new Ext.menu.Menu({
792 new Ext.menu.CheckItem({
794 text: 'View only selected backup',
795 checked: Ext.brestore.option_vosb,
796 checkHandler: sel_option
798 new Ext.menu.CheckItem({
800 text: 'View all file versions',
801 checked: Ext.brestore.option_vafv,
802 checkHandler: sel_option
804 new Ext.menu.CheckItem({
806 text: 'View copies version',
807 checked: Ext.brestore.option_vcopies,
808 checkHandler: sel_option
813 var tb = new Ext.Toolbar({
823 handler: function() {
827 Ext.brestore.offset=0;
829 file_store.load({params:init_params({action: 'list_files_dirs',
830 node:Ext.brestore.pathid})
837 text: 'Change location',
838 cls:'x-btn-text-icon',
839 handler: function() {
840 var where = where_field.getValue();
842 Ext.MessageBox.show({
843 title: 'Bad parameter',
844 msg: 'Location is empty!',
845 buttons: Ext.MessageBox.OK,
846 icon: Ext.MessageBox.ERROR
850 Ext.brestore.root_path=where;
852 tree_loader.baseParams = init_params({
853 action:'list_dirs', path: where
861 iconCls: 'bmenu', // <-- icon
862 menu: menu // assign menu by instance
865 { // TODO: put this button on south panel
866 icon: 'mR.png', // icons can also be specified inline
867 cls: 'x-btn-text-icon',
868 tooltip: 'Run restore',
870 handler: function() {
871 if (!file_selection_store.data.items.length) {
872 Ext.MessageBox.show({
873 title: 'Empty selection',
874 msg: 'Your object selection list is empty!',
875 buttons: Ext.MessageBox.OK,
876 icon: Ext.MessageBox.ERROR
885 ////////////////////////////////////////////////////////////////
887 // Define Main interface
888 var MainView = new Ext.Viewport({
890 title: 'Bacula Web Restore',
893 renderTo: Ext.getBody(),
905 title: 'Directories',
911 title: 'Directory content',
917 title: 'File version',
921 items: file_versions_grid
924 title: 'Restore selection',
928 items: file_selection_grid
931 client_store.load({params:{action: 'list_client'}});
933 // data.selections[0].json[]
935 // http://extjs.com/forum/showthread.php?t=12582&highlight=drag+drop
937 var horror_show1 = file_selection_grid.getView().el.dom;
938 var ddrow = new Ext.dd.DropTarget(horror_show1, {
941 notifyDrop : function(dd, e, data){
943 if (data.selections) {
944 if (data.grid.id == 'div-files') {
945 for(var i=0;i<data.selections.length;i++) {
946 var name = data.selections[i].json[4];
947 var fnid = data.selections[i].json[1];
948 if (fnid == 0 && name != '..') {
951 r = new file_selection_record({
952 jobid: data.selections[0].json[3],
953 fileid: data.selections[i].json[0],
954 filenameid:data.selections[i].json[1],
955 pathid: data.selections[i].json[2],
956 name: Ext.brestore.path + ((name=='..')?'':name),
957 size: data.selections[i].json[5],
958 mtime: data.selections[i].json[6]
960 file_selection_store.add(r);
964 if (data.grid.id == 'div-file-versions') {
965 r = new file_selection_record({
966 jobid: data.selections[0].json[3],
967 fileid: data.selections[0].json[0],
968 filenameid:data.selections[0].json[1],
969 pathid: data.selections[0].json[2],
970 name: Ext.brestore.path + Ext.brestore.filename,
971 size: data.selections[0].json[7],
972 mtime: data.selections[0].json[8]
974 file_selection_store.add(r)
979 var path= get_node_path(data.node);
980 r = new file_selection_record({
981 jobid: data.node.attributes.jobid,
984 pathid: data.node.id,
989 file_selection_store.add(r)
995 function force_reload_media_store() {
996 Ext.brestore.force_reload = 1;
997 reload_media_store();
998 Ext.brestore.force_reload = 0;
1001 function reload_media_store() {
1002 Ext.brestore.media_store.removeAll();
1003 var items = file_selection_store.data.items;
1004 var tab_fileid=new Array();
1005 var tab_dirid=new Array();
1006 var tab_jobid=new Array();
1007 var enable_compute=false;
1008 for(var i=0;i<items.length;i++) {
1009 if (items[i].data['fileid']) {
1010 tab_fileid.push(items[i].data['fileid']);
1012 tab_dirid.push(items[i].data['pathid']);
1013 enable_compute=true;
1015 tab_jobid.push(items[i].data['jobid']);
1017 var res = tab_fileid.join(",");
1018 var res2 = tab_jobid.join(",");
1019 var res3 = tab_dirid.join(",");
1021 Ext.brestore.media_store.baseParams = init_params({
1022 action: 'get_media',
1026 force: Ext.brestore.force_reload
1028 Ext.brestore.media_store.load();
1029 if (enable_compute) {
1030 Ext.get('reload_media').show();
1032 Ext.get('reload_media').hide();
1036 function display_run_job() {
1037 if (Ext.brestore.dlglaunch) {
1038 reload_media_store();
1039 Ext.brestore.dlglaunch.show();
1042 var rclient_combo = new Ext.form.ComboBox({
1043 value: Ext.brestore.client,
1044 fieldLabel: 'Client',
1045 hiddenName:'client',
1046 store: client_store,
1047 displayField:'name',
1050 triggerAction: 'all',
1051 emptyText:'Select a client...',
1052 forceSelection: true,
1053 value: Ext.brestore.client,
1056 var where_text = new Ext.form.TextField({
1057 fieldLabel: 'Where',
1059 value: '/tmp/bacula-restore'
1061 var stripprefix_text = new Ext.form.TextField({
1062 fieldLabel: 'Strip prefix',
1063 name: 'strip_prefix',
1067 var addsuffix_text = new Ext.form.TextField({
1068 fieldLabel: 'Add suffix',
1073 var addprefix_text = new Ext.form.TextField({
1074 fieldLabel: 'Add prefix',
1079 var rwhere_text = new Ext.form.TextField({
1080 fieldLabel: 'Where regexp',
1081 name: 'regexp_where',
1085 var useregexp_bp = new Ext.form.Checkbox({
1086 fieldLabel: 'Use regexp',
1090 handler: function(bp,state) {
1092 addsuffix_text.disable();
1093 addprefix_text.disable();
1094 stripprefix_text.disable();
1095 rwhere_text.enable();
1097 addsuffix_text.enable();
1098 addprefix_text.enable();
1099 stripprefix_text.enable();
1100 rwhere_text.disable();
1105 var usefilerelocation_bp = new Ext.form.Checkbox({
1106 fieldLabel: 'Use file relocation',
1107 name: 'use_relocation',
1111 usefilerelocation_bp.on('check', function(bp,state) {
1113 where_text.disable();
1114 useregexp_bp.enable();
1115 if (useregexp_bp.getValue()) {
1116 addsuffix_text.disable();
1117 addprefix_text.disable();
1118 stripprefix_text.disable();
1119 rwhere_text.enable();
1121 addsuffix_text.enable();
1122 addprefix_text.enable();
1123 stripprefix_text.enable();
1124 rwhere_text.disable();
1127 where_text.enable();
1128 addsuffix_text.disable();
1129 addprefix_text.disable();
1130 stripprefix_text.disable();
1131 useregexp_bp.disable();
1132 rwhere_text.disable();
1134 Ext.brestore.use_filerelocation = state;
1137 useregexp_bp.on('check', function(bp,state) {
1139 addsuffix_text.disable();
1140 addprefix_text.disable();
1141 stripprefix_text.disable();
1142 rwhere_text.enable();
1144 addsuffix_text.enable();
1145 addprefix_text.enable();
1146 stripprefix_text.enable();
1147 rwhere_text.disable();
1151 var media_store = Ext.brestore.media_store = new Ext.data.Store({
1152 proxy: new Ext.data.HttpProxy({
1153 url: '/cgi-bin/bweb/bresto.pl',
1155 params:{offset:0, limit:50 }
1158 reader: new Ext.data.ArrayReader({
1159 }, Ext.data.Record.create([
1160 {name: 'volumename'},
1162 {name: 'inchanger' }
1166 var media_cm = new Ext.grid.ColumnModel(
1168 header: "InChanger",
1169 dataIndex: 'inchanger',
1171 renderer: rd_vol_is_online
1175 dataIndex: 'volumename',
1181 var media_grid = new Ext.grid.GridPanel({
1182 id: 'div-media-grid',
1185 enableDragDrop: false,
1192 var form_panel = new Ext.FormPanel({
1193 labelWidth : 75, // label settings here cascade unless overridden
1195 bodyStyle : 'padding:5px 5px 0',
1197 // autoHeight : true,
1203 bodyStyle : 'padding:5px 5px 0',
1204 deferredRender : false,
1207 title : 'Restore details',
1210 title : 'Restore options',
1212 defaults : {width: 210},
1213 bodyStyle : 'padding:5px 5px 0',
1214 items :[ rclient_combo, where_text, replace_combo ]
1217 title : 'Media needed',
1219 defaults : {width: 280},
1220 bodyStyle : 'padding:5px 5px 0',
1221 items :[ media_grid,
1222 {xtype: 'button', id: 'reload_media',
1223 text: 'Compute with directories',
1224 tooltip: 'Can take long time...',
1225 handler:force_reload_media_store}]
1232 title : 'File relocation',
1234 defaults : {width: 210},
1235 bodyStyle : 'padding:5px 5px 0',
1236 items :[ usefilerelocation_bp, stripprefix_text,
1237 addprefix_text, addsuffix_text, useregexp_bp,
1241 title : 'Other options',
1243 defaults : {width: 210},
1244 bodyStyle : 'padding:5px 5px 0',
1245 defaultType : 'textfield',
1250 tooltip: 'YYY-MM-DD HH:MM'
1253 fieldLabel: 'Priority',
1263 handler: function() {
1264 if(!form_panel.getForm().isValid()) { alert("invalid") }
1265 else { launch_restore() }
1269 handler: function() { Ext.brestore.dlglaunch.hide(); }
1273 Ext.brestore.dlglaunch = new Ext.Window({
1274 applyTo : 'resto-div',
1275 title : 'Restore selection',
1279 closeAction :'hide',
1284 // Ext.brestore.dlglaunch.addKeyListener(27,
1285 // Ext.brestore.dlglaunch.hide,
1286 // Ext.brestore.dlglaunch);
1288 * var storage_store = new Ext.data.Store({
1289 * proxy: new Ext.data.HttpProxy({
1290 * url: '/cgi-bin/bweb/bresto.pl',
1292 * params:{action:'list_storage'}
1295 * reader: new Ext.data.ArrayReader({
1296 * }, Ext.data.Record.create([
1301 ////////////////////////////////////////////////////////////////
1303 function launch_restore() {
1304 var items = file_selection_store.data.items;
1305 var tab_fileid=new Array();
1306 var tab_dirid=new Array();
1307 var tab_jobid=new Array();
1308 for(var i=0;i<items.length;i++) {
1309 if (items[i].data['fileid']) {
1310 tab_fileid.push(items[i].data['fileid']);
1312 tab_dirid.push(items[i].data['pathid']);
1314 tab_jobid.push(items[i].data['jobid']);
1316 var res = ';fileid=' + tab_fileid.join(";fileid=");
1317 var res2 = ';dirid=' + tab_dirid.join(";dirid=");
1318 var res3 = ';jobid=' + tab_jobid.join(";jobid=");
1320 var res4 = ';client=' + rclient_combo.getValue();
1321 // if (storage_combo.getValue()) {
1322 // res4 = res4 + ';storage=' + storage_combo.getValue();
1324 if (Ext.brestore.use_filerelocation) {
1325 if (useregexp_bp.getValue()) {
1326 res4 = res4 + ';regexwhere=' + rwhere_text.getValue();
1328 var reg = new Array();
1329 if (stripprefix_text.getValue()) {
1330 reg.push('!' + stripprefix_text.getValue() + '!!i');
1332 if (addprefix_text.getValue()) {
1333 reg.push('!^!' + addprefix_text.getValue() + '!');
1335 if (addsuffix_text.getValue()) {
1336 reg.push('!([^/])$!$1' + addsuffix_text.getValue() + '!');
1338 res4 = res4 + ';regexwhere=' + reg.join(',');
1341 res4 = res4 + ';where=' + where_text.getValue();
1343 window.location='/cgi-bin/bweb/bresto.pl?action=restore' + res + res2 + res3 + res4;
1344 } // end launch_restore
1347 ////////////////////////////////////////////////////////////////
1348 reload_media_store();
1349 Ext.brestore.dlglaunch.show();
1350 // storage_store.load({params:{action: 'list_storage'}});