]>
Commit | Line | Data |
---|---|---|
1665b840 FE |
1 | Ext.define('PVE.storage.BackupView', { |
2 | extend: 'PVE.storage.ContentView', | |
3 | ||
4 | alias: 'widget.pveStorageBackupView', | |
5 | ||
61cf2658 | 6 | showColumns: ['name', 'notes', 'protected', 'date', 'format', 'size'], |
c0eadd55 | 7 | |
1665b840 FE |
8 | initComponent: function() { |
9 | var me = this; | |
10 | ||
11 | var nodename = me.nodename = me.pveSelNode.data.node; | |
12 | if (!nodename) { | |
13 | throw "no node name specified"; | |
14 | } | |
15 | ||
16 | var storage = me.storage = me.pveSelNode.data.storage; | |
17 | if (!storage) { | |
18 | throw "no storage ID specified"; | |
19 | } | |
20 | ||
21 | me.content = 'backup'; | |
22 | ||
23 | var sm = me.sm = Ext.create('Ext.selection.RowModel', {}); | |
24 | ||
25 | var reload = function() { | |
26 | me.store.load(); | |
27 | }; | |
28 | ||
e969d187 FE |
29 | let pruneButton = Ext.create('Proxmox.button.Button', { |
30 | text: gettext('Prune group'), | |
31 | disabled: true, | |
32 | selModel: sm, | |
33 | setBackupGroup: function(backup) { | |
34 | if (backup) { | |
35 | let name = backup.text; | |
36 | let vmid = backup.vmid; | |
37 | let format = backup.format; | |
38 | ||
39 | let vmtype; | |
40 | if (name.startsWith('vzdump-lxc-') || format === "pbs-ct") { | |
41 | vmtype = 'lxc'; | |
42 | } else if (name.startsWith('vzdump-qemu-') || format === "pbs-vm") { | |
43 | vmtype = 'qemu'; | |
44 | } | |
45 | ||
46 | if (vmid && vmtype) { | |
47 | this.setText(gettext('Prune group') + ` ${vmtype}/${vmid}`); | |
48 | this.vmid = vmid; | |
49 | this.vmtype = vmtype; | |
50 | this.setDisabled(false); | |
51 | return; | |
52 | } | |
53 | } | |
54 | this.setText(gettext('Prune group')); | |
55 | this.vmid = null; | |
56 | this.vmtype = null; | |
57 | this.setDisabled(true); | |
58 | }, | |
59 | handler: function(b, e, rec) { | |
60 | let win = Ext.create('PVE.window.Prune', { | |
61 | nodename: nodename, | |
62 | storage: storage, | |
63 | backup_id: this.vmid, | |
64 | backup_type: this.vmtype, | |
65 | }); | |
66 | win.show(); | |
67 | win.on('destroy', reload); | |
68 | }, | |
69 | }); | |
70 | ||
71 | me.on('selectionchange', function(model, srecords, eOpts) { | |
72 | if (srecords.length === 1) { | |
73 | pruneButton.setBackupGroup(srecords[0].data); | |
74 | } else { | |
75 | pruneButton.setBackupGroup(null); | |
76 | } | |
77 | }); | |
78 | ||
878bbf0b SR |
79 | let isPBS = me.pluginType === 'pbs'; |
80 | ||
1665b840 FE |
81 | me.tbar = [ |
82 | { | |
83 | xtype: 'proxmoxButton', | |
84 | text: gettext('Restore'), | |
85 | selModel: sm, | |
86 | disabled: true, | |
1665b840 FE |
87 | handler: function(b, e, rec) { |
88 | var vmtype; | |
89 | if (PVE.Utils.volume_is_qemu_backup(rec.data.volid, rec.data.format)) { | |
90 | vmtype = 'qemu'; | |
91 | } else if (PVE.Utils.volume_is_lxc_backup(rec.data.volid, rec.data.format)) { | |
92 | vmtype = 'lxc'; | |
93 | } else { | |
94 | return; | |
95 | } | |
96 | ||
97 | var win = Ext.create('PVE.window.Restore', { | |
98 | nodename: nodename, | |
99 | volid: rec.data.volid, | |
100 | volidText: PVE.Utils.render_storage_content(rec.data.volid, {}, rec), | |
f6710aac | 101 | vmtype: vmtype, |
878bbf0b | 102 | isPBS: isPBS, |
1665b840 FE |
103 | }); |
104 | win.show(); | |
105 | win.on('destroy', reload); | |
f6710aac | 106 | }, |
1665b840 | 107 | }, |
6e339db1 TL |
108 | ]; |
109 | if (isPBS) { | |
110 | me.tbar.push({ | |
111 | xtype: 'proxmoxButton', | |
112 | text: gettext('File Restore'), | |
113 | disabled: true, | |
114 | selModel: sm, | |
115 | handler: function(b, e, rec) { | |
116 | let isVMArchive = PVE.Utils.volume_is_qemu_backup(rec.data.volid, rec.data.format); | |
117 | Ext.create('Proxmox.window.FileBrowser', { | |
118 | title: gettext('File Restore') + " - " + rec.data.text, | |
119 | listURL: `/api2/json/nodes/localhost/storage/${me.storage}/file-restore/list`, | |
120 | downloadURL: `/api2/json/nodes/localhost/storage/${me.storage}/file-restore/download`, | |
121 | extraParams: { | |
122 | volume: rec.data.volid, | |
123 | }, | |
124 | archive: isVMArchive ? 'all' : undefined, | |
125 | autoShow: true, | |
126 | }); | |
127 | }, | |
128 | }); | |
129 | } | |
130 | me.tbar.push( | |
1665b840 FE |
131 | { |
132 | xtype: 'proxmoxButton', | |
133 | text: gettext('Show Configuration'), | |
134 | disabled: true, | |
135 | selModel: sm, | |
f6710aac | 136 | handler: function(b, e, rec) { |
1665b840 FE |
137 | var win = Ext.create('PVE.window.BackupConfig', { |
138 | volume: rec.data.volid, | |
f6710aac | 139 | pveSelNode: me.pveSelNode, |
1665b840 FE |
140 | }); |
141 | ||
142 | win.show(); | |
f6710aac | 143 | }, |
1665b840 | 144 | }, |
74b6a959 TL |
145 | { |
146 | xtype: 'proxmoxButton', | |
147 | text: gettext('Edit Notes'), | |
148 | disabled: true, | |
149 | selModel: sm, | |
150 | handler: function(b, e, rec) { | |
151 | let volid = rec.data.volid; | |
152 | Ext.create('Proxmox.window.Edit', { | |
153 | autoLoad: true, | |
154 | width: 600, | |
155 | height: 400, | |
156 | resizable: true, | |
157 | title: gettext('Notes'), | |
158 | url: `/api2/extjs/nodes/${nodename}/storage/${me.storage}/content/${volid}`, | |
159 | layout: 'fit', | |
160 | items: [ | |
161 | { | |
162 | xtype: 'textarea', | |
163 | layout: 'fit', | |
164 | name: 'notes', | |
165 | height: '100%', | |
166 | }, | |
167 | ], | |
168 | listeners: { | |
169 | destroy: () => reload(), | |
170 | }, | |
171 | }).show(); | |
172 | }, | |
173 | }, | |
b4818ea7 FE |
174 | { |
175 | xtype: 'proxmoxButton', | |
176 | text: gettext('Change Protection'), | |
177 | disabled: true, | |
178 | handler: function(button, event, record) { | |
179 | const volid = record.data.volid; | |
180 | Proxmox.Utils.API2Request({ | |
181 | url: `/api2/extjs/nodes/${nodename}/storage/${me.storage}/content/${volid}`, | |
182 | method: 'PUT', | |
183 | waitMsgTarget: me, | |
184 | params: { 'protected': record.data.protected ? 0 : 1 }, | |
185 | failure: (response) => Ext.Msg.alert('Error', response.htmlStatus), | |
186 | success: (response) => reload(), | |
187 | }); | |
188 | }, | |
189 | }, | |
6e339db1 | 190 | '-', |
e969d187 | 191 | pruneButton, |
6e339db1 | 192 | ); |
1665b840 | 193 | |
878bbf0b | 194 | if (isPBS) { |
a4b87129 TL |
195 | me.extraColumns = { |
196 | encrypted: { | |
197 | header: gettext('Encrypted'), | |
198 | dataIndex: 'encrypted', | |
199 | renderer: PVE.Utils.render_backup_encryption, | |
200 | }, | |
201 | verification: { | |
202 | header: gettext('Verify State'), | |
203 | dataIndex: 'verification', | |
204 | renderer: PVE.Utils.render_backup_verification, | |
f6710aac | 205 | }, |
a4b87129 TL |
206 | }; |
207 | } | |
208 | ||
1665b840 FE |
209 | me.callParent(); |
210 | }, | |
211 | }); |