Adds a grid to the lxc backup restore window allowing the user to select mountpoints which should be included/excluded from a restore.
Signed-off-by: Christian Ebner <c.eb...@proxmox.com> --- changes since v1: not present in v1 www/manager6/Makefile | 1 + www/manager6/grid/BackupRestoreTargets.js | 37 +++++++++++++++++++++++ www/manager6/window/Restore.js | 34 +++++++++++++++++++++ 3 files changed, 72 insertions(+) create mode 100644 www/manager6/grid/BackupRestoreTargets.js diff --git a/www/manager6/Makefile b/www/manager6/Makefile index 17e0ad05..c096a8be 100644 --- a/www/manager6/Makefile +++ b/www/manager6/Makefile @@ -88,6 +88,7 @@ JSSRC= \ form/TagEdit.js \ form/MultiFileButton.js \ grid/BackupView.js \ + grid/BackupRestoreTargets.js \ grid/FirewallAliases.js \ grid/FirewallOptions.js \ grid/FirewallRules.js \ diff --git a/www/manager6/grid/BackupRestoreTargets.js b/www/manager6/grid/BackupRestoreTargets.js new file mode 100644 index 00000000..b811989e --- /dev/null +++ b/www/manager6/grid/BackupRestoreTargets.js @@ -0,0 +1,37 @@ +Ext.define('PVE.BackupRestoreTargets', { + extend: 'Ext.grid.Panel', + alias: 'widget.pveBackupRestoreTargets', + store: { + fields: [ + { + name: 'restore', + type: 'boolean', + }, + { + name: 'target', + type: 'string', + }, + ], + }, + + getMountpoints: function() { + return this.store.getData(); + }, + + setMountpoints: function(mountpoints) { + this.store.loadData(mountpoints); + }, + + columns: [ + { + text: gettext('Mountpoint'), + dataIndex: 'mountpoint', + flex: 1, + }, + { + text: gettext('Restore'), + dataIndex: 'restore', + xtype: 'checkcolumn', + }, + ], +}); diff --git a/www/manager6/window/Restore.js b/www/manager6/window/Restore.js index 36aecc39..85e382fb 100644 --- a/www/manager6/window/Restore.js +++ b/www/manager6/window/Restore.js @@ -67,6 +67,13 @@ Ext.define('PVE.window.Restore', { params.unprivileged = values.unprivileged; } confirmMsg = Proxmox.Utils.format_task_description('vzrestore', params.vmid); + let viewModel = view.getViewModel(); + let excludes = viewModel.get('mountpoints') + .filter(mp => mp.restore === false) + .map(mp => mp.mountpoint); + if (excludes.length > 0) { + params['exclude-mps'] = excludes.join(','); + } } else if (view.vmtype === 'qemu') { params.archive = view.volid; confirmMsg = Proxmox.Utils.format_task_description('qmrestore', params.vmid); @@ -111,6 +118,7 @@ Ext.define('PVE.window.Restore', { afterRender: function() { let view = this.getView(); + let viewModel = view.getViewModel(); Proxmox.Utils.API2Request({ url: `/nodes/${view.nodename}/vzdump/extractconfig`, @@ -123,6 +131,7 @@ Ext.define('PVE.window.Restore', { success: function(response, options) { let allStoragesAvailable = true; + let mountpoints = []; response.result.data.split('\n').forEach(line => { let [_, key, value] = line.match(/^([^:]+):\s*(\S+)\s*$/) ?? []; @@ -139,8 +148,14 @@ Ext.define('PVE.window.Restore', { view.lookupReference('nameField').setEmptyText(value); } else if (key === 'memory' || key === 'cores' || key === 'sockets') { view.lookupReference(`${key}Field`).setEmptyText(value); + } else if (key.match(/mp\d+/) && value.includes('backup=1')) { + mountpoints.push({ + 'mountpoint': key, + 'restore': true, + }); } }); + viewModel.set('mountpoints', mountpoints); if (!allStoragesAvailable) { let storagesel = view.down('pveStorageSelector[name=storage]'); @@ -152,6 +167,12 @@ Ext.define('PVE.window.Restore', { }, }, + viewModel: { + config: { + mountpoints: [], + }, + }, + initComponent: function() { let me = this; @@ -354,6 +375,19 @@ Ext.define('PVE.window.Restore', { ], }); + if (me.vmtype === 'lxc') { + items.push({ + title: `${gettext('Restore Mountpoints')}:`, + name: 'mountpointRestoreTargets', + xtype: 'pveBackupRestoreTargets', + hidden: true, // Hide until config loaded + bind: { + mountpoints: '{mountpoints}', + hidden: '{!mountpoints.length}', + }, + }); + } + let title = gettext('Restore') + ": " + (me.vmtype === 'lxc' ? 'CT' : 'VM'); if (me.vmid) { title = `${gettext('Overwrite')} ${title} ${me.vmid}`; -- 2.39.2 _______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel