diff --git a/www/manager6/dc/Backup.js b/www/manager6/dc/Backup.js index 6810d92f..b6b0be98 100644 --- a/www/manager6/dc/Backup.js +++ b/www/manager6/dc/Backup.js @@ -417,6 +417,67 @@ Ext.define('PVE.dc.BackupView', { win.show(); }; + var run_backup_now = function(job) { + job = Ext.clone(job); + + var allNodes = PVE.data.ResourceStore.getNodes(); + var jobNode = job.node; + + // Remove properties related to scheduling + delete job.enabled; + delete job.starttime; + delete job.dow; + delete job.id; + delete job.node; + job.all = job.all === true ? 1 : 0; + + var errors = []; + var inProgress = allNodes.length; + + Ext.Msg.show({ + title: gettext('Please wait...'), + closable: false, + progress: true + }); + Ext.Msg.updateProgress(0, '0/' + allNodes.length); + + var postRequest = function () { + inProgress++; + + Ext.Msg.updateProgress(inProgress/allNodes.length, + inProgress + '/' + allNodes.length); + + if (inProgress == allNodes.length) { + Ext.Msg.hide(); + if (errors !== undefined && errors.length > 0) { + Ext.Msg.alert('Error', 'Some errors have been encountered:
---
' + + errors.join('
---
')); + } + } + } + + allNodes.forEach(node => { + if (node.status !== 'online' || + (jobNode !== undefined && jobNode !== node.node)) { + errors.push(node.node + ": " + gettext("Node is offline")); + return; + } + + inProgress--; + + Proxmox.Utils.API2Request({ + url: '/nodes/' + node.node + '/vzdump', + method: 'POST', + params: job, + failure: function (response, opts) { + errors.push(node.node + ': ' + response.htmlStatus); + postRequest(); + }, + success: postRequest + }); + }); + } + var edit_btn = new Proxmox.button.Button({ text: gettext('Edit'), disabled: true, @@ -424,6 +485,31 @@ Ext.define('PVE.dc.BackupView', { handler: run_editor }); + var run_btn = new Proxmox.button.Button({ + text: gettext('Run now'), + disabled: true, + selModel: sm, + handler: function() { + var rec = sm.getSelection()[0]; + if (!rec) { + return; + } + + Ext.Msg.show({ + title: gettext('Confirm'), + icon: Ext.Msg.QUESTION, + msg: gettext('Start the selected backup job now?'), + buttons: Ext.Msg.YESNO, + callback: function(btn) { + if (btn !== 'yes') { + return; + } + run_backup_now(rec.data); + } + }); + } + }); + var remove_btn = Ext.create('Proxmox.button.StdRemoveButton', { selModel: sm, baseurl: '/cluster/backup', @@ -452,7 +538,8 @@ Ext.define('PVE.dc.BackupView', { } }, remove_btn, - edit_btn + edit_btn, + run_btn ], columns: [ { @@ -574,13 +661,9 @@ Ext.define('PVE.dc.BackupView', { fields: [ 'id', 'starttime', 'dow', 'storage', 'node', 'vmid', 'exclude', - 'mailto', 'pool', + 'mailto', 'pool', 'compress', 'mode', { name: 'enabled', type: 'boolean' }, - { name: 'all', type: 'boolean' }, - { name: 'snapshot', type: 'boolean' }, - { name: 'stop', type: 'boolean' }, - { name: 'suspend', type: 'boolean' }, - { name: 'compress', type: 'boolean' } + { name: 'all', type: 'boolean' } ] }); });