]>
git.proxmox.com Git - pve-manager.git/blob - www/manager6/grid/FirewallRules.js
1 Ext
.define('PVE.form.FWMacroSelector', {
2 extend
: 'PVE.form.ComboGrid',
3 alias
: 'widget.pveFWMacroSelector',
11 header
: gettext('Macro'),
17 header
: gettext('Description'),
18 renderer
: Ext
.String
.htmlEncode
,
24 initComponent: function() {
27 var store
= Ext
.create('Ext.data.Store', {
29 fields
: [ 'macro', 'descr' ],
33 url
: "/api2/json/cluster/firewall/macros"
49 Ext
.define('PVE.FirewallRulePanel', {
50 extend
: 'PVE.panel.InputPanel',
54 list_refs_url
: undefined,
56 onGetValues: function(values
) {
59 // hack: editable ComboGrid returns nothing when empty, so we need to set ''
60 // Also, disabled text fields return nothing, so we need to set ''
62 Ext
.Array
.each(['source', 'dest', 'macro', 'proto', 'sport', 'dport'], function(key
) {
63 if (values
[key
] === undefined) {
68 delete values
.modified_marker
;
73 initComponent : function() {
76 if (!me
.list_refs_url
) {
77 throw "no list_refs_url specified";
82 // hack: we use this field to mark the form 'dirty' when the
83 // record has errors- so that the user can safe the unmodified
86 name
: 'modified_marker',
90 xtype
: 'pveKVComboBox',
93 comboItems
: [['in', 'in'], ['out', 'out']],
94 fieldLabel
: gettext('Direction'),
98 xtype
: 'pveKVComboBox',
101 comboItems
: [['ACCEPT', 'ACCEPT'], ['DROP', 'DROP'], ['REJECT', 'REJECT']],
102 fieldLabel
: gettext('Action'),
107 if (me
.allow_iface
) {
109 xtype
: 'pvetextfield',
111 deleteEmpty
: !me
.create
,
113 fieldLabel
: gettext('Interface')
117 xtype
: 'displayfield',
125 xtype
: 'displayfield',
131 xtype
: 'pveIPRefSelector',
135 base_url
: me
.list_refs_url
,
137 fieldLabel
: gettext('Source')
141 xtype
: 'pveIPRefSelector',
145 base_url
: me
.list_refs_url
,
147 fieldLabel
: gettext('Destination')
154 xtype
: 'pvecheckbox',
158 fieldLabel
: gettext('Enable')
161 xtype
: 'pveFWMacroSelector',
163 fieldLabel
: gettext('Macro'),
167 change: function(f
, value
) {
168 if (value
=== null) {
169 me
.down('field[name=proto]').setDisabled(false);
170 me
.down('field[name=sport]').setDisabled(false);
171 me
.down('field[name=dport]').setDisabled(false);
173 me
.down('field[name=proto]').setDisabled(true);
174 me
.down('field[name=proto]').setValue('');
175 me
.down('field[name=sport]').setDisabled(true);
176 me
.down('field[name=sport]').setValue('');
177 me
.down('field[name=dport]').setDisabled(true);
178 me
.down('field[name=dport]').setValue('');
184 xtype
: 'pveIPProtocolSelector',
189 fieldLabel
: gettext('Protocol')
192 xtype
: 'displayfield',
201 fieldLabel
: gettext('Source port')
207 fieldLabel
: gettext('Dest. port')
216 fieldLabel
: gettext('Comment')
224 Ext
.define('PVE.FirewallRuleEdit', {
225 extend
: 'PVE.window.Edit',
228 list_refs_url
: undefined,
232 initComponent : function() {
233 /*jslint confusion: true */
237 throw "no base_url specified";
239 if (!me
.list_refs_url
) {
240 throw "no list_refs_url specified";
243 me
.create
= (me
.rule_pos
=== undefined);
246 me
.url
= '/api2/extjs' + me
.base_url
;
249 me
.url
= '/api2/extjs' + me
.base_url
+ '/' + me
.rule_pos
.toString();
253 var ipanel
= Ext
.create('PVE.FirewallRulePanel', {
255 list_refs_url
: me
.list_refs_url
,
256 allow_iface
: me
.allow_iface
,
257 rule_pos
: me
.rule_pos
261 subject
: gettext('Rule'),
270 success: function(response
, options
) {
271 var values
= response
.result
.data
;
272 ipanel
.setValues(values
);
274 var field
= me
.query('[isFormField][name=modified_marker]')[0];
276 Ext
.Function
.defer(function() {
277 var form
= ipanel
.up('form').getForm();
278 form
.markInvalid(values
.errors
);
287 Ext
.define('PVE.FirewallGroupRuleEdit', {
288 extend
: 'PVE.window.Edit',
294 initComponent : function() {
295 /*jslint confusion: true */
298 me
.create
= (me
.rule_pos
=== undefined);
301 me
.url
= '/api2/extjs' + me
.base_url
;
304 me
.url
= '/api2/extjs' + me
.base_url
+ '/' + me
.rule_pos
.toString();
310 xtype
: 'hiddenfield',
315 xtype
: 'pveSecurityGroupsSelector',
318 fieldLabel
: gettext('Security Group'),
323 if (me
.allow_iface
) {
325 xtype
: 'pvetextfield',
327 deleteEmpty
: !me
.create
,
329 fieldLabel
: gettext('Interface')
333 var ipanel
= Ext
.create('PVE.panel.InputPanel', {
338 xtype
: 'pvecheckbox',
342 fieldLabel
: gettext('Enable')
350 fieldLabel
: gettext('Comment')
356 subject
: gettext('Rule'),
365 success: function(response
, options
) {
366 var values
= response
.result
.data
;
367 ipanel
.setValues(values
);
374 Ext
.define('PVE.FirewallRules', {
375 extend
: 'Ext.grid.Panel',
376 alias
: 'widget.pveFirewallRules',
379 list_refs_url
: undefined,
382 removeBtn
: undefined,
386 tbar_prefix
: undefined,
391 setBaseUrl: function(url
) {
396 if (url
=== undefined) {
397 me
.addBtn
.setDisabled(true);
399 me
.groupBtn
.setDisabled(true);
401 me
.store
.removeAll();
403 me
.addBtn
.setDisabled(false);
405 me
.groupBtn
.setDisabled(false);
409 url
: '/api2/json' + url
416 moveRule: function(from, to
) {
423 PVE
.Utils
.API2Request({
424 url
: me
.base_url
+ "/" + from,
426 params
: { moveto
: to
},
428 failure: function(response
, options
) {
429 Ext
.Msg
.alert(gettext('Error'), response
.htmlStatus
);
431 callback: function() {
437 updateRule: function(rule
) {
444 rule
.enable
= rule
.enable
? 1 : 0;
450 PVE
.Utils
.API2Request({
451 url
: me
.base_url
+ '/' + pos
.toString(),
455 failure: function(response
, options
) {
456 Ext
.Msg
.alert(gettext('Error'), response
.htmlStatus
);
458 callback: function() {
464 deleteRule: function(rule
) {
471 PVE
.Utils
.API2Request({
472 url
: me
.base_url
+ '/' + rule
.pos
.toString() +
473 '?digest=' + encodeURIComponent(rule
.digest
),
476 failure: function(response
, options
) {
477 Ext
.Msg
.alert(gettext('Error'), response
.htmlStatus
);
479 callback: function() {
485 initComponent: function() {
486 /*jslint confusion: true */
489 if (!me
.list_refs_url
) {
490 throw "no list_refs_url specified";
493 var store
= Ext
.create('Ext.data.Store',{
497 var reload = function() {
501 var sm
= Ext
.create('Ext.selection.RowModel', {});
503 var run_editor = function() {
504 var rec
= sm
.getSelection()[0];
508 var type
= rec
.data
.type
;
511 if (type
=== 'in' || type
=== 'out') {
512 editor
= 'PVE.FirewallRuleEdit';
513 } else if (type
=== 'group') {
514 editor
= 'PVE.FirewallGroupRuleEdit';
519 var win
= Ext
.create(editor
, {
520 digest
: rec
.data
.digest
,
521 allow_iface
: me
.allow_iface
,
522 base_url
: me
.base_url
,
523 list_refs_url
: me
.list_refs_url
,
524 rule_pos
: rec
.data
.pos
528 win
.on('destroy', reload
);
531 me
.editBtn
= Ext
.create('PVE.button.Button',{
532 text
: gettext('Edit'),
538 me
.addBtn
= Ext
.create('Ext.Button', {
539 text
: gettext('Add'),
541 handler: function() {
542 var win
= Ext
.create('PVE.FirewallRuleEdit', {
543 allow_iface
: me
.allow_iface
,
544 base_url
: me
.base_url
,
545 list_refs_url
: me
.list_refs_url
547 win
.on('destroy', reload
);
552 if (me
.allow_groups
) {
553 me
.groupBtn
= Ext
.create('Ext.Button', {
554 text
: gettext('Insert') + ': ' +
555 gettext('Security Group'),
557 handler: function() {
558 var win
= Ext
.create('PVE.FirewallGroupRuleEdit', {
559 allow_iface
: me
.allow_iface
,
560 base_url
: me
.base_url
562 win
.on('destroy', reload
);
568 me
.removeBtn
= Ext
.create('PVE.button.Button',{
569 text
: gettext('Remove'),
572 handler: function() {
573 var rec
= sm
.getSelection()[0];
577 me
.deleteRule(rec
.data
);
581 var tbar
= me
.tbar_prefix
? [ me
.tbar_prefix
] : [];
582 tbar
.push(me
.addBtn
);
584 tbar
.push(me
.groupBtn
);
586 tbar
.push(me
.removeBtn
, me
.editBtn
);
588 var render_errors = function(name
, value
, metaData
, record
) {
589 var errors
= record
.data
.errors
;
590 if (errors
&& errors
[name
]) {
591 metaData
.tdCls
= 'x-form-invalid-field';
592 var html
= '<p>' + Ext
.htmlEncode(errors
[name
]) + '</p>';
593 metaData
.tdAttr
= 'data-qwidth=600 data-qtitle="ERROR" data-qtip="' +
594 html
.replace(/\"/g,'"') + '"';
601 // similar to xtype: 'rownumberer',
609 renderer: function(value
, metaData
, record
, rowIdx
, colIdx
, store
) {
610 metaData
.tdCls
= Ext
.baseCSSPrefix
+ 'grid-cell-special';
618 xtype
: 'checkcolumn',
619 header
: gettext('Enable'),
622 checkchange: function(column
, recordIndex
, checked
) {
623 var record
= me
.getStore().getData().items
[recordIndex
];
626 Ext
.Array
.forEach(record
.getFields(), function(field
) {
627 data
[field
.name
] = record
.get(field
.name
);
629 if (!me
.allow_iface
|| !data
.iface
) {
638 header
: gettext('Type'),
640 renderer: function(value
, metaData
, record
) {
641 return render_errors('type', value
, metaData
, record
);
646 header
: gettext('Action'),
648 renderer: function(value
, metaData
, record
) {
649 return render_errors('action', value
, metaData
, record
);
654 header
: gettext('Macro'),
656 renderer: function(value
, metaData
, record
) {
657 return render_errors('macro', value
, metaData
, record
);
663 if (me
.allow_iface
) {
665 header
: gettext('Interface'),
667 renderer: function(value
, metaData
, record
) {
668 return render_errors('iface', value
, metaData
, record
);
676 header
: gettext('Source'),
678 renderer: function(value
, metaData
, record
) {
679 return render_errors('source', value
, metaData
, record
);
684 header
: gettext('Destination'),
686 renderer: function(value
, metaData
, record
) {
687 return render_errors('dest', value
, metaData
, record
);
692 header
: gettext('Protocol'),
694 renderer: function(value
, metaData
, record
) {
695 return render_errors('proto', value
, metaData
, record
);
700 header
: gettext('Dest. port'),
702 renderer: function(value
, metaData
, record
) {
703 return render_errors('dport', value
, metaData
, record
);
708 header
: gettext('Source port'),
710 renderer: function(value
, metaData
, record
) {
711 return render_errors('sport', value
, metaData
, record
);
716 header
: gettext('Comment'),
717 dataIndex
: 'comment',
719 renderer: function(value
, metaData
, record
) {
720 return render_errors('comment', Ext
.util
.Format
.htmlEncode(value
), metaData
, record
);
732 ptype
: 'gridviewdragdrop',
733 dragGroup
: 'FWRuleDDGroup',
734 dropGroup
: 'FWRuleDDGroup'
738 beforedrop: function(node
, data
, dropRec
, dropPosition
) {
740 return false; // empty view
742 var moveto
= dropRec
.get('pos');
743 if (dropPosition
=== 'after') {
746 var pos
= data
.records
[0].get('pos');
747 me
.moveRule(pos
, moveto
);
750 itemdblclick
: run_editor
753 sortableColumns
: false,
760 me
.setBaseUrl(me
.base_url
); // load
765 Ext
.define('pve-fw-rule', {
766 extend
: 'Ext.data.Model',
767 fields
: [ { name
: 'enable', type
: 'boolean' },
768 'type', 'action', 'macro', 'source', 'dest', 'proto', 'iface',
769 'dport', 'sport', 'comment', 'pos', 'digest', 'errors' ],