]> git.proxmox.com Git - pve-manager.git/blame - www/manager/Parser.js
disable animation of charts on load
[pve-manager.git] / www / manager / Parser.js
CommitLineData
0381b693
DM
1// Some configuration values are complex strings -
2// so we need parsers/generators for them.
aff192e6
DM
3
4Ext.define('PVE.Parser', { statics: {
5
6 // this class only contains static functions
7
8aebff91
WB
8 parseBoolean: function(value, default_value) {
9 if (!Ext.isDefined(value))
10 return default_value;
11 value = value.toLowerCase();
12 return value === 1 || value === '1' ||
13 value === 'on' ||
14 value === 'yes' ||
15 value === 'true';
16 },
17
aff192e6
DM
18 parseQemuNetwork: function(key, value) {
19 if (!(key && value)) {
20 return;
21 }
22
23 var res = {};
24
25 var errors = false;
26 Ext.Array.each(value.split(','), function(p) {
27 if (!p || p.match(/^\s*$/)) {
28 return; // continue
29 }
30
31 var match_res;
32
da0a3bad 33 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) {
aff192e6
DM
34 res.model = match_res[1].toLowerCase();
35 if (match_res[3]) {
36 res.macaddr = match_res[3];
37 }
38 } else if ((match_res = p.match(/^bridge=(\S+)$/)) !== null) {
39 res.bridge = match_res[1];
40 } else if ((match_res = p.match(/^rate=(\d+(\.\d+)?)$/)) !== null) {
41 res.rate = match_res[1];
cd265ba2 42 } else if ((match_res = p.match(/^tag=(\d+(\.\d+)?)$/)) !== null) {
43 res.tag = match_res[1];
a61b1ac9
AD
44 } else if ((match_res = p.match(/^firewall=(\d+)$/)) !== null) {
45 res.firewall = match_res[1];
caea0c79
WL
46 } else if ((match_res = p.match(/^link_down=(\d+)$/)) !== null) {
47 res.disconnect = match_res[1];
3af3f221
DM
48 } else if ((match_res = p.match(/^queues=(\d+)$/)) !== null) {
49 res.queues = match_res[1];
aff192e6
DM
50 } else {
51 errors = true;
52 return false; // break
53 }
54 });
55
56 if (errors || !res.model) {
57 return;
58 }
59
60 return res;
61 },
62
63 printQemuNetwork: function(net) {
64
65 var netstr = net.model;
66 if (net.macaddr) {
67 netstr += "=" + net.macaddr;
68 }
69 if (net.bridge) {
70 netstr += ",bridge=" + net.bridge;
2cc2eaf2
DM
71 if (net.tag) {
72 netstr += ",tag=" + net.tag;
73 }
a61b1ac9
AD
74 if (net.firewall) {
75 netstr += ",firewall=" + net.firewall;
76 }
aff192e6
DM
77 }
78 if (net.rate) {
79 netstr += ",rate=" + net.rate;
80 }
4aa63024
AD
81 if (net.queues) {
82 netstr += ",queues=" + net.queues;
83 }
caea0c79
WL
84 if (net.disconnect) {
85 netstr += ",link_down=" + net.disconnect;
86 }
aff192e6
DM
87 return netstr;
88 },
89
90 parseQemuDrive: function(key, value) {
91 if (!(key && value)) {
92 return;
93 }
94
95 var res = {};
96
97 var match_res = key.match(/^([a-z]+)(\d+)$/);
98 if (!match_res) {
99 return;
100 }
101 res['interface'] = match_res[1];
102 res.index = match_res[2];
103
104 var errors = false;
105 Ext.Array.each(value.split(','), function(p) {
106 if (!p || p.match(/^\s*$/)) {
107 return; // continue
108 }
ed4ea4ce 109 var match_res = p.match(/^([a-z_]+)=(\S+)$/);
aff192e6
DM
110 if (!match_res) {
111 if (!p.match(/\=/)) {
112 res.file = p;
113 return; // continue
114 }
115 errors = true;
116 return false; // break
117 }
118 var k = match_res[1];
119 if (k === 'volume') {
120 k = 'file';
121 }
122
123 if (Ext.isDefined(res[k])) {
124 errors = true;
125 return false; // break
126 }
127
128 var v = match_res[2];
0381b693 129
aff192e6
DM
130 if (k === 'cache' && v === 'off') {
131 v = 'none';
132 }
133
134 res[k] = v;
135 });
136
137 if (errors || !res.file) {
138 return;
139 }
140
141 return res;
142 },
143
144 printQemuDrive: function(drive) {
145
146 var drivestr = drive.file;
147
148 Ext.Object.each(drive, function(key, value) {
0381b693 149 if (!Ext.isDefined(value) || key === 'file' ||
aff192e6
DM
150 key === 'index' || key === 'interface') {
151 return; // continue
152 }
153 drivestr += ',' + key + '=' + value;
154 });
155
156 return drivestr;
9021b40c
DM
157 },
158
159 parseOpenVZNetIf: function(value) {
160 if (!value) {
161 return;
162 }
163
164 var res = {};
165
166 var errors = false;
167 Ext.Array.each(value.split(';'), function(item) {
168 if (!item || item.match(/^\s*$/)) {
169 return; // continue
170 }
171
172 var data = {};
173 Ext.Array.each(item.split(','), function(p) {
174 if (!p || p.match(/^\s*$/)) {
175 return; // continue
176 }
4bfdc218 177 var match_res = p.match(/^(ifname|mac|bridge|host_ifname|host_mac|mac_filter)=(\S+)$/);
9021b40c
DM
178 if (!match_res) {
179 errors = true;
180 return false; // break
181 }
0381b693 182 if (match_res[1] === 'bridge'){
85c2c7b9 183 var bridgevlanf = match_res[2];
0381b693 184 var bridge_res = bridgevlanf.match(/^(vmbr(\d+))(v(\d+))?(f)?$/);
85c2c7b9
AD
185 if (!bridge_res) {
186 errors = true;
187 return false; // break
188 }
189 data['bridge'] = bridge_res[1];
190 data['tag'] = bridge_res[4];
0381b693
DM
191 data['firewall'] = bridge_res[5] ? 1 : 0;
192 } else {
85c2c7b9
AD
193 data[match_res[1]] = match_res[2];
194 }
9021b40c 195 });
aff192e6 196
9021b40c
DM
197 if (errors || !data.ifname) {
198 errors = true;
199 return false; // break
200 }
201
202 data.raw = item;
203
204 res[data.ifname] = data;
205 });
206
207 return errors ? undefined: res;
208 },
209
210 printOpenVZNetIf: function(netif) {
211 var netarray = [];
212
213 Ext.Object.each(netif, function(iface, data) {
214 var tmparray = [];
85c2c7b9 215 Ext.Array.each(['ifname', 'mac', 'bridge', 'host_ifname' , 'host_mac', 'mac_filter', 'tag', 'firewall'], function(key) {
9021b40c 216 var value = data[key];
0381b693 217 if (key === 'bridge'){
85c2c7b9
AD
218 if(data['tag']){
219 value = value + 'v' + data['tag'];
220 }
0381b693 221 if (data['firewall']){
85c2c7b9
AD
222 value = value + 'f';
223 }
85c2c7b9 224 }
9021b40c
DM
225 if (value) {
226 tmparray.push(key + '=' + value);
227 }
85c2c7b9 228
9021b40c
DM
229 });
230 netarray.push(tmparray.join(','));
231 });
232
233 return netarray.join(';');
640f8f14
DM
234 },
235
853568b0
DM
236 parseLxcNetwork: function(value) {
237 if (!value) {
238 return;
239 }
240
241 var data = {};
242 Ext.Array.each(value.split(','), function(p) {
243 if (!p || p.match(/^\s*$/)) {
244 return; // continue
245 }
5940550c 246 var match_res = p.match(/^(bridge|hwaddr|mtu|name|ip|ip6|gw|gw6|firewall|tag)=(\S+)$/);
853568b0
DM
247 if (!match_res) {
248 // todo: simply ignore errors ?
249 return; // continue
250 }
251 data[match_res[1]] = match_res[2];
252 });
253
254 return data;
255 },
256
72392546
DM
257 printLxcNetwork: function(data) {
258 var tmparray = [];
30a7e3b7 259 Ext.Array.each(['bridge', 'hwaddr', 'mtu', 'name', 'ip',
5940550c 260 'gw', 'ip6', 'gw6', 'firewall', 'tag'], function(key) {
72392546 261 var value = data[key];
72392546
DM
262 if (value) {
263 tmparray.push(key + '=' + value);
264 }
72392546
DM
265 });
266
267 return tmparray.join(',');
268 },
269
b521e972
WB
270 parseLxcMountPoint: function(value) {
271 if (!value) {
272 return;
273 }
274
275 var res = {};
276
277 var errors = false;
278 Ext.Array.each(value.split(','), function(p) {
279 if (!p || p.match(/^\s*$/)) {
280 return; // continue
281 }
282 var match_res = p.match(/^([a-z_]+)=(\S+)$/);
283 if (!match_res) {
284 if (!p.match(/\=/)) {
285 res.file = p;
286 return; // continue
287 }
288 errors = true;
289 return false; // break
290 }
291 var k = match_res[1];
292 if (k === 'volume') {
293 k = 'file';
294 }
295
296 if (Ext.isDefined(res[k])) {
297 errors = true;
298 return false; // break
299 }
300
301 var v = match_res[2];
302
303 res[k] = v;
304 });
305
306 if (errors || !res.file) {
307 return;
308 }
309
283b450e 310 var m = res.file.match(/^([a-z][a-z0-9\-\_\.]*[a-z0-9]):/i);
ae8a861e
WB
311 if (m) {
312 res.storage = m[1];
313 res.type = 'volume';
314 } else if (res.file.match(/^\/dev\//)) {
315 res.type = 'device';
316 } else {
317 res.type = 'bind';
318 }
319
b521e972
WB
320 return res;
321 },
322
323 printLxcMountPoint: function(mp) {
324 var drivestr = mp.file;
325
326 Ext.Object.each(mp, function(key, value) {
ae8a861e
WB
327 if (!Ext.isDefined(value) || key === 'file' ||
328 key === 'type' || key === 'storage') {
b521e972
WB
329 return; // continue
330 }
331 drivestr += ',' + key + '=' + value;
332 });
333
334 return drivestr;
335 },
336
640f8f14
DM
337 parseStartup: function(value) {
338 if (value === undefined) {
339 return;
340 }
341
342 var res = {};
343
344 var errors = false;
345 Ext.Array.each(value.split(','), function(p) {
346 if (!p || p.match(/^\s*$/)) {
347 return; // continue
348 }
349
350 var match_res;
351
352 if ((match_res = p.match(/^(order)?=(\d+)$/)) !== null) {
353 res.order = match_res[2];
354 } else if ((match_res = p.match(/^up=(\d+)$/)) !== null) {
355 res.up = match_res[1];
356 } else if ((match_res = p.match(/^down=(\d+)$/)) !== null) {
357 res.down = match_res[1];
358 } else {
359 errors = true;
360 return false; // break
361 }
362 });
363
364 if (errors) {
365 return;
366 }
367
368 return res;
369 },
0381b693 370
640f8f14
DM
371 printStartup: function(startup) {
372 var arr = [];
373 if (startup.order !== undefined && startup.order !== '') {
374 arr.push('order=' + startup.order);
375 }
376 if (startup.up !== undefined && startup.up !== '') {
377 arr.push('up=' + startup.up);
378 }
379 if (startup.down !== undefined && startup.down !== '') {
380 arr.push('down=' + startup.down);
381 }
382
383 return arr.join(',');
71b05bd6
DM
384 },
385
386 parseQemuSmbios1: function(value) {
387 var res = {};
388
389 Ext.Array.each(value.split(','), function(p) {
390 var kva = p.split(/=/, 2);
391 res[kva[0]] = kva[1];
392 });
393
394 return res;
395 },
396
397 printQemuSmbios1: function(data) {
398
399 var datastr = '';
400
401 Ext.Object.each(data, function(key, value) {
402 if (value === '') return;
403 datastr += (datastr !== '' ? ',' : '') + key + '=' + value;
404 });
405
406 return datastr;
407 },
408
c5ebd41f
DM
409 parseTfaConfig: function(value) {
410 var res = {};
411
412 Ext.Array.each(value.split(','), function(p) {
413 var kva = p.split(/=/, 2);
414 res[kva[0]] = kva[1];
415 });
416
417 return res;
0f2c29ad
WB
418 },
419
420 parseQemuCpu: function(value) {
421 if (!value) {
730b2558 422 return {};
0f2c29ad
WB
423 }
424
425 var res = {};
426
427 var errors = false;
428 Ext.Array.each(value.split(','), function(p) {
429 if (!p || p.match(/^\s*$/)) {
430 return; // continue
431 }
432
433 if (!p.match(/=/)) {
434 if (Ext.isDefined(res['cpu'])) {
435 errors = true;
436 return false; // break
437 }
438 res.cputype = p;
439 return; // continue
440 }
441
442 var match_res = p.match(/^([a-z_]+)=(\S+)$/);
443 if (!match_res) {
444 errors = true;
445 return false; // break
446 }
447
448 var k = match_res[1];
449 if (Ext.isDefined(res[k])) {
450 errors = true;
451 return false; // break
452 }
453
454 res[k] = match_res[2];
455 });
456
457 if (errors || !res.cputype) {
458 return;
459 }
460
461 return res;
462 },
463
464 printQemuCpu: function(cpu) {
465 var cpustr = cpu.cputype;
730b2558 466 var optstr = '';
0f2c29ad
WB
467
468 Ext.Object.each(cpu, function(key, value) {
469 if (!Ext.isDefined(value) || key === 'cputype') {
470 return; // continue
471 }
730b2558 472 optstr += ',' + key + '=' + value;
0f2c29ad
WB
473 });
474
730b2558
WB
475 if (!cpustr) {
476 if (optstr)
477 return 'kvm64' + optstr;
478 return;
479 }
640f8f14 480
730b2558
WB
481 return cpustr + optstr;
482 },
aff192e6 483}});