]>
git.proxmox.com Git - pmg-gui.git/blob - js/PBSConfig.js
1 Ext
.define('Proxmox.form.PBSEncryptionCheckbox', {
2 extend
: 'Ext.form.field.Checkbox',
3 xtype
: 'pbsEncryptionCheckbox',
15 let original
= get('originalValue');
16 if (!get('isCreate') && original
) {
18 return gettext('Warning: Existing encryption key will be deleted!');
20 return gettext('Active');
22 return gettext('Auto-generate a client encryption key, saved privately in /etc/pmg');
32 resetOriginalValue: function() {
34 let vm
= me
.getViewModel();
35 vm
.set('originalValue', me
.value
);
37 me
.callParent(arguments
);
40 getSubmitData: function() {
42 let val
= me
.getSubmitValue();
45 return { 'delete': 'encryption-key' };
46 } else if (val
&& !!val
!== !!me
.originalValue
) {
47 return { 'encryption-key': 'autogen' };
50 return { 'encryption-key': 'autogen' };
55 initComponent: function() {
59 let vm
= me
.getViewModel();
60 vm
.set('isCreate', me
.isCreate
);
64 Ext
.define('PMG.PBSInputPanel', {
65 extend
: 'Ext.tab.Panel',
66 xtype
: 'pmgPBSInputPanel',
71 initComponent: function() {
76 title
: gettext('Backup Server'),
78 reference
: 'remoteeditpanel',
79 onGetValues: function(values
) {
80 values
.disable
= values
.enable
? 0 : 1;
88 xtype
: me
.isCreate
? 'textfield' : 'displayfield',
90 value
: me
.isCreate
? null : undefined,
91 fieldLabel
: gettext('ID'),
95 xtype
: 'proxmoxtextfield',
97 value
: me
.isCreate
? null : undefined,
99 fieldLabel
: gettext('Server'),
103 xtype
: 'proxmoxtextfield',
105 value
: me
.isCreate
? null : undefined,
106 fieldLabel
: 'Datastore',
112 xtype
: 'proxmoxtextfield',
114 value
: me
.isCreate
? null : undefined,
115 emptyText
: gettext('Example') + ': admin@pbs',
116 fieldLabel
: gettext('Username'),
118 regexText
: gettext('Example') + ': admin@pbs',
122 xtype
: 'proxmoxtextfield',
123 inputType
: 'password',
125 value
: me
.isCreate
? null : undefined,
126 emptyText
: me
.isCreate
? gettext('None') : '********',
127 fieldLabel
: gettext('Password'),
131 xtype
: 'proxmoxcheckbox',
135 fieldLabel
: gettext('Enable'),
140 xtype
: 'proxmoxtextfield',
142 value
: me
.isCreate
? null : undefined,
143 fieldLabel
: gettext('Fingerprint'),
144 emptyText
: gettext('Server certificate SHA-256 fingerprint, required for self-signed certificates'),
145 regex
: /[A-Fa-f0-9]{2}(:[A-Fa-f0-9]{2}){31}/,
146 regexText
: gettext('Example') + ': AB:CD:EF:...',
150 xtype
: 'pbsEncryptionCheckbox',
151 name
: 'encryption-key',
152 isCreate
: me
.isCreate
,
153 fieldLabel
: gettext('Encryption Key'),
156 xtype
: 'displayfield',
158 value
: `Proxmox Backup Server is currently in beta.`,
163 title
: gettext('Prune Options'),
165 reference
: 'prunepanel',
168 xtype
: 'proxmoxintegerfield',
169 fieldLabel
: gettext('Keep Last'),
172 deleteEmpty
: '{!isCreate}',
178 xtype
: 'proxmoxintegerfield',
179 fieldLabel
: gettext('Keep Daily'),
182 deleteEmpty
: '{!isCreate}',
188 xtype
: 'proxmoxintegerfield',
189 fieldLabel
: gettext('Keep Monthly'),
190 name
: 'keep-monthly',
192 deleteEmpty
: '{!isCreate}',
200 xtype
: 'proxmoxintegerfield',
201 fieldLabel
: gettext('Keep Hourly'),
204 deleteEmpty
: '{!isCreate}',
210 xtype
: 'proxmoxintegerfield',
211 fieldLabel
: gettext('Keep Weekly'),
214 deleteEmpty
: '{!isCreate}',
220 xtype
: 'proxmoxintegerfield',
221 fieldLabel
: gettext('Keep Yearly'),
224 deleteEmpty
: '{!isCreate}',
238 Ext
.define('PMG.PBSEdit', {
239 extend
: 'Proxmox.window.Edit',
242 subject
: 'Proxmox Backup Server',
247 initComponent: function() {
250 me
.isCreate
= !me
.remoteId
;
253 me
.url
= '/api2/extjs/config/pbs';
256 me
.url
= '/api2/extjs/config/pbs/' + me
.remoteId
;
260 let ipanel
= Ext
.create('PMG.PBSInputPanel', {
261 isCreate
: me
.isCreate
,
262 remoteId
: me
.remoteId
,
275 success: function(response
, options
) {
276 let values
= response
.result
.data
;
278 values
.enable
= values
.disable
? 0 : 1;
279 me
.down('inputpanel[reference=remoteeditpanel]').setValues(values
);
280 me
.down('inputpanel[reference=prunepanel]').setValues(values
);
287 Ext
.define('PMG.PBSScheduleEdit', {
288 extend
: 'Proxmox.window.Edit',
289 xtype
: 'pmgPBSScheduleEdit',
293 subject
: gettext('Scheduled Backup'),
297 xtype
: 'proxmoxKVComboBox',
299 fieldLabel
: gettext('Schedule'),
302 ['hourly', 'hourly'],
303 ['weekly', 'weekly'],
304 ['monthly', 'monthly'],
307 emptyText
: 'Systemd Calender Event',
310 xtype
: 'proxmoxKVComboBox',
312 fieldLabel
: gettext('Random Delay'),
315 ['15 minutes', '15 Minutes'],
316 ['6 hours', '6 hours'],
319 emptyText
: 'Systemd TimeSpan',
322 initComponent: function() {
325 me
.url
= '/nodes/' + Proxmox
.NodeName
+ '/pbs/' + me
.remote
+ '/timer';
330 Ext
.define('PMG.PBSConfig', {
331 extend
: 'Ext.panel.Panel',
332 xtype
: 'pmgPBSConfig',
335 xclass
: 'Ext.app.ViewController',
337 callRestore: function(grid
, record
) {
338 let name
= this.getViewModel().get('name');
339 Ext
.create('PMG.RestoreWindow', {
341 backup_time
: record
.data
.time
,
345 restoreSnapshot: function(button
) {
347 let view
= me
.lookup('pbsremotegrid');
348 let record
= view
.getSelection()[0];
349 me
.callRestore(view
, record
);
352 runBackup: function(button
) {
354 let view
= me
.lookup('pbsremotegrid');
355 let name
= me
.getViewModel().get('name');
356 Proxmox
.Utils
.API2Request({
357 url
: "/nodes/" + Proxmox
.NodeName
+ "/pbs/" + name
+ "/backup",
360 failure: function(response
, opts
) {
361 Ext
.Msg
.alert(gettext('Error'), response
.htmlStatus
);
363 success: function(response
, opts
) {
364 let upid
= response
.result
.data
;
366 let win
= Ext
.create('Proxmox.window.TaskViewer', {
370 me
.mon(win
, 'close', function() { view
.getStore().load(); });
375 reload: function(grid
) {
377 let selection
= grid
.getSelection();
378 me
.showInfo(grid
, selection
);
381 showInfo: function(grid
, selected
) {
383 let viewModel
= me
.getViewModel();
385 let name
= selected
[0].data
.remote
;
386 viewModel
.set('selected', true);
387 viewModel
.set('name', name
);
389 // set grid stores and load them
390 let remstore
= me
.lookup('pbsremotegrid').getStore();
391 remstore
.getProxy().setUrl('/api2/json/nodes/' + Proxmox
.NodeName
+ '/pbs/' + name
+ '/snapshots');
394 viewModel
.set('selected', false);
397 reloadSnapshots: function() {
399 let grid
= me
.lookup('grid');
400 let selection
= grid
.getSelection();
401 me
.showInfo(grid
, selection
);
403 init: function(view
) {
405 me
.lookup('grid').relayEvents(view
, ['activate']);
406 let pbsremotegrid
= me
.lookup('pbsremotegrid');
408 Proxmox
.Utils
.monStoreErrors(pbsremotegrid
, pbsremotegrid
.getStore(), true);
412 'grid[reference=grid]': {
413 selectionchange
: 'showInfo',
416 'grid[reference=pbsremotegrid]': {
417 itemdblclick
: 'restoreSnapshot',
435 xtype
: 'pmgPBSConfigGrid',
441 reference
: 'pbsremotegrid',
446 emptyText
: gettext('No backups on remote'),
449 xtype
: 'proxmoxButton',
450 text
: gettext('Backup'),
451 handler
: 'runBackup',
455 xtype
: 'proxmoxButton',
456 text
: gettext('Restore'),
457 handler
: 'restoreSnapshot',
461 xtype
: 'proxmoxStdRemoveButton',
462 text
: gettext('Forget Snapshot'),
464 getUrl: function(rec
) {
466 let remote
= me
.lookupViewModel().get('name');
467 return '/nodes/' + Proxmox
.NodeName
+ '/pbs/' + remote
+'/snapshots/'+ rec
.data
.time
;
469 confirmMsg: function(rec
) {
471 let time
= rec
.data
.time
;
472 return Ext
.String
.format(gettext('Are you sure you want to forget snapshot {0}'), `'${time}'`);
474 callback
: 'reloadSnapshots',
478 fields
: ['time', 'size', 'ctime', 'encrypted'],
479 proxy
: { type
: 'proxmox' },
488 title
: Ext
.String
.format(gettext("Backup snapshots on '{0}'"), '{name}'),
489 hidden
: '{!selected}',
504 dataIndex
: 'encrypted',
505 renderer
: Proxmox
.Utils
.format_boolean
,
514 Ext
.define('pmg-pbs-config', {
515 extend
: 'Ext.data.Model',
516 fields
: ['remote', 'server', 'datastore', 'username', 'disabled'],
519 url
: '/api2/json/config/pbs',
521 idProperty
: 'remote',
524 Ext
.define('PMG.PBSConfigGrid', {
525 extend
: 'Ext.grid.GridPanel',
526 xtype
: 'pmgPBSConfigGrid',
529 xclass
: 'Ext.app.ViewController',
531 run_editor: function() {
533 let view
= me
.getView();
534 let rec
= view
.getSelection()[0];
539 let win
= Ext
.createWidget('pmgPBSEdit', {
540 remoteId
: rec
.data
.remote
,
542 win
.on('destroy', me
.reload
, me
);
547 newRemote: function() {
549 let win
= Ext
.createWidget('pmgPBSEdit', {});
550 win
.on('destroy', me
.reload
, me
);
557 let view
= me
.getView();
558 view
.getStore().load();
559 view
.fireEvent('load', view
);
562 createSchedule: function() {
564 let view
= me
.getView();
565 let rec
= view
.getSelection()[0];
566 let remotename
= rec
.data
.remote
;
567 let win
= Ext
.createWidget('pmgPBSScheduleEdit', {
570 win
.on('destroy', me
.reload
, me
);
574 init: function(view
) {
576 Proxmox
.Utils
.monStoreErrors(view
, view
.getStore(), true);
582 model
: 'pmg-pbs-config',
591 xtype
: 'proxmoxButton',
592 text
: gettext('Edit'),
594 handler
: 'run_editor',
597 text
: gettext('Create'),
598 handler
: 'newRemote',
601 xtype
: 'proxmoxStdRemoveButton',
602 baseurl
: '/config/pbs',
606 xtype
: 'proxmoxButton',
607 text
: gettext('Schedule'),
608 enableFn: function(rec
) {
609 return !rec
.data
.disable
;
612 handler
: 'createSchedule',
615 xtype
: 'proxmoxStdRemoveButton',
616 baseurl
: '/nodes/' + Proxmox
.NodeName
+ '/pbs/',
618 text
: gettext('Remove Schedule'),
619 confirmMsg: function(rec
) {
621 let name
= rec
.getId();
622 return Ext
.String
.format(gettext('Are you sure you want to remove the schedule for {0}'), `'${name}'`);
624 getUrl: function(rec
) {
626 return me
.baseurl
+ '/' + rec
.getId() + '/timer';
632 itemdblclick
: 'run_editor',
638 header
: gettext('Backup Server name'),
644 header
: gettext('Server'),
650 header
: gettext('Datastore'),
652 dataIndex
: 'datastore',
656 header
: gettext('User ID'),
658 dataIndex
: 'username',
662 header
: gettext('Encryption'),
665 dataIndex
: 'encryption-key',
666 renderer
: Proxmox
.Utils
.format_boolean
,
669 header
: gettext('Enabled'),
672 dataIndex
: 'disable',
673 renderer
: Proxmox
.Utils
.format_neg_boolean
,