]> git.proxmox.com Git - pve-manager.git/blame - www/manager5/Parser.js
copy Parser.js from manager to manager5
[pve-manager.git] / www / manager5 / Parser.js
CommitLineData
fcb64fe4
DM
1// Some configuration values are complex strings -
2// so we need parsers/generators for them.
3
4Ext.define('PVE.Parser', { statics: {
5
6 // this class only contains static functions
7
8 parseQemuNetwork: function(key, value) {
9 if (!(key && value)) {
10 return;
11 }
12
13 var res = {};
14
15 var errors = false;
16 Ext.Array.each(value.split(','), function(p) {
17 if (!p || p.match(/^\s*$/)) {
18 return; // continue
19 }
20
21 var match_res;
22
23 if ((match_res = p.match(/^(ne2k_pci|e1000|e1000-82540em|e1000-82544gc|e1000-82545em|vmxnet3|rtl8139|pcnet|virtio|ne2k_isa|i82551|i82557b|i82559er)(=([0-9a-f]{2}(:[0-9a-f]{2}){5}))?$/i)) !== null) {
24 res.model = match_res[1].toLowerCase();
25 if (match_res[3]) {
26 res.macaddr = match_res[3];
27 }
28 } else if ((match_res = p.match(/^bridge=(\S+)$/)) !== null) {
29 res.bridge = match_res[1];
30 } else if ((match_res = p.match(/^rate=(\d+(\.\d+)?)$/)) !== null) {
31 res.rate = match_res[1];
32 } else if ((match_res = p.match(/^tag=(\d+(\.\d+)?)$/)) !== null) {
33 res.tag = match_res[1];
34 } else if ((match_res = p.match(/^firewall=(\d+)$/)) !== null) {
35 res.firewall = match_res[1];
36 } else if ((match_res = p.match(/^link_down=(\d+)$/)) !== null) {
37 res.disconnect = match_res[1];
38 } else if ((match_res = p.match(/^queues=(\d+)$/)) !== null) {
39 res.queues = match_res[1];
40 } else {
41 errors = true;
42 return false; // break
43 }
44 });
45
46 if (errors || !res.model) {
47 return;
48 }
49
50 return res;
51 },
52
53 printQemuNetwork: function(net) {
54
55 var netstr = net.model;
56 if (net.macaddr) {
57 netstr += "=" + net.macaddr;
58 }
59 if (net.bridge) {
60 netstr += ",bridge=" + net.bridge;
61 if (net.tag) {
62 netstr += ",tag=" + net.tag;
63 }
64 if (net.firewall) {
65 netstr += ",firewall=" + net.firewall;
66 }
67 }
68 if (net.rate) {
69 netstr += ",rate=" + net.rate;
70 }
71 if (net.queues) {
72 netstr += ",queues=" + net.queues;
73 }
74 if (net.disconnect) {
75 netstr += ",link_down=" + net.disconnect;
76 }
77 return netstr;
78 },
79
80 parseQemuDrive: function(key, value) {
81 if (!(key && value)) {
82 return;
83 }
84
85 var res = {};
86
87 var match_res = key.match(/^([a-z]+)(\d+)$/);
88 if (!match_res) {
89 return;
90 }
91 res['interface'] = match_res[1];
92 res.index = match_res[2];
93
94 var errors = false;
95 Ext.Array.each(value.split(','), function(p) {
96 if (!p || p.match(/^\s*$/)) {
97 return; // continue
98 }
99 var match_res = p.match(/^([a-z_]+)=(\S+)$/);
100 if (!match_res) {
101 if (!p.match(/\=/)) {
102 res.file = p;
103 return; // continue
104 }
105 errors = true;
106 return false; // break
107 }
108 var k = match_res[1];
109 if (k === 'volume') {
110 k = 'file';
111 }
112
113 if (Ext.isDefined(res[k])) {
114 errors = true;
115 return false; // break
116 }
117
118 var v = match_res[2];
119
120 if (k === 'cache' && v === 'off') {
121 v = 'none';
122 }
123
124 res[k] = v;
125 });
126
127 if (errors || !res.file) {
128 return;
129 }
130
131 return res;
132 },
133
134 printQemuDrive: function(drive) {
135
136 var drivestr = drive.file;
137
138 Ext.Object.each(drive, function(key, value) {
139 if (!Ext.isDefined(value) || key === 'file' ||
140 key === 'index' || key === 'interface') {
141 return; // continue
142 }
143 drivestr += ',' + key + '=' + value;
144 });
145
146 return drivestr;
147 },
148
149 parseOpenVZNetIf: function(value) {
150 if (!value) {
151 return;
152 }
153
154 var res = {};
155
156 var errors = false;
157 Ext.Array.each(value.split(';'), function(item) {
158 if (!item || item.match(/^\s*$/)) {
159 return; // continue
160 }
161
162 var data = {};
163 Ext.Array.each(item.split(','), function(p) {
164 if (!p || p.match(/^\s*$/)) {
165 return; // continue
166 }
167 var match_res = p.match(/^(ifname|mac|bridge|host_ifname|host_mac|mac_filter)=(\S+)$/);
168 if (!match_res) {
169 errors = true;
170 return false; // break
171 }
172 if (match_res[1] === 'bridge'){
173 var bridgevlanf = match_res[2];
174 var bridge_res = bridgevlanf.match(/^(vmbr(\d+))(v(\d+))?(f)?$/);
175 if (!bridge_res) {
176 errors = true;
177 return false; // break
178 }
179 data['bridge'] = bridge_res[1];
180 data['tag'] = bridge_res[4];
181 data['firewall'] = bridge_res[5] ? 1 : 0;
182 } else {
183 data[match_res[1]] = match_res[2];
184 }
185 });
186
187 if (errors || !data.ifname) {
188 errors = true;
189 return false; // break
190 }
191
192 data.raw = item;
193
194 res[data.ifname] = data;
195 });
196
197 return errors ? undefined: res;
198 },
199
200 printOpenVZNetIf: function(netif) {
201 var netarray = [];
202
203 Ext.Object.each(netif, function(iface, data) {
204 var tmparray = [];
205 Ext.Array.each(['ifname', 'mac', 'bridge', 'host_ifname' , 'host_mac', 'mac_filter', 'tag', 'firewall'], function(key) {
206 var value = data[key];
207 if (key === 'bridge'){
208 if(data['tag']){
209 value = value + 'v' + data['tag'];
210 }
211 if (data['firewall']){
212 value = value + 'f';
213 }
214 }
215 if (value) {
216 tmparray.push(key + '=' + value);
217 }
218
219 });
220 netarray.push(tmparray.join(','));
221 });
222
223 return netarray.join(';');
224 },
225
226 parseLxcNetwork: function(value) {
227 if (!value) {
228 return;
229 }
230
231 var data = {};
232 Ext.Array.each(value.split(','), function(p) {
233 if (!p || p.match(/^\s*$/)) {
234 return; // continue
235 }
236 var match_res = p.match(/^(bridge|hwaddr|mtu|name|ip|ip6|gw|gw6|firewall|tag)=(\S+)$/);
237 if (!match_res) {
238 // todo: simply ignore errors ?
239 return; // continue
240 }
241 data[match_res[1]] = match_res[2];
242 });
243
244 return data;
245 },
246
247 printLxcNetwork: function(data) {
248 var tmparray = [];
249 Ext.Array.each(['bridge', 'hwaddr', 'mtu', 'name', 'ip',
250 'gw', 'ip6', 'gw6', 'firewall', 'tag'], function(key) {
251 var value = data[key];
252 if (value) {
253 tmparray.push(key + '=' + value);
254 }
255 });
256
257 return tmparray.join(',');
258 },
259
260 parseStartup: function(value) {
261 if (value === undefined) {
262 return;
263 }
264
265 var res = {};
266
267 var errors = false;
268 Ext.Array.each(value.split(','), function(p) {
269 if (!p || p.match(/^\s*$/)) {
270 return; // continue
271 }
272
273 var match_res;
274
275 if ((match_res = p.match(/^(order)?=(\d+)$/)) !== null) {
276 res.order = match_res[2];
277 } else if ((match_res = p.match(/^up=(\d+)$/)) !== null) {
278 res.up = match_res[1];
279 } else if ((match_res = p.match(/^down=(\d+)$/)) !== null) {
280 res.down = match_res[1];
281 } else {
282 errors = true;
283 return false; // break
284 }
285 });
286
287 if (errors) {
288 return;
289 }
290
291 return res;
292 },
293
294 printStartup: function(startup) {
295 var arr = [];
296 if (startup.order !== undefined && startup.order !== '') {
297 arr.push('order=' + startup.order);
298 }
299 if (startup.up !== undefined && startup.up !== '') {
300 arr.push('up=' + startup.up);
301 }
302 if (startup.down !== undefined && startup.down !== '') {
303 arr.push('down=' + startup.down);
304 }
305
306 return arr.join(',');
307 },
308
309 parseQemuSmbios1: function(value) {
310 var res = {};
311
312 Ext.Array.each(value.split(','), function(p) {
313 var kva = p.split(/=/, 2);
314 res[kva[0]] = kva[1];
315 });
316
317 return res;
318 },
319
320 printQemuSmbios1: function(data) {
321
322 var datastr = '';
323
324 Ext.Object.each(data, function(key, value) {
325 if (value === '') return;
326 datastr += (datastr !== '' ? ',' : '') + key + '=' + value;
327 });
328
329 return datastr;
330 },
331
332 parseTfaConfig: function(value) {
333 var res = {};
334
335 Ext.Array.each(value.split(','), function(p) {
336 var kva = p.split(/=/, 2);
337 res[kva[0]] = kva[1];
338 });
339
340 return res;
341 }
342
343}});