r3253 Fixed isConfigVarChanged()
[racktables] / inc / ophandlers.php
1 <?php
2 /*
3 *
4 * This file is a library of operation handlers for RackTables.
5 *
6 */
7
8 $msgcode = array();
9
10 function buildWideRedirectURL ($log, $nextpage = NULL, $nexttab = NULL, $moreArgs = array())
11 {
12 global $page, $pageno, $tabno;
13 if ($nextpage === NULL)
14 $nextpage = $pageno;
15 if ($nexttab === NULL)
16 $nexttab = $tabno;
17 $url = "index.php?page=${nextpage}&tab=${nexttab}";
18 if (isset ($page[$nextpage]['bypass']))
19 $url .= '&' . $page[$nextpage]['bypass'] . '=' . $_REQUEST[$page[$nextpage]['bypass']];
20
21 if (count($moreArgs)>0)
22 {
23 foreach($moreArgs as $arg=>$value)
24 {
25 if (gettype($value) == 'array')
26 {
27 foreach ($value as $v)
28 {
29 $url .= '&'.urlencode($arg.'[]').'='.urlencode($v);
30 }
31 }
32 else
33 $url .= '&'.urlencode($arg).'='.urlencode($value);
34 }
35 }
36
37 $_SESSION['log'] = $log;
38 return $url;
39 }
40
41 function buildRedirectURL ($callfunc, $status, $args = array(), $nextpage = NULL, $nexttab = NULL)
42 {
43 global $pageno, $tabno, $msgcode;
44 if ($nextpage === NULL)
45 $nextpage = $pageno;
46 if ($nexttab === NULL)
47 $nexttab = $tabno;
48 return buildWideRedirectURL (oneLiner ($msgcode[$callfunc][$status], $args), $nextpage, $nexttab);
49 }
50
51 $msgcode['addPortForwarding']['OK'] = 2;
52 $msgcode['addPortForwarding']['ERR'] = 100;
53 function addPortForwarding ()
54 {
55 assertUIntArg ('object_id');
56 assertIPv4Arg ('localip');
57 assertIPv4Arg ('remoteip');
58 assertUIntArg ('localport');
59 assertStringArg ('proto');
60 assertStringArg ('description', TRUE);
61 $remoteport = isset ($_REQUEST['remoteport']) ? $_REQUEST['remoteport'] : '';
62 if (!strlen ($remoteport))
63 $remoteport = $_REQUEST['localport'];
64
65 $error = newPortForwarding
66 (
67 $_REQUEST['object_id'],
68 $_REQUEST['localip'],
69 $_REQUEST['localport'],
70 $_REQUEST['remoteip'],
71 $remoteport,
72 $_REQUEST['proto'],
73 $_REQUEST['description']
74 );
75
76 if ($error == '')
77 return buildRedirectURL (__FUNCTION__, 'OK');
78 else
79 return buildRedirectURL (__FUNCTION__, 'ERR', array ($error));
80 }
81
82 $msgcode['delPortForwarding']['OK'] = 3;
83 $msgcode['delPortForwarding']['ERR'] = 100;
84 function delPortForwarding ()
85 {
86 assertUIntArg ('object_id');
87 assertIPv4Arg ('localip');
88 assertIPv4Arg ('remoteip');
89 assertUIntArg ('localport');
90 assertUIntArg ('remoteport');
91 assertStringArg ('proto');
92
93 $error = deletePortForwarding
94 (
95 $_REQUEST['object_id'],
96 $_REQUEST['localip'],
97 $_REQUEST['localport'],
98 $_REQUEST['remoteip'],
99 $_REQUEST['remoteport'],
100 $_REQUEST['proto']
101 );
102 if ($error == '')
103 return buildRedirectURL (__FUNCTION__, 'OK');
104 else
105 return buildRedirectURL (__FUNCTION__, 'ERR', array ($error));
106 }
107
108 $msgcode['updPortForwarding']['OK'] = 4;
109 $msgcode['updPortForwarding']['ERR'] = 100;
110 function updPortForwarding ()
111 {
112 assertUIntArg ('object_id');
113 assertIPv4Arg ('localip');
114 assertIPv4Arg ('remoteip');
115 assertUIntArg ('localport');
116 assertUIntArg ('remoteport');
117 assertStringArg ('proto');
118 assertStringArg ('description');
119
120 $error = updatePortForwarding
121 (
122 $_REQUEST['object_id'],
123 $_REQUEST['localip'],
124 $_REQUEST['localport'],
125 $_REQUEST['remoteip'],
126 $_REQUEST['remoteport'],
127 $_REQUEST['proto'],
128 $_REQUEST['description']
129 );
130 if ($error == '')
131 return buildRedirectURL (__FUNCTION__, 'OK');
132 else
133 return buildRedirectURL (__FUNCTION__, 'ERR', array ($error));
134 }
135
136 $msgcode['addPortForObject']['OK'] = 5;
137 $msgcode['addPortForObject']['ERR1'] = 101;
138 $msgcode['addPortForObject']['ERR2'] = 100;
139 function addPortForObject ()
140 {
141 assertUIntArg ('object_id');
142 assertStringArg ('port_name', TRUE);
143 if (!strlen ($_REQUEST['port_name']))
144 return buildRedirectURL (__FUNCTION__, 'ERR1');
145 $error = commitAddPort ($_REQUEST['object_id'], $_REQUEST['port_name'], $_REQUEST['port_type_id'], $_REQUEST['port_label'], $_REQUEST['port_l2address']);
146 if ($error != '')
147 return buildRedirectURL (__FUNCTION__, 'ERR2', array ($error));
148 else
149 return buildRedirectURL (__FUNCTION__, 'OK', array ($_REQUEST['port_name']));
150 }
151
152 $msgcode['editPortForObject']['OK'] = 6;
153 $msgcode['editPortForObject']['ERR1'] = 101;
154 $msgcode['editPortForObject']['ERR2'] = 100;
155 function editPortForObject ()
156 {
157 assertUIntArg ('object_id');
158 assertUIntArg ('port_id');
159 assertUIntArg ('port_type_id');
160 // tolerate empty value now to produce custom informative message later
161 assertStringArg ('name', TRUE);
162 if (!strlen ($_REQUEST['name']))
163 return buildRedirectURL (__FUNCTION__, 'ERR1');
164
165 if (isset ($_REQUEST['reservation_comment']) and strlen ($_REQUEST['reservation_comment']))
166 $port_rc = '"' . $_REQUEST['reservation_comment'] . '"';
167 else
168 $port_rc = 'NULL';
169 $error = commitUpdatePort ($_REQUEST['object_id'], $_REQUEST['port_id'], $_REQUEST['name'], $_REQUEST['port_type_id'], $_REQUEST['label'], $_REQUEST['l2address'], $port_rc);
170 if ($error != '')
171 return buildRedirectURL (__FUNCTION__, 'ERR2', array ($error));
172 else
173 return buildRedirectURL (__FUNCTION__, 'OK', array ($_REQUEST['name']));
174 }
175
176 $msgcode['delPortFromObject']['OK'] = 7;
177 $msgcode['delPortFromObject']['ERR'] = 100;
178 function delPortFromObject ()
179 {
180 assertUIntArg ('port_id');
181 $error = delObjectPort ($_REQUEST['port_id']);
182
183 if ($error != '')
184 return buildRedirectURL (__FUNCTION__, 'ERR', array ($error));
185 else
186 return buildRedirectURL (__FUNCTION__, 'OK', array ($_REQUEST['port_name']));
187 }
188
189 $msgcode['linkPortForObject']['OK'] = 8;
190 $msgcode['linkPortForObject']['ERR'] = 100;
191 function linkPortForObject ()
192 {
193 assertUIntArg ('port_id');
194 assertUIntArg ('remote_port_id');
195
196 // FIXME: ensure, that at least one of these ports belongs to the current object
197 $error = linkPorts ($_REQUEST['port_id'], $_REQUEST['remote_port_id']);
198 if ($error != '')
199 return buildRedirectURL (__FUNCTION__, 'ERR', array ($error));
200 $local_port_info = getPortInfo ($_REQUEST['port_id']);
201 $remote_port_info = getPortInfo ($_REQUEST['remote_port_id']);
202 $remote_object = spotEntity ('object', $remote_port_info['object_id']);
203 return buildRedirectURL
204 (
205 __FUNCTION__,
206 'OK',
207 array
208 (
209 $local_port_info['name'],
210 $remote_port_info['name'],
211 $remote_object['dname'],
212 )
213 );
214 }
215
216 $msgcode['unlinkPortForObject']['OK'] = 9;
217 $msgcode['unlinkPortForObject']['ERR'] = 100;
218 function unlinkPortForObject ()
219 {
220 assertUIntArg ('port_id');
221 assertUIntArg ('remote_port_id');
222
223 $local_port_info = getPortInfo ($_REQUEST['port_id']);
224 $remote_port_info = getPortInfo ($_REQUEST['remote_port_id']);
225 $remote_object = spotEntity ('object', $remote_port_info['object_id']);
226 $error = unlinkPort ($_REQUEST['port_id']);
227 if ($error != '')
228 return buildRedirectURL (__FUNCTION__, 'ERR', array ($error));
229 return buildRedirectURL
230 (
231 __FUNCTION__,
232 'OK',
233 array
234 (
235 $local_port_info['name'],
236 $remote_port_info['name'],
237 $remote_object['dname'],
238 )
239 );
240 }
241
242 $msgcode['addMultiPorts']['OK'] = 10;
243 $msgcode['addMultiPorts']['ERR'] = 123;
244 function addMultiPorts ()
245 {
246 assertStringArg ('format');
247 assertStringArg ('input');
248 assertUIntArg ('port_type');
249 assertUIntArg ('object_id');
250 $format = $_REQUEST['format'];
251 $port_type = $_REQUEST['port_type'];
252 $object_id = $_REQUEST['object_id'];
253 // Input lines are escaped, so we have to explode and to chop by 2-char
254 // \n and \r respectively.
255 $lines1 = explode ('\n', $_REQUEST['input']);
256 foreach ($lines1 as $line)
257 {
258 $parts = explode ('\r', $line);
259 reset ($parts);
260 if (!strlen ($parts[0]))
261 continue;
262 else
263 $lines2[] = rtrim ($parts[0]);
264 }
265 $ports = array();
266 foreach ($lines2 as $line)
267 {
268 switch ($format)
269 {
270 case 'fisxii':
271 $words = explode (' ', ereg_replace ('[[:space:]]+', ' ', $line));
272 list ($slot, $port) = explode ('/', $words[0]);
273 $ports[] = array
274 (
275 'name' => "e ${slot}/${port}",
276 'l2address' => $words[8],
277 'label' => "slot ${slot} port ${port}"
278 );
279 break;
280 case 'c3600asy':
281 $words = explode (' ', ereg_replace ('[[:space:]]+', ' ', trim (substr ($line, 3))));
282 /*
283 How Async Lines are Numbered in Cisco 3600 Series Routers
284 http://www.cisco.com/en/US/products/hw/routers/ps274/products_tech_note09186a00801ca70b.shtml
285
286 Understanding 16- and 32-Port Async Network Modules
287 http://www.cisco.com/en/US/products/hw/routers/ps274/products_tech_note09186a00800a93f0.shtml
288 */
289 $async = $words[0];
290 $slot = floor (($async - 1) / 32);
291 $octalgroup = floor (($async - 1 - $slot * 32) / 8);
292 $cable = $async - $slot * 32 - $octalgroup * 8;
293 $og_label[0] = 'async 0-7';
294 $og_label[1] = 'async 8-15';
295 $og_label[2] = 'async 16-23';
296 $og_label[3] = 'async 24-31';
297 $ports[] = array
298 (
299 'name' => "async ${async}",
300 'l2address' => '',
301 'label' => "slot ${slot} " . $og_label[$octalgroup] . " cable ${cable}"
302 );
303 break;
304 case 'fiwg':
305 $words = explode (' ', ereg_replace ('[[:space:]]+', ' ', $line));
306 $ifnumber = $words[0] * 1;
307 $ports[] = array
308 (
309 'name' => "e ${ifnumber}",
310 'l2address' => "${words[8]}",
311 'label' => "${ifnumber}"
312 );
313 break;
314 case 'ssv1':
315 $words = explode (' ', $line);
316 if (!strlen ($words[0]) or !strlen ($words[1]))
317 continue;
318 $ports[] = array
319 (
320 'name' => $words[0],
321 'l2address' => $words[1],
322 'label' => ''
323 );
324 break;
325 default:
326 return buildRedirectURL (__FUNCTION__, 'ERR');
327 break;
328 }
329 }
330 // Create ports, if they don't exist.
331 $added_count = $updated_count = $error_count = 0;
332 foreach ($ports as $port)
333 {
334 $port_id = getPortID ($object_id, $port['name']);
335 if ($port_id === NULL)
336 {
337 $result = commitAddPort ($object_id, $port['name'], $port_type, $port['label'], $port['l2address']);
338 if ($result == '')
339 $added_count++;
340 else
341 $error_count++;
342 }
343 else
344 {
345 $result = commitUpdatePort ($object_id, $port_id, $port['name'], $port_type, $port['label'], $port['l2address']);
346 if ($result == '')
347 $updated_count++;
348 else
349 $error_count++;
350 }
351 }
352 return buildRedirectURL (__FUNCTION__, 'OK', array ($added_count, $updated_count, $error_count));
353 }
354
355 $msgcode['updIPv4Allocation']['OK'] = 12;
356 $msgcode['updIPv4Allocation']['ERR'] = 100;
357 function updIPv4Allocation ()
358 {
359 assertIPv4Arg ('ip');
360 assertUIntArg ('object_id');
361 assertStringArg ('bond_name', TRUE);
362 assertStringArg ('bond_type');
363
364 $error = updateBond ($_REQUEST['ip'], $_REQUEST['object_id'], $_REQUEST['bond_name'], $_REQUEST['bond_type']);
365 if ($error != '')
366 return buildRedirectURL (__FUNCTION__, 'ERR', array ($error));
367 else
368 return buildRedirectURL (__FUNCTION__, 'OK');
369 }
370
371 $msgcode['delIPv4Allocation']['OK'] = 14;
372 $msgcode['delIPv4Allocation']['ERR'] = 100;
373 function delIPv4Allocation ()
374 {
375 assertIPv4Arg ('ip');
376 assertUIntArg ('object_id');
377
378 $error = unbindIpFromObject ($_REQUEST['ip'], $_REQUEST['object_id']);
379 if ($error != '')
380 return buildRedirectURL (__FUNCTION__, 'ERR', array ($error));
381 else
382 return buildRedirectURL (__FUNCTION__, 'OK');
383 }
384
385 $msgcode['addIPv4Allocation']['OK'] = 13;
386 $msgcode['addIPv4Allocation']['ERR1'] = 170;
387 $msgcode['addIPv4Allocation']['ERR2'] = 100;
388 function addIPv4Allocation ()
389 {
390 assertIPv4Arg ('ip');
391 assertUIntArg ('object_id');
392 assertStringArg ('bond_name', TRUE);
393 assertStringArg ('bond_type');
394
395 // Strip masklen.
396 $ip = ereg_replace ('/[[:digit:]]+$', '', $_REQUEST['ip']);
397 if (getConfigVar ('IPV4_JAYWALK') != 'yes' and NULL === getIPv4AddressNetworkId ($ip))
398 return buildRedirectURL (__FUNCTION__, 'ERR1', array ($ip));
399
400 $error = bindIpToObject ($ip, $_REQUEST['object_id'], $_REQUEST['bond_name'], $_REQUEST['bond_type']);
401 if ($error != '')
402 return buildRedirectURL (__FUNCTION__, 'ERR2', array ($error));
403 $address = getIPv4Address ($ip);
404 if ($address['reserved'] == 'yes' or strlen ($address['name']))
405 {
406 $release = getConfigVar ('IPV4_AUTO_RELEASE');
407 if ($release >= 1)
408 $address['reserved'] = 'no';
409 if ($release >= 2)
410 $address['name'] = '';
411 updateAddress ($ip, $address['name'], $address['reserved']);
412 }
413 return buildRedirectURL (__FUNCTION__, 'OK');
414 }
415
416 $msgcode['addIPv4Prefix']['OK'] = 23;
417 $msgcode['addIPv4Prefix']['ERR'] = 100;
418 $msgcode['addIPv4Prefix']['ERR1'] = 173;
419 $msgcode['addIPv4Prefix']['ERR2'] = 174;
420 $msgcode['addIPv4Prefix']['ERR3'] = 175;
421 $msgcode['addIPv4Prefix']['ERR4'] = 176;
422 function addIPv4Prefix ()
423 {
424 assertStringArg ('range');
425 assertStringArg ('name', TRUE);
426
427 $is_bcast = isset ($_REQUEST['is_bcast']) ? $_REQUEST['is_bcast'] : 'off';
428 $taglist = isset ($_REQUEST['taglist']) ? $_REQUEST['taglist'] : array();
429 global $sic;
430 $error = createIPv4Prefix ($_REQUEST['range'], $sic['name'], $is_bcast == 'on', $taglist);
431 if ($error != '')
432 return buildRedirectURL (__FUNCTION__, 'ERR', array ($error));
433 else
434 return buildRedirectURL (__FUNCTION__, 'OK');
435 }
436
437 $msgcode['delIPv4Prefix']['OK'] = 24;
438 $msgcode['delIPv4Prefix']['ERR'] = 100;
439 function delIPv4Prefix ()
440 {
441 assertUIntArg ('id');
442 $error = destroyIPv4Prefix ($_REQUEST['id']);
443 if ($error != '')
444 return buildRedirectURL (__FUNCTION__, 'ERR', array ($error));
445 else
446 return buildRedirectURL (__FUNCTION__, 'OK');
447 }
448
449 $msgcode['updIPv4Prefix']['OK'] = 25;
450 $msgcode['updIPv4Prefix']['ERR'] = 100;
451 function updIPv4Prefix ()
452 {
453 assertUIntArg ('id');
454 assertStringArg ('name', TRUE);
455 assertStringArg ('comment', TRUE);
456 global $sic;
457 if (strlen ($error = updateIPv4Network_real ($sic['id'], $sic['name'], $sic['comment'])))
458 return buildRedirectURL (__FUNCTION__, 'ERR', array ($error));
459 else
460 return buildRedirectURL (__FUNCTION__, 'OK');
461 }
462
463 $msgcode['editAddress']['OK'] = 27;
464 $msgcode['editAddress']['ERR'] = 100;
465 function editAddress ()
466 {
467 assertIPv4Arg ('ip');
468 assertStringArg ('name', TRUE);
469
470 if (isset ($_REQUEST['reserved']))
471 $reserved = $_REQUEST['reserved'];
472 else
473 $reserved = 'off';
474 $error = updateAddress ($_REQUEST['ip'], $_REQUEST['name'], $reserved == 'on' ? 'yes' : 'no');
475 if ($error != '')
476 return buildRedirectURL (__FUNCTION__, 'ERR', array ($error));
477 else
478 return buildRedirectURL (__FUNCTION__, 'OK');
479 }
480
481 $msgcode['createUser']['OK'] = 40;
482 $msgcode['createUser']['ERR'] = 102;
483 function createUser ()
484 {
485 assertStringArg ('username');
486 assertStringArg ('realname', TRUE);
487 assertStringArg ('password');
488 $username = $_REQUEST['username'];
489 $password = sha1 ($_REQUEST['password']);
490 $result = commitCreateUserAccount ($username, $_REQUEST['realname'], $password);
491 if ($result != TRUE)
492 return buildRedirectURL (__FUNCTION__, 'ERR', array ($username));
493 if (isset ($_REQUEST['taglist']))
494 produceTagsForLastRecord ('user', $_REQUEST['taglist']);
495 return buildRedirectURL (__FUNCTION__, 'OK', array ($username));
496 }
497
498 $msgcode['updateUser']['OK'] = 39;
499 $msgcode['updateUser']['ERR1'] = 103;
500 $msgcode['updateUser']['ERR1'] = 104;
501 function updateUser ()
502 {
503 assertUIntArg ('user_id');
504 assertStringArg ('username');
505 assertStringArg ('realname', TRUE);
506 assertStringArg ('password');
507 $username = $_REQUEST['username'];
508 $new_password = $_REQUEST['password'];
509 if (NULL == ($userinfo = spotEntity ('user', $_REQUEST['user_id'])))
510 return buildRedirectURL (__FUNCTION__, 'ERR1');
511 // Update user password only if provided password is not the same as current password hash.
512 if ($new_password != $userinfo['user_password_hash'])
513 $new_password = sha1 ($new_password);
514 $result = commitUpdateUserAccount ($_REQUEST['user_id'], $username, $_REQUEST['realname'], $new_password);
515 if ($result == TRUE)
516 return buildRedirectURL (__FUNCTION__, 'OK', array ($username));
517 else
518 return buildRedirectURL (__FUNCTION__, 'ERR2', array ($username));
519 }
520
521 $msgcode['updateDictionary']['OK'] = 51;
522 $msgcode['updateDictionary']['ERR'] = 109;
523 function updateDictionary ()
524 {
525 assertUIntArg ('chapter_no');
526 assertUIntArg ('dict_key');
527 assertStringArg ('dict_value');
528 if (commitUpdateDictionary ($_REQUEST['chapter_no'], $_REQUEST['dict_key'], $_REQUEST['dict_value']) === TRUE)
529 return buildRedirectURL (__FUNCTION__, 'OK');
530 else
531 return buildRedirectURL (__FUNCTION__, 'ERR');
532 }
533
534 $msgcode['supplementDictionary']['OK'] = 52;
535 $msgcode['supplementDictionary']['ERR'] = 110;
536 function supplementDictionary ()
537 {
538 assertUIntArg ('chapter_no');
539 assertStringArg ('dict_value');
540 if (commitSupplementDictionary ($_REQUEST['chapter_no'], $_REQUEST['dict_value']) === TRUE)
541 return buildRedirectURL (__FUNCTION__, 'OK');
542 else
543 return buildRedirectURL (__FUNCTION__, 'ERR');
544 }
545
546 $msgcode['reduceDictionary']['OK'] = 50;
547 $msgcode['reduceDictionary']['ERR'] = 111;
548 function reduceDictionary ()
549 {
550 assertUIntArg ('chapter_no');
551 assertUIntArg ('dict_key');
552 if (commitReduceDictionary ($_REQUEST['chapter_no'], $_REQUEST['dict_key']) === TRUE)
553 return buildRedirectURL (__FUNCTION__, 'OK');
554 else
555 return buildRedirectURL (__FUNCTION__, 'ERR');
556 }
557
558 $msgcode['addChapter']['OK'] = 55;
559 $msgcode['addChapter']['ERR'] = 112;
560 function addChapter ()
561 {
562 assertStringArg ('chapter_name');
563 if (commitAddChapter ($_REQUEST['chapter_name']) === TRUE)
564 return buildRedirectURL (__FUNCTION__, 'OK');
565 else
566 return buildRedirectURL (__FUNCTION__, 'ERR');
567 }
568
569 $msgcode['updateChapter']['OK'] = 54;
570 $msgcode['updateChapter']['ERR'] = 113;
571 function updateChapter ()
572 {
573 assertUIntArg ('chapter_no');
574 assertStringArg ('chapter_name');
575 if (commitUpdateChapter ($_REQUEST['chapter_no'], $_REQUEST['chapter_name']) === TRUE)
576 return buildRedirectURL (__FUNCTION__, 'OK');
577 else
578 return buildRedirectURL (__FUNCTION__, 'ERR');
579 }
580
581 $msgcode['delChapter']['OK'] = 53;
582 $msgcode['delChapter']['ERR'] = 114;
583 function delChapter ()
584 {
585 assertUIntArg ('chapter_no');
586 if (commitDeleteChapter ($_REQUEST['chapter_no']))
587 return buildRedirectURL (__FUNCTION__, 'OK');
588 else
589 return buildRedirectURL (__FUNCTION__, 'ERR');
590 }
591
592 $msgcode['changeAttribute']['OK'] = 46;
593 $msgcode['changeAttribute']['ERR'] = 115;
594 function changeAttribute ()
595 {
596 assertUIntArg ('attr_id');
597 assertStringArg ('attr_name');
598 if (commitUpdateAttribute ($_REQUEST['attr_id'], $_REQUEST['attr_name']))
599 return buildRedirectURL (__FUNCTION__, 'OK');
600 else
601 return buildRedirectURL (__FUNCTION__, 'ERR');
602 }
603
604 $msgcode['createAttribute']['OK'] = 45;
605 $msgcode['createAttribute']['ERR'] = 116;
606 function createAttribute ()
607 {
608 assertStringArg ('attr_name');
609 assertStringArg ('attr_type');
610 if (commitAddAttribute ($_REQUEST['attr_name'], $_REQUEST['attr_type']))
611 return buildRedirectURL (__FUNCTION__, 'OK', array ($_REQUEST['attr_name']));
612 else
613 return buildRedirectURL (__FUNCTION__, 'ERR');
614 }
615
616 $msgcode['deleteAttribute']['OK'] = 47;
617 $msgcode['deleteAttribute']['ERR'] = 117;
618 function deleteAttribute ()
619 {
620 assertUIntArg ('attr_id');
621 if (commitDeleteAttribute ($_REQUEST['attr_id']))
622 return buildRedirectURL (__FUNCTION__, 'OK');
623 else
624 return buildRedirectURL (__FUNCTION__, 'ERR');
625 }
626
627 $msgcode['supplementAttrMap']['OK'] = 48;
628 $msgcode['supplementAttrMap']['ERR1'] = 154;
629 $msgcode['supplementAttrMap']['ERR2'] = 118;
630 function supplementAttrMap ()
631 {
632 assertUIntArg ('attr_id');
633 assertUIntArg ('objtype_id');
634 $attrMap = getAttrMap();
635 if ($attrMap[$_REQUEST['attr_id']]['type'] != 'dict')
636 $chapter_id = 'NULL';
637 else
638 {
639 assertUIntArg ('chapter_no'); // FIXME: this doesn't fail on 0 (ticket:272)
640 if (0 == ($chapter_id = $_REQUEST['chapter_no']))
641 return buildRedirectURL (__FUNCTION__, 'ERR1', array ('chapter not selected'));
642 }
643 if (commitSupplementAttrMap ($_REQUEST['attr_id'], $_REQUEST['objtype_id'], $chapter_id) === TRUE)
644 return buildRedirectURL (__FUNCTION__, 'OK');
645 else
646 return buildRedirectURL (__FUNCTION__, 'ERR2');
647 }
648
649 $msgcode['reduceAttrMap']['OK'] = 49;
650 $msgcode['reduceAttrMap']['ERR'] = 119;
651 function reduceAttrMap ()
652 {
653 assertUIntArg ('attr_id');
654 assertUIntArg ('objtype_id');
655 if (commitReduceAttrMap ($_REQUEST['attr_id'], $_REQUEST['objtype_id']) === TRUE)
656 return buildRedirectURL (__FUNCTION__, 'OK');
657 else
658 return buildRedirectURL (__FUNCTION__, 'ERR');
659 }
660
661 $msgcode['clearSticker']['OK'] = 15;
662 $msgcode['clearSticker']['ERR'] = 120;
663 function clearSticker ()
664 {
665 assertUIntArg ('attr_id');
666 assertUIntArg ('object_id');
667 if (commitResetAttrValue ($_REQUEST['object_id'], $_REQUEST['attr_id']) === TRUE)
668 return buildRedirectURL (__FUNCTION__, 'OK');
669 else
670 return buildRedirectURL (__FUNCTION__, 'ERR');
671 }
672
673 $msgcode['updateObjectAllocation']['OK'] = 63;
674 function updateObjectAllocation ()
675 {
676 assertUIntArg ('object_id');
677
678 if (!isset ($_REQUEST['got_atoms']))
679 {
680 unset($_GET['page']);
681 unset($_GET['tab']);
682 unset($_GET['op']);
683 unset($_POST['page']);
684 unset($_POST['tab']);
685 unset($_POST['op']);
686 return buildWideRedirectURL (array(), NULL, NULL, array_merge ($_GET, $_POST));
687 }
688 $object_id = $_REQUEST['object_id'];
689 $workingRacksData = array();
690 foreach ($_REQUEST['rackmulti'] as $cand_id)
691 {
692 if (!isset ($workingRacksData[$cand_id]))
693 {
694 $rackData = spotEntity ('rack', $cand_id);
695 amplifyCell ($rackData);
696 $workingRacksData[$cand_id] = $rackData;
697 }
698 }
699
700 foreach ($workingRacksData as &$rd)
701 applyObjectMountMask ($rd, $object_id);
702
703 $oldMolecule = getMoleculeForObject ($object_id);
704 $changecnt = 0;
705 $log = array();
706 foreach ($workingRacksData as $rack_id => $rackData)
707 {
708 $logrecord = processGridForm ($rackData, 'F', 'T', $object_id);
709 $log[] = $logrecord;
710 if ($logrecord['code'] == 300)
711 continue;
712 $changecnt++;
713 // Reload our working copy after form processing.
714 $rackData = spotEntity ('rack', $cand_id);
715 amplifyCell ($rackData);
716 applyObjectMountMask ($rackData, $object_id);
717 $workingRacksData[$rack_id] = $rackData;
718 }
719 if (!$changecnt)
720 return buildRedirectURL (__FUNCTION__, 'OK', $changecnt);
721 // Log a record.
722 $newMolecule = getMoleculeForObject ($object_id);
723 $oc = count ($oldMolecule);
724 $nc = count ($newMolecule);
725 $omid = $oc ? createMolecule ($oldMolecule) : 'NULL';
726 $nmid = $nc ? createMolecule ($newMolecule) : 'NULL';
727 global $remote_username;
728 $comment = empty ($_REQUEST['comment']) ? 'NULL' : "'${_REQUEST['comment']}'";
729 $query =
730 "insert into MountOperation(object_id, old_molecule_id, new_molecule_id, user_name, comment) " .
731 "values (${object_id}, ${omid}, ${nmid}, '${remote_username}', ${comment})";
732 global $dbxlink;
733 $result = $dbxlink->query ($query);
734 if ($result == NULL)
735 $log[] = array ('code' => 500, 'message' => 'SQL query failed during history logging.');
736 else
737 $log[] = array ('code' => 200, 'message' => 'History logged.');
738 return buildWideRedirectURL ($log);
739 }
740
741 $msgcode['updateObject']['OK'] = 16;
742 $msgcode['updateObject']['ERR'] = 121;
743 function updateObject ()
744 {
745 assertUIntArg ('num_attrs', TRUE);
746 assertUIntArg ('object_id');
747 assertUIntArg ('object_type_id');
748 assertStringArg ('object_name', TRUE);
749 assertStringArg ('object_label', TRUE);
750 assertStringArg ('object_barcode', TRUE);
751 assertStringArg ('object_asset_no', TRUE);
752 if (isset ($_REQUEST['object_has_problems']) and $_REQUEST['object_has_problems'] == 'on')
753 $has_problems = 'yes';
754 else
755 $has_problems = 'no';
756
757 if (commitUpdateObject (
758 $_REQUEST['object_id'],
759 $_REQUEST['object_name'],
760 $_REQUEST['object_label'],
761 $_REQUEST['object_barcode'],
762 $_REQUEST['object_type_id'],
763 $has_problems,
764 $_REQUEST['object_asset_no'],
765 $_REQUEST['object_comment']
766 ) !== TRUE)
767 return buildRedirectURL (__FUNCTION__, 'ERR');
768
769 // Update optional attributes
770 $oldvalues = getAttrValues ($_REQUEST['object_id']);
771 $result = array();
772 $num_attrs = isset ($_REQUEST['num_attrs']) ? $_REQUEST['num_attrs'] : 0;
773 for ($i = 0; $i < $num_attrs; $i++)
774 {
775 assertUIntArg ("${i}_attr_id");
776 $attr_id = $_REQUEST["${i}_attr_id"];
777
778 // Field is empty, delete attribute and move on.
779 if (!strlen ($_REQUEST["${i}_value"]))
780 {
781 commitResetAttrValue ($_REQUEST['object_id'], $attr_id);
782 continue;
783 }
784
785 // The value could be uint/float, but we don't know ATM. Let SQL
786 // server check this and complain.
787 assertStringArg ("${i}_value");
788 $value = $_REQUEST["${i}_value"];
789 switch ($oldvalues[$attr_id]['type'])
790 {
791 case 'uint':
792 case 'float':
793 case 'string':
794 $oldvalue = $oldvalues[$attr_id]['value'];
795 break;
796 case 'dict':
797 $oldvalue = $oldvalues[$attr_id]['key'];
798 break;
799 default:
800 throw new RuntimeException('Internal structure error');
801 }
802 if ($value === $oldvalue) // ('' == 0), but ('' !== 0)
803 continue;
804
805 // Note if the queries succeed or not, it determines which page they see.
806 $result[] = commitUpdateAttrValue ($_REQUEST['object_id'], $attr_id, $value);
807 }
808 if (in_array (FALSE, $result))
809 return buildRedirectURL (__FUNCTION__, 'ERR');
810
811 // Invalidate thumb cache of all racks objects could occupy.
812 foreach (getResidentRacksData ($_REQUEST['object_id'], FALSE) as $rack_id)
813 resetThumbCache ($rack_id);
814
815 return buildRedirectURL (__FUNCTION__, 'OK');
816 }
817
818
819 function addMultipleObjects()
820 {
821 $log = emptyLog();
822 $taglist = isset ($_REQUEST['taglist']) ? $_REQUEST['taglist'] : array();
823 $max = getConfigVar ('MASSCOUNT');
824 for ($i = 0; $i < $max; $i++)
825 {
826 if (!isset ($_REQUEST["${i}_object_type_id"]))
827 {
828 $log = mergeLogs ($log, oneLiner (184, array ($i + 1)));
829 break;
830 }
831 assertUIntArg ("${i}_object_type_id", TRUE);
832 assertStringArg ("${i}_object_name", TRUE);
833 assertStringArg ("${i}_object_label", TRUE);
834 assertStringArg ("${i}_object_asset_no", TRUE);
835 assertStringArg ("${i}_object_barcode", TRUE);
836 $name = $_REQUEST["${i}_object_name"];
837
838 // It's better to skip silently, than to print a notice.
839 if ($_REQUEST["${i}_object_type_id"] == 0)
840 continue;
841 if (($object_id = commitAddObject
842 (
843 $name,
844 $_REQUEST["${i}_object_label"],
845 $_REQUEST["${i}_object_barcode"],
846 $_REQUEST["${i}_object_type_id"],
847 $_REQUEST["${i}_object_asset_no"],
848 $taglist
849 )) !== FALSE){
850 $info = spotEntity ('object', $object_id);
851 // FIXME: employ amplifyCell() instead of calling loader functions directly
852 amplifyCell ($info);
853 $log = mergeLogs ($log, oneLiner (80, array ('<a href="' . makeHref (array ('page' => 'object', 'tab' => 'default', 'object_id' => $object_id)) . '">' . $info['dname'] . '</a>')));
854 }else{
855 $log = mergeLogs ($log, oneLiner (185, array ($name)));
856 }
857 }
858 return buildWideRedirectURL ($log);
859 }
860
861 function addLotOfObjects()
862 {
863 $log = emptyLog();
864 $taglist = isset ($_REQUEST['taglist']) ? $_REQUEST['taglist'] : array();
865 assertUIntArg ('global_type_id', TRUE);
866 assertStringArg ('namelist', TRUE);
867 $global_type_id = $_REQUEST['global_type_id'];
868 if ($global_type_id == 0 or !strlen ($_REQUEST['namelist']))
869 $log = mergeLogs ($log, oneLiner (186));
870 else
871 {
872 // The name extractor below was stolen from ophandlers.php:addMultiPorts()
873 $names1 = explode ('\n', $_REQUEST['namelist']);
874 $names2 = array();
875 foreach ($names1 as $line)
876 {
877 $parts = explode ('\r', $line);
878 reset ($parts);
879 if (!strlen ($parts[0]))
880 continue;
881 else
882 $names2[] = rtrim ($parts[0]);
883 }
884 foreach ($names2 as $name)
885 if (commitAddObject ($name, '', '', $global_type_id, '', $taglist) !== FALSE)
886 $log = mergeLogs ($log, oneLiner (80, array ($name)));
887 else
888 $log = mergeLogs ($log, oneLiner (185, array ($name)));
889 }
890 return buildWideRedirectURL ($log);
891 }
892
893 $msgcode['deleteObject']['OK'] = 76;
894 $msgcode['deleteObject']['ERR'] = 100;
895 function deleteObject ()
896 {
897 assertUIntArg ('object_id');
898 if (NULL === ($oinfo = spotEntity ('object', $_REQUEST['object_id'])))
899 return buildRedirectURL (__FUNCTION__, 'ERR', array ('object not found'));
900
901 $racklist = getResidentRacksData ($_REQUEST['object_id'], FALSE);
902 $error = commitDeleteObject ($_REQUEST['object_id']);
903 foreach ($racklist as $rack_id)
904 resetThumbCache ($rack_id);
905
906 if ($error != '')
907 return buildRedirectURL (__FUNCTION__, 'ERR', array ($error));
908
909 return buildRedirectURL (__FUNCTION__, 'OK', array ($oinfo['dname']));
910 }
911
912 $msgcode['useupPort']['OK'] = 11;
913 $msgcode['useupPort']['ERR'] = 124;
914 function useupPort ()
915 {
916 assertUIntArg ('port_id');
917 if (commitUseupPort ($_REQUEST['port_id']) === TRUE)
918 return buildRedirectURL (__FUNCTION__, 'OK');
919 else
920 return buildRedirectURL (__FUNCTION__, 'ERR');
921 }
922
923 $msgcode['updateUI']['OK'] = 56;
924 $msgcode['updateUI']['ERR'] = 125;
925 function updateUI ()
926 {
927 assertUIntArg ('num_vars');
928
929 for ($i = 0; $i < $_REQUEST['num_vars']; $i++)
930 {
931 assertStringArg ("${i}_varname");
932 assertStringArg ("${i}_varvalue", TRUE);
933 $varname = $_REQUEST["${i}_varname"];
934 $varvalue = $_REQUEST["${i}_varvalue"];
935
936 // If form value = value in DB, don't bother updating DB
937 if (!isConfigVarChanged($varname, $varvalue))
938 continue;
939
940 // Note if the queries succeed or not, it determines which page they see.
941 try {
942 setConfigVar ($varname, $varvalue, TRUE);
943 } catch (InvalidArgException $e) {
944 return buildRedirectURL (__FUNCTION__, 'ERR', array ($e->getMessage()));
945 }
946 }
947 return buildRedirectURL (__FUNCTION__, 'OK');
948 }
949
950 $msgcode['saveMyPreferences']['OK'] = 56;
951 $msgcode['saveMyPreferences']['ERR'] = 125;
952 function saveMyPreferences ()
953 {
954 assertUIntArg ('num_vars');
955
956 for ($i = 0; $i < $_REQUEST['num_vars']; $i++)
957 {
958 assertStringArg ("${i}_varname");
959 assertStringArg ("${i}_varvalue", TRUE);
960 $varname = $_REQUEST["${i}_varname"];
961 $varvalue = $_REQUEST["${i}_varvalue"];
962
963 // If form value = value in DB, don't bother updating DB
964 if (!isConfigVarChanged($varname, $varvalue))
965 continue;
966 // Note if the queries succeed or not, it determines which page they see.
967 try {
968 setUserConfigVar ($varname, $varvalue);
969 } catch (InvalidArgException $e) {
970 return buildRedirectURL (__FUNCTION__, 'ERR', array ($e->getMessage()));
971 }
972 }
973 return buildRedirectURL (__FUNCTION__, 'OK');
974 }
975
976 $msgcode['resetMyPreference']['OK'] = 56;
977 $msgcode['resetMyPreference']['ERR'] = 125;
978 function resetMyPreference ()
979 {
980 assertStringArg ("varname");
981 $varname = $_REQUEST["varname"];
982
983 try {
984 resetUserConfigVar ($varname);
985 } catch (InvalidArgException $e) {
986 return buildRedirectURL (__FUNCTION__, 'ERR', array ($e->getMessage()));
987 }
988 return buildRedirectURL (__FUNCTION__, 'OK');
989 }
990
991
992
993
994 $msgcode['resetUIConfig']['OK'] = 57;
995 function resetUIConfig()
996 {
997 setConfigVar ('MASSCOUNT','15');
998 setConfigVar ('MAXSELSIZE','30');
999 setConfigVar ('ROW_SCALE','2');
1000 setConfigVar ('PORTS_PER_ROW','12');
1001 setConfigVar ('IPV4_ADDRS_PER_PAGE','256');
1002 setConfigVar ('DEFAULT_RACK_HEIGHT','42');
1003 setConfigVar ('DEFAULT_SLB_VS_PORT','');
1004 setConfigVar ('DEFAULT_SLB_RS_PORT','');
1005 setConfigVar ('DETECT_URLS','no');
1006 setConfigVar ('RACK_PRESELECT_THRESHOLD','1');
1007 setConfigVar ('DEFAULT_IPV4_RS_INSERVICE','no');
1008 setConfigVar ('AUTOPORTS_CONFIG','4 = 1*33*kvm + 2*24*eth%u;15 = 1*446*kvm');
1009 setConfigVar ('SHOW_EXPLICIT_TAGS','yes');
1010 setConfigVar ('SHOW_IMPLICIT_TAGS','yes');
1011 setConfigVar ('SHOW_AUTOMATIC_TAGS','no');
1012 setConfigVar ('DEFAULT_OBJECT_TYPE','4');
1013 setConfigVar ('IPV4_AUTO_RELEASE','1');
1014 setConfigVar ('SHOW_LAST_TAB', 'no');
1015 setConfigVar ('EXT_IPV4_VIEW', 'yes');
1016 setConfigVar ('TREE_THRESHOLD', '25');
1017 setConfigVar ('IPV4_JAYWALK', 'no');
1018 setConfigVar ('ADDNEW_AT_TOP', 'yes');
1019 setConfigVar ('IPV4_TREE_SHOW_USAGE', 'yes');
1020 setConfigVar ('PREVIEW_TEXT_MAXCHARS', '10240');
1021 setConfigVar ('PREVIEW_TEXT_ROWS', '25');
1022 setConfigVar ('PREVIEW_TEXT_COLS', '80');
1023 setConfigVar ('PREVIEW_IMAGE_MAXPXS', '320');
1024 setConfigVar ('VENDOR_SIEVE', '');
1025 setConfigVar ('IPV4LB_LISTSRC', '{$typeid_4}');
1026 setConfigVar ('IPV4OBJ_LISTSRC','{$typeid_4} or {$typeid_7} or {$typeid_8} or {$typeid_12} or {$typeid_445} or {$typeid_447} or {$typeid_798}');
1027 setConfigVar ('IPV4NAT_LISTSRC','{$typeid_4} or {$typeid_7} or {$typeid_8} or {$typeid_798}');
1028 setConfigVar ('ASSETWARN_LISTSRC','{$typeid_4} or {$typeid_7} or {$typeid_8}');
1029 setConfigVar ('NAMEWARN_LISTSRC','{$typeid_4} or {$typeid_7} or {$typeid_8}');
1030 setConfigVar ('RACKS_PER_ROW','12');
1031 setConfigVar ('FILTER_PREDICATE_SIEVE','');
1032 setConfigVar ('FILTER_DEFAULT_ANDOR','or');
1033 setConfigVar ('FILTER_SUGGEST_ANDOR','yes');
1034 setConfigVar ('FILTER_SUGGEST_TAGS','yes');
1035 setConfigVar ('FILTER_SUGGEST_PREDICATES','yes');
1036 setConfigVar ('FILTER_SUGGEST_EXTRA','no');
1037 setConfigVar ('DEFAULT_SNMP_COMMUNITY','public');
1038 setConfigVar ('IPV4_ENABLE_KNIGHT','yes');
1039 setConfigVar ('TAGS_TOPLIST_SIZE','50');
1040 setConfigVar ('TAGS_QUICKLIST_SIZE','20');
1041 setConfigVar ('TAGS_QUICKLIST_THRESHOLD','50');
1042 setConfigVar ('ENABLE_MULTIPORT_FORM', 'no');
1043 setConfigVar ('DEFAULT_PORT_IIF_ID', '1');
1044 setConfigVar ('DEFAULT_PORT_OIF_IDS', '1=24; 3=1078; 4=1077; 5=1079; 6=1080; 8=1082; 9=1084');
1045 setConfigVar ('IPV4_TREE_RTR_AS_CELL', 'yes');
1046 setConfigVar ('PROXIMITY_RANGE', 0);
1047 return buildRedirectURL (__FUNCTION__, 'OK');
1048 }
1049
1050 $msgcode['addRealServer']['OK'] = 34;
1051 $msgcode['addRealServer']['ERR'] = 126;
1052 // Add single record.
1053 function addRealServer ()
1054 {
1055 assertUIntArg ('pool_id');
1056 assertIPv4Arg ('remoteip');
1057 assertStringArg ('rsport', TRUE);
1058 assertStringArg ('rsconfig', TRUE);
1059 if (!addRStoRSPool (
1060 $_REQUEST['pool_id'],
1061 $_REQUEST['remoteip'],
1062 $_REQUEST['rsport'],
1063 getConfigVar ('DEFAULT_IPV4_RS_INSERVICE'),
1064 $_REQUEST['rsconfig']
1065 ))
1066 return buildRedirectURL (__FUNCTION__, 'ERR');
1067 else
1068 return buildRedirectURL (__FUNCTION__, 'OK');
1069 }
1070
1071 $msgcode['addRealServers']['OK'] = 37;
1072 $msgcode['addRealServers']['ERR1'] = 131;
1073 $msgcode['addRealServers']['ERR2'] = 127;
1074 // Parse textarea submitted and try adding a real server for each line.
1075 function addRealServers ()
1076 {
1077 assertUIntArg ('pool_id');
1078 assertStringArg ('format');
1079 assertStringArg ('rawtext');
1080 $rawtext = str_replace ('\r', '', $_REQUEST['rawtext']);
1081 $ngood = $nbad = 0;
1082 $rsconfig = '';
1083 // Keep in mind, that the text will have HTML entities (namely '>') escaped.
1084 foreach (explode ('\n', $rawtext) as $line)
1085 {
1086 if (!strlen ($line))
1087 continue;
1088 $match = array ();
1089 switch ($_REQUEST['format'])
1090 {
1091 case 'ipvs_2': // address and port only
1092 if (!preg_match ('/^ -&gt; ([0-9\.]+):([0-9]+) /', $line, $match))
1093 continue;
1094 if (addRStoRSPool ($_REQUEST['pool_id'], $match[1], $match[2], getConfigVar ('DEFAULT_IPV4_RS_INSERVICE'), ''))
1095 $ngood++;
1096 else
1097 $nbad++;
1098 break;
1099 case 'ipvs_3': // address, port and weight
1100 if (!preg_match ('/^ -&gt; ([0-9\.]+):([0-9]+) +[a-zA-Z]+ +([0-9]+) /', $line, $match))
1101 continue;
1102 if (addRStoRSPool ($_REQUEST['pool_id'], $match[1], $match[2], getConfigVar ('DEFAULT_IPV4_RS_INSERVICE'), 'weight ' . $match[3]))
1103 $ngood++;
1104 else
1105 $nbad++;
1106 break;
1107 case 'ssv_2': // IP address and port
1108 if (!preg_match ('/^([0-9\.]+) ([0-9]+)$/', $line, $match))
1109 continue;
1110 if (addRStoRSPool ($_REQUEST['pool_id'], $match[1], $match[2], getConfigVar ('DEFAULT_IPV4_RS_INSERVICE'), ''))
1111 $ngood++;
1112 else
1113 $nbad++;
1114 break;
1115 case 'ssv_1': // IP address
1116 if (!preg_match ('/^([0-9\.]+)$/', $line, $match))
1117 continue;
1118 if (addRStoRSPool ($_REQUEST['pool_id'], $match[1], 0, getConfigVar ('DEFAULT_IPV4_RS_INSERVICE'), ''))
1119 $ngood++;
1120 else
1121 $nbad++;
1122 break;
1123 default:
1124 return buildRedirectURL (__FUNCTION__, 'ERR1');
1125 break;
1126 }
1127 }
1128 if ($nbad == 0 and $ngood > 0)
1129 return buildRedirectURL (__FUNCTION__, 'OK', array ($ngood));
1130 else
1131 return buildRedirectURL (__FUNCTION__, 'ERR2', array ($ngood, $nbad));
1132 }
1133
1134 $msgcode['addVService']['OK'] = 28;
1135 $msgcode['addVService']['ERR1'] = 132;
1136 $msgcode['addVService']['ERR2'] = 100;
1137 function addVService ()
1138 {
1139 assertIPv4Arg ('vip');
1140 assertUIntArg ('vport');
1141 assertStringArg ('proto');
1142 if ($_REQUEST['proto'] != 'TCP' and $_REQUEST['proto'] != 'UDP')
1143 return buildRedirectURL (__FUNCTION__, 'ERR1');
1144 assertStringArg ('name', TRUE);
1145 assertStringArg ('vsconfig', TRUE);
1146 assertStringArg ('rsconfig', TRUE);
1147 $error = commitCreateVS
1148 (
1149 $_REQUEST['vip'],
1150 $_REQUEST['vport'],
1151 $_REQUEST['proto'],
1152 $_REQUEST['name'],
1153 $_REQUEST['vsconfig'],
1154 $_REQUEST['rsconfig'],
1155 isset ($_REQUEST['taglist']) ? $_REQUEST['taglist'] : array()
1156 );
1157 if ($error != '')
1158 return buildRedirectURL (__FUNCTION__, 'ERR2', array ($error));
1159 else
1160 return buildRedirectURL (__FUNCTION__, 'OK');
1161 }
1162
1163 $msgcode['deleteRealServer']['OK'] = 35;
1164 $msgcode['deleteRealServer']['ERR'] = 128;
1165 function deleteRealServer ()
1166 {
1167 assertUIntArg ('id');
1168 if (!commitDeleteRS ($_REQUEST['id']))
1169 return buildRedirectURL (__FUNCTION__, 'ERR');
1170 else
1171 return buildRedirectURL (__FUNCTION__, 'OK');
1172 }
1173
1174 $msgcode['deleteLoadBalancer']['OK'] = 19;
1175 $msgcode['deleteLoadBalancer']['ERR'] = 129;
1176 function deleteLoadBalancer ()
1177 {
1178 assertUIntArg ('object_id');
1179 assertUIntArg ('pool_id');
1180 assertUIntArg ('vs_id');
1181 if (!commitDeleteLB (
1182 $_REQUEST['object_id'],
1183 $_REQUEST['pool_id'],
1184 $_REQUEST['vs_id']
1185 ))
1186 return buildRedirectURL (__FUNCTION__, 'ERR');
1187 else
1188 return buildRedirectURL (__FUNCTION__, 'OK');
1189 }
1190
1191 $msgcode['deleteVService']['OK'] = 29;
1192 $msgcode['deleteVService']['ERR'] = 130;
1193 function deleteVService ()
1194 {
1195 assertUIntArg ('vs_id');
1196 if (!commitDeleteVS ($_REQUEST['vs_id']))
1197 return buildRedirectURL (__FUNCTION__, 'ERR');
1198 else
1199 return buildRedirectURL (__FUNCTION__, 'OK');
1200 }
1201
1202 $msgcode['updateRealServer']['OK'] = 36;
1203 $msgcode['updateRealServer']['ERR'] = 133;
1204 function updateRealServer ()
1205 {
1206 assertUIntArg ('rs_id');
1207 assertIPv4Arg ('rsip');
1208 assertStringArg ('rsport', TRUE);
1209 assertStringArg ('rsconfig', TRUE);
1210 if (!commitUpdateRS (
1211 $_REQUEST['rs_id'],
1212 $_REQUEST['rsip'],
1213 $_REQUEST['rsport'],
1214 $_REQUEST['rsconfig']
1215 ))
1216 return buildRedirectURL (__FUNCTION__, 'ERR');
1217 else
1218 return buildRedirectURL (__FUNCTION__, 'OK');
1219 }
1220
1221 $msgcode['updateLoadBalancer']['OK'] = 20;
1222 $msgcode['updateLoadBalancer']['ERR'] = 134;
1223 function updateLoadBalancer ()
1224 {
1225 assertUIntArg ('object_id');
1226 assertUIntArg ('pool_id');
1227 assertUIntArg ('vs_id');
1228 assertStringArg ('vsconfig', TRUE);
1229 assertStringArg ('rsconfig', TRUE);
1230 if (!commitUpdateLB (
1231 $_REQUEST['object_id'],
1232 $_REQUEST['pool_id'],
1233 $_REQUEST['vs_id'],
1234 $_REQUEST['vsconfig'],
1235 $_REQUEST['rsconfig']
1236 ))
1237 return buildRedirectURL (__FUNCTION__, 'ERR');
1238 else
1239 return buildRedirectURL (__FUNCTION__, 'OK');
1240 }
1241
1242 $msgcode['updateVService']['OK'] = 30;
1243 $msgcode['updateVService']['ERR'] = 135;
1244 function updateVService ()
1245 {
1246 assertUIntArg ('vs_id');
1247 assertIPv4Arg ('vip');
1248 assertUIntArg ('vport');
1249 assertStringArg ('proto');
1250 assertStringArg ('name', TRUE);
1251 assertStringArg ('vsconfig', TRUE);
1252 assertStringArg ('rsconfig', TRUE);
1253 if (!commitUpdateVS (
1254 $_REQUEST['vs_id'],
1255 $_REQUEST['vip'],
1256 $_REQUEST['vport'],
1257 $_REQUEST['proto'],
1258 $_REQUEST['name'],
1259 $_REQUEST['vsconfig'],
1260 $_REQUEST['rsconfig']
1261 ))
1262 return buildRedirectURL (__FUNCTION__, 'ERR');
1263 else
1264 return buildRedirectURL (__FUNCTION__, 'OK');
1265 }
1266
1267 $msgcode['addLoadBalancer']['OK'] = 18;
1268 $msgcode['addLoadBalancer']['ERR'] = 137;
1269 function addLoadBalancer ()
1270 {
1271 assertUIntArg ('pool_id');
1272 assertUIntArg ('object_id');
1273 assertUIntArg ('vs_id');
1274 assertStringArg ('vsconfig', TRUE);
1275 assertStringArg ('rsconfig', TRUE);
1276 if (!addLBtoRSPool (
1277 $_REQUEST['pool_id'],
1278 $_REQUEST['object_id'],
1279 $_REQUEST['vs_id'],
1280 $_REQUEST['vsconfig'],
1281 $_REQUEST['rsconfig']
1282 ))
1283 return buildRedirectURL (__FUNCTION__, 'ERR');
1284 else
1285 return buildRedirectURL (__FUNCTION__, 'OK');
1286 }
1287
1288 $msgcode['addRSPool']['OK'] = 31;
1289 $msgcode['addRSPool']['ERR'] = 100;
1290 function addRSPool ()
1291 {
1292 assertStringArg ('name', TRUE);
1293 assertStringArg ('vsconfig', TRUE);
1294 assertStringArg ('rsconfig', TRUE);
1295 $error = commitCreateRSPool
1296 (
1297 $_REQUEST['name'],
1298 $_REQUEST['vsconfig'],
1299 $_REQUEST['rsconfig'],
1300 isset ($_REQUEST['taglist']) ? $_REQUEST['taglist'] : array()
1301 );
1302 if ($error != '')
1303 return buildRedirectURL (__FUNCTION__, 'ERR', array ($error));
1304 else
1305 return buildRedirectURL (__FUNCTION__, 'OK');
1306 }
1307
1308 $msgcode['deleteRSPool']['OK'] = 32;
1309 $msgcode['deleteRSPool']['ERR'] = 138;
1310 function deleteRSPool ()
1311 {
1312 assertUIntArg ('pool_id');
1313 if (!commitDeleteRSPool ($_REQUEST['pool_id']))
1314 return buildRedirectURL (__FUNCTION__, 'ERR');
1315 else
1316 return buildRedirectURL (__FUNCTION__, 'OK');
1317 }
1318
1319 $msgcode['updateRSPool']['OK'] = 33;
1320 $msgcode['updateRSPool']['ERR'] = 139;
1321 function updateRSPool ()
1322 {
1323 assertUIntArg ('pool_id');
1324 assertStringArg ('name', TRUE);
1325 assertStringArg ('vsconfig', TRUE);
1326 assertStringArg ('rsconfig', TRUE);
1327 if (!commitUpdateRSPool ($_REQUEST['pool_id'], $_REQUEST['name'], $_REQUEST['vsconfig'], $_REQUEST['rsconfig']))
1328 return buildRedirectURL (__FUNCTION__, 'ERR');
1329 else
1330 return buildRedirectURL (__FUNCTION__, 'OK');
1331 }
1332
1333 $msgcode['updateRSInService']['OK'] = 38;
1334 $msgcode['updateRSInService']['ERR'] = 140;
1335 function updateRSInService ()
1336 {
1337 assertUIntArg ('rscount');
1338 $pool_id = $_REQUEST['pool_id'];
1339 $orig = spotEntity ('ipv4rspool', $pool_id);
1340 amplifyCell ($orig);
1341 $nbad = $ngood = 0;
1342 for ($i = 1; $i <= $_REQUEST['rscount']; $i++)
1343 {
1344 $rs_id = $_REQUEST["rsid_${i}"];
1345 if (isset ($_REQUEST["inservice_${i}"]) and $_REQUEST["inservice_${i}"] == 'on')
1346 $newval = 'yes';
1347 else
1348 $newval = 'no';
1349 if ($newval != $orig['rslist'][$rs_id]['inservice'])
1350 {
1351 if (commitSetInService ($rs_id, $newval))
1352 $ngood++;
1353 else
1354 $nbad++;
1355 }
1356 }
1357 if (!$nbad)
1358 return buildRedirectURL (__FUNCTION__, 'OK', array ($ngood));
1359 else
1360 return buildRedirectURL (__FUNCTION__, 'ERR', array ($nbad, $ngood));
1361 }
1362
1363 $msgcode['importPTRData']['OK'] = 26;
1364 $msgcode['importPTRData']['ERR'] = 141;
1365 // FIXME: check, that each submitted address belongs to the prefix we
1366 // are operating on.
1367 function importPTRData ()
1368 {
1369 assertUIntArg ('addrcount');
1370 $nbad = $ngood = 0;
1371 for ($i = 0; $i < $_REQUEST['addrcount']; $i++)
1372 {
1373 $inputname = "import_${i}";
1374 if (!isset ($_REQUEST[$inputname]) or $_REQUEST[$inputname] != 'on')
1375 continue;
1376 assertIPv4Arg ("addr_${i}");
1377 assertStringArg ("descr_${i}", TRUE);
1378 assertStringArg ("rsvd_${i}");
1379 // Non-existent addresses will not have this argument set in request.
1380 $rsvd = 'no';
1381 if ($_REQUEST["rsvd_${i}"] == 'yes')
1382 $rsvd = 'yes';
1383 if (updateAddress ($_REQUEST["addr_${i}"], $_REQUEST["descr_${i}"], $rsvd) == '')
1384 $ngood++;
1385 else
1386 $nbad++;
1387 }
1388 if (!$nbad)
1389 return buildRedirectURL (__FUNCTION__, 'OK', array ($ngood));
1390 else
1391 return buildRedirectURL (__FUNCTION__, 'ERR', array ($nbad, $ngood));
1392 }
1393
1394 $msgcode['generateAutoPorts']['OK'] = 21;
1395 $msgcode['generateAutoPorts']['ERR'] = 142;
1396 function generateAutoPorts ()
1397 {
1398 global $pageno;
1399 assertUIntArg ('object_id');
1400 $info = spotEntity ('object', $_REQUEST['object_id']);
1401 // Navigate away in case of success, stay at the place otherwise.
1402 if (executeAutoPorts ($_REQUEST['object_id'], $info['objtype_id']))
1403 return buildRedirectURL (__FUNCTION__, 'OK', array(), $pageno, 'ports');
1404 else
1405 return buildRedirectURL (__FUNCTION__, 'ERR');
1406 }
1407
1408 $msgcode['saveEntityTags']['OK'] = 22;
1409 $msgcode['saveEntityTags']['ERR1'] = 143;
1410 $msgcode['saveEntityTags']['ERR2'] = 187;
1411 // Filter out implicit tags before storing the new tag set.
1412 function saveEntityTags ()
1413 {
1414 global $page, $pageno, $etype_by_pageno;
1415 if (!isset ($etype_by_pageno[$pageno]) or !isset ($page[$pageno]['bypass']))
1416 return buildRedirectURL (__FUNCTION__, 'ERR2', array (__FUNCTION__));
1417 $realm = $etype_by_pageno[$pageno];
1418 $bypass = $page[$pageno]['bypass'];
1419 assertUIntArg ($bypass);
1420 $entity_id = $_REQUEST[$bypass];
1421 $taglist = isset ($_REQUEST['taglist']) ? $_REQUEST['taglist'] : array();
1422 // Build a chain from the submitted data, minimize it,
1423 // then wipe existing records and store the new set instead.
1424 destroyTagsForEntity ($realm, $entity_id);
1425 // TODO: these actions are very close to what rebuildTagChainForEntity() does,
1426 // so why not use it?
1427 $newchain = getExplicitTagsOnly (buildTagChainFromIds ($taglist));
1428 $n_succeeds = $n_errors = 0;
1429 foreach ($newchain as $taginfo)
1430 if (addTagForEntity ($realm, $entity_id, $taginfo['id']))
1431 $n_succeeds++;
1432 else
1433 $n_errors++;
1434 if ($n_errors)
1435 return buildRedirectURL (__FUNCTION__, 'ERR1', array ($n_succeeds, $n_errors));
1436 else
1437 return buildRedirectURL (__FUNCTION__, 'OK', array ($n_succeeds));
1438 }
1439
1440 $msgcode['destroyTag']['OK'] = 58;
1441 $msgcode['destroyTag']['ERR1'] = 183;
1442 $msgcode['destroyTag']['ERR2'] = 144;
1443 function destroyTag ()
1444 {
1445 assertUIntArg ('tag_id');
1446 global $taglist;
1447 if (!isset ($taglist[$_REQUEST['tag_id']]))
1448 return buildRedirectURL (__FUNCTION__, 'ERR1', array ($_REQUEST['tag_id']));
1449 if (($ret = commitDestroyTag ($_REQUEST['tag_id'])) == '')
1450 return buildRedirectURL (__FUNCTION__, 'OK', array ($taglist[$_REQUEST['tag_id']]['tag']));
1451 else
1452 return buildRedirectURL (__FUNCTION__, 'ERR2');
1453 }
1454
1455 $msgcode['createTag']['OK'] = 59;
1456 $msgcode['createTag']['ERR1'] = 145;
1457 $msgcode['createTag']['ERR3'] = 147;
1458 function createTag ()
1459 {
1460 assertStringArg ('tag_name');
1461 assertUIntArg ('parent_id', TRUE);
1462 $tagname = trim ($_REQUEST['tag_name']);
1463 if (!validTagName ($tagname))
1464 return buildRedirectURL (__FUNCTION__, 'ERR1', array ($tagname));
1465 if (($parent_id = $_REQUEST['parent_id']) <= 0)
1466 $parent_id = 'NULL';
1467 if (($ret = commitCreateTag ($tagname, $parent_id)) == '')
1468 return buildRedirectURL (__FUNCTION__, 'OK', array ($tagname));
1469 else
1470 return buildRedirectURL (__FUNCTION__, 'ERR3', array ($tagname, $ret));
1471 }
1472
1473 $msgcode['updateTag']['OK'] = 60;
1474 $msgcode['updateTag']['ERR1'] = 145;
1475 $msgcode['updateTag']['ERR2'] = 148;
1476 function updateTag ()
1477 {
1478 assertUIntArg ('tag_id');
1479 assertUIntArg ('parent_id', TRUE);
1480 assertStringArg ('tag_name');
1481 $tagname = trim ($_REQUEST['tag_name']);
1482 if (!validTagName ($tagname))
1483 return buildRedirectURL (__FUNCTION__, 'ERR1', array ($tagname));
1484 if (($parent_id = $_REQUEST['parent_id']) <= 0)
1485 $parent_id = 'NULL';
1486 if (($ret = commitUpdateTag ($_REQUEST['tag_id'], $tagname, $parent_id)) == '')
1487 return buildRedirectURL (__FUNCTION__, 'OK', array ($tagname));
1488 // Use old name in the message, cause update failed.
1489 global $taglist;
1490 return buildRedirectURL (__FUNCTION__, 'ERR2', array ($taglist[$_REQUEST['tag_id']]['tag'], $ret));
1491 }
1492
1493 $msgcode['rollTags']['OK'] = 67;
1494 $msgcode['rollTags']['ERR'] = 149;
1495 function rollTags ()
1496 {
1497 assertUIntArg ('row_id');
1498 assertStringArg ('sum', TRUE);
1499 assertUIntArg ('realsum');
1500 if ($_REQUEST['sum'] != $_REQUEST['realsum'])
1501 return buildRedirectURL (__FUNCTION__, 'ERR');
1502 // Even if the user requested an empty tag list, don't bail out, but process existing
1503 // tag chains with "zero" extra. This will make sure, that the stuff processed will
1504 // have its chains refined to "normal" form.
1505 $extratags = isset ($_REQUEST['taglist']) ? $_REQUEST['taglist'] : array();
1506 $n_ok = 0;
1507 // Minimizing the extra chain early, so that tag rebuilder doesn't have to
1508 // filter out the same tag again and again. It will have own noise to cancel.
1509 $extrachain = getExplicitTagsOnly (buildTagChainFromIds ($extratags));
1510 foreach (listCells ('rack', $_REQUEST['row_id']) as $rack)
1511 {
1512 if (rebuildTagChainForEntity ('rack', $rack['id'], $extrachain))
1513 $n_ok++;
1514 amplifyCell ($rack);
1515 foreach ($rack['mountedObjects'] as $object_id)
1516 if (rebuildTagChainForEntity ('object', $object_id, $extrachain))
1517 $n_ok++;
1518 }
1519 return buildRedirectURL (__FUNCTION__, 'OK', array ($n_ok));
1520 }
1521
1522 $msgcode['changeMyPassword']['OK'] = 61;
1523 $msgcode['changeMyPassword']['ERR1'] = 150;
1524 $msgcode['changeMyPassword']['ERR2'] = 151;
1525 $msgcode['changeMyPassword']['ERR3'] = 152;
1526 $msgcode['changeMyPassword']['ERR4'] = 153;
1527 function changeMyPassword ()
1528 {
1529 global $remote_username, $user_auth_src;
1530 if ($user_auth_src != 'database')
1531 return buildRedirectURL (__FUNCTION__, 'ERR1');
1532 assertStringArg ('oldpassword');
1533 assertStringArg ('newpassword1');
1534 assertStringArg ('newpassword2');
1535 $remote_userid = getUserIDByUsername ($remote_username);
1536 $userinfo = spotEntity ('user', $remote_userid);
1537 if ($userinfo['user_password_hash'] != sha1 ($_REQUEST['oldpassword']))
1538 return buildRedirectURL (__FUNCTION__, 'ERR2');
1539 if ($_REQUEST['newpassword1'] != $_REQUEST['newpassword2'])
1540 return buildRedirectURL (__FUNCTION__, 'ERR3');
1541 if (commitUpdateUserAccount ($remote_userid, $userinfo['user_name'], $userinfo['user_realname'], sha1 ($_REQUEST['newpassword1'])))
1542 return buildRedirectURL (__FUNCTION__, 'OK');
1543 else
1544 return buildRedirectURL (__FUNCTION__, 'ERR4');
1545 }
1546
1547 $msgcode['saveRackCode']['OK'] = 43;
1548 $msgcode['saveRackCode']['ERR1'] = 154;
1549 $msgcode['saveRackCode']['ERR2'] = 155;
1550 function saveRackCode ()
1551 {
1552 assertStringArg ('rackcode');
1553 // For the test to succeed, unescape LFs, strip CRs.
1554 $newcode = str_replace ('\r', '', str_replace ('\n', "\n", $_REQUEST['rackcode']));
1555 $parseTree = getRackCode ($newcode);
1556 if ($parseTree['result'] != 'ACK')
1557 return buildRedirectURL (__FUNCTION__, 'ERR1', array ($parseTree['load']));
1558 saveScript ('RackCodeCache', '');
1559 if (saveScript ('RackCode', $newcode))
1560 return buildRedirectURL (__FUNCTION__, 'OK');
1561 else
1562 return buildRedirectURL (__FUNCTION__, 'ERR2');
1563 }
1564
1565 $msgcode['setPortVLAN']['ERR1'] = 156;
1566 // This handler's context is pre-built, but not authorized. It is assumed, that the
1567 // handler will take existing context and before each commit check authorization
1568 // on the base chain plus necessary context added.
1569 function setPortVLAN ()
1570 {
1571 assertUIntArg ('portcount');
1572 $data = getSwitchVLANs ($_REQUEST['object_id']);
1573 if ($data === NULL)
1574 return buildRedirectURL (__FUNCTION__, 'ERR1');
1575 list ($vlanlist, $portlist) = $data;
1576 // Here we just build up 1 set command for the gateway with all of the ports
1577 // included. The gateway is expected to filter unnecessary changes silently
1578 // and to provide a list of responses with either error or success message
1579 // for each of the rest.
1580 $nports = $_REQUEST['portcount'];
1581 $prefix = 'set ';
1582 $log = emptyLog();
1583 $setcmd = '';
1584 for ($i = 0; $i < $nports; $i++)
1585 if
1586 (
1587 !isset ($_REQUEST['portname_' . $i]) ||
1588 !isset ($_REQUEST['vlanid_' . $i]) ||
1589 $_REQUEST['portname_' . $i] != $portlist[$i]['portname']
1590 )
1591 $log['m'][] = array ('c' => 158, 'a' => array ($i));
1592 elseif
1593 (
1594 $_REQUEST['vlanid_' . $i] == $portlist[$i]['vlanid'] ||
1595 $portlist[$i]['vlaind'] == 'TRUNK'
1596 )
1597 continue;
1598 else
1599 {
1600 $portname = $_REQUEST['portname_' . $i];
1601 $oldvlanid = $portlist[$i]['vlanid'];
1602 $newvlanid = $_REQUEST['vlanid_' . $i];
1603 // Finish the security context and evaluate it.
1604 $annex = array();
1605 $annex[] = array ('tag' => '$fromvlan_' . $oldvlanid);
1606 $annex[] = array ('tag' => '$tovlan_' . $newvlanid);
1607 if (!permitted (NULL, NULL, NULL, $annex))
1608 {
1609 $log['m'][] = array ('c' => 159, 'a' => array ($portname, $oldvlanid, $newvlanid));
1610 continue;
1611 }
1612 $setcmd .= $prefix . $portname . '=' . $newvlanid;
1613 $prefix = ';';
1614 }
1615 // Feed the gateway and interpret its (non)response.
1616 if ($setcmd != '')
1617 $log['m'] = array_merge ($log['m'], setSwitchVLANs ($_REQUEST['object_id'], $setcmd));
1618 else
1619 $log['m'][] = array ('c' => 201);
1620 return buildWideRedirectURL ($log);
1621 }
1622
1623 function submitSLBConfig ()
1624 {
1625 assertUIntArg ('object_id');
1626 $newconfig = buildLVSConfig ($_REQUEST['object_id']);
1627 $msglog = gwSendFileToObject ($_REQUEST['object_id'], 'slbconfig', html_entity_decode ($newconfig, ENT_QUOTES, 'UTF-8'));
1628 return buildWideRedirectURL ($msglog);
1629 }
1630
1631 $msgcode['addRow']['OK'] = 74;
1632 $msgcode['addRow']['ERR'] = 100;
1633 function addRow ()
1634 {
1635 assertStringArg ('name');
1636
1637 if (commitAddRow ($_REQUEST['name']) === TRUE)
1638 return buildRedirectURL (__FUNCTION__, 'OK', array ($_REQUEST['name']));
1639 else
1640 return buildRedirectURL (__FUNCTION__, 'ERR', array ($_REQUEST['name']));
1641 }
1642
1643 $msgcode['updateRow']['OK'] = 75;
1644 $msgcode['updateRow']['ERR'] = 100;
1645 function updateRow ()
1646 {
1647 assertUIntArg ('row_id');
1648 assertStringArg ('name');
1649
1650 if (TRUE === commitUpdateRow ($_REQUEST['row_id'], $_REQUEST['name']))
1651 return buildRedirectURL (__FUNCTION__, 'OK', array ($_REQUEST['name']));
1652 else
1653 return buildRedirectURL (__FUNCTION__, 'ERR', array ($_REQUEST['name']));
1654 }
1655
1656 $msgcode['deleteRow']['OK'] = 77;
1657 $msgcode['deleteRow']['ERR'] = 100;
1658 function deleteRow ()
1659 {
1660 assertUIntArg ('row_id');
1661 $rowinfo = getRackRowInfo ($_REQUEST['row_id']);
1662
1663 if (TRUE === commitDeleteRow ($_REQUEST['row_id']))
1664 return buildRedirectURL (__FUNCTION__, 'OK', array ($rowinfo['name']));
1665 else
1666 return buildRedirectURL (__FUNCTION__, 'ERR', array ($rowinfo['name']));
1667 }
1668
1669 $msgcode['addRack']['OK'] = 65;
1670 $msgcode['addRack']['ERR1'] = 171;
1671 $msgcode['addRack']['ERR2'] = 172;
1672 function addRack ()
1673 {
1674 assertUIntArg ('row_id');
1675 $taglist = isset ($_REQUEST['taglist']) ? $_REQUEST['taglist'] : array();
1676 if (isset ($_REQUEST['got_data']))
1677 {
1678 assertStringArg ('rack_name');
1679 assertUIntArg ('rack_height1');
1680 assertStringArg ('rack_comment', TRUE);
1681
1682 if (commitAddRack ($_REQUEST['rack_name'], $_REQUEST['rack_height1'], $_REQUEST['row_id'], $_REQUEST['rack_comment'], $taglist) === TRUE)
1683 return buildRedirectURL (__FUNCTION__, 'OK', array ($_REQUEST['rack_name']));
1684 else
1685 return buildRedirectURL (__FUNCTION__, 'ERR1', array ($_REQUEST['rack_name']));
1686 }
1687 elseif (isset ($_REQUEST['got_mdata']))
1688 {
1689 assertUIntArg ('rack_height2');
1690 assertStringArg ('rack_names', TRUE);
1691 $log = emptyLog();
1692 // copy-and-paste from renderAddMultipleObjectsForm()
1693 $names1 = explode ('\n', $_REQUEST['rack_names']);
1694 $names2 = array();
1695 foreach ($names1 as $line)
1696 {
1697 $parts = explode ('\r', $line);
1698 reset ($parts);
1699 if (!strlen ($parts[0]))
1700 continue;
1701 else
1702 $names2[] = rtrim ($parts[0]);
1703 }
1704 global $msgcode;
1705 foreach ($names2 as $cname)
1706 if (commitAddRack ($cname, $_REQUEST['rack_height2'], $_REQUEST['row_id'], '', $taglist) === TRUE)
1707 $log['m'][] = array ('c' => $msgcode[__FUNCTION__]['OK'], 'a' => array ($cname));
1708 else
1709 $log['m'][] = array ('c' => $msgcode[__FUNCTION__]['ERR1'], 'a' => array ($cname));
1710 return buildWideRedirectURL ($log);
1711 }
1712 else
1713 return buildRedirectURL (__FUNCTION__, 'ERR2');
1714 }
1715
1716 $msgcode['deleteRack']['OK'] = 79;
1717 $msgcode['deleteRack']['ERR'] = 100;
1718 $msgcode['deleteRack']['ERR1'] = 206;
1719 function deleteRack ()
1720 {
1721 assertUIntArg ('rack_id');
1722 if (NULL == ($rackData = spotEntity ('rack', $_REQUEST['rack_id'])))
1723 return buildRedirectURL (__FUNCTION__, 'ERR', array ('Rack not found'), 'rackspace', 'default');
1724 amplifyCell ($rackData);
1725 if (count ($rackData['mountedObjects']))
1726 return buildRedirectURL (__FUNCTION__, 'ERR1');
1727 if (TRUE !== commitDeleteRack ($_REQUEST['rack_id']))
1728 return buildRedirectURL (__FUNCTION__, 'ERR', array(), 'rackspace', 'default');
1729 return buildRedirectURL (__FUNCTION__, 'OK', array ($rackData['name']), 'rackspace', 'default');
1730 }
1731
1732 $msgcode['updateRack']['OK'] = 68;
1733 $msgcode['updateRack']['ERR'] = 177;
1734 function updateRack ()
1735 {
1736 assertUIntArg ('rack_id');
1737 assertUIntArg ('rack_row_id');
1738 assertUIntArg ('rack_height');
1739 assertStringArg ('rack_name');
1740 assertStringArg ('rack_comment', TRUE);
1741
1742 resetThumbCache ($_REQUEST['rack_id']);
1743 if (TRUE === commitUpdateRack ($_REQUEST['rack_id'], $_REQUEST['rack_name'], $_REQUEST['rack_height'], $_REQUEST['rack_row_id'], $_REQUEST['rack_comment']))
1744 return buildRedirectURL (__FUNCTION__, 'OK', array ($_REQUEST['rack_name']));
1745 else
1746 return buildRedirectURL (__FUNCTION__, 'ERR');
1747 }
1748
1749 $msgcode['updateRackDesign']['ERR'] = 100;
1750 function updateRackDesign ()
1751 {
1752 assertUIntArg ('rack_id');
1753 if (NULL == ($rackData = spotEntity ('rack', $_REQUEST['rack_id'])))
1754 return buildRedirectURL (__FUNCTION__, 'ERR', array ('Rack not found'), 'rackspace', 'default');
1755 amplifyCell ($rackData);
1756 applyRackDesignMask($rackData);
1757 markupObjectProblems ($rackData);
1758 $response = processGridForm ($rackData, 'A', 'F');
1759 return buildWideRedirectURL (array($response));
1760 }
1761
1762 $msgcode['updateRackProblems']['ERR'] = 100;
1763 function updateRackProblems ()
1764 {
1765 assertUIntArg ('rack_id');
1766 if (NULL == ($rackData = spotEntity ('rack', $_REQUEST['rack_id'])))
1767 return buildRedirectURL (__FUNCTION__, 'ERR', array ('Rack not found'), 'rackspace', 'default');
1768 amplifyCell ($rackData);
1769 applyRackProblemMask($rackData);
1770 markupObjectProblems ($rackData);
1771 $response = processGridForm ($rackData, 'F', 'U');
1772 return buildWideRedirectURL (array($response));
1773 }
1774
1775 function querySNMPData ()
1776 {
1777 assertUIntArg ('object_id');
1778 assertStringArg ('community');
1779 return doSNMPmining ($_REQUEST['object_id'], $_REQUEST['community']);
1780 }
1781
1782 $msgcode['addFileWithoutLink']['OK'] = 69;
1783 $msgcode['addFileWithoutLink']['ERR'] = 100;
1784 // File-related functions
1785 function addFileWithoutLink ()
1786 {
1787 assertStringArg ('comment', TRUE);
1788
1789 // Make sure the file can be uploaded
1790 if (get_cfg_var('file_uploads') != 1)
1791 return buildRedirectURL (__FUNCTION__, 'ERR', array ("file uploads not allowed, change 'file_uploads' parameter in php.ini"));
1792
1793 $fp = fopen($_FILES['file']['tmp_name'], 'rb');
1794 global $sic;
1795 // commitAddFile() uses prepared statements
1796 $error = commitAddFile ($_FILES['file']['name'], $_FILES['file']['type'], $_FILES['file']['size'], $fp, $sic['comment']);
1797 if (isset ($_REQUEST['taglist']))
1798 produceTagsForLastRecord ('file', $_REQUEST['taglist']);
1799
1800 if ($error != '')
1801 return buildRedirectURL (__FUNCTION__, 'ERR', array ($error));
1802
1803 return buildRedirectURL (__FUNCTION__, 'OK', array ($_FILES['file']['name']));
1804 }
1805
1806 $msgcode['addFileToEntity']['OK'] = 69;
1807 $msgcode['addFileToEntity']['ERR1'] = 187;
1808 $msgcode['addFileToEntity']['ERR2'] = 181;
1809 $msgcode['addFileToEntity']['ERR3'] = 182;
1810 function addFileToEntity ()
1811 {
1812 global $page, $pageno, $etype_by_pageno;
1813 if (!isset ($etype_by_pageno[$pageno]) or !isset ($page[$pageno]['bypass']))
1814 return buildRedirectURL (__FUNCTION__, 'ERR1', array (__FUNCTION__));
1815 $realm = $etype_by_pageno[$pageno];
1816 $bypass = $page[$pageno]['bypass'];
1817 assertUIntArg ($bypass);
1818 $entity_id = $_REQUEST[$bypass];
1819 assertStringArg ('comment', TRUE);
1820
1821 // Make sure the file can be uploaded
1822 if (get_cfg_var('file_uploads') != 1)
1823 return buildRedirectURL (__FUNCTION__, 'ERR2');
1824
1825 $fp = fopen($_FILES['file']['tmp_name'], 'rb');
1826 global $sic;
1827 // commitAddFile() uses prepared statements
1828 $error = commitAddFile ($_FILES['file']['name'], $_FILES['file']['type'], $_FILES['file']['size'], $fp, $sic['comment']);
1829 if ($error != '')
1830 return buildRedirectURL (__FUNCTION__, 'ERR3', array ($error));
1831
1832 $error = commitLinkFile (lastInsertID(), $realm, $entity_id);
1833 if ($error != '')
1834 return buildRedirectURL (__FUNCTION__, 'ERR3', array ($error));
1835
1836 return buildRedirectURL (__FUNCTION__, 'OK', array ($_FILES['file']['name']));
1837 }
1838
1839 $msgcode['linkFileToEntity']['OK'] = 71;
1840 $msgcode['linkFileToEntity']['ERR1'] = 178;
1841 $msgcode['linkFileToEntity']['ERR2'] = 100;
1842 function linkFileToEntity ()
1843 {
1844 assertUIntArg ('file_id');
1845 global $page, $pageno, $etype_by_pageno;
1846 $entity_type = $etype_by_pageno[$pageno];
1847 $bypass_name = $page[$pageno]['bypass'];
1848 assertUIntArg ($bypass_name);
1849
1850 $fi = spotEntity ('file', $_REQUEST['file_id']);
1851 if ($fi === NULL)
1852 return buildRedirectURL (__FUNCTION__, 'ERR1'); // file not found
1853 $error = commitLinkFile ($_REQUEST['file_id'], $entity_type, $_REQUEST[$bypass_name]);
1854 if ($error != '')
1855 return buildRedirectURL (__FUNCTION__, 'ERR2', array ($error)); // linking failed
1856
1857 return buildRedirectURL (__FUNCTION__, 'OK', array ($fi['name']));
1858 }
1859
1860 $msgcode['replaceFile']['OK'] = 70;
1861 $msgcode['replaceFile']['ERR1'] = 181;
1862 $msgcode['replaceFile']['ERR2'] = 207;
1863 $msgcode['replaceFile']['ERR3'] = 182;
1864 function replaceFile ()
1865 {
1866 global $sic;
1867 assertUIntArg ('file_id');
1868
1869 // Make sure the file can be uploaded
1870 if (get_cfg_var('file_uploads') != 1)
1871 return buildRedirectURL (__FUNCTION__, 'ERR1');
1872 $shortInfo = spotEntity ('file', $sic['file_id']);
1873
1874 $fp = fopen($_FILES['file']['tmp_name'], 'rb');
1875 if ($fp === FALSE)
1876 return buildRedirectURL (__FUNCTION__, 'ERR2');
1877 $error = commitReplaceFile ($sic['file_id'], $fp);
1878 if ($error != '')
1879 return buildRedirectURL (__FUNCTION__, 'ERR3', array ($error));
1880
1881 return buildRedirectURL (__FUNCTION__, 'OK', array (htmlspecialchars ($shortInfo['name'])));
1882 }
1883
1884 $msgcode['updateFile']['OK'] = 70;
1885 $msgcode['updateFile']['ERR'] = 100;
1886 function updateFile ()
1887 {
1888 assertUIntArg ('file_id');
1889 assertStringArg ('file_name');
1890 assertStringArg ('file_type');
1891 assertStringArg ('file_comment', TRUE);
1892 // prepared statement params below
1893 global $sic;
1894 $error = commitUpdateFile ($sic['file_id'], $sic['file_name'], $sic['file_type'], $sic['file_comment']);
1895 if ($error != '')
1896 return buildRedirectURL (__FUNCTION__, 'ERR', array ($error));
1897
1898 return buildRedirectURL (__FUNCTION__, 'OK', array ($_REQUEST['name']));
1899 }
1900
1901 $msgcode['unlinkFile']['OK'] = 72;
1902 $msgcode['unlinkFile']['ERR'] = 182;
1903 function unlinkFile ()
1904 {
1905 assertUIntArg ('link_id');
1906 $error = commitUnlinkFile ($_REQUEST['link_id']);
1907
1908 if ($error != '')
1909 return buildRedirectURL (__FUNCTION__, 'ERR', array ($error));
1910
1911 return buildRedirectURL (__FUNCTION__, 'OK');
1912 }
1913
1914 $msgcode['deleteFile']['OK'] = 73;
1915 $msgcode['deleteFile']['ERR'] = 100;
1916 function deleteFile ()
1917 {
1918 assertUIntArg ('file_id');
1919 $shortInfo = spotEntity ('file', $_REQUEST['file_id']);
1920 $error = commitDeleteFile ($_REQUEST['file_id']);
1921
1922 if ($error != '')
1923 return buildRedirectURL (__FUNCTION__, 'ERR', array ($error));
1924
1925 return buildRedirectURL (__FUNCTION__, 'OK', array (htmlspecialchars ($shortInfo['name'])));
1926 }
1927
1928 $msgcode['updateFileText']['OK'] = 78;
1929 $msgcode['updateFileText']['ERR1'] = 179;
1930 $msgcode['updateFileText']['ERR2'] = 180;
1931 function updateFileText ()
1932 {
1933 assertUIntArg ('file_id');
1934 assertStringArg ('mtime_copy');
1935 assertStringArg ('file_text', TRUE); // it's Ok to save empty
1936 $shortInfo = spotEntity ('file', $_REQUEST['file_id']);
1937 if ($shortInfo['mtime'] != $_REQUEST['mtime_copy'])
1938 return buildRedirectURL (__FUNCTION__, 'ERR1');
1939 global $sic;
1940 $error = commitReplaceFile ($sic['file_id'], $sic['file_text']);
1941 if ($error == '')
1942 return buildRedirectURL (__FUNCTION__, 'OK', array (htmlspecialchars ($shortInfo['name'])));
1943 return buildRedirectURL (__FUNCTION__, 'ERR2');
1944 }
1945
1946 $msgcode['addPortInterfaceCompat']['OK'] = 48;
1947 $msgcode['addPortInterfaceCompat']['ERR'] = 110;
1948 function addPortInterfaceCompat ()
1949 {
1950 assertUIntArg ('iif_id');
1951 assertUIntArg ('oif_id');
1952 if (commitSupplementPIC ($_REQUEST['iif_id'], $_REQUEST['oif_id']))
1953 return buildRedirectURL (__FUNCTION__, 'OK');
1954 return buildRedirectURL (__FUNCTION__, 'ERR');
1955 }
1956
1957 $msgcode['delPortInterfaceCompat']['OK'] = 49;
1958 $msgcode['delPortInterfaceCompat']['ERR'] = 111;
1959 function delPortInterfaceCompat ()
1960 {
1961 assertUIntArg ('iif_id');
1962 assertUIntArg ('oif_id');
1963 if (commitReducePIC ($_REQUEST['iif_id'], $_REQUEST['oif_id']))
1964 return buildRedirectURL (__FUNCTION__, 'OK');
1965 return buildRedirectURL (__FUNCTION__, 'ERR');
1966 }
1967
1968 $ifcompatpack = array
1969 (
1970 '1000cwdm80' => array (1209, 1210, 1211, 1212, 1213, 1214, 1215, 1216),
1971 '1000dwdm80' => array // ITU channels 20~61
1972 (
1973 1217, 1218, 1219, 1220, 1221, 1222, 1223, 1224, 1225, 1226,
1974 1227, 1228, 1229, 1230, 1231, 1232, 1233, 1234, 1235, 1236,
1975 1237, 1238, 1239, 1240, 1241, 1242, 1243, 1244, 1245, 1246,
1976 1247, 1248, 1249, 1250, 1251, 1252, 1253, 1254, 1255, 1256,
1977 1257, 1258
1978 ),
1979 '10000dwdm80' => array // same channels for 10GE
1980 (
1981 1259, 1260, 1261, 1262, 1263, 1264, 1265, 1266, 1267, 1268,
1982 1269, 1270, 1271, 1272, 1273, 1274, 1275, 1276, 1277, 1278,
1983 1279, 1280, 1281, 1282, 1283, 1284, 1285, 1286, 1287, 1288,
1984 1289, 1290, 1291, 1292, 1293, 1294, 1295, 1296, 1297, 1298,
1985 1299, 1300
1986 ),
1987 );
1988
1989 $msgcode['addPortInterfaceCompatPack']['OK'] = 44;
1990 $msgcode['addPortInterfaceCompatPack']['ERR'] = 123;
1991 function addPortInterfaceCompatPack ()
1992 {
1993 assertStringArg ('standard');
1994 assertUIntArg ('iif_id');
1995 global $ifcompatpack;
1996 if (!array_key_exists ($_REQUEST['standard'], $ifcompatpack) or !array_key_exists ($_REQUEST['iif_id'], getPortIIFOptions()))
1997 return buildRedirectURL (__FUNCTION__, 'ERR');
1998 $ngood = $nbad = 0;
1999 foreach ($ifcompatpack[$_REQUEST['standard']] as $oif_id)
2000 if (commitSupplementPIC ($_REQUEST['iif_id'], $oif_id))
2001 $ngood++;
2002 else
2003 $nbad++;
2004 return buildRedirectURL (__FUNCTION__, 'OK', array ($nbad, $ngood));
2005 }
2006
2007 $msgcode['delPortInterfaceCompatPack']['OK'] = 44;
2008 $msgcode['delPortInterfaceCompatPack']['ERR'] = 123;
2009 function delPortInterfaceCompatPack ()
2010 {
2011 assertStringArg ('standard');
2012 assertUIntArg ('iif_id');
2013 global $ifcompatpack;
2014 if (!array_key_exists ($_REQUEST['standard'], $ifcompatpack) or !array_key_exists ($_REQUEST['iif_id'], getPortIIFOptions()))
2015 return buildRedirectURL (__FUNCTION__, 'ERR');
2016 $ngood = $nbad = 0;
2017 foreach ($ifcompatpack[$_REQUEST['standard']] as $oif_id)
2018 if (commitReducePIC ($_REQUEST['iif_id'], $oif_id))
2019 $ngood++;
2020 else
2021 $nbad++;
2022 return buildRedirectURL (__FUNCTION__, 'OK', array ($nbad, $ngood));
2023 }
2024
2025 $msgcode['addPortOIFCompat']['OK'] = 48;
2026 $msgcode['addPortOIFCompat']['ERR'] = 110;
2027 function addPortOIFCompat()
2028 {
2029 assertUIntArg('type1', __FUNCTION__);
2030 assertUIntArg('type2', __FUNCTION__);
2031 if (commitSupplementPOIFC($_REQUEST['type1'], $_REQUEST['type2']))
2032 return buildRedirectURL(__FUNCTION__, 'OK');
2033 return buildRedirectURL(__FUNCTION__, 'ERR');
2034 }
2035
2036 $msgcode['delPortOIFCompat']['OK'] = 49;
2037 $msgcode['delPortOIFCompat']['ERR'] = 111;
2038 function delPortOIFCompat ()
2039 {
2040 assertUIntArg('type1', __FUNCTION__);
2041 assertUIntArg('type2', __FUNCTION__);
2042 if (commitReducePOIFC ($_REQUEST['type1'], $_REQUEST['type2']))
2043 return buildRedirectURL (__FUNCTION__, 'OK');
2044 return buildRedirectURL (__FUNCTION__, 'ERR');
2045
2046 }
2047
2048 ?>