]>
git.proxmox.com Git - pve-manager.git/blob - www/manager6/window/Restore.js
1 Ext
.define('PVE.window.Restore', {
2 extend
: 'Ext.window.Window', // fixme: Proxmox.window.Edit?
11 xclass
: 'Ext.app.ViewController',
14 change: function(el
, newVal
) {
15 let liveWarning
= this.lookupReference('liveWarning');
16 liveWarning
.setHidden(!newVal
);
17 let start
= this.lookupReference('start');
18 start
.setDisabled(newVal
);
22 validitychange: function(f
, valid
) {
23 this.lookupReference('doRestoreBtn').setDisabled(!valid
);
28 doRestore: function() {
30 let view
= me
.getView();
32 let values
= view
.down('form').getForm().getValues();
35 vmid
: view
.vmid
|| values
.vmid
,
36 force
: view
.vmid
? 1 : 0,
41 if (values
.start
&& !values
['live-restore']) {
44 if (values
['live-restore']) {
45 params
['live-restore'] = 1;
48 params
.storage
= values
.storage
;
51 ['bwlimit', 'cores', 'name', 'memory', 'sockets'].forEach(opt
=> {
52 if ((values
[opt
] ?? '') !== '') {
53 params
[opt
] = values
[opt
];
57 if (params
.name
&& view
.vmtype
=== 'lxc') {
58 params
.hostname
= params
.name
;
63 if (view
.vmtype
=== 'lxc') {
64 params
.ostemplate
= view
.volid
;
66 if (values
.unprivileged
!== 'keep') {
67 params
.unprivileged
= values
.unprivileged
;
69 confirmMsg
= Proxmox
.Utils
.format_task_description('vzrestore', params
.vmid
);
70 } else if (view
.vmtype
=== 'qemu') {
71 params
.archive
= view
.volid
;
72 confirmMsg
= Proxmox
.Utils
.format_task_description('qmrestore', params
.vmid
);
74 throw 'unknown VM type';
77 let executeRestore
= () => {
78 Proxmox
.Utils
.API2Request({
79 url
: `/nodes/${view.nodename}/${view.vmtype}`,
83 failure
: response
=> Ext
.Msg
.alert(gettext('Error'), response
.htmlStatus
),
84 success: function(response
, options
) {
85 Ext
.create('Proxmox.window.TaskViewer', {
87 upid
: response
.result
.data
,
95 confirmMsg
+= `. ${Ext.String.format(
96 gettext('This will permanently erase current {0} data.'),
97 view.vmtype === 'lxc' ? 'CT' : 'VM',
99 if (view
.vmtype
=== 'lxc') {
100 confirmMsg
+= `<br>${gettext('Mount point volumes are also erased.')}`;
102 Ext
.Msg
.confirm(gettext('Confirm'), confirmMsg
, function(btn
) {
112 afterRender: function() {
113 let view
= this.getView();
115 Proxmox
.Utils
.API2Request({
116 url
: `/nodes/${view.nodename}/vzdump/extractconfig`,
122 failure
: response
=> Ext
.Msg
.alert('Error', response
.htmlStatus
),
123 success: function(response
, options
) {
124 let allStoragesAvailable
= true;
126 response
.result
.data
.split('\n').forEach(line
=> {
127 let [_
, key
, value
] = line
.match(/^([^:]+):\s*(\S+)\s*$/) ?? [];
133 if (key
=== '#qmdump#map') {
134 let match
= value
.match(/^(\S+):(\S+):(\S*):(\S*):$/) ?? [];
135 // if a /dev/XYZ disk was backed up, ther is no storage hint
136 allStoragesAvailable
&&= !!match
[3] && !!PVE
.data
.ResourceStore
.getById(
137 `storage/${view.nodename}/${match[3]}`);
138 } else if (key
=== 'name' || key
=== 'hostname') {
139 view
.lookupReference('nameField').setEmptyText(value
);
140 } else if (key
=== 'memory' || key
=== 'cores' || key
=== 'sockets') {
141 view
.lookupReference(`${key}Field`).setEmptyText(value
);
145 if (!allStoragesAvailable
) {
146 let storagesel
= view
.down('pveStorageSelector[name=storage]');
147 storagesel
.allowBlank
= false;
148 storagesel
.setEmptyText('');
155 initComponent: function() {
159 throw "no node name specified";
162 throw "no volume ID specified";
165 throw "no vmtype specified";
168 let storagesel
= Ext
.create('PVE.form.StorageSelector', {
169 nodename
: me
.nodename
,
172 fieldLabel
: gettext('Storage'),
173 storageContent
: me
.vmtype
=== 'lxc' ? 'rootdir' : 'images',
174 // when restoring a container without specifying a storage, the backend defaults
175 // to 'local', which is unintuitive and 'rootdir' might not even be allowed on it
176 allowBlank
: me
.vmtype
!== 'lxc',
177 emptyText
: me
.vmtype
=== 'lxc' ? '' : gettext('From backup configuration'),
178 autoSelect
: me
.vmtype
=== 'lxc',
183 xtype
: 'displayfield',
184 value
: me
.volidText
|| me
.volid
,
185 fieldLabel
: gettext('Source'),
189 xtype
: 'pmxDisplayEditField',
191 fieldLabel
: me
.vmtype
=== 'lxc' ? 'CT' : 'VM',
195 xtype
: 'pveGuestIDSelector',
196 guestType
: me
.vmtype
,
197 loadNextFreeID
: true,
198 validateExists
: false,
202 xtype
: 'pveBandwidthField',
206 fieldLabel
: gettext('Bandwidth Limit'),
207 emptyText
: gettext('Defaults to target storage restore limit'),
210 'data-qtip': gettext("Use '0' to disable all bandwidth limits."),
214 xtype
: 'fieldcontainer',
217 xtype
: 'proxmoxcheckbox',
219 fieldLabel
: gettext('Unique'),
223 'data-qtip': gettext('Autogenerate unique properties, e.g., MAC addresses'),
228 xtype
: 'proxmoxcheckbox',
232 fieldLabel
: gettext('Start after restore'),
239 if (me
.vmtype
=== 'lxc') {
243 fieldLabel
: gettext('Privilege Level'),
244 reference
: 'noVNCScalingGroup',
245 height
: '15px', // renders faster with value assigned
253 gettext('Choose if you want to keep or override the privilege level of the restored Container.'),
258 name
: 'unprivileged',
260 boxLabel
: gettext('From Backup'),
266 name
: 'unprivileged',
268 boxLabel
: gettext('Unprivileged'),
273 name
: 'unprivileged',
275 boxLabel
: gettext('Privileged'),
277 //margin: '0 0 0 10',
282 } else if (me
.vmtype
=== 'qemu') {
284 xtype
: 'proxmoxcheckbox',
285 name
: 'live-restore',
286 itemId
: 'liveRestore',
288 fieldLabel
: gettext('Live restore'),
293 xtype
: 'displayfield',
294 reference
: 'liveWarning',
295 // TODO: Remove once more tested/stable?
296 value
: gettext('Note: If anything goes wrong during the live-restore, new data written by the VM may be lost.'),
304 title
: `${gettext('Override Settings')}:`,
316 fieldLabel
: me
.vmtype
=== 'lxc' ? gettext('Hostname') : gettext('Name'),
319 reference
: 'nameField',
322 xtype
: 'proxmoxintegerfield',
323 fieldLabel
: gettext('Cores'),
325 reference
: 'coresField',
335 xtype
: 'pveMemoryField',
336 fieldLabel
: gettext('Memory'),
338 reference
: 'memoryField',
343 xtype
: 'proxmoxintegerfield',
344 fieldLabel
: gettext('Sockets'),
346 reference
: 'socketsField',
350 hidden
: me
.vmtype
!== 'qemu',
351 disabled
: me
.vmtype
!== 'qemu',
357 let title
= gettext('Restore') + ": " + (me
.vmtype
=== 'lxc' ? 'CT' : 'VM');
359 title
= `${gettext('Overwrite')} ${title} ${me.vmid}`;
378 text
: gettext('Restore'),
379 reference
: 'doRestoreBtn',
380 handler
: 'doRestore',