]>
Commit | Line | Data |
---|---|---|
307a2fb8 DM |
1 | Ext.define('PVE.FirewallOptions', { |
2 | extend: 'PVE.grid.ObjectGrid', | |
3 | alias: ['widget.pveFirewallOptions'], | |
4 | ||
5 | fwtype: undefined, // 'dc', 'node' or 'vm' | |
6 | ||
7 | base_url: undefined, | |
8 | ||
9 | initComponent : function() { | |
10 | /*jslint confusion: true */ | |
11 | ||
12 | var me = this; | |
13 | ||
14 | if (!me.base_url) { | |
15 | throw "missing base_url configuration"; | |
16 | } | |
17 | ||
18 | if (me.fwtype === 'dc' || me.fwtype === 'node' || me.fwtype === 'vm') { | |
19 | if (me.fwtype === 'node') { | |
20 | me.cwidth1 = 250; | |
21 | } | |
22 | } else { | |
23 | throw "unknown firewall option type"; | |
24 | } | |
25 | ||
26 | var rows = {}; | |
27 | ||
28 | var add_boolean_row = function(name, text, defaultValue, labelWidth) { | |
29 | rows[name] = { | |
30 | header: text, | |
31 | required: true, | |
32 | defaultValue: defaultValue || 0, | |
33 | renderer: PVE.Utils.format_boolean, | |
34 | editor: { | |
35 | xtype: 'pveWindowEdit', | |
36 | subject: text, | |
37 | fieldDefaults: { labelWidth: labelWidth || 100 }, | |
38 | items: { | |
39 | xtype: 'pvecheckbox', | |
40 | defaultValue: defaultValue || 0, | |
41 | checked: defaultValue ? true : false, | |
42 | name: name, | |
43 | uncheckedValue: 0, | |
44 | fieldLabel: text | |
45 | } | |
46 | } | |
47 | }; | |
48 | }; | |
49 | ||
50 | var add_integer_row = function(name, text, labelWidth, minValue) { | |
51 | rows[name] = { | |
52 | header: text, | |
53 | required: true, | |
54 | renderer: function(value) { | |
55 | return value || PVE.Utils.defaultText; | |
56 | }, | |
57 | editor: { | |
58 | xtype: 'pveWindowEdit', | |
59 | subject: text, | |
60 | fieldDefaults: { labelWidth: labelWidth || 100 }, | |
61 | items: { | |
62 | xtype: 'numberfield', | |
63 | name: name, | |
64 | minValue: minValue, | |
65 | decimalPrecision: 0, | |
66 | fieldLabel: text, | |
67 | emptyText: gettext('Default'), | |
68 | getSubmitData: function() { | |
69 | var me = this; | |
70 | var val = me.getSubmitValue(); | |
71 | if (val !== null && val !== '') { | |
72 | var data = {}; | |
73 | data[name] = val; | |
74 | return data; | |
75 | } else { | |
76 | return { 'delete' : name }; | |
77 | } | |
78 | } | |
79 | } | |
80 | } | |
81 | }; | |
82 | }; | |
83 | ||
84 | var add_log_row = function(name, labelWidth) { | |
85 | rows[name] = { | |
86 | header: name, | |
87 | required: true, | |
88 | defaultValue: 'nolog', | |
89 | editor: { | |
90 | xtype: 'pveWindowEdit', | |
91 | subject: name, | |
92 | fieldDefaults: { labelWidth: labelWidth || 100 }, | |
93 | items: { | |
94 | xtype: 'pveKVComboBox', | |
95 | name: name, | |
96 | fieldLabel: name, | |
97 | data: [['nolog', 'nolog'], ['info', 'info'], ['err', 'err'], | |
98 | ['warning', 'warning'], ['crit', 'crit'], ['alert', 'alert'], | |
99 | ['emerg', 'emerg'], ['debug', 'debug']] | |
100 | } | |
101 | } | |
102 | }; | |
103 | }; | |
104 | ||
105 | ||
106 | if (me.fwtype === 'node') { | |
107 | add_boolean_row('enable', gettext('Enable Firewall'), 1); | |
108 | add_boolean_row('nosmurfs', gettext('SMURFS filter'), 1); | |
109 | add_boolean_row('tcpflags', gettext('TCP flags filter'), 0); | |
110 | add_integer_row('nf_conntrack_max', 'nf_conntrack_max', 120, 32768); | |
111 | add_integer_row('nf_conntrack_tcp_timeout_established', | |
112 | 'nf_conntrack_tcp_timeout_established', 250, 7875); | |
113 | add_log_row('log_level_in'); | |
114 | add_log_row('log_level_out'); | |
115 | add_log_row('tcp_flags_log_level', 120); | |
116 | add_log_row('smurf_log_level'); | |
117 | } else if (me.fwtype === 'vm') { | |
118 | add_boolean_row('enable', gettext('Enable Firewall'), 0); | |
119 | add_boolean_row('dhcp', gettext('Enable DHCP'), 0); | |
120 | add_boolean_row('macfilter', gettext('MAC filter'), 1); | |
121 | add_log_row('log_level_in'); | |
122 | add_log_row('log_level_out'); | |
123 | } else if (me.fwtype === 'dc') { | |
124 | add_boolean_row('enable', gettext('Enable Firewall'), 0); | |
125 | } | |
126 | ||
127 | if (me.fwtype === 'dc' || me.fwtype === 'vm') { | |
128 | rows.policy_in = { | |
129 | header: gettext('Input Policy'), | |
130 | required: true, | |
131 | defaultValue: 'DROP', | |
132 | editor: { | |
133 | xtype: 'pveWindowEdit', | |
134 | subject: gettext('Input Policy'), | |
135 | items: { | |
136 | xtype: 'pveFirewallPolicySelector', | |
137 | name: 'policy_in', | |
138 | value: 'DROP', | |
139 | fieldLabel: gettext('Input Policy') | |
140 | } | |
141 | } | |
142 | }; | |
143 | ||
144 | rows.policy_out = { | |
145 | header: gettext('Output Policy'), | |
146 | required: true, | |
147 | defaultValue: 'ACCEPT', | |
148 | editor: { | |
149 | xtype: 'pveWindowEdit', | |
150 | subject: gettext('Output Policy'), | |
151 | items: { | |
152 | xtype: 'pveFirewallPolicySelector', | |
153 | name: 'policy_out', | |
154 | value: 'ACCEPT', | |
155 | fieldLabel: gettext('Output Policy') | |
156 | } | |
157 | } | |
158 | }; | |
159 | } | |
160 | ||
161 | var reload = function() { | |
162 | me.rstore.load(); | |
163 | }; | |
164 | ||
165 | var run_editor = function() { | |
166 | var sm = me.getSelectionModel(); | |
167 | var rec = sm.getSelection()[0]; | |
168 | if (!rec) { | |
169 | return; | |
170 | } | |
171 | ||
172 | var rowdef = rows[rec.data.key]; | |
173 | if (!rowdef.editor) { | |
174 | return; | |
175 | } | |
176 | ||
177 | var win; | |
178 | if (Ext.isString(rowdef.editor)) { | |
179 | win = Ext.create(rowdef.editor, { | |
180 | pveSelNode: me.pveSelNode, | |
181 | confid: rec.data.key, | |
182 | url: '/api2/extjs' + me.base_url | |
183 | }); | |
184 | } else { | |
185 | var config = Ext.apply({ | |
186 | pveSelNode: me.pveSelNode, | |
187 | confid: rec.data.key, | |
188 | url: '/api2/extjs' + me.base_url | |
189 | }, rowdef.editor); | |
190 | win = Ext.createWidget(rowdef.editor.xtype, config); | |
191 | win.load(); | |
192 | } | |
193 | ||
194 | win.show(); | |
195 | win.on('destroy', reload); | |
196 | }; | |
197 | ||
198 | var edit_btn = new Ext.Button({ | |
199 | text: gettext('Edit'), | |
200 | disabled: true, | |
201 | handler: run_editor | |
202 | }); | |
203 | ||
204 | var set_button_status = function() { | |
205 | var sm = me.getSelectionModel(); | |
206 | var rec = sm.getSelection()[0]; | |
207 | ||
208 | if (!rec) { | |
209 | edit_btn.disable(); | |
210 | return; | |
211 | } | |
212 | var rowdef = rows[rec.data.key]; | |
213 | edit_btn.setDisabled(!rowdef.editor); | |
214 | }; | |
215 | ||
216 | Ext.applyIf(me, { | |
217 | url: "/api2/json" + me.base_url, | |
218 | cwidth1: 150, | |
219 | tbar: [ edit_btn ], | |
220 | rows: rows, | |
221 | listeners: { | |
222 | itemdblclick: run_editor, | |
223 | selectionchange: set_button_status | |
224 | } | |
225 | }); | |
226 | ||
227 | me.callParent(); | |
228 | ||
229 | me.on('show', reload); | |
230 | } | |
231 | }); |