r3864 copy recent exceptions-related commits into trunk
[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, $log_args = array(), $nextpage = NULL, $nexttab = NULL, $url_args = array())
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], $log_args), $nextpage, $nexttab, $url_args);
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'] = 111;
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 $result = deletePortForwarding
94 (
95 $_REQUEST['object_id'],
96 $_REQUEST['localip'],
97 $_REQUEST['localport'],
98 $_REQUEST['remoteip'],
99 $_REQUEST['remoteport'],
100 $_REQUEST['proto']
101 );
102 buildRedirectURL (__FUNCTION__, $result !== FALSE ? 'OK' : 'ERR');
103 }
104
105 $msgcode['updPortForwarding']['OK'] = 4;
106 $msgcode['updPortForwarding']['ERR'] = 109;
107 function updPortForwarding ()
108 {
109 assertUIntArg ('object_id');
110 assertIPv4Arg ('localip');
111 assertIPv4Arg ('remoteip');
112 assertUIntArg ('localport');
113 assertUIntArg ('remoteport');
114 assertStringArg ('proto');
115 assertStringArg ('description');
116
117 $result = updatePortForwarding
118 (
119 $_REQUEST['object_id'],
120 $_REQUEST['localip'],
121 $_REQUEST['localport'],
122 $_REQUEST['remoteip'],
123 $_REQUEST['remoteport'],
124 $_REQUEST['proto'],
125 $_REQUEST['description']
126 );
127 buildRedirectURL (__FUNCTION__, $result !== FALSE ? 'OK' : 'ERR');
128 }
129
130 $msgcode['addPortForObject']['OK'] = 5;
131 $msgcode['addPortForObject']['ERR1'] = 101;
132 $msgcode['addPortForObject']['ERR2'] = 100;
133 function addPortForObject ()
134 {
135 assertUIntArg ('object_id');
136 assertStringArg ('port_name', TRUE);
137 if (!strlen ($_REQUEST['port_name']))
138 return buildRedirectURL (__FUNCTION__, 'ERR1');
139 $error = commitAddPort
140 (
141 $_REQUEST['object_id'],
142 trim ($_REQUEST['port_name']),
143 $_REQUEST['port_type_id'],
144 trim ($_REQUEST['port_label']),
145 trim ($_REQUEST['port_l2address'])
146 );
147 if ($error != '')
148 return buildRedirectURL (__FUNCTION__, 'ERR2', array ($error));
149 else
150 return buildRedirectURL (__FUNCTION__, 'OK', array ($_REQUEST['port_name']));
151 }
152
153 $msgcode['editPortForObject']['OK'] = 6;
154 $msgcode['editPortForObject']['ERR1'] = 101;
155 $msgcode['editPortForObject']['ERR2'] = 100;
156 function editPortForObject ()
157 {
158 assertUIntArg ('object_id');
159 assertUIntArg ('port_id');
160 assertUIntArg ('port_type_id');
161 assertStringArg ('reservation_comment', TRUE);
162 // tolerate empty value now to produce custom informative message later
163 assertStringArg ('name', TRUE);
164 if (!strlen ($_REQUEST['name']))
165 return buildRedirectURL (__FUNCTION__, 'ERR1');
166
167 $error = commitUpdatePort ($_REQUEST['object_id'], $_REQUEST['port_id'], $_REQUEST['name'], $_REQUEST['port_type_id'], $_REQUEST['label'], $_REQUEST['l2address'], $_REQUEST['reservation_comment']);
168 if ($error != '')
169 return buildRedirectURL (__FUNCTION__, 'ERR2', array ($error));
170 else
171 return buildRedirectURL (__FUNCTION__, 'OK', array ($_REQUEST['name']));
172 }
173
174 $msgcode['delPortFromObject']['OK'] = 7;
175 $msgcode['delPortFromObject']['ERR'] = 100;
176 function delPortFromObject ()
177 {
178 assertUIntArg ('port_id');
179 $error = delObjectPort ($_REQUEST['port_id']);
180
181 if ($error != '')
182 return buildRedirectURL (__FUNCTION__, 'ERR', array ($error));
183 else
184 return buildRedirectURL (__FUNCTION__, 'OK', array ($_REQUEST['port_name']));
185 }
186
187 $msgcode['linkPortForObject']['OK'] = 8;
188 $msgcode['linkPortForObject']['ERR'] = 100;
189 function linkPortForObject ()
190 {
191 assertUIntArg ('port_id');
192 assertUIntArg ('remote_port_id');
193
194 // FIXME: ensure, that at least one of these ports belongs to the current object
195 $error = linkPorts ($_REQUEST['port_id'], $_REQUEST['remote_port_id']);
196 if ($error != '')
197 return buildRedirectURL (__FUNCTION__, 'ERR', array ($error));
198 global $sic;
199 $local_port_info = getPortInfo ($sic['port_id']);
200 $remote_port_info = getPortInfo ($sic['remote_port_id']);
201 $remote_object = spotEntity ('object', $remote_port_info['object_id']);
202 return buildRedirectURL
203 (
204 __FUNCTION__,
205 'OK',
206 array
207 (
208 $local_port_info['name'],
209 $remote_port_info['name'],
210 $remote_object['dname'],
211 )
212 );
213 }
214
215 $msgcode['unlinkPortForObject']['OK'] = 9;
216 $msgcode['unlinkPortForObject']['ERR'] = 100;
217 function unlinkPortForObject ()
218 {
219 assertUIntArg ('port_id');
220 assertUIntArg ('remote_port_id');
221
222 global $sic;
223 $local_port_info = getPortInfo ($sic['port_id']);
224 $remote_port_info = getPortInfo ($sic['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 assertStringArg ('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 (' ', preg_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 (' ', preg_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 (' ', preg_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_ids = getPortIDs ($object_id, $port['name']);
335 if (!count ($port_ids))
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 elseif (count ($port_ids) == 1) // update only single-socket ports
344 {
345 $result = commitUpdatePort ($object_id, $port_ids[0], $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['addBulkPorts']['OK'] = 82;
356 $msgcode['addBulkPorts']['ERR'] = 192;
357
358 function addBulkPorts ()
359 {
360 assertUIntArg ('object_id', __FUNCTION__);
361 assertStringArg ('port_name', __FUNCTION__, TRUE);
362 assertStringArg ('port_label', __FUNCTION__, TRUE);
363 assertUIntArg('port_numbering_start', __FUNCTION__);
364 assertUIntArg('port_numbering_count', __FUNCTION__);
365
366 $object_id = $_REQUEST['object_id'];
367 $port_name = $_REQUEST['port_name'];
368 $port_type_id = $_REQUEST['port_type_id'];
369 $port_label = $_REQUEST['port_label'];
370 $port_numbering_start = $_REQUEST['port_numbering_start'];
371 $port_numbering_count = $_REQUEST['port_numbering_count'];
372
373 if ($object_id == 0 or $port_type_id == 0 or $port_name == '' or $port_numbering_count == 0)
374 {
375 return buildRedirectURL (__FUNCTION__, 'ERR');
376 }
377 $added_count = $error_count = 0;
378 if(strrpos($port_name, "%u") === false )
379 $port_name .= '%u';
380 for ($i=0,$c=$port_numbering_start; $i<$port_numbering_count; $i++,$c++)
381 {
382 $result = commitAddPort ($object_id, @sprintf($port_name,$c), $port_type_id, @sprintf($port_label,$c), '');
383 if ($result == '')
384 $added_count++;
385 else
386 $error_count++;
387 }
388 return buildRedirectURL (__FUNCTION__, 'OK', array ($added_count, $error_count));
389 }
390
391
392 $msgcode['updIPv4Allocation']['OK'] = 12;
393 $msgcode['updIPv4Allocation']['ERR'] = 109;
394 function updIPv4Allocation ()
395 {
396 assertIPv4Arg ('ip');
397 assertUIntArg ('object_id');
398 assertStringArg ('bond_name', TRUE);
399 assertStringArg ('bond_type');
400
401 $result = updateBond ($_REQUEST['ip'], $_REQUEST['object_id'], $_REQUEST['bond_name'], $_REQUEST['bond_type']);
402 return buildRedirectURL (__FUNCTION__, $result === FALSE ? 'ERR' : 'OK');
403 }
404
405 $msgcode['delIPv4Allocation']['OK'] = 14;
406 $msgcode['delIPv4Allocation']['ERR'] = 111;
407 function delIPv4Allocation ()
408 {
409 assertIPv4Arg ('ip');
410 assertUIntArg ('object_id');
411
412 $result = unbindIpFromObject ($_REQUEST['ip'], $_REQUEST['object_id']);
413 return buildRedirectURL (__FUNCTION__, $result === FALSE ? 'ERR' : 'OK');
414 }
415
416 $msgcode['addIPv4Allocation']['OK'] = 13;
417 $msgcode['addIPv4Allocation']['ERR1'] = 170;
418 $msgcode['addIPv4Allocation']['ERR2'] = 100;
419 function addIPv4Allocation ()
420 {
421 assertIPv4Arg ('ip');
422 assertUIntArg ('object_id');
423 assertStringArg ('bond_name', TRUE);
424 assertStringArg ('bond_type');
425
426 // Strip masklen.
427 $ip = preg_replace ('@/[[:digit:]]+$@', '', $_REQUEST['ip']);
428 if (getConfigVar ('IPV4_JAYWALK') != 'yes' and NULL === getIPv4AddressNetworkId ($ip))
429 return buildRedirectURL (__FUNCTION__, 'ERR1', array ($ip));
430
431 if (FALSE === bindIpToObject ($ip, $_REQUEST['object_id'], $_REQUEST['bond_name'], $_REQUEST['bond_type']))
432 return buildRedirectURL (__FUNCTION__, 'ERR2', array ($error));
433 $address = getIPv4Address ($ip);
434 if ($address['reserved'] == 'yes' or strlen ($address['name']))
435 {
436 $release = getConfigVar ('IPV4_AUTO_RELEASE');
437 if ($release >= 1)
438 $address['reserved'] = 'no';
439 if ($release >= 2)
440 $address['name'] = '';
441 updateAddress ($ip, $address['name'], $address['reserved']);
442 }
443 return buildRedirectURL (__FUNCTION__, 'OK');
444 }
445
446 $msgcode['addIPv4Prefix']['OK'] = 23;
447 $msgcode['addIPv4Prefix']['ERR'] = 100;
448 $msgcode['addIPv4Prefix']['ERR1'] = 173;
449 $msgcode['addIPv4Prefix']['ERR2'] = 174;
450 $msgcode['addIPv4Prefix']['ERR3'] = 175;
451 $msgcode['addIPv4Prefix']['ERR4'] = 176;
452 function addIPv4Prefix ()
453 {
454 assertStringArg ('range');
455 assertStringArg ('name', TRUE);
456
457 $is_bcast = isset ($_REQUEST['is_bcast']) ? $_REQUEST['is_bcast'] : 'off';
458 $taglist = isset ($_REQUEST['taglist']) ? $_REQUEST['taglist'] : array();
459 global $sic;
460 $error = createIPv4Prefix ($_REQUEST['range'], $sic['name'], $is_bcast == 'on', $taglist);
461 if ($error != '')
462 return buildRedirectURL (__FUNCTION__, 'ERR', array ($error));
463 else
464 return buildRedirectURL (__FUNCTION__, 'OK');
465 }
466
467 $msgcode['delIPv4Prefix']['OK'] = 24;
468 $msgcode['delIPv4Prefix']['ERR'] = 100;
469 function delIPv4Prefix ()
470 {
471 assertUIntArg ('id');
472 $error = destroyIPv4Prefix ($_REQUEST['id']);
473 if ($error != '')
474 return buildRedirectURL (__FUNCTION__, 'ERR', array ($error));
475 else
476 return buildRedirectURL (__FUNCTION__, 'OK');
477 }
478
479 $msgcode['updIPv4Prefix']['OK'] = 25;
480 $msgcode['updIPv4Prefix']['ERR'] = 109;
481 function updIPv4Prefix ()
482 {
483 assertUIntArg ('id');
484 assertStringArg ('name', TRUE);
485 assertStringArg ('comment', TRUE);
486 global $sic;
487 $result = updateIPv4Network_real ($sic['id'], $sic['name'], $sic['comment']);
488 return buildRedirectURL (__FUNCTION__, $result !== FALSE ? 'OK' : 'ERR');
489 }
490
491 $msgcode['editAddress']['OK'] = 27;
492 $msgcode['editAddress']['ERR'] = 100;
493 function editAddress ()
494 {
495 assertIPv4Arg ('ip');
496 assertStringArg ('name', TRUE);
497
498 if (isset ($_REQUEST['reserved']))
499 $reserved = $_REQUEST['reserved'];
500 else
501 $reserved = 'off';
502 $error = updateAddress ($_REQUEST['ip'], $_REQUEST['name'], $reserved == 'on' ? 'yes' : 'no');
503 if ($error != '')
504 return buildRedirectURL (__FUNCTION__, 'ERR', array ($error));
505 else
506 return buildRedirectURL (__FUNCTION__, 'OK');
507 }
508
509 $msgcode['createUser']['OK'] = 40;
510 $msgcode['createUser']['ERR'] = 102;
511 function createUser ()
512 {
513 assertStringArg ('username');
514 assertStringArg ('realname', TRUE);
515 assertStringArg ('password');
516 $username = $_REQUEST['username'];
517 $password = sha1 ($_REQUEST['password']);
518 $result = commitCreateUserAccount ($username, $_REQUEST['realname'], $password);
519 if ($result != TRUE)
520 return buildRedirectURL (__FUNCTION__, 'ERR', array ($username));
521 if (isset ($_REQUEST['taglist']))
522 produceTagsForLastRecord ('user', $_REQUEST['taglist']);
523 return buildRedirectURL (__FUNCTION__, 'OK', array ($username));
524 }
525
526 $msgcode['updateUser']['OK'] = 39;
527 $msgcode['updateUser']['ERR1'] = 103;
528 $msgcode['updateUser']['ERR1'] = 104;
529 function updateUser ()
530 {
531 assertUIntArg ('user_id');
532 assertStringArg ('username');
533 assertStringArg ('realname', TRUE);
534 assertStringArg ('password');
535 $username = $_REQUEST['username'];
536 $new_password = $_REQUEST['password'];
537 if (NULL == ($userinfo = spotEntity ('user', $_REQUEST['user_id'])))
538 return buildRedirectURL (__FUNCTION__, 'ERR1');
539 // Update user password only if provided password is not the same as current password hash.
540 if ($new_password != $userinfo['user_password_hash'])
541 $new_password = sha1 ($new_password);
542 $result = commitUpdateUserAccount ($_REQUEST['user_id'], $username, $_REQUEST['realname'], $new_password);
543 if ($result !== FALSE)
544 return buildRedirectURL (__FUNCTION__, 'OK', array ($username));
545 else
546 return buildRedirectURL (__FUNCTION__, 'ERR2', array ($username));
547 }
548
549 $msgcode['updateDictionary']['OK'] = 51;
550 $msgcode['updateDictionary']['ERR'] = 109;
551 function updateDictionary ()
552 {
553 assertUIntArg ('chapter_no');
554 assertUIntArg ('dict_key');
555 assertStringArg ('dict_value');
556 if (FALSE !== commitUpdateDictionary ($_REQUEST['chapter_no'], $_REQUEST['dict_key'], $_REQUEST['dict_value']))
557 return buildRedirectURL (__FUNCTION__, 'OK');
558 else
559 return buildRedirectURL (__FUNCTION__, 'ERR');
560 }
561
562 $msgcode['supplementDictionary']['OK'] = 52;
563 $msgcode['supplementDictionary']['ERR'] = 110;
564 function supplementDictionary ()
565 {
566 assertUIntArg ('chapter_no');
567 assertStringArg ('dict_value');
568 if (commitSupplementDictionary ($_REQUEST['chapter_no'], $_REQUEST['dict_value']) === TRUE)
569 return buildRedirectURL (__FUNCTION__, 'OK');
570 else
571 return buildRedirectURL (__FUNCTION__, 'ERR');
572 }
573
574 $msgcode['reduceDictionary']['OK'] = 50;
575 $msgcode['reduceDictionary']['ERR'] = 111;
576 function reduceDictionary ()
577 {
578 assertUIntArg ('chapter_no');
579 assertUIntArg ('dict_key');
580 if (commitReduceDictionary ($_REQUEST['chapter_no'], $_REQUEST['dict_key']) === TRUE)
581 return buildRedirectURL (__FUNCTION__, 'OK');
582 else
583 return buildRedirectURL (__FUNCTION__, 'ERR');
584 }
585
586 $msgcode['addChapter']['OK'] = 55;
587 $msgcode['addChapter']['ERR'] = 112;
588 function addChapter ()
589 {
590 assertStringArg ('chapter_name');
591 if (commitAddChapter ($_REQUEST['chapter_name']) === TRUE)
592 return buildRedirectURL (__FUNCTION__, 'OK');
593 else
594 return buildRedirectURL (__FUNCTION__, 'ERR');
595 }
596
597 $msgcode['updateChapter']['OK'] = 54;
598 $msgcode['updateChapter']['ERR'] = 113;
599 function updateChapter ()
600 {
601 assertUIntArg ('chapter_no');
602 assertStringArg ('chapter_name');
603 if (FALSE !== commitUpdateChapter ($_REQUEST['chapter_no'], $_REQUEST['chapter_name']))
604 return buildRedirectURL (__FUNCTION__, 'OK');
605 else
606 return buildRedirectURL (__FUNCTION__, 'ERR');
607 }
608
609 $msgcode['delChapter']['OK'] = 53;
610 $msgcode['delChapter']['ERR'] = 114;
611 function delChapter ()
612 {
613 assertUIntArg ('chapter_no');
614 if (commitDeleteChapter ($_REQUEST['chapter_no']))
615 return buildRedirectURL (__FUNCTION__, 'OK');
616 else
617 return buildRedirectURL (__FUNCTION__, 'ERR');
618 }
619
620 $msgcode['changeAttribute']['OK'] = 46;
621 $msgcode['changeAttribute']['ERR'] = 115;
622 function changeAttribute ()
623 {
624 assertUIntArg ('attr_id');
625 assertStringArg ('attr_name');
626 if (FALSE !== commitUpdateAttribute ($_REQUEST['attr_id'], $_REQUEST['attr_name']))
627 return buildRedirectURL (__FUNCTION__, 'OK');
628 else
629 return buildRedirectURL (__FUNCTION__, 'ERR');
630 }
631
632 $msgcode['createAttribute']['OK'] = 45;
633 $msgcode['createAttribute']['ERR'] = 116;
634 function createAttribute ()
635 {
636 assertStringArg ('attr_name');
637 assertStringArg ('attr_type');
638 if (commitAddAttribute ($_REQUEST['attr_name'], $_REQUEST['attr_type']))
639 return buildRedirectURL (__FUNCTION__, 'OK', array ($_REQUEST['attr_name']));
640 else
641 return buildRedirectURL (__FUNCTION__, 'ERR');
642 }
643
644 $msgcode['deleteAttribute']['OK'] = 47;
645 $msgcode['deleteAttribute']['ERR'] = 117;
646 function deleteAttribute ()
647 {
648 assertUIntArg ('attr_id');
649 if (commitDeleteAttribute ($_REQUEST['attr_id']))
650 return buildRedirectURL (__FUNCTION__, 'OK');
651 else
652 return buildRedirectURL (__FUNCTION__, 'ERR');
653 }
654
655 $msgcode['supplementAttrMap']['OK'] = 48;
656 $msgcode['supplementAttrMap']['ERR1'] = 154;
657 $msgcode['supplementAttrMap']['ERR2'] = 118;
658 function supplementAttrMap ()
659 {
660 assertUIntArg ('attr_id');
661 assertUIntArg ('objtype_id');
662 $attrMap = getAttrMap();
663 if ($attrMap[$_REQUEST['attr_id']]['type'] != 'dict')
664 $chapter_id = 'NULL';
665 else
666 {
667 assertUIntArg ('chapter_no'); // FIXME: this doesn't fail on 0 (ticket:272)
668 if (0 == ($chapter_id = $_REQUEST['chapter_no']))
669 return buildRedirectURL (__FUNCTION__, 'ERR1', array ('chapter not selected'));
670 }
671 if (commitSupplementAttrMap ($_REQUEST['attr_id'], $_REQUEST['objtype_id'], $chapter_id) !== FALSE)
672 return buildRedirectURL (__FUNCTION__, 'OK');
673 else
674 return buildRedirectURL (__FUNCTION__, 'ERR2');
675 }
676
677 $msgcode['reduceAttrMap']['OK'] = 49;
678 $msgcode['reduceAttrMap']['ERR'] = 119;
679 function reduceAttrMap ()
680 {
681 assertUIntArg ('attr_id');
682 assertUIntArg ('objtype_id');
683 if (commitReduceAttrMap ($_REQUEST['attr_id'], $_REQUEST['objtype_id']) !== FALSE)
684 return buildRedirectURL (__FUNCTION__, 'OK');
685 else
686 return buildRedirectURL (__FUNCTION__, 'ERR');
687 }
688
689 $msgcode['clearSticker']['OK'] = 15;
690 $msgcode['clearSticker']['ERR'] = 120;
691 function clearSticker ()
692 {
693 assertUIntArg ('attr_id');
694 assertUIntArg ('object_id');
695 if (commitResetAttrValue ($_REQUEST['object_id'], $_REQUEST['attr_id']) !== FALSE)
696 return buildRedirectURL (__FUNCTION__, 'OK');
697 else
698 return buildRedirectURL (__FUNCTION__, 'ERR');
699 }
700
701 $msgcode['updateObjectAllocation']['OK'] = 63;
702 function updateObjectAllocation ()
703 {
704 assertUIntArg ('object_id');
705
706 if (!isset ($_REQUEST['got_atoms']))
707 {
708 unset($_GET['page']);
709 unset($_GET['tab']);
710 unset($_GET['op']);
711 unset($_POST['page']);
712 unset($_POST['tab']);
713 unset($_POST['op']);
714 return buildWideRedirectURL (array(), NULL, NULL, array_merge ($_GET, $_POST));
715 }
716 $object_id = $_REQUEST['object_id'];
717 $workingRacksData = array();
718 foreach ($_REQUEST['rackmulti'] as $cand_id)
719 {
720 if (!isset ($workingRacksData[$cand_id]))
721 {
722 $rackData = spotEntity ('rack', $cand_id);
723 amplifyCell ($rackData);
724 $workingRacksData[$cand_id] = $rackData;
725 }
726 }
727
728 foreach ($workingRacksData as &$rd)
729 applyObjectMountMask ($rd, $object_id);
730
731 $oldMolecule = getMoleculeForObject ($object_id);
732 $changecnt = 0;
733 $log = array();
734 foreach ($workingRacksData as $rack_id => $rackData)
735 {
736 $logrecord = processGridForm ($rackData, 'F', 'T', $object_id);
737 $log[] = $logrecord;
738 if ($logrecord['code'] == 300)
739 continue;
740 $changecnt++;
741 // Reload our working copy after form processing.
742 $rackData = spotEntity ('rack', $cand_id);
743 amplifyCell ($rackData);
744 applyObjectMountMask ($rackData, $object_id);
745 $workingRacksData[$rack_id] = $rackData;
746 }
747 if (!$changecnt)
748 return buildRedirectURL (__FUNCTION__, 'OK', $changecnt);
749 // Log a record.
750 $newMolecule = getMoleculeForObject ($object_id);
751 $oc = count ($oldMolecule);
752 $nc = count ($newMolecule);
753 $omid = $oc ? createMolecule ($oldMolecule) : 'NULL';
754 $nmid = $nc ? createMolecule ($newMolecule) : 'NULL';
755 global $remote_username;
756 $comment = empty ($_REQUEST['comment']) ? 'NULL' : "'${_REQUEST['comment']}'";
757 $query =
758 "insert into MountOperation(object_id, old_molecule_id, new_molecule_id, user_name, comment) " .
759 "values (${object_id}, ${omid}, ${nmid}, '${remote_username}', ${comment})";
760 global $dbxlink;
761 $result = $dbxlink->query ($query);
762 if ($result == NULL)
763 $log[] = array ('code' => 500, 'message' => 'SQL query failed during history logging.');
764 else
765 $log[] = array ('code' => 200, 'message' => 'History logged.');
766 return buildWideRedirectURL ($log);
767 }
768
769 $msgcode['updateObject']['OK'] = 16;
770 $msgcode['updateObject']['ERR'] = 121;
771 function updateObject ()
772 {
773 assertUIntArg ('num_attrs', TRUE);
774 assertUIntArg ('object_id');
775 assertUIntArg ('object_type_id');
776 assertStringArg ('object_name', TRUE);
777 assertStringArg ('object_label', TRUE);
778 assertStringArg ('object_barcode', TRUE);
779 assertStringArg ('object_asset_no', TRUE);
780 if (isset ($_REQUEST['object_has_problems']) and $_REQUEST['object_has_problems'] == 'on')
781 $has_problems = 'yes';
782 else
783 $has_problems = 'no';
784
785 if (commitUpdateObject (
786 $_REQUEST['object_id'],
787 $_REQUEST['object_name'],
788 $_REQUEST['object_label'],
789 $_REQUEST['object_barcode'],
790 $_REQUEST['object_type_id'],
791 $has_problems,
792 $_REQUEST['object_asset_no'],
793 $_REQUEST['object_comment']
794 ) !== TRUE)
795 return buildRedirectURL (__FUNCTION__, 'ERR');
796
797 // Update optional attributes
798 $oldvalues = getAttrValues ($_REQUEST['object_id']);
799 $result = array();
800 $num_attrs = isset ($_REQUEST['num_attrs']) ? $_REQUEST['num_attrs'] : 0;
801 for ($i = 0; $i < $num_attrs; $i++)
802 {
803 assertUIntArg ("${i}_attr_id");
804 $attr_id = $_REQUEST["${i}_attr_id"];
805
806 // Field is empty, delete attribute and move on. OR if the field type is a dictionary and it is the --NOT SET-- value of 0
807 if (!strlen ($_REQUEST["${i}_value"]) || ($oldvalues[$attr_id]['type']=='dict' && $_REQUEST["${i}_value"] == 0))
808 {
809 commitResetAttrValue ($_REQUEST['object_id'], $attr_id);
810 continue;
811 }
812
813 // The value could be uint/float, but we don't know ATM. Let SQL
814 // server check this and complain.
815 assertStringArg ("${i}_value");
816 $value = $_REQUEST["${i}_value"];
817 switch ($oldvalues[$attr_id]['type'])
818 {
819 case 'uint':
820 case 'float':
821 case 'string':
822 $oldvalue = $oldvalues[$attr_id]['value'];
823 break;
824 case 'dict':
825 $oldvalue = $oldvalues[$attr_id]['key'];
826 break;
827 default:
828 }
829 if ($value === $oldvalue) // ('' == 0), but ('' !== 0)
830 continue;
831
832 // Note if the queries succeed or not, it determines which page they see.
833 $result[] = commitUpdateAttrValue ($_REQUEST['object_id'], $attr_id, $value);
834 }
835 if (in_array (FALSE, $result))
836 return buildRedirectURL (__FUNCTION__, 'ERR');
837
838 // Invalidate thumb cache of all racks objects could occupy.
839 foreach (getResidentRacksData ($_REQUEST['object_id'], FALSE) as $rack_id)
840 resetThumbCache ($rack_id);
841
842 return buildRedirectURL (__FUNCTION__, 'OK');
843 }
844
845
846 function addMultipleObjects()
847 {
848 $log = emptyLog();
849 $taglist = isset ($_REQUEST['taglist']) ? $_REQUEST['taglist'] : array();
850 $max = getConfigVar ('MASSCOUNT');
851 for ($i = 0; $i < $max; $i++)
852 {
853 if (!isset ($_REQUEST["${i}_object_type_id"]))
854 {
855 $log = mergeLogs ($log, oneLiner (184, array ($i + 1)));
856 break;
857 }
858 assertUIntArg ("${i}_object_type_id", TRUE);
859 assertStringArg ("${i}_object_name", TRUE);
860 assertStringArg ("${i}_object_label", TRUE);
861 assertStringArg ("${i}_object_asset_no", TRUE);
862 assertStringArg ("${i}_object_barcode", TRUE);
863 $name = $_REQUEST["${i}_object_name"];
864
865 // It's better to skip silently, than to print a notice.
866 if ($_REQUEST["${i}_object_type_id"] == 0)
867 continue;
868 if (($object_id = commitAddObject
869 (
870 $name,
871 $_REQUEST["${i}_object_label"],
872 $_REQUEST["${i}_object_barcode"],
873 $_REQUEST["${i}_object_type_id"],
874 $_REQUEST["${i}_object_asset_no"],
875 $taglist
876 )) !== FALSE){
877 $info = spotEntity ('object', $object_id);
878 // FIXME: employ amplifyCell() instead of calling loader functions directly
879 amplifyCell ($info);
880 $log = mergeLogs ($log, oneLiner (80, array ('<a href="' . makeHref (array ('page' => 'object', 'tab' => 'default', 'object_id' => $object_id)) . '">' . $info['dname'] . '</a>')));
881 }else{
882 $log = mergeLogs ($log, oneLiner (185, array ($name)));
883 }
884 }
885 return buildWideRedirectURL ($log);
886 }
887
888 function addLotOfObjects()
889 {
890 $log = emptyLog();
891 $taglist = isset ($_REQUEST['taglist']) ? $_REQUEST['taglist'] : array();
892 assertUIntArg ('global_type_id', TRUE);
893 assertStringArg ('namelist', TRUE);
894 $global_type_id = $_REQUEST['global_type_id'];
895 if ($global_type_id == 0 or !strlen ($_REQUEST['namelist']))
896 $log = mergeLogs ($log, oneLiner (186));
897 else
898 {
899 // The name extractor below was stolen from ophandlers.php:addMultiPorts()
900 $names1 = explode ("\n", $_REQUEST['namelist']);
901 $names2 = array();
902 foreach ($names1 as $line)
903 {
904 $parts = explode ('\r', $line);
905 reset ($parts);
906 if (!strlen ($parts[0]))
907 continue;
908 else
909 $names2[] = rtrim ($parts[0]);
910 }
911 foreach ($names2 as $name)
912 if (($object_id = commitAddObject ($name, '', '', $global_type_id, '', $taglist)) !== FALSE)
913 {
914 $info = spotEntity ('object', $object_id);
915 amplifyCell ($info);
916 $log = mergeLogs ($log, oneLiner (80, array ('<a href="' . makeHref (array ('page' => 'object', 'tab' => 'default', 'object_id' => $object_id)) . '">' . $info['dname'] . '</a>')));
917 }
918 else
919 $log = mergeLogs ($log, oneLiner (185, array ($name)));
920 }
921 return buildWideRedirectURL ($log);
922 }
923
924 $msgcode['deleteObject']['OK'] = 76;
925 $msgcode['deleteObject']['ERR'] = 100;
926 function deleteObject ()
927 {
928 assertUIntArg ('object_id');
929 if (NULL === ($oinfo = spotEntity ('object', $_REQUEST['object_id'])))
930 return buildRedirectURL (__FUNCTION__, 'ERR', array ('object not found'));
931
932 $racklist = getResidentRacksData ($_REQUEST['object_id'], FALSE);
933 $error = commitDeleteObject ($_REQUEST['object_id']);
934 foreach ($racklist as $rack_id)
935 resetThumbCache ($rack_id);
936
937 if ($error != '')
938 return buildRedirectURL (__FUNCTION__, 'ERR', array ($error));
939
940 return buildRedirectURL (__FUNCTION__, 'OK', array ($oinfo['dname']));
941 }
942
943 $msgcode['useupPort']['OK'] = 11;
944 $msgcode['useupPort']['ERR'] = 124;
945 function useupPort ()
946 {
947 assertUIntArg ('port_id');
948 if (FALSE !== commitUseupPort ($_REQUEST['port_id']))
949 return buildRedirectURL (__FUNCTION__, 'OK');
950 else
951 return buildRedirectURL (__FUNCTION__, 'ERR');
952 }
953
954 $msgcode['updateUI']['OK'] = 56;
955 function updateUI ()
956 {
957 assertUIntArg ('num_vars');
958
959 for ($i = 0; $i < $_REQUEST['num_vars']; $i++)
960 {
961 assertStringArg ("${i}_varname");
962 assertStringArg ("${i}_varvalue", TRUE);
963 $varname = $_REQUEST["${i}_varname"];
964 $varvalue = $_REQUEST["${i}_varvalue"];
965
966 // If form value = value in DB, don't bother updating DB
967 if (!isConfigVarChanged($varname, $varvalue))
968 continue;
969 // any exceptions will be handled by process.php
970 setConfigVar ($varname, $varvalue, TRUE);
971 }
972 return buildRedirectURL (__FUNCTION__, 'OK');
973 }
974
975 $msgcode['saveMyPreferences']['OK'] = 56;
976 function saveMyPreferences ()
977 {
978 assertUIntArg ('num_vars');
979
980 for ($i = 0; $i < $_REQUEST['num_vars']; $i++)
981 {
982 assertStringArg ("${i}_varname");
983 assertStringArg ("${i}_varvalue", TRUE);
984 $varname = $_REQUEST["${i}_varname"];
985 $varvalue = $_REQUEST["${i}_varvalue"];
986
987 // If form value = value in DB, don't bother updating DB
988 if (!isConfigVarChanged($varname, $varvalue))
989 continue;
990 setUserConfigVar ($varname, $varvalue);
991 }
992 return buildRedirectURL (__FUNCTION__, 'OK');
993 }
994
995 $msgcode['resetMyPreference']['OK'] = 56;
996 function resetMyPreference ()
997 {
998 assertStringArg ("varname");
999 resetUserConfigVar ($_REQUEST["varname"]);
1000 return buildRedirectURL (__FUNCTION__, 'OK');
1001 }
1002
1003 $msgcode['resetUIConfig']['OK'] = 57;
1004 function resetUIConfig()
1005 {
1006 setConfigVar ('MASSCOUNT','15');
1007 setConfigVar ('MAXSELSIZE','30');
1008 setConfigVar ('ROW_SCALE','2');
1009 setConfigVar ('PORTS_PER_ROW','12');
1010 setConfigVar ('IPV4_ADDRS_PER_PAGE','256');
1011 setConfigVar ('DEFAULT_RACK_HEIGHT','42');
1012 setConfigVar ('DEFAULT_SLB_VS_PORT','');
1013 setConfigVar ('DEFAULT_SLB_RS_PORT','');
1014 setConfigVar ('DETECT_URLS','no');
1015 setConfigVar ('RACK_PRESELECT_THRESHOLD','1');
1016 setConfigVar ('DEFAULT_IPV4_RS_INSERVICE','no');
1017 setConfigVar ('AUTOPORTS_CONFIG','4 = 1*33*kvm + 2*24*eth%u;15 = 1*446*kvm');
1018 setConfigVar ('SHOW_EXPLICIT_TAGS','yes');
1019 setConfigVar ('SHOW_IMPLICIT_TAGS','yes');
1020 setConfigVar ('SHOW_AUTOMATIC_TAGS','no');
1021 setConfigVar ('DEFAULT_OBJECT_TYPE','4');
1022 setConfigVar ('IPV4_AUTO_RELEASE','1');
1023 setConfigVar ('SHOW_LAST_TAB', 'no');
1024 setConfigVar ('EXT_IPV4_VIEW', 'yes');
1025 setConfigVar ('TREE_THRESHOLD', '25');
1026 setConfigVar ('IPV4_JAYWALK', 'no');
1027 setConfigVar ('ADDNEW_AT_TOP', 'yes');
1028 setConfigVar ('IPV4_TREE_SHOW_USAGE', 'yes');
1029 setConfigVar ('PREVIEW_TEXT_MAXCHARS', '10240');
1030 setConfigVar ('PREVIEW_TEXT_ROWS', '25');
1031 setConfigVar ('PREVIEW_TEXT_COLS', '80');
1032 setConfigVar ('PREVIEW_IMAGE_MAXPXS', '320');
1033 setConfigVar ('VENDOR_SIEVE', '');
1034 setConfigVar ('IPV4LB_LISTSRC', '{$typeid_4}');
1035 setConfigVar ('IPV4OBJ_LISTSRC','{$typeid_4} or {$typeid_7} or {$typeid_8} or {$typeid_12} or {$typeid_445} or {$typeid_447} or {$typeid_798}');
1036 setConfigVar ('IPV4NAT_LISTSRC','{$typeid_4} or {$typeid_7} or {$typeid_8} or {$typeid_798}');
1037 setConfigVar ('ASSETWARN_LISTSRC','{$typeid_4} or {$typeid_7} or {$typeid_8}');
1038 setConfigVar ('NAMEWARN_LISTSRC','{$typeid_4} or {$typeid_7} or {$typeid_8}');
1039 setConfigVar ('RACKS_PER_ROW','12');
1040 setConfigVar ('FILTER_PREDICATE_SIEVE','');
1041 setConfigVar ('FILTER_DEFAULT_ANDOR','or');
1042 setConfigVar ('FILTER_SUGGEST_ANDOR','yes');
1043 setConfigVar ('FILTER_SUGGEST_TAGS','yes');
1044 setConfigVar ('FILTER_SUGGEST_PREDICATES','yes');
1045 setConfigVar ('FILTER_SUGGEST_EXTRA','no');
1046 setConfigVar ('DEFAULT_SNMP_COMMUNITY','public');
1047 setConfigVar ('IPV4_ENABLE_KNIGHT','yes');
1048 setConfigVar ('TAGS_TOPLIST_SIZE','50');
1049 setConfigVar ('TAGS_QUICKLIST_SIZE','20');
1050 setConfigVar ('TAGS_QUICKLIST_THRESHOLD','50');
1051 setConfigVar ('ENABLE_MULTIPORT_FORM', 'no');
1052 setConfigVar ('DEFAULT_PORT_IIF_ID', '1');
1053 setConfigVar ('DEFAULT_PORT_OIF_IDS', '1=24; 3=1078; 4=1077; 5=1079; 6=1080; 8=1082; 9=1084');
1054 setConfigVar ('IPV4_TREE_RTR_AS_CELL', 'yes');
1055 setConfigVar ('PROXIMITY_RANGE', 0);
1056 setConfigVar ('IPV4_TREE_SHOW_VLAN', 'yes');
1057 setConfigVar ('VLANSWITCH_LISTSRC', '');
1058 setConfigVar ('VLANIPV4NET_LISTSRC', '');
1059 setConfigVar ('DEFAULT_VDOM_ID', '');
1060 setConfigVar ('DEFAULT_VST_ID', '');
1061 setConfigVar ('STATIC_FILTER', 'yes');
1062 setConfigVar ('8021Q_DEPLOY_MINAGE', '300');
1063 setConfigVar ('8021Q_DEPLOY_MAXAGE', '3600');
1064 setConfigVar ('8021Q_DEPLOY_RETRY', '10800');
1065 setConfigVar ('8021Q_WRI_AFTER_CONFT_LISTSRC', 'false');
1066 setConfigVar ('8021Q_INSTANT_DEPLOY', 'no');
1067 setConfigVar ('CDP_RUNNERS_LISTSRC', '');
1068 setConfigVar ('LLDP_RUNNERS_LISTSRC', '');
1069 setConfigVar ('HNDP_RUNNERS_LISTSRC', '');
1070 return buildRedirectURL (__FUNCTION__, 'OK');
1071 }
1072
1073 $msgcode['addRealServer']['OK'] = 34;
1074 $msgcode['addRealServer']['ERR'] = 126;
1075 // Add single record.
1076 function addRealServer ()
1077 {
1078 assertUIntArg ('pool_id');
1079 assertIPv4Arg ('remoteip');
1080 assertStringArg ('rsport', TRUE);
1081 assertStringArg ('rsconfig', TRUE);
1082 if (!addRStoRSPool (
1083 $_REQUEST['pool_id'],
1084 $_REQUEST['remoteip'],
1085 $_REQUEST['rsport'],
1086 getConfigVar ('DEFAULT_IPV4_RS_INSERVICE'),
1087 $_REQUEST['rsconfig']
1088 ))
1089 return buildRedirectURL (__FUNCTION__, 'ERR');
1090 else
1091 return buildRedirectURL (__FUNCTION__, 'OK');
1092 }
1093
1094 $msgcode['addRealServers']['OK'] = 37;
1095 $msgcode['addRealServers']['ERR1'] = 131;
1096 $msgcode['addRealServers']['ERR2'] = 127;
1097 // Parse textarea submitted and try adding a real server for each line.
1098 function addRealServers ()
1099 {
1100 assertUIntArg ('pool_id');
1101 assertStringArg ('format');
1102 assertStringArg ('rawtext');
1103 $ngood = $nbad = 0;
1104 $rsconfig = '';
1105 // Keep in mind, that the text will have HTML entities (namely '>') escaped.
1106 foreach (explode ("\n", dos2unix ($_REQUEST['rawtext'])) as $line)
1107 {
1108 if (!strlen ($line))
1109 continue;
1110 $match = array ();
1111 switch ($_REQUEST['format'])
1112 {
1113 case 'ipvs_2': // address and port only
1114 if (!preg_match ('/^ -&gt; ([0-9\.]+):([0-9]+) /', $line, $match))
1115 continue;
1116 if (addRStoRSPool ($_REQUEST['pool_id'], $match[1], $match[2], getConfigVar ('DEFAULT_IPV4_RS_INSERVICE'), ''))
1117 $ngood++;
1118 else
1119 $nbad++;
1120 break;
1121 case 'ipvs_3': // address, port and weight
1122 if (!preg_match ('/^ -&gt; ([0-9\.]+):([0-9]+) +[a-zA-Z]+ +([0-9]+) /', $line, $match))
1123 continue;
1124 if (addRStoRSPool ($_REQUEST['pool_id'], $match[1], $match[2], getConfigVar ('DEFAULT_IPV4_RS_INSERVICE'), 'weight ' . $match[3]))
1125 $ngood++;
1126 else
1127 $nbad++;
1128 break;
1129 case 'ssv_2': // IP address and port
1130 if (!preg_match ('/^([0-9\.]+) ([0-9]+)$/', $line, $match))
1131 continue;
1132 if (addRStoRSPool ($_REQUEST['pool_id'], $match[1], $match[2], getConfigVar ('DEFAULT_IPV4_RS_INSERVICE'), ''))
1133 $ngood++;
1134 else
1135 $nbad++;
1136 break;
1137 case 'ssv_1': // IP address
1138 if (!preg_match ('/^([0-9\.]+)$/', $line, $match))
1139 continue;
1140 if (addRStoRSPool ($_REQUEST['pool_id'], $match[1], 0, getConfigVar ('DEFAULT_IPV4_RS_INSERVICE'), ''))
1141 $ngood++;
1142 else
1143 $nbad++;
1144 break;
1145 default:
1146 return buildRedirectURL (__FUNCTION__, 'ERR1');
1147 break;
1148 }
1149 }
1150 if ($nbad == 0 and $ngood > 0)
1151 return buildRedirectURL (__FUNCTION__, 'OK', array ($ngood));
1152 else
1153 return buildRedirectURL (__FUNCTION__, 'ERR2', array ($ngood, $nbad));
1154 }
1155
1156 $msgcode['addVService']['OK'] = 28;
1157 $msgcode['addVService']['ERR1'] = 132;
1158 $msgcode['addVService']['ERR2'] = 100;
1159 function addVService ()
1160 {
1161 assertIPv4Arg ('vip');
1162 assertUIntArg ('vport');
1163 assertStringArg ('proto');
1164 if ($_REQUEST['proto'] != 'TCP' and $_REQUEST['proto'] != 'UDP')
1165 return buildRedirectURL (__FUNCTION__, 'ERR1');
1166 assertStringArg ('name', TRUE);
1167 assertStringArg ('vsconfig', TRUE);
1168 assertStringArg ('rsconfig', TRUE);
1169 $error = commitCreateVS
1170 (
1171 $_REQUEST['vip'],
1172 $_REQUEST['vport'],
1173 $_REQUEST['proto'],
1174 $_REQUEST['name'],
1175 $_REQUEST['vsconfig'],
1176 $_REQUEST['rsconfig'],
1177 isset ($_REQUEST['taglist']) ? $_REQUEST['taglist'] : array()
1178 );
1179 if ($error != '')
1180 return buildRedirectURL (__FUNCTION__, 'ERR2', array ($error));
1181 else
1182 return buildRedirectURL (__FUNCTION__, 'OK');
1183 }
1184
1185 $msgcode['deleteRealServer']['OK'] = 35;
1186 $msgcode['deleteRealServer']['ERR'] = 128;
1187 function deleteRealServer ()
1188 {
1189 assertUIntArg ('id');
1190 if (!commitDeleteRS ($_REQUEST['id']))
1191 return buildRedirectURL (__FUNCTION__, 'ERR');
1192 else
1193 return buildRedirectURL (__FUNCTION__, 'OK');
1194 }
1195
1196 $msgcode['deleteLoadBalancer']['OK'] = 19;
1197 $msgcode['deleteLoadBalancer']['ERR'] = 129;
1198 function deleteLoadBalancer ()
1199 {
1200 assertUIntArg ('object_id');
1201 assertUIntArg ('pool_id');
1202 assertUIntArg ('vs_id');
1203 if (!commitDeleteLB (
1204 $_REQUEST['object_id'],
1205 $_REQUEST['pool_id'],
1206 $_REQUEST['vs_id']
1207 ))
1208 return buildRedirectURL (__FUNCTION__, 'ERR');
1209 else
1210 return buildRedirectURL (__FUNCTION__, 'OK');
1211 }
1212
1213 $msgcode['deleteVService']['OK'] = 29;
1214 $msgcode['deleteVService']['ERR'] = 130;
1215 function deleteVService ()
1216 {
1217 assertUIntArg ('vs_id');
1218 if (!commitDeleteVS ($_REQUEST['vs_id']))
1219 return buildRedirectURL (__FUNCTION__, 'ERR');
1220 else
1221 return buildRedirectURL (__FUNCTION__, 'OK');
1222 }
1223
1224 $msgcode['updateRealServer']['OK'] = 36;
1225 $msgcode['updateRealServer']['ERR'] = 133;
1226 function updateRealServer ()
1227 {
1228 assertUIntArg ('rs_id');
1229 assertIPv4Arg ('rsip');
1230 assertStringArg ('rsport', TRUE);
1231 assertStringArg ('rsconfig', TRUE);
1232 if (FALSE === commitUpdateRS (
1233 $_REQUEST['rs_id'],
1234 $_REQUEST['rsip'],
1235 $_REQUEST['rsport'],
1236 $_REQUEST['rsconfig']
1237 ))
1238 return buildRedirectURL (__FUNCTION__, 'ERR');
1239 else
1240 return buildRedirectURL (__FUNCTION__, 'OK');
1241 }
1242
1243 $msgcode['updateLoadBalancer']['OK'] = 20;
1244 $msgcode['updateLoadBalancer']['ERR'] = 134;
1245 function updateLoadBalancer ()
1246 {
1247 assertUIntArg ('object_id');
1248 assertUIntArg ('pool_id');
1249 assertUIntArg ('vs_id');
1250 assertStringArg ('vsconfig', TRUE);
1251 assertStringArg ('rsconfig', TRUE);
1252 if (FALSE === commitUpdateLB (
1253 $_REQUEST['object_id'],
1254 $_REQUEST['pool_id'],
1255 $_REQUEST['vs_id'],
1256 $_REQUEST['vsconfig'],
1257 $_REQUEST['rsconfig']
1258 ))
1259 return buildRedirectURL (__FUNCTION__, 'ERR');
1260 else
1261 return buildRedirectURL (__FUNCTION__, 'OK');
1262 }
1263
1264 $msgcode['updateVService']['OK'] = 30;
1265 $msgcode['updateVService']['ERR'] = 135;
1266 function updateVService ()
1267 {
1268 assertUIntArg ('vs_id');
1269 assertIPv4Arg ('vip');
1270 assertUIntArg ('vport');
1271 assertStringArg ('proto');
1272 assertStringArg ('name', TRUE);
1273 assertStringArg ('vsconfig', TRUE);
1274 assertStringArg ('rsconfig', TRUE);
1275 if (FALSE === commitUpdateVS (
1276 $_REQUEST['vs_id'],
1277 $_REQUEST['vip'],
1278 $_REQUEST['vport'],
1279 $_REQUEST['proto'],
1280 $_REQUEST['name'],
1281 $_REQUEST['vsconfig'],
1282 $_REQUEST['rsconfig']
1283 ))
1284 return buildRedirectURL (__FUNCTION__, 'ERR');
1285 else
1286 return buildRedirectURL (__FUNCTION__, 'OK');
1287 }
1288
1289 $msgcode['addLoadBalancer']['OK'] = 18;
1290 $msgcode['addLoadBalancer']['ERR'] = 137;
1291 function addLoadBalancer ()
1292 {
1293 assertUIntArg ('pool_id');
1294 assertUIntArg ('object_id');
1295 assertUIntArg ('vs_id');
1296 assertStringArg ('vsconfig', TRUE);
1297 assertStringArg ('rsconfig', TRUE);
1298 if (!addLBtoRSPool (
1299 $_REQUEST['pool_id'],
1300 $_REQUEST['object_id'],
1301 $_REQUEST['vs_id'],
1302 $_REQUEST['vsconfig'],
1303 $_REQUEST['rsconfig']
1304 ))
1305 return buildRedirectURL (__FUNCTION__, 'ERR');
1306 else
1307 return buildRedirectURL (__FUNCTION__, 'OK');
1308 }
1309
1310 $msgcode['addRSPool']['OK'] = 31;
1311 $msgcode['addRSPool']['ERR'] = 100;
1312 function addRSPool ()
1313 {
1314 assertStringArg ('name', TRUE);
1315 assertStringArg ('vsconfig', TRUE);
1316 assertStringArg ('rsconfig', TRUE);
1317 $error = commitCreateRSPool
1318 (
1319 $_REQUEST['name'],
1320 $_REQUEST['vsconfig'],
1321 $_REQUEST['rsconfig'],
1322 isset ($_REQUEST['taglist']) ? $_REQUEST['taglist'] : array()
1323 );
1324 if ($error != '')
1325 return buildRedirectURL (__FUNCTION__, 'ERR', array ($error));
1326 else
1327 return buildRedirectURL (__FUNCTION__, 'OK');
1328 }
1329
1330 $msgcode['deleteRSPool']['OK'] = 32;
1331 $msgcode['deleteRSPool']['ERR'] = 138;
1332 function deleteRSPool ()
1333 {
1334 assertUIntArg ('pool_id');
1335 if (commitDeleteRSPool ($_REQUEST['pool_id']) === FALSE)
1336 return buildRedirectURL (__FUNCTION__, 'ERR');
1337 else
1338 return buildRedirectURL (__FUNCTION__, 'OK');
1339 }
1340
1341 $msgcode['updateRSPool']['OK'] = 33;
1342 $msgcode['updateRSPool']['ERR'] = 139;
1343 function updateRSPool ()
1344 {
1345 assertUIntArg ('pool_id');
1346 assertStringArg ('name', TRUE);
1347 assertStringArg ('vsconfig', TRUE);
1348 assertStringArg ('rsconfig', TRUE);
1349 if (FALSE === commitUpdateRSPool ($_REQUEST['pool_id'], $_REQUEST['name'], $_REQUEST['vsconfig'], $_REQUEST['rsconfig']))
1350 return buildRedirectURL (__FUNCTION__, 'ERR');
1351 else
1352 return buildRedirectURL (__FUNCTION__, 'OK');
1353 }
1354
1355 $msgcode['updateRSInService']['OK'] = 38;
1356 $msgcode['updateRSInService']['ERR'] = 140;
1357 function updateRSInService ()
1358 {
1359 assertUIntArg ('rscount');
1360 $pool_id = $_REQUEST['pool_id'];
1361 $orig = spotEntity ('ipv4rspool', $pool_id);
1362 amplifyCell ($orig);
1363 $nbad = $ngood = 0;
1364 for ($i = 1; $i <= $_REQUEST['rscount']; $i++)
1365 {
1366 $rs_id = $_REQUEST["rsid_${i}"];
1367 if (isset ($_REQUEST["inservice_${i}"]) and $_REQUEST["inservice_${i}"] == 'on')
1368 $newval = 'yes';
1369 else
1370 $newval = 'no';
1371 if ($newval != $orig['rslist'][$rs_id]['inservice'])
1372 {
1373 if (FALSE !== commitSetInService ($rs_id, $newval))
1374 $ngood++;
1375 else
1376 $nbad++;
1377 }
1378 }
1379 if (!$nbad)
1380 return buildRedirectURL (__FUNCTION__, 'OK', array ($ngood));
1381 else
1382 return buildRedirectURL (__FUNCTION__, 'ERR', array ($nbad, $ngood));
1383 }
1384
1385 $msgcode['importPTRData']['OK'] = 26;
1386 $msgcode['importPTRData']['ERR'] = 141;
1387 // FIXME: check, that each submitted address belongs to the prefix we
1388 // are operating on.
1389 function importPTRData ()
1390 {
1391 assertUIntArg ('addrcount');
1392 $nbad = $ngood = 0;
1393 for ($i = 0; $i < $_REQUEST['addrcount']; $i++)
1394 {
1395 $inputname = "import_${i}";
1396 if (!isset ($_REQUEST[$inputname]) or $_REQUEST[$inputname] != 'on')
1397 continue;
1398 assertIPv4Arg ("addr_${i}");
1399 assertStringArg ("descr_${i}", TRUE);
1400 assertStringArg ("rsvd_${i}");
1401 // Non-existent addresses will not have this argument set in request.
1402 $rsvd = 'no';
1403 if ($_REQUEST["rsvd_${i}"] == 'yes')
1404 $rsvd = 'yes';
1405 if (updateAddress ($_REQUEST["addr_${i}"], $_REQUEST["descr_${i}"], $rsvd) == '')
1406 $ngood++;
1407 else
1408 $nbad++;
1409 }
1410 if (!$nbad)
1411 return buildRedirectURL (__FUNCTION__, 'OK', array ($ngood));
1412 else
1413 return buildRedirectURL (__FUNCTION__, 'ERR', array ($nbad, $ngood));
1414 }
1415
1416 $msgcode['generateAutoPorts']['OK'] = 21;
1417 $msgcode['generateAutoPorts']['ERR'] = 142;
1418 function generateAutoPorts ()
1419 {
1420 global $pageno;
1421 assertUIntArg ('object_id');
1422 $info = spotEntity ('object', $_REQUEST['object_id']);
1423 // Navigate away in case of success, stay at the place otherwise.
1424 if (executeAutoPorts ($_REQUEST['object_id'], $info['objtype_id']))
1425 return buildRedirectURL (__FUNCTION__, 'OK', array(), $pageno, 'ports');
1426 else
1427 return buildRedirectURL (__FUNCTION__, 'ERR');
1428 }
1429
1430 $msgcode['saveEntityTags']['OK'] = 22;
1431 $msgcode['saveEntityTags']['ERR1'] = 143;
1432 $msgcode['saveEntityTags']['ERR2'] = 187;
1433 // Filter out implicit tags before storing the new tag set.
1434 function saveEntityTags ()
1435 {
1436 global $page, $pageno, $etype_by_pageno;
1437 if (!isset ($etype_by_pageno[$pageno]) or !isset ($page[$pageno]['bypass']))
1438 return buildRedirectURL (__FUNCTION__, 'ERR2', array (__FUNCTION__));
1439 $realm = $etype_by_pageno[$pageno];
1440 $bypass = $page[$pageno]['bypass'];
1441 assertUIntArg ($bypass);
1442 $entity_id = $_REQUEST[$bypass];
1443 $taglist = isset ($_REQUEST['taglist']) ? $_REQUEST['taglist'] : array();
1444 // Build a chain from the submitted data, minimize it,
1445 // then wipe existing records and store the new set instead.
1446 destroyTagsForEntity ($realm, $entity_id);
1447 // TODO: these actions are very close to what rebuildTagChainForEntity() does,
1448 // so why not use it?
1449 $newchain = getExplicitTagsOnly (buildTagChainFromIds ($taglist));
1450 $n_succeeds = $n_errors = 0;
1451 foreach ($newchain as $taginfo)
1452 if (addTagForEntity ($realm, $entity_id, $taginfo['id']))
1453 $n_succeeds++;
1454 else
1455 $n_errors++;
1456 if ($n_errors)
1457 return buildRedirectURL (__FUNCTION__, 'ERR1', array ($n_succeeds, $n_errors));
1458 else
1459 return buildRedirectURL (__FUNCTION__, 'OK', array ($n_succeeds));
1460 }
1461
1462 $msgcode['destroyTag']['OK'] = 58;
1463 $msgcode['destroyTag']['ERR1'] = 183;
1464 $msgcode['destroyTag']['ERR2'] = 144;
1465 function destroyTag ()
1466 {
1467 assertUIntArg ('tag_id');
1468 global $taglist;
1469 if (!isset ($taglist[$_REQUEST['tag_id']]))
1470 return buildRedirectURL (__FUNCTION__, 'ERR1', array ($_REQUEST['tag_id']));
1471 if (($ret = commitDestroyTag ($_REQUEST['tag_id'])) == '')
1472 return buildRedirectURL (__FUNCTION__, 'OK', array ($taglist[$_REQUEST['tag_id']]['tag']));
1473 else
1474 return buildRedirectURL (__FUNCTION__, 'ERR2');
1475 }
1476
1477 $msgcode['createTag']['OK'] = 59;
1478 $msgcode['createTag']['ERR1'] = 145;
1479 $msgcode['createTag']['ERR3'] = 147;
1480 function createTag ()
1481 {
1482 assertStringArg ('tag_name');
1483 assertUIntArg ('parent_id', TRUE);
1484 $tagname = trim ($_REQUEST['tag_name']);
1485 if (!validTagName ($tagname))
1486 return buildRedirectURL (__FUNCTION__, 'ERR1', array ($tagname));
1487 if (($parent_id = $_REQUEST['parent_id']) <= 0)
1488 $parent_id = NULL;
1489 if (FALSE === commitCreateTag ($tagname, $parent_id))
1490 return buildRedirectURL (__FUNCTION__, 'ERR3', array (niftyString ($tagname)));
1491 return buildRedirectURL (__FUNCTION__, 'OK', array (niftyString ($tagname)));
1492 }
1493
1494 $msgcode['updateTag']['OK'] = 60;
1495 $msgcode['updateTag']['ERR1'] = 145;
1496 $msgcode['updateTag']['ERR2'] = 109;
1497 function updateTag ()
1498 {
1499 assertUIntArg ('tag_id');
1500 assertUIntArg ('parent_id', TRUE);
1501 assertStringArg ('tag_name');
1502 $tagname = trim ($_REQUEST['tag_name']);
1503 if (!validTagName ($tagname))
1504 return buildRedirectURL (__FUNCTION__, 'ERR1', array ($tagname));
1505 if (($parent_id = $_REQUEST['parent_id']) <= 0)
1506 $parent_id = 'NULL';
1507 if (FALSE !== commitUpdateTag ($_REQUEST['tag_id'], $tagname, $parent_id))
1508 return buildRedirectURL (__FUNCTION__, 'OK', array ($tagname));
1509 // Use old name in the message, cause update failed.
1510 global $taglist;
1511 return buildRedirectURL (__FUNCTION__, 'ERR2', array ($taglist[$_REQUEST['tag_id']]['tag']));
1512 }
1513
1514 $msgcode['rollTags']['OK'] = 67;
1515 $msgcode['rollTags']['ERR'] = 149;
1516 function rollTags ()
1517 {
1518 assertUIntArg ('row_id');
1519 assertStringArg ('sum', TRUE);
1520 assertUIntArg ('realsum');
1521 if ($_REQUEST['sum'] != $_REQUEST['realsum'])
1522 return buildRedirectURL (__FUNCTION__, 'ERR');
1523 // Even if the user requested an empty tag list, don't bail out, but process existing
1524 // tag chains with "zero" extra. This will make sure, that the stuff processed will
1525 // have its chains refined to "normal" form.
1526 $extratags = isset ($_REQUEST['taglist']) ? $_REQUEST['taglist'] : array();
1527 $n_ok = 0;
1528 // Minimizing the extra chain early, so that tag rebuilder doesn't have to
1529 // filter out the same tag again and again. It will have own noise to cancel.
1530 $extrachain = getExplicitTagsOnly (buildTagChainFromIds ($extratags));
1531 foreach (listCells ('rack', $_REQUEST['row_id']) as $rack)
1532 {
1533 if (rebuildTagChainForEntity ('rack', $rack['id'], $extrachain))
1534 $n_ok++;
1535 amplifyCell ($rack);
1536 foreach ($rack['mountedObjects'] as $object_id)
1537 if (rebuildTagChainForEntity ('object', $object_id, $extrachain))
1538 $n_ok++;
1539 }
1540 return buildRedirectURL (__FUNCTION__, 'OK', array ($n_ok));
1541 }
1542
1543 $msgcode['changeMyPassword']['OK'] = 61;
1544 $msgcode['changeMyPassword']['ERR1'] = 150;
1545 $msgcode['changeMyPassword']['ERR2'] = 151;
1546 $msgcode['changeMyPassword']['ERR3'] = 152;
1547 $msgcode['changeMyPassword']['ERR4'] = 153;
1548 function changeMyPassword ()
1549 {
1550 global $remote_username, $user_auth_src;
1551 if ($user_auth_src != 'database')
1552 return buildRedirectURL (__FUNCTION__, 'ERR1');
1553 assertStringArg ('oldpassword');
1554 assertStringArg ('newpassword1');
1555 assertStringArg ('newpassword2');
1556 $remote_userid = getUserIDByUsername ($remote_username);
1557 $userinfo = spotEntity ('user', $remote_userid);
1558 if ($userinfo['user_password_hash'] != sha1 ($_REQUEST['oldpassword']))
1559 return buildRedirectURL (__FUNCTION__, 'ERR2');
1560 if ($_REQUEST['newpassword1'] != $_REQUEST['newpassword2'])
1561 return buildRedirectURL (__FUNCTION__, 'ERR3');
1562 if (FALSE !== commitUpdateUserAccount ($remote_userid, $userinfo['user_name'], $userinfo['user_realname'], sha1 ($_REQUEST['newpassword1'])))
1563 return buildRedirectURL (__FUNCTION__, 'OK');
1564 else
1565 return buildRedirectURL (__FUNCTION__, 'ERR4');
1566 }
1567
1568 $msgcode['saveRackCode']['OK'] = 43;
1569 $msgcode['saveRackCode']['ERR1'] = 154;
1570 $msgcode['saveRackCode']['ERR2'] = 155;
1571 function saveRackCode ()
1572 {
1573 assertStringArg ('rackcode');
1574 // For the test to succeed, unescape LFs, strip CRs.
1575 $newcode = dos2unix ($_REQUEST['rackcode']);
1576 $parseTree = getRackCode ($newcode);
1577 if ($parseTree['result'] != 'ACK')
1578 return buildRedirectURL (__FUNCTION__, 'ERR1', array ($parseTree['load']));
1579 if (FALSE !== saveScript ('RackCode', $newcode))
1580 {
1581 saveScript ('RackCodeCache', base64_encode (serialize ($parseTree)));
1582 return buildRedirectURL (__FUNCTION__, 'OK');
1583 }
1584 return buildRedirectURL (__FUNCTION__, 'ERR2');
1585 }
1586
1587 $msgcode['setPortVLAN']['ERR1'] = 156;
1588 // This handler's context is pre-built, but not authorized. It is assumed, that the
1589 // handler will take existing context and before each commit check authorization
1590 // on the base chain plus necessary context added.
1591 function setPortVLAN ()
1592 {
1593 assertUIntArg ('portcount');
1594 $data = getSwitchVLANs ($_REQUEST['object_id']);
1595 if ($data === NULL)
1596 return buildRedirectURL (__FUNCTION__, 'ERR1');
1597 list ($vlanlist, $portlist) = $data;
1598 // Here we just build up 1 set command for the gateway with all of the ports
1599 // included. The gateway is expected to filter unnecessary changes silently
1600 // and to provide a list of responses with either error or success message
1601 // for each of the rest.
1602 $nports = $_REQUEST['portcount'];
1603 $prefix = 'set ';
1604 $log = emptyLog();
1605 $setcmd = '';
1606 for ($i = 0; $i < $nports; $i++)
1607 if
1608 (
1609 !isset ($_REQUEST['portname_' . $i]) ||
1610 !isset ($_REQUEST['vlanid_' . $i]) ||
1611 $_REQUEST['portname_' . $i] != $portlist[$i]['portname']
1612 )
1613 $log['m'][] = array ('c' => 158, 'a' => array ($i));
1614 elseif
1615 (
1616 $_REQUEST['vlanid_' . $i] == $portlist[$i]['vlanid'] ||
1617 $portlist[$i]['vlaind'] == 'TRUNK'
1618 )
1619 continue;
1620 else
1621 {
1622 $portname = $_REQUEST['portname_' . $i];
1623 $oldvlanid = $portlist[$i]['vlanid'];
1624 $newvlanid = $_REQUEST['vlanid_' . $i];
1625 // Finish the security context and evaluate it.
1626 $annex = array();
1627 $annex[] = array ('tag' => '$fromvlan_' . $oldvlanid);
1628 $annex[] = array ('tag' => '$tovlan_' . $newvlanid);
1629 if (!permitted (NULL, NULL, NULL, $annex))
1630 {
1631 $log['m'][] = array ('c' => 159, 'a' => array ($portname, $oldvlanid, $newvlanid));
1632 continue;
1633 }
1634 $setcmd .= $prefix . $portname . '=' . $newvlanid;
1635 $prefix = ';';
1636 }
1637 // Feed the gateway and interpret its (non)response.
1638 if ($setcmd != '')
1639 $log['m'] = array_merge ($log['m'], setSwitchVLANs ($_REQUEST['object_id'], $setcmd));
1640 else
1641 $log['m'][] = array ('c' => 201);
1642 return buildWideRedirectURL ($log);
1643 }
1644
1645 $msgcode['submitSLBConfig']['OK'] = 66;
1646 $msgcode['submitSLBConfig']['ERR'] = 164;
1647 function submitSLBConfig ()
1648 {
1649 assertUIntArg ('object_id');
1650 $newconfig = buildLVSConfig ($_REQUEST['object_id']);
1651 try
1652 {
1653 gwSendFileToObject ($_REQUEST['object_id'], 'slbconfig', html_entity_decode ($newconfig, ENT_QUOTES, 'UTF-8'));
1654 }
1655 catch (RTGatewayError $e)
1656 {
1657 return buildRedirectURL (__FUNCTION__, 'ERR', array ($e->getMessage()));
1658 }
1659 return buildRedirectURL (__FUNCTION__, 'OK', array ('slbconfig'));
1660 }
1661
1662 $msgcode['addRow']['OK'] = 74;
1663 $msgcode['addRow']['ERR'] = 100;
1664 function addRow ()
1665 {
1666 assertStringArg ('name');
1667
1668 if (commitAddRow ($_REQUEST['name']) === TRUE)
1669 return buildRedirectURL (__FUNCTION__, 'OK', array ($_REQUEST['name']));
1670 else
1671 return buildRedirectURL (__FUNCTION__, 'ERR', array ($_REQUEST['name']));
1672 }
1673
1674 $msgcode['updateRow']['OK'] = 75;
1675 $msgcode['updateRow']['ERR'] = 100;
1676 function updateRow ()
1677 {
1678 assertUIntArg ('row_id');
1679 assertStringArg ('name');
1680
1681 if (FALSE !== commitUpdateRow ($_REQUEST['row_id'], $_REQUEST['name']))
1682 return buildRedirectURL (__FUNCTION__, 'OK', array ($_REQUEST['name']));
1683 else
1684 return buildRedirectURL (__FUNCTION__, 'ERR', array ($_REQUEST['name']));
1685 }
1686
1687 $msgcode['deleteRow']['OK'] = 77;
1688 $msgcode['deleteRow']['ERR'] = 146;
1689 function deleteRow ()
1690 {
1691 assertUIntArg ('row_id');
1692 $rowinfo = getRackRowInfo ($_REQUEST['row_id']);
1693 return buildRedirectURL (__FUNCTION__, FALSE === commitDeleteRow ($_REQUEST['row_id']) ? 'ERR' : 'OK', array ($rowinfo['name']));
1694 }
1695
1696 $msgcode['addRack']['OK'] = 65;
1697 $msgcode['addRack']['ERR1'] = 171;
1698 $msgcode['addRack']['ERR2'] = 172;
1699 function addRack ()
1700 {
1701 assertUIntArg ('row_id');
1702 $taglist = isset ($_REQUEST['taglist']) ? $_REQUEST['taglist'] : array();
1703 if (isset ($_REQUEST['got_data']))
1704 {
1705 assertStringArg ('rack_name');
1706 assertUIntArg ('rack_height1');
1707 assertStringArg ('rack_comment', TRUE);
1708
1709 if (commitAddRack ($_REQUEST['rack_name'], $_REQUEST['rack_height1'], $_REQUEST['row_id'], $_REQUEST['rack_comment'], $taglist) === TRUE)
1710 return buildRedirectURL (__FUNCTION__, 'OK', array ($_REQUEST['rack_name']));
1711 else
1712 return buildRedirectURL (__FUNCTION__, 'ERR1', array ($_REQUEST['rack_name']));
1713 }
1714 elseif (isset ($_REQUEST['got_mdata']))
1715 {
1716 assertUIntArg ('rack_height2');
1717 assertStringArg ('rack_names', TRUE);
1718 $log = emptyLog();
1719 // copy-and-paste from renderAddMultipleObjectsForm()
1720 $names1 = explode ("\n", $_REQUEST['rack_names']);
1721 $names2 = array();
1722 foreach ($names1 as $line)
1723 {
1724 $parts = explode ('\r', $line);
1725 reset ($parts);
1726 if (!strlen ($parts[0]))
1727 continue;
1728 else
1729 $names2[] = rtrim ($parts[0]);
1730 }
1731 global $msgcode;
1732 foreach ($names2 as $cname)
1733 if (commitAddRack ($cname, $_REQUEST['rack_height2'], $_REQUEST['row_id'], '', $taglist) === TRUE)
1734 $log['m'][] = array ('c' => $msgcode[__FUNCTION__]['OK'], 'a' => array ($cname));
1735 else
1736 $log['m'][] = array ('c' => $msgcode[__FUNCTION__]['ERR1'], 'a' => array ($cname));
1737 return buildWideRedirectURL ($log);
1738 }
1739 else
1740 return buildRedirectURL (__FUNCTION__, 'ERR2');
1741 }
1742
1743 $msgcode['deleteRack']['OK'] = 79;
1744 $msgcode['deleteRack']['ERR'] = 100;
1745 $msgcode['deleteRack']['ERR1'] = 206;
1746 function deleteRack ()
1747 {
1748 assertUIntArg ('rack_id');
1749 if (NULL == ($rackData = spotEntity ('rack', $_REQUEST['rack_id'])))
1750 return buildRedirectURL (__FUNCTION__, 'ERR', array ('Rack not found'), 'rackspace', 'default');
1751 amplifyCell ($rackData);
1752 if (count ($rackData['mountedObjects']))
1753 return buildRedirectURL (__FUNCTION__, 'ERR1');
1754 if (TRUE !== commitDeleteRack ($_REQUEST['rack_id']))
1755 return buildRedirectURL (__FUNCTION__, 'ERR', array(), 'rackspace', 'default');
1756 return buildRedirectURL (__FUNCTION__, 'OK', array ($rackData['name']), 'rackspace', 'default');
1757 }
1758
1759 $msgcode['updateRack']['OK'] = 68;
1760 $msgcode['updateRack']['ERR'] = 177;
1761 function updateRack ()
1762 {
1763 assertUIntArg ('rack_id');
1764 assertUIntArg ('rack_row_id');
1765 assertUIntArg ('rack_height');
1766 assertStringArg ('rack_name');
1767 assertStringArg ('rack_comment', TRUE);
1768
1769 resetThumbCache ($_REQUEST['rack_id']);
1770 if (TRUE === commitUpdateRack ($_REQUEST['rack_id'], $_REQUEST['rack_name'], $_REQUEST['rack_height'], $_REQUEST['rack_row_id'], $_REQUEST['rack_comment']))
1771 return buildRedirectURL (__FUNCTION__, 'OK', array ($_REQUEST['rack_name']));
1772 else
1773 return buildRedirectURL (__FUNCTION__, 'ERR');
1774 }
1775
1776 function updateRackDesign ()
1777 {
1778 assertUIntArg ('rack_id');
1779 $rackData = spotEntity ('rack', $_REQUEST['rack_id']);
1780 amplifyCell ($rackData);
1781 applyRackDesignMask($rackData);
1782 markupObjectProblems ($rackData);
1783 $response = processGridForm ($rackData, 'A', 'F');
1784 return buildWideRedirectURL (array($response));
1785 }
1786
1787 function updateRackProblems ()
1788 {
1789 assertUIntArg ('rack_id');
1790 $rackData = spotEntity ('rack', $_REQUEST['rack_id']);
1791 amplifyCell ($rackData);
1792 applyRackProblemMask($rackData);
1793 markupObjectProblems ($rackData);
1794 $response = processGridForm ($rackData, 'F', 'U');
1795 return buildWideRedirectURL (array($response));
1796 }
1797
1798 function querySNMPData ()
1799 {
1800 assertUIntArg ('object_id');
1801 assertStringArg ('community');
1802 return doSNMPmining ($_REQUEST['object_id'], $_REQUEST['community']);
1803 }
1804
1805 $msgcode['addFileWithoutLink']['OK'] = 69;
1806 $msgcode['addFileWithoutLink']['ERR1'] = 181;
1807 $msgcode['addFileWithoutLink']['ERR2'] = 110;
1808 // File-related functions
1809 function addFileWithoutLink ()
1810 {
1811 assertStringArg ('comment', TRUE);
1812
1813 // Make sure the file can be uploaded
1814 if (get_cfg_var('file_uploads') != 1)
1815 return buildRedirectURL (__FUNCTION__, 'ERR1');
1816
1817 $fp = fopen($_FILES['file']['tmp_name'], 'rb');
1818 global $sic;
1819 if (FALSE === commitAddFile ($_FILES['file']['name'], $_FILES['file']['type'], $_FILES['file']['size'], $fp, $sic['comment']))
1820 return buildRedirectURL (__FUNCTION__, 'ERR2');
1821 if (isset ($_REQUEST['taglist']))
1822 produceTagsForLastRecord ('file', $_REQUEST['taglist']);
1823 return buildRedirectURL (__FUNCTION__, 'OK', array (htmlspecialchars ($_FILES['file']['name'])));
1824 }
1825
1826 $msgcode['addFileToEntity']['OK'] = 69;
1827 $msgcode['addFileToEntity']['ERR2'] = 181;
1828 $msgcode['addFileToEntity']['ERR3'] = 110;
1829 function addFileToEntity ()
1830 {
1831 global $page, $pageno, $etype_by_pageno;
1832 if (!isset ($etype_by_pageno[$pageno]) or !isset ($page[$pageno]['bypass']))
1833 throw new RackTablesError ('dispatching failure', RackTablesError::INTERNAL);
1834 $realm = $etype_by_pageno[$pageno];
1835 $bypass = $page[$pageno]['bypass'];
1836 assertUIntArg ($bypass);
1837 $entity_id = $_REQUEST[$bypass];
1838 assertStringArg ('comment', TRUE);
1839
1840 // Make sure the file can be uploaded
1841 if (get_cfg_var('file_uploads') != 1)
1842 return buildRedirectURL (__FUNCTION__, 'ERR2');
1843
1844 $fp = fopen($_FILES['file']['tmp_name'], 'rb');
1845 global $sic;
1846 if (FALSE === commitAddFile ($_FILES['file']['name'], $_FILES['file']['type'], $_FILES['file']['size'], $fp, $sic['comment']))
1847 return buildRedirectURL (__FUNCTION__, 'ERR3');
1848 if (FALSE === commitLinkFile (lastInsertID(), $realm, $entity_id))
1849 return buildRedirectURL (__FUNCTION__, 'ERR3');
1850
1851 return buildRedirectURL (__FUNCTION__, 'OK', array (htmlspecialchars ($_FILES['file']['name'])));
1852 }
1853
1854 $msgcode['linkFileToEntity']['OK'] = 71;
1855 $msgcode['linkFileToEntity']['ERR1'] = 178;
1856 $msgcode['linkFileToEntity']['ERR2'] = 110;
1857 function linkFileToEntity ()
1858 {
1859 assertUIntArg ('file_id');
1860 global $page, $pageno, $etype_by_pageno;
1861 if (!isset ($etype_by_pageno[$pageno]) or !isset ($page[$pageno]['bypass']))
1862 throw new RackTablesError ('dispatching failure', RackTablesError::INTERNAL);
1863 $entity_type = $etype_by_pageno[$pageno];
1864 $bypass_name = $page[$pageno]['bypass'];
1865 assertUIntArg ($bypass_name);
1866
1867 $fi = spotEntity ('file', $_REQUEST['file_id']);
1868 if (FALSE === commitLinkFile ($_REQUEST['file_id'], $entity_type, $_REQUEST[$bypass_name]))
1869 return buildRedirectURL (__FUNCTION__, 'ERR2');
1870
1871 return buildRedirectURL (__FUNCTION__, 'OK', array (htmlspecialchars ($fi['name'])));
1872 }
1873
1874 $msgcode['replaceFile']['OK'] = 70;
1875 $msgcode['replaceFile']['ERR1'] = 181;
1876 $msgcode['replaceFile']['ERR2'] = 207;
1877 $msgcode['replaceFile']['ERR3'] = 109;
1878 function replaceFile ()
1879 {
1880 global $sic;
1881 assertUIntArg ('file_id');
1882
1883 // Make sure the file can be uploaded
1884 if (get_cfg_var('file_uploads') != 1)
1885 return buildRedirectURL (__FUNCTION__, 'ERR1');
1886 $shortInfo = spotEntity ('file', $sic['file_id']);
1887
1888 $fp = fopen($_FILES['file']['tmp_name'], 'rb');
1889 if ($fp === FALSE)
1890 return buildRedirectURL (__FUNCTION__, 'ERR2');
1891 if (FALSE === commitReplaceFile ($sic['file_id'], $fp))
1892 return buildRedirectURL (__FUNCTION__, 'ERR3');
1893
1894 return buildRedirectURL (__FUNCTION__, 'OK', array (htmlspecialchars ($shortInfo['name'])));
1895 }
1896
1897 $msgcode['updateFile']['OK'] = 70;
1898 $msgcode['updateFile']['ERR'] = 109;
1899 function updateFile ()
1900 {
1901 assertUIntArg ('file_id');
1902 assertStringArg ('file_name');
1903 assertStringArg ('file_type');
1904 assertStringArg ('file_comment', TRUE);
1905 global $sic;
1906 if (FALSE === commitUpdateFile ($sic['file_id'], $sic['file_name'], $sic['file_type'], $sic['file_comment']))
1907 return buildRedirectURL (__FUNCTION__, 'ERR');
1908 return buildRedirectURL (__FUNCTION__, 'OK', array ($_REQUEST['file_name']));
1909 }
1910
1911 $msgcode['unlinkFile']['OK'] = 72;
1912 $msgcode['unlinkFile']['ERR'] = 182;
1913 function unlinkFile ()
1914 {
1915 assertUIntArg ('link_id');
1916 $error = commitUnlinkFile ($_REQUEST['link_id']);
1917
1918 if ($error != '')
1919 return buildRedirectURL (__FUNCTION__, 'ERR', array ($error));
1920
1921 return buildRedirectURL (__FUNCTION__, 'OK');
1922 }
1923
1924 $msgcode['deleteFile']['OK'] = 73;
1925 $msgcode['deleteFile']['ERR'] = 100;
1926 function deleteFile ()
1927 {
1928 assertUIntArg ('file_id');
1929 $shortInfo = spotEntity ('file', $_REQUEST['file_id']);
1930 $error = commitDeleteFile ($_REQUEST['file_id']);
1931
1932 if ($error != '')
1933 return buildRedirectURL (__FUNCTION__, 'ERR', array ($error));
1934
1935 return buildRedirectURL (__FUNCTION__, 'OK', array (htmlspecialchars ($shortInfo['name'])));
1936 }
1937
1938 $msgcode['updateFileText']['OK'] = 78;
1939 $msgcode['updateFileText']['ERR1'] = 179;
1940 $msgcode['updateFileText']['ERR2'] = 180;
1941 function updateFileText ()
1942 {
1943 assertUIntArg ('file_id');
1944 assertStringArg ('mtime_copy');
1945 assertStringArg ('file_text', TRUE); // it's Ok to save empty
1946 $shortInfo = spotEntity ('file', $_REQUEST['file_id']);
1947 if ($shortInfo['mtime'] != $_REQUEST['mtime_copy'])
1948 return buildRedirectURL (__FUNCTION__, 'ERR1');
1949 global $sic;
1950 if (FALSE === commitReplaceFile ($sic['file_id'], $sic['file_text']))
1951 return buildRedirectURL (__FUNCTION__, 'ERR2');
1952 return buildRedirectURL (__FUNCTION__, 'OK', array (htmlspecialchars ($shortInfo['name'])));
1953 }
1954
1955 $msgcode['addPortInterfaceCompat']['OK'] = 48;
1956 $msgcode['addPortInterfaceCompat']['ERR'] = 110;
1957 function addPortInterfaceCompat ()
1958 {
1959 assertUIntArg ('iif_id');
1960 assertUIntArg ('oif_id');
1961 if (commitSupplementPIC ($_REQUEST['iif_id'], $_REQUEST['oif_id']))
1962 return buildRedirectURL (__FUNCTION__, 'OK');
1963 return buildRedirectURL (__FUNCTION__, 'ERR');
1964 }
1965
1966 $msgcode['delPortInterfaceCompat']['OK'] = 49;
1967 $msgcode['delPortInterfaceCompat']['ERR'] = 111;
1968 function delPortInterfaceCompat ()
1969 {
1970 assertUIntArg ('iif_id');
1971 assertUIntArg ('oif_id');
1972 if (commitReducePIC ($_REQUEST['iif_id'], $_REQUEST['oif_id']))
1973 return buildRedirectURL (__FUNCTION__, 'OK');
1974 return buildRedirectURL (__FUNCTION__, 'ERR');
1975 }
1976
1977 $ifcompatpack = array
1978 (
1979 '1000cwdm80' => array (1209, 1210, 1211, 1212, 1213, 1214, 1215, 1216),
1980 '1000dwdm80' => array // ITU channels 20~61
1981 (
1982 1217, 1218, 1219, 1220, 1221, 1222, 1223, 1224, 1225, 1226,
1983 1227, 1228, 1229, 1230, 1231, 1232, 1233, 1234, 1235, 1236,
1984 1237, 1238, 1239, 1240, 1241, 1242, 1243, 1244, 1245, 1246,
1985 1247, 1248, 1249, 1250, 1251, 1252, 1253, 1254, 1255, 1256,
1986 1257, 1258
1987 ),
1988 '10000dwdm80' => array // same channels for 10GE
1989 (
1990 1259, 1260, 1261, 1262, 1263, 1264, 1265, 1266, 1267, 1268,
1991 1269, 1270, 1271, 1272, 1273, 1274, 1275, 1276, 1277, 1278,
1992 1279, 1280, 1281, 1282, 1283, 1284, 1285, 1286, 1287, 1288,
1993 1289, 1290, 1291, 1292, 1293, 1294, 1295, 1296, 1297, 1298,
1994 1299, 1300
1995 ),
1996 );
1997
1998 $msgcode['addPortInterfaceCompatPack']['OK'] = 44;
1999 $msgcode['addPortInterfaceCompatPack']['ERR'] = 123;
2000 function addPortInterfaceCompatPack ()
2001 {
2002 assertStringArg ('standard');
2003 assertUIntArg ('iif_id');
2004 global $ifcompatpack;
2005 if (!array_key_exists ($_REQUEST['standard'], $ifcompatpack) or !array_key_exists ($_REQUEST['iif_id'], getPortIIFOptions()))
2006 return buildRedirectURL (__FUNCTION__, 'ERR');
2007 $ngood = $nbad = 0;
2008 foreach ($ifcompatpack[$_REQUEST['standard']] as $oif_id)
2009 if (commitSupplementPIC ($_REQUEST['iif_id'], $oif_id))
2010 $ngood++;
2011 else
2012 $nbad++;
2013 return buildRedirectURL (__FUNCTION__, 'OK', array ($nbad, $ngood));
2014 }
2015
2016 $msgcode['delPortInterfaceCompatPack']['OK'] = 44;
2017 $msgcode['delPortInterfaceCompatPack']['ERR'] = 123;
2018 function delPortInterfaceCompatPack ()
2019 {
2020 assertStringArg ('standard');
2021 assertUIntArg ('iif_id');
2022 global $ifcompatpack;
2023 if (!array_key_exists ($_REQUEST['standard'], $ifcompatpack) or !array_key_exists ($_REQUEST['iif_id'], getPortIIFOptions()))
2024 return buildRedirectURL (__FUNCTION__, 'ERR');
2025 $ngood = $nbad = 0;
2026 foreach ($ifcompatpack[$_REQUEST['standard']] as $oif_id)
2027 if (commitReducePIC ($_REQUEST['iif_id'], $oif_id))
2028 $ngood++;
2029 else
2030 $nbad++;
2031 return buildRedirectURL (__FUNCTION__, 'OK', array ($nbad, $ngood));
2032 }
2033
2034 $msgcode['addPortOIFCompat']['OK'] = 48;
2035 $msgcode['addPortOIFCompat']['ERR'] = 110;
2036 function addPortOIFCompat()
2037 {
2038 assertUIntArg('type1');
2039 assertUIntArg('type2');
2040 if (commitSupplementPOIFC($_REQUEST['type1'], $_REQUEST['type2']))
2041 return buildRedirectURL(__FUNCTION__, 'OK');
2042 return buildRedirectURL(__FUNCTION__, 'ERR');
2043 }
2044
2045 $msgcode['delPortOIFCompat']['OK'] = 49;
2046 $msgcode['delPortOIFCompat']['ERR'] = 111;
2047 function delPortOIFCompat ()
2048 {
2049 assertUIntArg('type1');
2050 assertUIntArg('type2');
2051 if (commitReducePOIFC ($_REQUEST['type1'], $_REQUEST['type2']) !== FALSE)
2052 return buildRedirectURL (__FUNCTION__, 'OK');
2053 return buildRedirectURL (__FUNCTION__, 'ERR');
2054
2055 }
2056
2057 $msgcode['add8021QOrder']['OK'] = 48;
2058 $msgcode['add8021QOrder']['ERR'] = 118;
2059 function add8021QOrder ()
2060 {
2061 assertUIntArg ('vdom_id');
2062 assertUIntArg ('object_id');
2063 assertUIntArg ('vst_id');
2064 global $sic;
2065 $result = usePreparedExecuteBlade
2066 (
2067 'INSERT INTO VLANSwitch (domain_id, object_id, template_id, last_change, out_of_sync) ' .
2068 'VALUES (?, ?, ?, NOW(), "yes")',
2069 array ($sic['vdom_id'], $sic['object_id'], $sic['vst_id'])
2070 );
2071 return buildRedirectURL (__FUNCTION__, $result !== FALSE ? 'OK' : 'ERR');
2072 }
2073
2074 $msgcode['del8021QOrder']['OK'] = 49;
2075 $msgcode['del8021QOrder']['ERR'] = 119;
2076 function del8021QOrder ()
2077 {
2078 assertUIntArg ('object_id');
2079 global $sic;
2080 $result = usePreparedDeleteBlade ('VLANSwitch', array ('object_id' => $sic['object_id']));
2081 return buildRedirectURL (__FUNCTION__, $result ? 'OK' : 'ERR');
2082 }
2083
2084 $msgcode['addVLANDescription']['OK'] = 48;
2085 $msgcode['addVLANDescription']['ERR1'] = 190;
2086 $msgcode['addVLANDescription']['ERR2'] = 110;
2087 function addVLANDescription ()
2088 {
2089 assertUIntArg ('vlan_id');
2090 assertStringArg ('vlan_type', TRUE);
2091 assertStringArg ('vlan_descr', TRUE);
2092 global $sic;
2093 if (!($sic['vlan_id'] >= VLAN_MIN_ID + 1 and $sic['vlan_id'] <= VLAN_MAX_ID))
2094 return buildRedirectURL (__FUNCTION__, 'ERR1', array ($sic['vlan_id']));
2095 $result = usePreparedInsertBlade
2096 (
2097 'VLANDescription',
2098 array
2099 (
2100 'domain_id' => $sic['vdom_id'],
2101 'vlan_id' => $sic['vlan_id'],
2102 'vlan_type' => $sic['vlan_type'],
2103 'vlan_descr' => mb_strlen ($sic['vlan_descr']) ? $sic['vlan_descr'] : NULL
2104 )
2105 );
2106 return buildRedirectURL (__FUNCTION__, $result ? 'OK' : 'ERR2');
2107 }
2108
2109 $msgcode['delVLANDescription']['OK'] = 49;
2110 $msgcode['delVLANDescription']['ERR1'] = 105;
2111 $msgcode['delVLANDescription']['ERR2'] = 111;
2112 function delVLANDescription ()
2113 {
2114 assertUIntArg ('vlan_id');
2115 global $sic;
2116 if ($sic['vlan_id'] == VLAN_DFL_ID)
2117 return buildRedirectURL (__FUNCTION__, 'ERR1');
2118 $result = commitReduceVLANDescription ($sic['vdom_id'], $sic['vlan_id']);
2119 return buildRedirectURL (__FUNCTION__, $result ? 'OK' : 'ERR2');
2120 }
2121
2122 $msgcode['updVLANDescription']['OK'] = 51;
2123 $msgcode['updVLANDescription']['ERR1'] = 105;
2124 $msgcode['updVLANDescription']['ERR2'] = 109;
2125 function updVLANDescription ()
2126 {
2127 assertUIntArg ('vlan_id');
2128 assertStringArg ('vlan_type');
2129 assertStringArg ('vlan_descr', TRUE);
2130 global $sic;
2131 if ($sic['vlan_id'] == VLAN_DFL_ID)
2132 return buildRedirectURL (__FUNCTION__, 'ERR1');
2133 $result = commitUpdateVLANDescription
2134 (
2135 $sic['vdom_id'],
2136 $sic['vlan_id'],
2137 $sic['vlan_type'],
2138 $sic['vlan_descr']
2139 );
2140 return buildRedirectURL (__FUNCTION__, $result !== FALSE ? 'OK' : 'ERR2');
2141 }
2142
2143 $msgcode['createVLANDomain']['OK'] = 48;
2144 $msgcode['createVLANDomain']['ERR'] = 110;
2145 function createVLANDomain ()
2146 {
2147 assertStringArg ('vdom_descr');
2148 global $sic;
2149 $result = usePreparedInsertBlade
2150 (
2151 'VLANDomain',
2152 array
2153 (
2154 'description' => $sic['vdom_descr'],
2155 )
2156 );
2157 $result = $result and usePreparedInsertBlade
2158 (
2159 'VLANDescription',
2160 array
2161 (
2162 'domain_id' => lastInsertID(),
2163 'vlan_id' => VLAN_DFL_ID,
2164 'vlan_type' => 'compulsory',
2165 'vlan_descr' => 'default',
2166 )
2167 );
2168 return buildRedirectURL (__FUNCTION__, $result ? 'OK' : 'ERR');
2169 }
2170
2171 $msgcode['destroyVLANDomain']['OK'] = 49;
2172 $msgcode['destroyVLANDomain']['ERR'] = 111;
2173 function destroyVLANDomain ()
2174 {
2175 assertUIntArg ('vdom_id');
2176 global $sic;
2177 $result = FALSE !== usePreparedDeleteBlade ('VLANDomain', array ('id' => $sic['vdom_id']));
2178 return buildRedirectURL (__FUNCTION__, $result ? 'OK' : 'ERR');
2179 }
2180
2181 $msgcode['updateVLANDomain']['OK'] = 51;
2182 $msgcode['updateVLANDomain']['ERR'] = 109;
2183 function updateVLANDomain ()
2184 {
2185 assertUIntArg ('vdom_id');
2186 assertStringArg ('vdom_descr');
2187 global $sic;
2188 $result = FALSE !== commitUpdateVLANDomain ($sic['vdom_id'], $sic['vdom_descr']);
2189 return buildRedirectURL (__FUNCTION__, $result ? 'OK' : 'ERR');
2190 }
2191
2192 $msgcode['save8021QPorts']['OK1'] = 63;
2193 $msgcode['save8021QPorts']['OK2'] = 41;
2194 $msgcode['save8021QPorts']['ERR1'] = 160;
2195 $msgcode['save8021QPorts']['ERR2'] = 109;
2196 function save8021QPorts ()
2197 {
2198 global $sic, $dbxlink;
2199 assertUIntArg ('mutex_rev', TRUE); // counts from 0
2200 assertStringArg ('form_mode');
2201 if ($sic['form_mode'] != 'save' and $sic['form_mode'] != 'duplicate')
2202 throw new InvalidRequestArgException ('form_mode', $sic['form_mode']);
2203 $extra = array();
2204 $dbxlink->beginTransaction();
2205 try
2206 {
2207 if (NULL === $vswitch = getVLANSwitchInfo ($sic['object_id'], 'FOR UPDATE'))
2208 throw new InvalidArgException ('object_id', $object_id, 'VLAN domain is not set for this object');
2209 if ($vswitch['mutex_rev'] != $sic['mutex_rev'])
2210 throw new InvalidRequestArgException ('mutex_rev', $sic['mutex_rev'], 'expired form data');
2211 $after = $before = apply8021QOrder ($vswitch['template_id'], getStored8021QConfig ($sic['object_id'], 'desired'));
2212 $changes = array();
2213 switch ($sic['form_mode'])
2214 {
2215 case 'save':
2216 assertUIntArg ('nports');
2217 if ($sic['nports'] == 1)
2218 {
2219 assertStringArg ('pn_0');
2220 $extra = array ('port_name' => $sic['pn_0']);
2221 }
2222 for ($i = 0; $i < $sic['nports']; $i++)
2223 {
2224 assertStringArg ('pn_' . $i);
2225 assertStringArg ('pm_' . $i);
2226 // An access port only generates form input for its native VLAN,
2227 // which we derive allowed VLAN list from.
2228 $native = isset ($sic['pnv_' . $i]) ? $sic['pnv_' . $i] : 0;
2229 switch ($sic["pm_${i}"])
2230 {
2231 case 'trunk':
2232 # assertArrayArg ('pav_' . $i);
2233 $allowed = isset ($sic['pav_' . $i]) ? $sic['pav_' . $i] : array();
2234 break;
2235 case 'access':
2236 if ($native == 'same')
2237 continue 2;
2238 assertUIntArg ('pnv_' . $i);
2239 $allowed = array ($native);
2240 break;
2241 default:
2242 throw new InvalidRequestArgException ("pm_${i}", $_REQUEST["pm_${i}"], 'unknown port mode');
2243 }
2244 $changes[$sic['pn_' . $i]] = array
2245 (
2246 'mode' => $sic['pm_' . $i],
2247 'allowed' => $allowed,
2248 'native' => $native,
2249 );
2250 }
2251 break;
2252 case 'duplicate':
2253 assertStringArg ('from_port');
2254 # assertArrayArg ('to_ports');
2255 if (!array_key_exists ($sic['from_port'], $before))
2256 throw new InvalidArgException ('from_port', $sic['from_port'], 'this port does not exist');
2257 foreach ($sic['to_ports'] as $tpn)
2258 if (!array_key_exists ($tpn, $before))
2259 throw new InvalidArgException ('to_ports[]', $tpn, 'this port does not exist');
2260 elseif ($tpn != $sic['from_port'])
2261 $changes[$tpn] = $before[$sic['from_port']];
2262 break;
2263 }
2264 $domain_vlanlist = getDomainVLANs ($vswitch['domain_id']);
2265 $changes = filter8021QChangeRequests
2266 (
2267 $domain_vlanlist,
2268 $before,
2269 apply8021QOrder ($vswitch['template_id'], $changes)
2270 );
2271 $changes = authorize8021QChangeRequests ($before, $changes);
2272 foreach ($changes as $port_name => $port)
2273 $after[$port_name] = $port;
2274 $new_uplinks = filter8021QChangeRequests ($domain_vlanlist, $after, produceUplinkPorts ($domain_vlanlist, $after));
2275 $npulled = replace8021QPorts ('desired', $vswitch['object_id'], $before, $changes);
2276 $nsaved_uplinks = replace8021QPorts ('desired', $vswitch['object_id'], $before, $new_uplinks);
2277 }
2278 catch (Exception $e)
2279 {
2280 $dbxlink->rollBack();
2281 return buildRedirectURL (__FUNCTION__, 'ERR2', array(), NULL, NULL, $extra);
2282 }
2283 if ($npulled + $nsaved_uplinks)
2284 $result = usePreparedExecuteBlade
2285 (
2286 'UPDATE VLANSwitch SET mutex_rev=mutex_rev+1, last_change=NOW(), out_of_sync="yes" WHERE object_id=?',
2287 array ($sic['object_id'])
2288 );
2289 $dbxlink->commit();
2290 $log = oneLiner (63, array ($npulled + $nsaved_uplinks));
2291 if ($nsaved_uplinks)
2292 {
2293 initiateUplinksReverb ($vswitch['object_id'], $new_uplinks);
2294 $log = mergeLogs ($log, oneLiner (41));
2295 }
2296 if ($npulled + $nsaved_uplinks > 0 and getConfigVar ('8021Q_INSTANT_DEPLOY') == 'yes')
2297 {
2298 try
2299 {
2300 if (FALSE === $done = exec8021QDeploy ($sic['object_id'], TRUE))
2301 $log = mergeLogs ($log, oneLiner (191));
2302 else
2303 $log = mergeLogs ($log, oneLiner (63, array ($done)));
2304 }
2305 catch (Exception $e)
2306 {
2307 $log = mergeLogs ($log, oneLiner (109));
2308 }
2309 }
2310 return buildWideRedirectURL ($log, NULL, NULL, $extra);
2311 }
2312
2313 $msgcode['bindVLANtoIPv4']['OK'] = 48;
2314 $msgcode['bindVLANtoIPv4']['ERR'] = 110;
2315 function bindVLANtoIPv4 ()
2316 {
2317 assertUIntArg ('id'); // network id
2318 global $sic;
2319 $result = commitSupplementVLANIPv4 ($sic['vlan_ck'], $sic['id']);
2320 return buildRedirectURL (__FUNCTION__, $result ? 'OK' : 'ERR');
2321 }
2322
2323 $msgcode['unbindVLANfromIPv4']['OK'] = 49;
2324 $msgcode['unbindVLANfromIPv4']['ERR'] = 111;
2325 function unbindVLANfromIPv4 ()
2326 {
2327 assertUIntArg ('id'); // network id
2328 global $sic;
2329 $result = commitReduceVLANIPv4 ($sic['vlan_ck'], $sic['id']);
2330 return buildRedirectURL (__FUNCTION__, $result ? 'OK' : 'ERR');
2331 }
2332
2333 $msgcode['process8021QSyncRequest']['OK'] = 63;
2334 $msgcode['process8021QSyncRequest']['ERR1'] = 109;
2335 $msgcode['process8021QSyncRequest']['ERR2'] = 191;
2336 function process8021QSyncRequest ()
2337 {
2338 // behave depending on current operation: exec8021QPull or exec8021QPush
2339 global $sic, $op;
2340 try
2341 {
2342 if (FALSE === $done = exec8021QDeploy ($sic['object_id'], $op == 'exec8021QPush'))
2343 return buildRedirectURL (__FUNCTION__, 'ERR2'); // specific case
2344 return buildRedirectURL (__FUNCTION__, 'OK', array ($done));
2345 }
2346 catch (Exception $e)
2347 {
2348 return buildRedirectURL (__FUNCTION__, 'ERR1'); // generic failure
2349 }
2350 }
2351
2352 $msgcode['resolve8021QConflicts']['OK'] = 63;
2353 $msgcode['resolve8021QConflicts']['ERR1'] = 179;
2354 $msgcode['resolve8021QConflicts']['ERR2'] = 109;
2355 function resolve8021QConflicts ()
2356 {
2357 global $sic, $dbxlink;
2358 assertUIntArg ('mutex_rev', TRUE); // counts from 0
2359 assertUIntArg ('nrows');
2360 // Divide submitted radio buttons into 3 groups:
2361 // left (saved version wins)
2362 // asis (ignore)
2363 // right (running version wins)
2364 $F = array();
2365 for ($i = 0; $i < $sic['nrows']; $i++)
2366 {
2367 if (!array_key_exists ("i_${i}", $sic))
2368 continue;
2369 // let's hope other inputs are in place
2370 switch ($sic["i_${i}"])
2371 {
2372 case 'left':
2373 case 'right':
2374 $F[$sic["pn_${i}"]] = array
2375 (
2376 'mode' => $sic["rm_${i}"],
2377 'allowed' => $sic["ra_${i}"],
2378 'native' => $sic["rn_${i}"],
2379 'decision' => $sic["i_${i}"],
2380 );
2381 break;
2382 default:
2383 // don't care
2384 }
2385 }
2386 $dbxlink->beginTransaction();
2387 try
2388 {
2389 if (NULL === $vswitch = getVLANSwitchInfo ($sic['object_id'], 'FOR UPDATE'))
2390 throw new InvalidArgException ('object_id', $sic['object_id'], 'VLAN domain is not set for this object');
2391 if ($vswitch['mutex_rev'] != $sic['mutex_rev'])
2392 throw new InvalidRequestArgException ('mutex_rev', $sic['mutex_rev'], 'expired form (table data has changed)');
2393 $D = getStored8021QConfig ($vswitch['object_id'], 'desired');
2394 $C = getStored8021QConfig ($vswitch['object_id'], 'cached');
2395 $R = getRunning8021QConfig ($vswitch['object_id']);
2396 $plan = get8021QSyncOptions ($vswitch, $D, $C, $R['portdata']);
2397 $ndone = 0;
2398 foreach ($F as $port_name => $port)
2399 {
2400 if (!array_key_exists ($port_name, $plan))
2401 continue;
2402 elseif ($plan[$port_name]['status'] == 'merge_conflict')
2403 {
2404 // for R neither mutex nor revisions can be emulated, but revision change can be
2405 if (!same8021QConfigs ($port, $R['portdata'][$port_name]))
2406 throw new InvalidRequestArgException ("port ${port_name}", '(hidden)', 'expired form (switch data has changed)');
2407 if ($port['decision'] == 'right') // D wins, frame R by writing value of R to C
2408 $ndone += upd8021QPort ('cached', $vswitch['object_id'], $port_name, $port);
2409 elseif ($port['decision'] == 'left') // R wins, cross D up
2410 $ndone += upd8021QPort ('cached', $vswitch['object_id'], $port_name, $D[$port_name]);
2411 // otherwise there was no decision made
2412 }
2413 elseif
2414 (
2415 $plan[$port_name]['status'] == 'delete_conflict' or
2416 $plan[$port_name]['status'] == 'martian_conflict'
2417 )
2418 {
2419 if ($port['decision'] == 'left') // confirm deletion of local copy
2420 $ndone += del8021QPort ($vswitch['object_id'], $port_name);
2421 }
2422 // otherwise ignore a decision, which doesn't address a conflict
2423 }
2424 }
2425 catch (InvalidRequestArgException $e)
2426 {
2427 $dbxlink->rollBack();
2428 return buildRedirectURL (__FUNCTION__, 'ERR1');
2429 }
2430 catch (Exception $e)
2431 {
2432 $dbxlink->rollBack();
2433 return buildRedirectURL (__FUNCTION__, 'ERR2');
2434 }
2435 $dbxlink->commit();
2436 return buildRedirectURL (__FUNCTION__, 'OK', array ($ndone));
2437 }
2438
2439 $msgcode['addVLANSwitchTemplate']['OK'] = 48;
2440 $msgcode['addVLANSwitchTemplate']['ERR'] = 110;
2441 function addVLANSwitchTemplate()
2442 {
2443 assertStringArg ('vst_descr');
2444 global $sic;
2445 $max_local_vlans = NULL;
2446 if (array_key_exists ('vst_maxvlans', $sic) && mb_strlen ($sic['vst_maxvlans']))
2447 {
2448 assertUIntArg ('vst_maxvlans');
2449 $max_local_vlans = $sic['vst_maxvlans'];
2450 }
2451 $result = usePreparedInsertBlade
2452 (
2453 'VLANSwitchTemplate',
2454 array
2455 (
2456 'max_local_vlans' => $max_local_vlans,
2457 'description' => $sic['vst_descr'],
2458 )
2459 );
2460 return buildRedirectURL (__FUNCTION__, $result ? 'OK' : 'ERR');
2461 }
2462
2463 $msgcode['delVLANSwitchTemplate']['OK'] = 49;
2464 $msgcode['delVLANSwitchTemplate']['ERR'] = 111;
2465 function delVLANSwitchTemplate()
2466 {
2467 assertUIntArg ('vst_id');
2468 global $sic;
2469 $result = FALSE !== usePreparedDeleteBlade ('VLANSwitchTemplate', array ('id' => $sic['vst_id']));
2470 return buildRedirectURL (__FUNCTION__, $result ? 'OK' : 'ERR');
2471 }
2472
2473 $msgcode['updVLANSwitchTemplate']['OK'] = 51;
2474 $msgcode['updVLANSwitchTemplate']['ERR'] = 109;
2475 function updVLANSwitchTemplate()
2476 {
2477 assertUIntArg ('vst_id');
2478 assertStringArg ('vst_descr');
2479 global $sic;
2480 $max_local_vlans = NULL;
2481 if (array_key_exists ('vst_maxvlans', $sic) && mb_strlen ($sic['vst_maxvlans']))
2482 {
2483 assertUIntArg ('vst_maxvlans');
2484 $max_local_vlans = $sic['vst_maxvlans'];
2485 }
2486 $result = commitUpdateVST ($sic['vst_id'], $max_local_vlans, $sic['vst_descr']);
2487 return buildRedirectURL (__FUNCTION__, $result !== FALSE ? 'OK' : 'ERR');
2488 }
2489
2490 $msgcode['addVSTRule']['OK'] = 48;
2491 $msgcode['addVSTRule']['ERR'] = 110;
2492 function addVSTRule()
2493 {
2494 assertUIntArg ('vst_id');
2495 assertUIntArg ('rule_no');
2496 assertPCREArg ('port_pcre');
2497 assertStringArg ('port_role');
2498 assertStringArg ('wrt_vlans', TRUE);
2499 assertStringArg ('description', TRUE);
2500 global $sic;
2501 $result = usePreparedInsertBlade
2502 (
2503 'VLANSTRule',
2504 array
2505 (
2506 'vst_id' => $sic['vst_id'],
2507 'rule_no' => $sic['rule_no'],
2508 'port_pcre' => $sic['port_pcre'],
2509 'port_role' => $sic['port_role'],
2510 'wrt_vlans' => $sic['wrt_vlans'],
2511 'description' => $sic['description'],
2512 )
2513 );
2514 return buildRedirectURL (__FUNCTION__, $result ? 'OK' : 'ERR');
2515 }
2516
2517 $msgcode['delVSTRule']['OK'] = 49;
2518 $msgcode['delVSTRule']['ERR'] = 111;
2519 function delVSTRule()
2520 {
2521 assertUIntArg ('vst_id');
2522 assertUIntArg ('rule_no');
2523 global $sic;
2524 $result = FALSE !== usePreparedDeleteBlade
2525 (
2526 'VLANSTRule',
2527 array
2528 (
2529 'vst_id' => $sic['vst_id'],
2530 'rule_no' => $sic['rule_no']
2531 )
2532 );
2533 return buildRedirectURL (__FUNCTION__, $result ? 'OK' : 'ERR');
2534 }
2535
2536 $msgcode['updVSTRule']['OK'] = 51;
2537 $msgcode['updVSTRule']['ERR'] = 109;
2538 function updVSTRule()
2539 {
2540 assertUIntArg ('vst_id');
2541 assertUIntArg ('rule_no');
2542 assertUIntArg ('new_rule_no');
2543 assertPCREArg ('port_pcre');
2544 assertStringArg ('port_role');
2545 assertStringArg ('wrt_vlans', TRUE);
2546 assertStringArg ('description', TRUE);
2547 global $sic;
2548 $result = commitUpdateVSTRule
2549 (
2550 $sic['vst_id'],
2551 $sic['rule_no'],
2552 $sic['new_rule_no'],
2553 $sic['port_pcre'],
2554 $sic['port_role'],
2555 $sic['wrt_vlans'],
2556 $sic['description']
2557 );
2558 return buildRedirectURL (__FUNCTION__, $result !== FALSE ? 'OK' : 'ERR');
2559 }
2560
2561 $msgcode['importDPData']['OK'] = 44;
2562 function importDPData()
2563 {
2564 global $sic;
2565 assertUIntArg ('nports');
2566 $nignored = $ndone = 0;
2567 $POIFC = getPortOIFCompat();
2568 for ($i = 0; $i < $sic['nports']; $i++)
2569 if (array_key_exists ("do_${i}", $sic))
2570 {
2571 assertUIntArg ("pid1_${i}");
2572 assertUIntArg ("pid2_${i}");
2573 $porta = getPortInfo ($_REQUEST["pid1_${i}"]);
2574 $portb = getPortInfo ($_REQUEST["pid2_${i}"]);
2575 if
2576 (
2577 $porta['linked'] or
2578 $portb['linked'] or
2579 ($porta['object_id'] != $sic['object_id'] and $portb['object_id'] != $sic['object_id'])
2580 )
2581 {
2582 $nignored++;
2583 continue;
2584 }
2585 foreach ($POIFC as $item)
2586 if ($item['type1'] == $porta['oif_id'] and $item['type2'] == $portb['oif_id'])
2587 {
2588 linkPorts ($_REQUEST["pid1_${i}"], $_REQUEST["pid2_${i}"]);
2589 $ndone++;
2590 continue 2; // next port
2591 }
2592 $nignored++;
2593 }
2594 return buildRedirectURL (__FUNCTION__, 'OK', array ($nignored, $ndone));
2595 }
2596
2597 ?>