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