]>
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, | |
0a3cf3d4 | 33 | renderer: PVE.Utils.format_enabled_toggle, |
307a2fb8 DM |
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: { | |
8a7e5598 | 62 | xtype: 'pveIntegerField', |
307a2fb8 DM |
63 | name: name, |
64 | minValue: minValue, | |
307a2fb8 DM |
65 | fieldLabel: text, |
66 | emptyText: gettext('Default'), | |
67 | getSubmitData: function() { | |
68 | var me = this; | |
69 | var val = me.getSubmitValue(); | |
70 | if (val !== null && val !== '') { | |
71 | var data = {}; | |
72 | data[name] = val; | |
73 | return data; | |
74 | } else { | |
75 | return { 'delete' : name }; | |
76 | } | |
77 | } | |
78 | } | |
79 | } | |
80 | }; | |
81 | }; | |
82 | ||
83 | var add_log_row = function(name, labelWidth) { | |
84 | rows[name] = { | |
85 | header: name, | |
86 | required: true, | |
87 | defaultValue: 'nolog', | |
88 | editor: { | |
89 | xtype: 'pveWindowEdit', | |
90 | subject: name, | |
91 | fieldDefaults: { labelWidth: labelWidth || 100 }, | |
92 | items: { | |
93 | xtype: 'pveKVComboBox', | |
94 | name: name, | |
95 | fieldLabel: name, | |
734b3795 | 96 | comboItems: [['nolog', 'nolog'], ['info', 'info'], ['err', 'err'], |
307a2fb8 DM |
97 | ['warning', 'warning'], ['crit', 'crit'], ['alert', 'alert'], |
98 | ['emerg', 'emerg'], ['debug', 'debug']] | |
99 | } | |
100 | } | |
101 | }; | |
102 | }; | |
103 | ||
104 | ||
105 | if (me.fwtype === 'node') { | |
0a3cf3d4 | 106 | add_boolean_row('enable', gettext('Firewall'), 1); |
307a2fb8 DM |
107 | add_boolean_row('nosmurfs', gettext('SMURFS filter'), 1); |
108 | add_boolean_row('tcpflags', gettext('TCP flags filter'), 0); | |
c4941d5b | 109 | add_boolean_row('ndp', 'NDP', 1); |
307a2fb8 DM |
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') { | |
0a3cf3d4 | 118 | add_boolean_row('enable', gettext('Firewall'), 0); |
b9628aa5 EK |
119 | add_boolean_row('dhcp', 'DHCP', 0); |
120 | add_boolean_row('ndp', 'NDP', 1); | |
0a3cf3d4 | 121 | add_boolean_row('radv', gettext('Router Advertisement'), 0); |
307a2fb8 | 122 | add_boolean_row('macfilter', gettext('MAC filter'), 1); |
9eef71f3 | 123 | add_boolean_row('ipfilter', gettext('IP filter'), 0); |
307a2fb8 DM |
124 | add_log_row('log_level_in'); |
125 | add_log_row('log_level_out'); | |
126 | } else if (me.fwtype === 'dc') { | |
0a3cf3d4 | 127 | add_boolean_row('enable', gettext('Firewall'), 0); |
307a2fb8 DM |
128 | } |
129 | ||
130 | if (me.fwtype === 'dc' || me.fwtype === 'vm') { | |
131 | rows.policy_in = { | |
132 | header: gettext('Input Policy'), | |
133 | required: true, | |
134 | defaultValue: 'DROP', | |
135 | editor: { | |
136 | xtype: 'pveWindowEdit', | |
137 | subject: gettext('Input Policy'), | |
138 | items: { | |
139 | xtype: 'pveFirewallPolicySelector', | |
140 | name: 'policy_in', | |
141 | value: 'DROP', | |
142 | fieldLabel: gettext('Input Policy') | |
143 | } | |
144 | } | |
145 | }; | |
146 | ||
147 | rows.policy_out = { | |
148 | header: gettext('Output Policy'), | |
149 | required: true, | |
150 | defaultValue: 'ACCEPT', | |
151 | editor: { | |
152 | xtype: 'pveWindowEdit', | |
153 | subject: gettext('Output Policy'), | |
154 | items: { | |
155 | xtype: 'pveFirewallPolicySelector', | |
156 | name: 'policy_out', | |
157 | value: 'ACCEPT', | |
158 | fieldLabel: gettext('Output Policy') | |
159 | } | |
160 | } | |
161 | }; | |
162 | } | |
163 | ||
164 | var reload = function() { | |
165 | me.rstore.load(); | |
166 | }; | |
167 | ||
168 | var run_editor = function() { | |
169 | var sm = me.getSelectionModel(); | |
170 | var rec = sm.getSelection()[0]; | |
171 | if (!rec) { | |
172 | return; | |
173 | } | |
174 | ||
175 | var rowdef = rows[rec.data.key]; | |
176 | if (!rowdef.editor) { | |
177 | return; | |
178 | } | |
179 | ||
180 | var win; | |
181 | if (Ext.isString(rowdef.editor)) { | |
182 | win = Ext.create(rowdef.editor, { | |
183 | pveSelNode: me.pveSelNode, | |
184 | confid: rec.data.key, | |
185 | url: '/api2/extjs' + me.base_url | |
186 | }); | |
187 | } else { | |
188 | var config = Ext.apply({ | |
189 | pveSelNode: me.pveSelNode, | |
190 | confid: rec.data.key, | |
191 | url: '/api2/extjs' + me.base_url | |
192 | }, rowdef.editor); | |
193 | win = Ext.createWidget(rowdef.editor.xtype, config); | |
194 | win.load(); | |
195 | } | |
196 | ||
197 | win.show(); | |
198 | win.on('destroy', reload); | |
199 | }; | |
200 | ||
201 | var edit_btn = new Ext.Button({ | |
202 | text: gettext('Edit'), | |
203 | disabled: true, | |
204 | handler: run_editor | |
205 | }); | |
206 | ||
207 | var set_button_status = function() { | |
208 | var sm = me.getSelectionModel(); | |
209 | var rec = sm.getSelection()[0]; | |
210 | ||
211 | if (!rec) { | |
212 | edit_btn.disable(); | |
213 | return; | |
214 | } | |
215 | var rowdef = rows[rec.data.key]; | |
216 | edit_btn.setDisabled(!rowdef.editor); | |
217 | }; | |
218 | ||
bc5d0cf8 | 219 | Ext.apply(me, { |
307a2fb8 | 220 | url: "/api2/json" + me.base_url, |
307a2fb8 DM |
221 | tbar: [ edit_btn ], |
222 | rows: rows, | |
223 | listeners: { | |
224 | itemdblclick: run_editor, | |
225 | selectionchange: set_button_status | |
226 | } | |
227 | }); | |
228 | ||
229 | me.callParent(); | |
230 | ||
734b3795 | 231 | me.on('activate', reload); |
307a2fb8 DM |
232 | } |
233 | }); |