r3992 queryLDAPServer(): throw exception on missing extension
[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 924$msgcode['deleteObject']['OK'] = 76;
52b34485
AD
925function deleteObject ()
926{
0cc24e9a 927 assertUIntArg ('object_id');
4bb5b87f 928 $oinfo = spotEntity ('object', $_REQUEST['object_id']);
c78a40ec 929
f0e2c99f 930 $racklist = getResidentRacksData ($_REQUEST['object_id'], FALSE);
4bb5b87f 931 commitDeleteObject ($_REQUEST['object_id']);
f0e2c99f
DO
932 foreach ($racklist as $rack_id)
933 resetThumbCache ($rack_id);
abd1e9ac
DO
934 return buildRedirectURL (__FUNCTION__, 'OK', array ($oinfo['dname']));
935}
52b34485 936
abd1e9ac
DO
937$msgcode['resetObject']['OK'] = 83;
938$msgcode['resetObject']['ERR'] = 100;
939function resetObject ()
940{
941 assertUIntArg ('object_id');
942 $oinfo = spotEntity ('object', $_REQUEST['object_id']);
943
944 $racklist = getResidentRacksData ($_REQUEST['object_id'], FALSE);
945 commitResetObject ($_REQUEST['object_id']);
946 foreach ($racklist as $rack_id)
947 resetThumbCache ($rack_id);
c78a40ec 948 return buildRedirectURL (__FUNCTION__, 'OK', array ($oinfo['dname']));
52b34485
AD
949}
950
b6a7d936
DO
951$msgcode['useupPort']['OK'] = 11;
952$msgcode['useupPort']['ERR'] = 124;
e673ee24
DO
953function useupPort ()
954{
0cc24e9a 955 assertUIntArg ('port_id');
32832c0e 956 if (FALSE !== commitUseupPort ($_REQUEST['port_id']))
135080d8 957 return buildRedirectURL (__FUNCTION__, 'OK');
e673ee24 958 else
135080d8 959 return buildRedirectURL (__FUNCTION__, 'ERR');
e673ee24
DO
960}
961
b6a7d936 962$msgcode['updateUI']['OK'] = 56;
4fe32e78
DY
963function updateUI ()
964{
0cc24e9a 965 assertUIntArg ('num_vars');
4fe32e78 966
103b1e1e 967 for ($i = 0; $i < $_REQUEST['num_vars']; $i++)
4fe32e78 968 {
0cc24e9a
DY
969 assertStringArg ("${i}_varname");
970 assertStringArg ("${i}_varvalue", TRUE);
4fe32e78 971 $varname = $_REQUEST["${i}_varname"];
4fe32e78 972 $varvalue = $_REQUEST["${i}_varvalue"];
4fe32e78 973
c461c579 974 // If form value = value in DB, don't bother updating DB
ed941e67 975 if (!isConfigVarChanged($varname, $varvalue))
4fe32e78 976 continue;
3a089a44
DO
977 // any exceptions will be handled by process.php
978 setConfigVar ($varname, $varvalue, TRUE);
3540d15c
DY
979 }
980 return buildRedirectURL (__FUNCTION__, 'OK');
981}
982
983$msgcode['saveMyPreferences']['OK'] = 56;
3540d15c
DY
984function saveMyPreferences ()
985{
986 assertUIntArg ('num_vars');
987
988 for ($i = 0; $i < $_REQUEST['num_vars']; $i++)
989 {
990 assertStringArg ("${i}_varname");
991 assertStringArg ("${i}_varvalue", TRUE);
992 $varname = $_REQUEST["${i}_varname"];
993 $varvalue = $_REQUEST["${i}_varvalue"];
994
995 // If form value = value in DB, don't bother updating DB
ed941e67 996 if (!isConfigVarChanged($varname, $varvalue))
3540d15c 997 continue;
3a089a44 998 setUserConfigVar ($varname, $varvalue);
3540d15c
DY
999 }
1000 return buildRedirectURL (__FUNCTION__, 'OK');
1001}
1002
1003$msgcode['resetMyPreference']['OK'] = 56;
3540d15c
DY
1004function resetMyPreference ()
1005{
1006 assertStringArg ("varname");
3a089a44 1007 resetUserConfigVar ($_REQUEST["varname"]);
135080d8 1008 return buildRedirectURL (__FUNCTION__, 'OK');
4fe32e78
DY
1009}
1010
b6a7d936 1011$msgcode['resetUIConfig']['OK'] = 57;
b07f617c
DO
1012function resetUIConfig()
1013{
b07f617c
DO
1014 setConfigVar ('MASSCOUNT','15');
1015 setConfigVar ('MAXSELSIZE','30');
b07f617c
DO
1016 setConfigVar ('ROW_SCALE','2');
1017 setConfigVar ('PORTS_PER_ROW','12');
1018 setConfigVar ('IPV4_ADDRS_PER_PAGE','256');
1019 setConfigVar ('DEFAULT_RACK_HEIGHT','42');
b5ce46aa
DO
1020 setConfigVar ('DEFAULT_SLB_VS_PORT','');
1021 setConfigVar ('DEFAULT_SLB_RS_PORT','');
72281138 1022 setConfigVar ('DETECT_URLS','no');
4b8d413e 1023 setConfigVar ('RACK_PRESELECT_THRESHOLD','1');
b108de49 1024 setConfigVar ('DEFAULT_IPV4_RS_INSERVICE','no');
8dfb997c 1025 setConfigVar ('AUTOPORTS_CONFIG','4 = 1*33*kvm + 2*24*eth%u;15 = 1*446*kvm');
194e3748
DO
1026 setConfigVar ('SHOW_EXPLICIT_TAGS','yes');
1027 setConfigVar ('SHOW_IMPLICIT_TAGS','yes');
1028 setConfigVar ('SHOW_AUTOMATIC_TAGS','no');
a477e405 1029 setConfigVar ('DEFAULT_OBJECT_TYPE','4');
2754cefc 1030 setConfigVar ('IPV4_AUTO_RELEASE','1');
a53dc9df 1031 setConfigVar ('SHOW_LAST_TAB', 'no');
f0ed1181 1032 setConfigVar ('EXT_IPV4_VIEW', 'yes');
efee2692 1033 setConfigVar ('TREE_THRESHOLD', '25');
2be3fd23 1034 setConfigVar ('IPV4_JAYWALK', 'no');
9318d2ef 1035 setConfigVar ('ADDNEW_AT_TOP', 'yes');
64347dcf 1036 setConfigVar ('IPV4_TREE_SHOW_USAGE', 'yes');
37e59768
DO
1037 setConfigVar ('PREVIEW_TEXT_MAXCHARS', '10240');
1038 setConfigVar ('PREVIEW_TEXT_ROWS', '25');
1039 setConfigVar ('PREVIEW_TEXT_COLS', '80');
1040 setConfigVar ('PREVIEW_IMAGE_MAXPXS', '320');
f3d274bf 1041 setConfigVar ('VENDOR_SIEVE', '');
35bf153d 1042 setConfigVar ('IPV4LB_LISTSRC', '{$typeid_4}');
8fee82b4
DO
1043 setConfigVar ('IPV4OBJ_LISTSRC','{$typeid_4} or {$typeid_7} or {$typeid_8} or {$typeid_12} or {$typeid_445} or {$typeid_447} or {$typeid_798}');
1044 setConfigVar ('IPV4NAT_LISTSRC','{$typeid_4} or {$typeid_7} or {$typeid_8} or {$typeid_798}');
35bf153d
DO
1045 setConfigVar ('ASSETWARN_LISTSRC','{$typeid_4} or {$typeid_7} or {$typeid_8}');
1046 setConfigVar ('NAMEWARN_LISTSRC','{$typeid_4} or {$typeid_7} or {$typeid_8}');
f5883ec1 1047 setConfigVar ('RACKS_PER_ROW','12');
590e1281 1048 setConfigVar ('FILTER_PREDICATE_SIEVE','');
23cdc7e9
DO
1049 setConfigVar ('FILTER_DEFAULT_ANDOR','or');
1050 setConfigVar ('FILTER_SUGGEST_ANDOR','yes');
1051 setConfigVar ('FILTER_SUGGEST_TAGS','yes');
1052 setConfigVar ('FILTER_SUGGEST_PREDICATES','yes');
1053 setConfigVar ('FILTER_SUGGEST_EXTRA','no');
8fee82b4 1054 setConfigVar ('DEFAULT_SNMP_COMMUNITY','public');
f06fe423 1055 setConfigVar ('IPV4_ENABLE_KNIGHT','yes');
9e51318b
DO
1056 setConfigVar ('TAGS_TOPLIST_SIZE','50');
1057 setConfigVar ('TAGS_QUICKLIST_SIZE','20');
1058 setConfigVar ('TAGS_QUICKLIST_THRESHOLD','50');
f44fdef9 1059 setConfigVar ('ENABLE_MULTIPORT_FORM', 'no');
2400d7ec
DO
1060 setConfigVar ('DEFAULT_PORT_IIF_ID', '1');
1061 setConfigVar ('DEFAULT_PORT_OIF_IDS', '1=24; 3=1078; 4=1077; 5=1079; 6=1080; 8=1082; 9=1084');
4a47d34b 1062 setConfigVar ('IPV4_TREE_RTR_AS_CELL', 'yes');
cd3775e9 1063 setConfigVar ('PROXIMITY_RANGE', 0);
ca4eb604 1064 setConfigVar ('IPV4_TREE_SHOW_VLAN', 'yes');
407ed7bb
DO
1065 setConfigVar ('VLANSWITCH_LISTSRC', '');
1066 setConfigVar ('VLANIPV4NET_LISTSRC', '');
2fb1f79b
DO
1067 setConfigVar ('DEFAULT_VDOM_ID', '');
1068 setConfigVar ('DEFAULT_VST_ID', '');
01b9a31a 1069 setConfigVar ('STATIC_FILTER', 'yes');
37cb9e18
DO
1070 setConfigVar ('8021Q_DEPLOY_MINAGE', '300');
1071 setConfigVar ('8021Q_DEPLOY_MAXAGE', '3600');
1072 setConfigVar ('8021Q_DEPLOY_RETRY', '10800');
2582446d 1073 setConfigVar ('8021Q_WRI_AFTER_CONFT_LISTSRC', 'false');
4492050b 1074 setConfigVar ('8021Q_INSTANT_DEPLOY', 'no');
b49a479e
DO
1075 setConfigVar ('CDP_RUNNERS_LISTSRC', '');
1076 setConfigVar ('LLDP_RUNNERS_LISTSRC', '');
0328f6d6 1077 setConfigVar ('HNDP_RUNNERS_LISTSRC', '');
95857b5c 1078 setConfigVar ('SHRINK_TAG_TREE_ON_CLICK', 'yes');
1ebbf889 1079 setConfigVar ('MAX_UNFILTERED_ENTITIES', '0');
135080d8 1080 return buildRedirectURL (__FUNCTION__, 'OK');
b07f617c
DO
1081}
1082
b6a7d936
DO
1083$msgcode['addRealServer']['OK'] = 34;
1084$msgcode['addRealServer']['ERR'] = 126;
732e4578 1085// Add single record.
ca461127
DO
1086function addRealServer ()
1087{
0cc24e9a
DY
1088 assertUIntArg ('pool_id');
1089 assertIPv4Arg ('remoteip');
1090 assertStringArg ('rsport', TRUE);
1091 assertStringArg ('rsconfig', TRUE);
103b1e1e
DO
1092 if (!addRStoRSPool (
1093 $_REQUEST['pool_id'],
1094 $_REQUEST['remoteip'],
1095 $_REQUEST['rsport'],
1096 getConfigVar ('DEFAULT_IPV4_RS_INSERVICE'),
1097 $_REQUEST['rsconfig']
1098 ))
135080d8 1099 return buildRedirectURL (__FUNCTION__, 'ERR');
d6517a21 1100 else
135080d8 1101 return buildRedirectURL (__FUNCTION__, 'OK');
d6517a21
DO
1102}
1103
b6a7d936
DO
1104$msgcode['addRealServers']['OK'] = 37;
1105$msgcode['addRealServers']['ERR1'] = 131;
1106$msgcode['addRealServers']['ERR2'] = 127;
732e4578
DO
1107// Parse textarea submitted and try adding a real server for each line.
1108function addRealServers ()
1109{
0cc24e9a
DY
1110 assertUIntArg ('pool_id');
1111 assertStringArg ('format');
1112 assertStringArg ('rawtext');
732e4578
DO
1113 $ngood = $nbad = 0;
1114 $rsconfig = '';
1115 // Keep in mind, that the text will have HTML entities (namely '>') escaped.
7f42d792 1116 foreach (explode ("\n", dos2unix ($_REQUEST['rawtext'])) as $line)
732e4578 1117 {
59a83bd8 1118 if (!strlen ($line))
732e4578
DO
1119 continue;
1120 $match = array ();
1121 switch ($_REQUEST['format'])
1122 {
1123 case 'ipvs_2': // address and port only
1124 if (!preg_match ('/^ -&gt; ([0-9\.]+):([0-9]+) /', $line, $match))
1125 continue;
103b1e1e 1126 if (addRStoRSPool ($_REQUEST['pool_id'], $match[1], $match[2], getConfigVar ('DEFAULT_IPV4_RS_INSERVICE'), ''))
732e4578
DO
1127 $ngood++;
1128 else
1129 $nbad++;
1130 break;
1131 case 'ipvs_3': // address, port and weight
1132 if (!preg_match ('/^ -&gt; ([0-9\.]+):([0-9]+) +[a-zA-Z]+ +([0-9]+) /', $line, $match))
1133 continue;
103b1e1e 1134 if (addRStoRSPool ($_REQUEST['pool_id'], $match[1], $match[2], getConfigVar ('DEFAULT_IPV4_RS_INSERVICE'), 'weight ' . $match[3]))
732e4578
DO
1135 $ngood++;
1136 else
1137 $nbad++;
1138 break;
e69c2aa3
DO
1139 case 'ssv_2': // IP address and port
1140 if (!preg_match ('/^([0-9\.]+) ([0-9]+)$/', $line, $match))
1141 continue;
103b1e1e 1142 if (addRStoRSPool ($_REQUEST['pool_id'], $match[1], $match[2], getConfigVar ('DEFAULT_IPV4_RS_INSERVICE'), ''))
e69c2aa3
DO
1143 $ngood++;
1144 else
1145 $nbad++;
1146 break;
948c37e3
DO
1147 case 'ssv_1': // IP address
1148 if (!preg_match ('/^([0-9\.]+)$/', $line, $match))
1149 continue;
1150 if (addRStoRSPool ($_REQUEST['pool_id'], $match[1], 0, getConfigVar ('DEFAULT_IPV4_RS_INSERVICE'), ''))
1151 $ngood++;
1152 else
1153 $nbad++;
1154 break;
732e4578 1155 default:
135080d8 1156 return buildRedirectURL (__FUNCTION__, 'ERR1');
732e4578
DO
1157 break;
1158 }
1159 }
1160 if ($nbad == 0 and $ngood > 0)
135080d8 1161 return buildRedirectURL (__FUNCTION__, 'OK', array ($ngood));
732e4578 1162 else
135080d8 1163 return buildRedirectURL (__FUNCTION__, 'ERR2', array ($ngood, $nbad));
732e4578
DO
1164}
1165
b6a7d936
DO
1166$msgcode['addVService']['OK'] = 28;
1167$msgcode['addVService']['ERR1'] = 132;
1168$msgcode['addVService']['ERR2'] = 100;
d6517a21
DO
1169function addVService ()
1170{
0cc24e9a
DY
1171 assertIPv4Arg ('vip');
1172 assertUIntArg ('vport');
1173 assertStringArg ('proto');
103b1e1e 1174 if ($_REQUEST['proto'] != 'TCP' and $_REQUEST['proto'] != 'UDP')
135080d8 1175 return buildRedirectURL (__FUNCTION__, 'ERR1');
0cc24e9a
DY
1176 assertStringArg ('name', TRUE);
1177 assertStringArg ('vsconfig', TRUE);
1178 assertStringArg ('rsconfig', TRUE);
c63a8d6e
DO
1179 $error = commitCreateVS
1180 (
103b1e1e
DO
1181 $_REQUEST['vip'],
1182 $_REQUEST['vport'],
7320b661 1183 $_REQUEST['proto'],
103b1e1e
DO
1184 $_REQUEST['name'],
1185 $_REQUEST['vsconfig'],
c63a8d6e
DO
1186 $_REQUEST['rsconfig'],
1187 isset ($_REQUEST['taglist']) ? $_REQUEST['taglist'] : array()
1188 );
1189 if ($error != '')
135080d8 1190 return buildRedirectURL (__FUNCTION__, 'ERR2', array ($error));
ca461127 1191 else
135080d8 1192 return buildRedirectURL (__FUNCTION__, 'OK');
fb1c4a54
DO
1193}
1194
b6a7d936
DO
1195$msgcode['deleteRealServer']['OK'] = 35;
1196$msgcode['deleteRealServer']['ERR'] = 128;
fb1c4a54
DO
1197function deleteRealServer ()
1198{
0cc24e9a 1199 assertUIntArg ('id');
d6517a21 1200 if (!commitDeleteRS ($_REQUEST['id']))
135080d8 1201 return buildRedirectURL (__FUNCTION__, 'ERR');
fb1c4a54 1202 else
135080d8 1203 return buildRedirectURL (__FUNCTION__, 'OK');
fb1c4a54
DO
1204}
1205
b6a7d936
DO
1206$msgcode['deleteLoadBalancer']['OK'] = 19;
1207$msgcode['deleteLoadBalancer']['ERR'] = 129;
3241551e
DO
1208function deleteLoadBalancer ()
1209{
0cc24e9a
DY
1210 assertUIntArg ('object_id');
1211 assertUIntArg ('pool_id');
1212 assertUIntArg ('vs_id');
103b1e1e
DO
1213 if (!commitDeleteLB (
1214 $_REQUEST['object_id'],
1215 $_REQUEST['pool_id'],
1216 $_REQUEST['vs_id']
1217 ))
135080d8 1218 return buildRedirectURL (__FUNCTION__, 'ERR');
d6517a21 1219 else
135080d8 1220 return buildRedirectURL (__FUNCTION__, 'OK');
d6517a21
DO
1221}
1222
b6a7d936
DO
1223$msgcode['deleteVService']['OK'] = 29;
1224$msgcode['deleteVService']['ERR'] = 130;
d6517a21
DO
1225function deleteVService ()
1226{
0cc24e9a 1227 assertUIntArg ('vs_id');
e02e1941 1228 if (!commitDeleteVS ($_REQUEST['vs_id']))
135080d8 1229 return buildRedirectURL (__FUNCTION__, 'ERR');
3241551e 1230 else
135080d8 1231 return buildRedirectURL (__FUNCTION__, 'OK');
3241551e
DO
1232}
1233
1f54e1ba
DO
1234$msgcode['updateSLBDefConfig']['OK'] = 43;
1235$msgcode['updateSLBDefConfig']['ERR'] = 109;
1236function updateSLBDefConfig ()
1237{
1238 $data = array(
1239 'vs' => $_REQUEST['vsconfig'],
1240 'rs' => $_REQUEST['rsconfig']
1241 );
1242 if (!commitUpdateSLBDefConf ($data))
1243 return buildRedirectURL (__FUNCTION__, 'ERR');
1244 else
1245 return buildRedirectURL (__FUNCTION__, 'OK');
1246}
1247
b6a7d936
DO
1248$msgcode['updateRealServer']['OK'] = 36;
1249$msgcode['updateRealServer']['ERR'] = 133;
fb1c4a54
DO
1250function updateRealServer ()
1251{
0cc24e9a
DY
1252 assertUIntArg ('rs_id');
1253 assertIPv4Arg ('rsip');
1254 assertStringArg ('rsport', TRUE);
1255 assertStringArg ('rsconfig', TRUE);
a5c589d2 1256 if (FALSE === commitUpdateRS (
103b1e1e
DO
1257 $_REQUEST['rs_id'],
1258 $_REQUEST['rsip'],
1259 $_REQUEST['rsport'],
1260 $_REQUEST['rsconfig']
1261 ))
135080d8 1262 return buildRedirectURL (__FUNCTION__, 'ERR');
fb1c4a54 1263 else
135080d8 1264 return buildRedirectURL (__FUNCTION__, 'OK');
ca461127
DO
1265}
1266
b6a7d936
DO
1267$msgcode['updateLoadBalancer']['OK'] = 20;
1268$msgcode['updateLoadBalancer']['ERR'] = 134;
c1ca768c 1269function updateLoadBalancer ()
3241551e 1270{
0cc24e9a
DY
1271 assertUIntArg ('object_id');
1272 assertUIntArg ('pool_id');
1273 assertUIntArg ('vs_id');
1274 assertStringArg ('vsconfig', TRUE);
1275 assertStringArg ('rsconfig', TRUE);
1f54e1ba
DO
1276 if (! empty($_REQUEST['prio']))
1277 assertUIntArg('prio', TRUE);
1278
a5c589d2 1279 if (FALSE === commitUpdateLB (
103b1e1e
DO
1280 $_REQUEST['object_id'],
1281 $_REQUEST['pool_id'],
1282 $_REQUEST['vs_id'],
1283 $_REQUEST['vsconfig'],
1f54e1ba
DO
1284 $_REQUEST['rsconfig'],
1285 $_REQUEST['prio']
103b1e1e 1286 ))
135080d8 1287 return buildRedirectURL (__FUNCTION__, 'ERR');
d6517a21 1288 else
135080d8 1289 return buildRedirectURL (__FUNCTION__, 'OK');
d6517a21
DO
1290}
1291
b6a7d936
DO
1292$msgcode['updateVService']['OK'] = 30;
1293$msgcode['updateVService']['ERR'] = 135;
d6517a21
DO
1294function updateVService ()
1295{
0cc24e9a
DY
1296 assertUIntArg ('vs_id');
1297 assertIPv4Arg ('vip');
1298 assertUIntArg ('vport');
1299 assertStringArg ('proto');
1300 assertStringArg ('name', TRUE);
1301 assertStringArg ('vsconfig', TRUE);
1302 assertStringArg ('rsconfig', TRUE);
a5c589d2 1303 if (FALSE === commitUpdateVS (
103b1e1e
DO
1304 $_REQUEST['vs_id'],
1305 $_REQUEST['vip'],
1306 $_REQUEST['vport'],
1307 $_REQUEST['proto'],
1308 $_REQUEST['name'],
1309 $_REQUEST['vsconfig'],
1310 $_REQUEST['rsconfig']
1311 ))
135080d8 1312 return buildRedirectURL (__FUNCTION__, 'ERR');
3241551e 1313 else
135080d8 1314 return buildRedirectURL (__FUNCTION__, 'OK');
3241551e
DO
1315}
1316
b6a7d936
DO
1317$msgcode['addLoadBalancer']['OK'] = 18;
1318$msgcode['addLoadBalancer']['ERR'] = 137;
3241551e
DO
1319function addLoadBalancer ()
1320{
0cc24e9a
DY
1321 assertUIntArg ('pool_id');
1322 assertUIntArg ('object_id');
1323 assertUIntArg ('vs_id');
1324 assertStringArg ('vsconfig', TRUE);
1325 assertStringArg ('rsconfig', TRUE);
1f54e1ba
DO
1326 if (! empty($_REQUEST['prio']))
1327 assertUIntArg('prio', TRUE);
1328
103b1e1e
DO
1329 if (!addLBtoRSPool (
1330 $_REQUEST['pool_id'],
1331 $_REQUEST['object_id'],
1332 $_REQUEST['vs_id'],
1333 $_REQUEST['vsconfig'],
1f54e1ba
DO
1334 $_REQUEST['rsconfig'],
1335 $_REQUEST['prio']
103b1e1e 1336 ))
135080d8 1337 return buildRedirectURL (__FUNCTION__, 'ERR');
3241551e 1338 else
135080d8 1339 return buildRedirectURL (__FUNCTION__, 'OK');
3241551e
DO
1340}
1341
b6a7d936
DO
1342$msgcode['addRSPool']['OK'] = 31;
1343$msgcode['addRSPool']['ERR'] = 100;
5ad76f01
DO
1344function addRSPool ()
1345{
0cc24e9a
DY
1346 assertStringArg ('name', TRUE);
1347 assertStringArg ('vsconfig', TRUE);
1348 assertStringArg ('rsconfig', TRUE);
c63a8d6e
DO
1349 $error = commitCreateRSPool
1350 (
103b1e1e
DO
1351 $_REQUEST['name'],
1352 $_REQUEST['vsconfig'],
c63a8d6e
DO
1353 $_REQUEST['rsconfig'],
1354 isset ($_REQUEST['taglist']) ? $_REQUEST['taglist'] : array()
1355 );
1356 if ($error != '')
135080d8 1357 return buildRedirectURL (__FUNCTION__, 'ERR', array ($error));
5ad76f01 1358 else
135080d8 1359 return buildRedirectURL (__FUNCTION__, 'OK');
5ad76f01
DO
1360}
1361
b6a7d936
DO
1362$msgcode['deleteRSPool']['OK'] = 32;
1363$msgcode['deleteRSPool']['ERR'] = 138;
5ad76f01
DO
1364function deleteRSPool ()
1365{
0cc24e9a 1366 assertUIntArg ('pool_id');
654e4636 1367 if (commitDeleteRSPool ($_REQUEST['pool_id']) === FALSE)
135080d8 1368 return buildRedirectURL (__FUNCTION__, 'ERR');
5ad76f01 1369 else
135080d8 1370 return buildRedirectURL (__FUNCTION__, 'OK');
5ad76f01
DO
1371}
1372
b6a7d936
DO
1373$msgcode['updateRSPool']['OK'] = 33;
1374$msgcode['updateRSPool']['ERR'] = 139;
5ad76f01
DO
1375function updateRSPool ()
1376{
0cc24e9a
DY
1377 assertUIntArg ('pool_id');
1378 assertStringArg ('name', TRUE);
1379 assertStringArg ('vsconfig', TRUE);
1380 assertStringArg ('rsconfig', TRUE);
1f54e1ba
DO
1381 if (FALSE === commitUpdateRSPool
1382 (
1383 $_REQUEST['pool_id'],
1384 $_REQUEST['name'],
1385 $_REQUEST['vsconfig'],
1386 $_REQUEST['rsconfig']
1387 )
1388 )
135080d8 1389 return buildRedirectURL (__FUNCTION__, 'ERR');
5ad76f01 1390 else
135080d8 1391 return buildRedirectURL (__FUNCTION__, 'OK');
5ad76f01
DO
1392}
1393
b6a7d936
DO
1394$msgcode['updateRSInService']['OK'] = 38;
1395$msgcode['updateRSInService']['ERR'] = 140;
1f7d18fa
DO
1396function updateRSInService ()
1397{
0cc24e9a 1398 assertUIntArg ('rscount');
841a7a7a 1399 $pool_id = $_REQUEST['pool_id'];
a6e91ac2
DO
1400 $orig = spotEntity ('ipv4rspool', $pool_id);
1401 amplifyCell ($orig);
1f7d18fa
DO
1402 $nbad = $ngood = 0;
1403 for ($i = 1; $i <= $_REQUEST['rscount']; $i++)
1404 {
1405 $rs_id = $_REQUEST["rsid_${i}"];
1406 if (isset ($_REQUEST["inservice_${i}"]) and $_REQUEST["inservice_${i}"] == 'on')
1407 $newval = 'yes';
1408 else
1409 $newval = 'no';
1410 if ($newval != $orig['rslist'][$rs_id]['inservice'])
1411 {
a5c589d2 1412 if (FALSE !== commitSetInService ($rs_id, $newval))
1f7d18fa
DO
1413 $ngood++;
1414 else
1415 $nbad++;
1416 }
1417 }
1418 if (!$nbad)
135080d8 1419 return buildRedirectURL (__FUNCTION__, 'OK', array ($ngood));
1f7d18fa 1420 else
135080d8 1421 return buildRedirectURL (__FUNCTION__, 'ERR', array ($nbad, $ngood));
1f7d18fa
DO
1422}
1423
b6a7d936
DO
1424$msgcode['importPTRData']['OK'] = 26;
1425$msgcode['importPTRData']['ERR'] = 141;
8d9c16e7
DO
1426// FIXME: check, that each submitted address belongs to the prefix we
1427// are operating on.
03eb5209
DO
1428function importPTRData ()
1429{
0cc24e9a 1430 assertUIntArg ('addrcount');
03eb5209 1431 $nbad = $ngood = 0;
03eb5209
DO
1432 for ($i = 0; $i < $_REQUEST['addrcount']; $i++)
1433 {
3f3bd41e 1434 $inputname = "import_${i}";
03eb5209
DO
1435 if (!isset ($_REQUEST[$inputname]) or $_REQUEST[$inputname] != 'on')
1436 continue;
0cc24e9a
DY
1437 assertIPv4Arg ("addr_${i}");
1438 assertStringArg ("descr_${i}", TRUE);
1439 assertStringArg ("rsvd_${i}");
3f3bd41e
DO
1440 // Non-existent addresses will not have this argument set in request.
1441 $rsvd = 'no';
03eb5209
DO
1442 if ($_REQUEST["rsvd_${i}"] == 'yes')
1443 $rsvd = 'yes';
3f3bd41e 1444 if (updateAddress ($_REQUEST["addr_${i}"], $_REQUEST["descr_${i}"], $rsvd) == '')
03eb5209
DO
1445 $ngood++;
1446 else
1447 $nbad++;
1448 }
1449 if (!$nbad)
135080d8 1450 return buildRedirectURL (__FUNCTION__, 'OK', array ($ngood));
03eb5209 1451 else
135080d8 1452 return buildRedirectURL (__FUNCTION__, 'ERR', array ($nbad, $ngood));
03eb5209
DO
1453}
1454
b6a7d936
DO
1455$msgcode['generateAutoPorts']['OK'] = 21;
1456$msgcode['generateAutoPorts']['ERR'] = 142;
f3f0161f
DO
1457function generateAutoPorts ()
1458{
103b1e1e 1459 global $pageno;
0cc24e9a 1460 assertUIntArg ('object_id');
6297d584 1461 $info = spotEntity ('object', $_REQUEST['object_id']);
f3f0161f 1462 // Navigate away in case of success, stay at the place otherwise.
103b1e1e 1463 if (executeAutoPorts ($_REQUEST['object_id'], $info['objtype_id']))
135080d8 1464 return buildRedirectURL (__FUNCTION__, 'OK', array(), $pageno, 'ports');
f3f0161f 1465 else
135080d8 1466 return buildRedirectURL (__FUNCTION__, 'ERR');
f3f0161f
DO
1467}
1468
b6a7d936
DO
1469$msgcode['saveEntityTags']['OK'] = 22;
1470$msgcode['saveEntityTags']['ERR1'] = 143;
1471$msgcode['saveEntityTags']['ERR2'] = 187;
24cbe8af 1472// Filter out implicit tags before storing the new tag set.
3355ca56 1473function saveEntityTags ()
24cbe8af 1474{
eb27afad 1475 global $page, $pageno, $etype_by_pageno;
be2ae2a2 1476 if (!isset ($etype_by_pageno[$pageno]) or !isset ($page[$pageno]['bypass']))
9a61c175 1477 return buildRedirectURL (__FUNCTION__, 'ERR2', array (__FUNCTION__));
be2ae2a2 1478 $realm = $etype_by_pageno[$pageno];
3355ca56 1479 $bypass = $page[$pageno]['bypass'];
0cc24e9a 1480 assertUIntArg ($bypass);
2034d968 1481 $entity_id = $_REQUEST[$bypass];
e04931c8 1482 $taglist = isset ($_REQUEST['taglist']) ? $_REQUEST['taglist'] : array();
6e49bd1f 1483 // Build a chain from the submitted data, minimize it,
ab379543 1484 // then wipe existing records and store the new set instead.
01b6b4d6 1485 destroyTagsForEntity ($realm, $entity_id);
eb27afad
DO
1486 // TODO: these actions are very close to what rebuildTagChainForEntity() does,
1487 // so why not use it?
6e49bd1f 1488 $newchain = getExplicitTagsOnly (buildTagChainFromIds ($taglist));
ab379543 1489 $n_succeeds = $n_errors = 0;
6e49bd1f 1490 foreach ($newchain as $taginfo)
eb6ea26f 1491 if (addTagForEntity ($realm, $entity_id, $taginfo['id']))
ab379543
DO
1492 $n_succeeds++;
1493 else
1494 $n_errors++;
ab379543 1495 if ($n_errors)
9a61c175 1496 return buildRedirectURL (__FUNCTION__, 'ERR1', array ($n_succeeds, $n_errors));
ab379543 1497 else
135080d8 1498 return buildRedirectURL (__FUNCTION__, 'OK', array ($n_succeeds));
2034d968
DO
1499}
1500
b6a7d936
DO
1501$msgcode['destroyTag']['OK'] = 58;
1502$msgcode['destroyTag']['ERR1'] = 183;
1503$msgcode['destroyTag']['ERR2'] = 144;
fe7044ad
DO
1504function destroyTag ()
1505{
0cc24e9a 1506 assertUIntArg ('tag_id');
c615a655
DO
1507 global $taglist;
1508 if (!isset ($taglist[$_REQUEST['tag_id']]))
1509 return buildRedirectURL (__FUNCTION__, 'ERR1', array ($_REQUEST['tag_id']));
49fb1027 1510 if (($ret = commitDestroyTag ($_REQUEST['tag_id'])) == '')
c615a655 1511 return buildRedirectURL (__FUNCTION__, 'OK', array ($taglist[$_REQUEST['tag_id']]['tag']));
fe7044ad 1512 else
c615a655 1513 return buildRedirectURL (__FUNCTION__, 'ERR2');
fe7044ad
DO
1514}
1515
b6a7d936
DO
1516$msgcode['createTag']['OK'] = 59;
1517$msgcode['createTag']['ERR1'] = 145;
1518$msgcode['createTag']['ERR3'] = 147;
fe7044ad
DO
1519function createTag ()
1520{
0cc24e9a
DY
1521 assertStringArg ('tag_name');
1522 assertUIntArg ('parent_id', TRUE);
49fb1027 1523 $tagname = trim ($_REQUEST['tag_name']);
2eeeca80 1524 if (!validTagName ($tagname))
135080d8 1525 return buildRedirectURL (__FUNCTION__, 'ERR1', array ($tagname));
fe7044ad 1526 if (($parent_id = $_REQUEST['parent_id']) <= 0)
6cfedb71
DO
1527 $parent_id = NULL;
1528 if (FALSE === commitCreateTag ($tagname, $parent_id))
1529 return buildRedirectURL (__FUNCTION__, 'ERR3', array (niftyString ($tagname)));
1530 return buildRedirectURL (__FUNCTION__, 'OK', array (niftyString ($tagname)));
fe7044ad
DO
1531}
1532
b6a7d936
DO
1533$msgcode['updateTag']['OK'] = 60;
1534$msgcode['updateTag']['ERR1'] = 145;
a5c589d2 1535$msgcode['updateTag']['ERR2'] = 109;
49fb1027
DO
1536function updateTag ()
1537{
0cc24e9a
DY
1538 assertUIntArg ('tag_id');
1539 assertUIntArg ('parent_id', TRUE);
1540 assertStringArg ('tag_name');
49fb1027 1541 $tagname = trim ($_REQUEST['tag_name']);
2eeeca80 1542 if (!validTagName ($tagname))
135080d8 1543 return buildRedirectURL (__FUNCTION__, 'ERR1', array ($tagname));
49fb1027
DO
1544 if (($parent_id = $_REQUEST['parent_id']) <= 0)
1545 $parent_id = 'NULL';
a5c589d2 1546 if (FALSE !== commitUpdateTag ($_REQUEST['tag_id'], $tagname, $parent_id))
135080d8 1547 return buildRedirectURL (__FUNCTION__, 'OK', array ($tagname));
590e1281
DO
1548 // Use old name in the message, cause update failed.
1549 global $taglist;
a5c589d2 1550 return buildRedirectURL (__FUNCTION__, 'ERR2', array ($taglist[$_REQUEST['tag_id']]['tag']));
49fb1027
DO
1551}
1552
b6a7d936
DO
1553$msgcode['rollTags']['OK'] = 67;
1554$msgcode['rollTags']['ERR'] = 149;
eb6ea26f
DO
1555function rollTags ()
1556{
0cc24e9a
DY
1557 assertUIntArg ('row_id');
1558 assertStringArg ('sum', TRUE);
1559 assertUIntArg ('realsum');
eb6ea26f 1560 if ($_REQUEST['sum'] != $_REQUEST['realsum'])
135080d8 1561 return buildRedirectURL (__FUNCTION__, 'ERR');
abef7149
DO
1562 // Even if the user requested an empty tag list, don't bail out, but process existing
1563 // tag chains with "zero" extra. This will make sure, that the stuff processed will
1564 // have its chains refined to "normal" form.
1565 $extratags = isset ($_REQUEST['taglist']) ? $_REQUEST['taglist'] : array();
1566 $n_ok = 0;
1567 // Minimizing the extra chain early, so that tag rebuilder doesn't have to
1568 // filter out the same tag again and again. It will have own noise to cancel.
1569 $extrachain = getExplicitTagsOnly (buildTagChainFromIds ($extratags));
61a1d996 1570 foreach (listCells ('rack', $_REQUEST['row_id']) as $rack)
abef7149 1571 {
61a1d996 1572 if (rebuildTagChainForEntity ('rack', $rack['id'], $extrachain))
abef7149 1573 $n_ok++;
61a1d996
DO
1574 amplifyCell ($rack);
1575 foreach ($rack['mountedObjects'] as $object_id)
abef7149
DO
1576 if (rebuildTagChainForEntity ('object', $object_id, $extrachain))
1577 $n_ok++;
1578 }
135080d8 1579 return buildRedirectURL (__FUNCTION__, 'OK', array ($n_ok));
eb6ea26f
DO
1580}
1581
b6a7d936
DO
1582$msgcode['changeMyPassword']['OK'] = 61;
1583$msgcode['changeMyPassword']['ERR1'] = 150;
1584$msgcode['changeMyPassword']['ERR2'] = 151;
1585$msgcode['changeMyPassword']['ERR3'] = 152;
1586$msgcode['changeMyPassword']['ERR4'] = 153;
9457ca59 1587function changeMyPassword ()
cced6b7d 1588{
b82cce3f 1589 global $remote_username, $user_auth_src;
204284ba 1590 if ($user_auth_src != 'database')
135080d8 1591 return buildRedirectURL (__FUNCTION__, 'ERR1');
0cc24e9a
DY
1592 assertStringArg ('oldpassword');
1593 assertStringArg ('newpassword1');
1594 assertStringArg ('newpassword2');
b82cce3f 1595 $remote_userid = getUserIDByUsername ($remote_username);
0b2c74cb 1596 $userinfo = spotEntity ('user', $remote_userid);
b82cce3f 1597 if ($userinfo['user_password_hash'] != sha1 ($_REQUEST['oldpassword']))
135080d8 1598 return buildRedirectURL (__FUNCTION__, 'ERR2');
cced6b7d 1599 if ($_REQUEST['newpassword1'] != $_REQUEST['newpassword2'])
135080d8 1600 return buildRedirectURL (__FUNCTION__, 'ERR3');
32832c0e 1601 if (FALSE !== commitUpdateUserAccount ($remote_userid, $userinfo['user_name'], $userinfo['user_realname'], sha1 ($_REQUEST['newpassword1'])))
135080d8 1602 return buildRedirectURL (__FUNCTION__, 'OK');
cced6b7d 1603 else
135080d8 1604 return buildRedirectURL (__FUNCTION__, 'ERR4');
cced6b7d
DO
1605}
1606
b6a7d936
DO
1607$msgcode['saveRackCode']['OK'] = 43;
1608$msgcode['saveRackCode']['ERR1'] = 154;
1609$msgcode['saveRackCode']['ERR2'] = 155;
cced6b7d
DO
1610function saveRackCode ()
1611{
cced6b7d 1612 assertStringArg ('rackcode');
e6a4adb9 1613 // For the test to succeed, unescape LFs, strip CRs.
7f42d792 1614 $newcode = dos2unix ($_REQUEST['rackcode']);
cf25e649
DO
1615 $parseTree = getRackCode ($newcode);
1616 if ($parseTree['result'] != 'ACK')
135080d8 1617 return buildRedirectURL (__FUNCTION__, 'ERR1', array ($parseTree['load']));
bb09f49c
DO
1618 if (FALSE !== saveScript ('RackCode', $newcode))
1619 {
1620 saveScript ('RackCodeCache', base64_encode (serialize ($parseTree)));
135080d8 1621 return buildRedirectURL (__FUNCTION__, 'OK');
bb09f49c
DO
1622 }
1623 return buildRedirectURL (__FUNCTION__, 'ERR2');
cced6b7d
DO
1624}
1625
b6a7d936 1626$msgcode['setPortVLAN']['ERR1'] = 156;
46f92ff7
DO
1627// This handler's context is pre-built, but not authorized. It is assumed, that the
1628// handler will take existing context and before each commit check authorization
1629// on the base chain plus necessary context added.
1630function setPortVLAN ()
1631{
0cc24e9a 1632 assertUIntArg ('portcount');
46f92ff7
DO
1633 $data = getSwitchVLANs ($_REQUEST['object_id']);
1634 if ($data === NULL)
135080d8 1635 return buildRedirectURL (__FUNCTION__, 'ERR1');
46f92ff7
DO
1636 list ($vlanlist, $portlist) = $data;
1637 // Here we just build up 1 set command for the gateway with all of the ports
1638 // included. The gateway is expected to filter unnecessary changes silently
1639 // and to provide a list of responses with either error or success message
1640 // for each of the rest.
1641 $nports = $_REQUEST['portcount'];
1642 $prefix = 'set ';
db55cf54 1643 $log = emptyLog();
46f92ff7
DO
1644 $setcmd = '';
1645 for ($i = 0; $i < $nports; $i++)
1646 if
1647 (
1648 !isset ($_REQUEST['portname_' . $i]) ||
1649 !isset ($_REQUEST['vlanid_' . $i]) ||
1650 $_REQUEST['portname_' . $i] != $portlist[$i]['portname']
1651 )
24dcb9d8 1652 $log['m'][] = array ('c' => 158, 'a' => array ($i));
46f92ff7
DO
1653 elseif
1654 (
1655 $_REQUEST['vlanid_' . $i] == $portlist[$i]['vlanid'] ||
1656 $portlist[$i]['vlaind'] == 'TRUNK'
1657 )
1658 continue;
1659 else
1660 {
1661 $portname = $_REQUEST['portname_' . $i];
1662 $oldvlanid = $portlist[$i]['vlanid'];
1663 $newvlanid = $_REQUEST['vlanid_' . $i];
647635ad
DO
1664 if
1665 (
1666 !permitted (NULL, NULL, NULL, array (array ('tag' => '$fromvlan_' . $oldvlanid))) or
1667 !permitted (NULL, NULL, NULL, array (array ('tag' => '$tovlan_' . $newvlanid)))
1668 )
46f92ff7 1669 {
24dcb9d8 1670 $log['m'][] = array ('c' => 159, 'a' => array ($portname, $oldvlanid, $newvlanid));
46f92ff7
DO
1671 continue;
1672 }
1673 $setcmd .= $prefix . $portname . '=' . $newvlanid;
1674 $prefix = ';';
1675 }
1676 // Feed the gateway and interpret its (non)response.
1677 if ($setcmd != '')
f0ff4930 1678 $log['m'] = array_merge ($log['m'], setSwitchVLANs ($_REQUEST['object_id'], $setcmd));
46f92ff7 1679 else
24dcb9d8 1680 $log['m'][] = array ('c' => 201);
46f92ff7
DO
1681 return buildWideRedirectURL ($log);
1682}
1683
12b0c847
DO
1684$msgcode['submitSLBConfig']['OK'] = 66;
1685$msgcode['submitSLBConfig']['ERR'] = 164;
2987fc1f
DO
1686function submitSLBConfig ()
1687{
0cc24e9a 1688 assertUIntArg ('object_id');
2987fc1f 1689 $newconfig = buildLVSConfig ($_REQUEST['object_id']);
12b0c847
DO
1690 try
1691 {
1692 gwSendFileToObject ($_REQUEST['object_id'], 'slbconfig', html_entity_decode ($newconfig, ENT_QUOTES, 'UTF-8'));
1693 }
3a089a44 1694 catch (RTGatewayError $e)
12b0c847 1695 {
3a089a44 1696 return buildRedirectURL (__FUNCTION__, 'ERR', array ($e->getMessage()));
12b0c847
DO
1697 }
1698 return buildRedirectURL (__FUNCTION__, 'OK', array ('slbconfig'));
2987fc1f
DO
1699}
1700
b6a7d936
DO
1701$msgcode['addRow']['OK'] = 74;
1702$msgcode['addRow']['ERR'] = 100;
345fd640
AD
1703function addRow ()
1704{
0cc24e9a 1705 assertStringArg ('name');
345fd640 1706
10bac82a 1707 if (commitAddRow ($_REQUEST['name']) === TRUE)
135080d8 1708 return buildRedirectURL (__FUNCTION__, 'OK', array ($_REQUEST['name']));
345fd640 1709 else
135080d8 1710 return buildRedirectURL (__FUNCTION__, 'ERR', array ($_REQUEST['name']));
345fd640
AD
1711}
1712
b6a7d936
DO
1713$msgcode['updateRow']['OK'] = 75;
1714$msgcode['updateRow']['ERR'] = 100;
345fd640
AD
1715function updateRow ()
1716{
0cc24e9a
DY
1717 assertUIntArg ('row_id');
1718 assertStringArg ('name');
345fd640 1719
39eadd27 1720 if (FALSE !== commitUpdateRow ($_REQUEST['row_id'], $_REQUEST['name']))
135080d8 1721 return buildRedirectURL (__FUNCTION__, 'OK', array ($_REQUEST['name']));
345fd640 1722 else
135080d8 1723 return buildRedirectURL (__FUNCTION__, 'ERR', array ($_REQUEST['name']));
345fd640
AD
1724}
1725
b6a7d936 1726$msgcode['deleteRow']['OK'] = 77;
f78748cf 1727$msgcode['deleteRow']['ERR'] = 146;
9f14a7ef
DY
1728function deleteRow ()
1729{
0cc24e9a 1730 assertUIntArg ('row_id');
7be51fea 1731 $rowinfo = getRackRowInfo ($_REQUEST['row_id']);
f78748cf 1732 return buildRedirectURL (__FUNCTION__, FALSE === commitDeleteRow ($_REQUEST['row_id']) ? 'ERR' : 'OK', array ($rowinfo['name']));
9f14a7ef
DY
1733}
1734
b6a7d936
DO
1735$msgcode['addRack']['OK'] = 65;
1736$msgcode['addRack']['ERR1'] = 171;
1737$msgcode['addRack']['ERR2'] = 172;
f19c75d6
DO
1738function addRack ()
1739{
0cc24e9a 1740 assertUIntArg ('row_id');
f19c75d6
DO
1741 $taglist = isset ($_REQUEST['taglist']) ? $_REQUEST['taglist'] : array();
1742 if (isset ($_REQUEST['got_data']))
1743 {
0cc24e9a
DY
1744 assertStringArg ('rack_name');
1745 assertUIntArg ('rack_height1');
1746 assertStringArg ('rack_comment', TRUE);
f19c75d6
DO
1747
1748 if (commitAddRack ($_REQUEST['rack_name'], $_REQUEST['rack_height1'], $_REQUEST['row_id'], $_REQUEST['rack_comment'], $taglist) === TRUE)
135080d8 1749 return buildRedirectURL (__FUNCTION__, 'OK', array ($_REQUEST['rack_name']));
f19c75d6 1750 else
135080d8 1751 return buildRedirectURL (__FUNCTION__, 'ERR1', array ($_REQUEST['rack_name']));
f19c75d6
DO
1752 }
1753 elseif (isset ($_REQUEST['got_mdata']))
1754 {
0cc24e9a
DY
1755 assertUIntArg ('rack_height2');
1756 assertStringArg ('rack_names', TRUE);
db55cf54 1757 $log = emptyLog();
f19c75d6 1758 // copy-and-paste from renderAddMultipleObjectsForm()
7f42d792 1759 $names1 = explode ("\n", $_REQUEST['rack_names']);
f19c75d6
DO
1760 $names2 = array();
1761 foreach ($names1 as $line)
1762 {
1763 $parts = explode ('\r', $line);
1764 reset ($parts);
59a83bd8 1765 if (!strlen ($parts[0]))
f19c75d6
DO
1766 continue;
1767 else
1768 $names2[] = rtrim ($parts[0]);
1769 }
b3029d5c 1770 global $msgcode;
f19c75d6
DO
1771 foreach ($names2 as $cname)
1772 if (commitAddRack ($cname, $_REQUEST['rack_height2'], $_REQUEST['row_id'], '', $taglist) === TRUE)
b3029d5c 1773 $log['m'][] = array ('c' => $msgcode[__FUNCTION__]['OK'], 'a' => array ($cname));
f19c75d6 1774 else
b3029d5c 1775 $log['m'][] = array ('c' => $msgcode[__FUNCTION__]['ERR1'], 'a' => array ($cname));
f19c75d6
DO
1776 return buildWideRedirectURL ($log);
1777 }
1778 else
135080d8 1779 return buildRedirectURL (__FUNCTION__, 'ERR2');
f19c75d6
DO
1780}
1781
b6a7d936
DO
1782$msgcode['deleteRack']['OK'] = 79;
1783$msgcode['deleteRack']['ERR'] = 100;
1784$msgcode['deleteRack']['ERR1'] = 206;
c8187437
DY
1785function deleteRack ()
1786{
0cc24e9a 1787 assertUIntArg ('rack_id');
61a1d996
DO
1788 if (NULL == ($rackData = spotEntity ('rack', $_REQUEST['rack_id'])))
1789 return buildRedirectURL (__FUNCTION__, 'ERR', array ('Rack not found'), 'rackspace', 'default');
1790 amplifyCell ($rackData);
1791 if (count ($rackData['mountedObjects']))
c8187437 1792 return buildRedirectURL (__FUNCTION__, 'ERR1');
61a1d996
DO
1793 if (TRUE !== commitDeleteRack ($_REQUEST['rack_id']))
1794 return buildRedirectURL (__FUNCTION__, 'ERR', array(), 'rackspace', 'default');
1795 return buildRedirectURL (__FUNCTION__, 'OK', array ($rackData['name']), 'rackspace', 'default');
c8187437
DY
1796}
1797
b6a7d936
DO
1798$msgcode['updateRack']['OK'] = 68;
1799$msgcode['updateRack']['ERR'] = 177;
7056988c
DO
1800function updateRack ()
1801{
0cc24e9a
DY
1802 assertUIntArg ('rack_id');
1803 assertUIntArg ('rack_row_id');
1804 assertUIntArg ('rack_height');
1805 assertStringArg ('rack_name');
1806 assertStringArg ('rack_comment', TRUE);
7056988c 1807
7056988c 1808 resetThumbCache ($_REQUEST['rack_id']);
0c2b7c4a 1809 if (TRUE === commitUpdateRack ($_REQUEST['rack_id'], $_REQUEST['rack_name'], $_REQUEST['rack_height'], $_REQUEST['rack_row_id'], $_REQUEST['rack_comment']))
135080d8 1810 return buildRedirectURL (__FUNCTION__, 'OK', array ($_REQUEST['rack_name']));
0c2b7c4a 1811 else
135080d8 1812 return buildRedirectURL (__FUNCTION__, 'ERR');
7056988c
DO
1813}
1814
4fbb5a00
DY
1815function updateRackDesign ()
1816{
0cc24e9a 1817 assertUIntArg ('rack_id');
6cfedb71 1818 $rackData = spotEntity ('rack', $_REQUEST['rack_id']);
61a1d996 1819 amplifyCell ($rackData);
4fbb5a00
DY
1820 applyRackDesignMask($rackData);
1821 markupObjectProblems ($rackData);
1822 $response = processGridForm ($rackData, 'A', 'F');
51690ad4 1823 return buildWideRedirectURL (array($response));
4fbb5a00
DY
1824}
1825
1826function updateRackProblems ()
1827{
0cc24e9a 1828 assertUIntArg ('rack_id');
6cfedb71 1829 $rackData = spotEntity ('rack', $_REQUEST['rack_id']);
61a1d996 1830 amplifyCell ($rackData);
4fbb5a00
DY
1831 applyRackProblemMask($rackData);
1832 markupObjectProblems ($rackData);
1833 $response = processGridForm ($rackData, 'F', 'U');
51690ad4 1834 return buildWideRedirectURL (array($response));
4fbb5a00
DY
1835}
1836
7056988c
DO
1837function querySNMPData ()
1838{
0cc24e9a
DY
1839 assertUIntArg ('object_id');
1840 assertStringArg ('community');
8536e20a 1841 return doSNMPmining ($_REQUEST['object_id'], $_REQUEST['community']);
7056988c
DO
1842}
1843
b6a7d936 1844$msgcode['addFileWithoutLink']['OK'] = 69;
6cfedb71
DO
1845$msgcode['addFileWithoutLink']['ERR1'] = 181;
1846$msgcode['addFileWithoutLink']['ERR2'] = 110;
e1ae3fb4
AD
1847// File-related functions
1848function addFileWithoutLink ()
1849{
0cc24e9a 1850 assertStringArg ('comment', TRUE);
e1ae3fb4
AD
1851
1852 // Make sure the file can be uploaded
1853 if (get_cfg_var('file_uploads') != 1)
6cfedb71 1854 return buildRedirectURL (__FUNCTION__, 'ERR1');
e1ae3fb4
AD
1855
1856 $fp = fopen($_FILES['file']['tmp_name'], 'rb');
4bb95650 1857 global $sic;
6cfedb71
DO
1858 if (FALSE === commitAddFile ($_FILES['file']['name'], $_FILES['file']['type'], $_FILES['file']['size'], $fp, $sic['comment']))
1859 return buildRedirectURL (__FUNCTION__, 'ERR2');
f857f71f
DO
1860 if (isset ($_REQUEST['taglist']))
1861 produceTagsForLastRecord ('file', $_REQUEST['taglist']);
6cfedb71 1862 return buildRedirectURL (__FUNCTION__, 'OK', array (htmlspecialchars ($_FILES['file']['name'])));
e1ae3fb4
AD
1863}
1864
b6a7d936 1865$msgcode['addFileToEntity']['OK'] = 69;
b6a7d936 1866$msgcode['addFileToEntity']['ERR2'] = 181;
6cfedb71 1867$msgcode['addFileToEntity']['ERR3'] = 110;
e1ae3fb4
AD
1868function addFileToEntity ()
1869{
9a61c175
DO
1870 global $page, $pageno, $etype_by_pageno;
1871 if (!isset ($etype_by_pageno[$pageno]) or !isset ($page[$pageno]['bypass']))
3a089a44 1872 throw new RackTablesError ('dispatching failure', RackTablesError::INTERNAL);
9a61c175
DO
1873 $realm = $etype_by_pageno[$pageno];
1874 $bypass = $page[$pageno]['bypass'];
0cc24e9a 1875 assertUIntArg ($bypass);
9a61c175 1876 $entity_id = $_REQUEST[$bypass];
0cc24e9a 1877 assertStringArg ('comment', TRUE);
e1ae3fb4
AD
1878
1879 // Make sure the file can be uploaded
1880 if (get_cfg_var('file_uploads') != 1)
9a61c175 1881 return buildRedirectURL (__FUNCTION__, 'ERR2');
e1ae3fb4
AD
1882
1883 $fp = fopen($_FILES['file']['tmp_name'], 'rb');
4bb95650 1884 global $sic;
6cfedb71
DO
1885 if (FALSE === commitAddFile ($_FILES['file']['name'], $_FILES['file']['type'], $_FILES['file']['size'], $fp, $sic['comment']))
1886 return buildRedirectURL (__FUNCTION__, 'ERR3');
1887 if (FALSE === commitLinkFile (lastInsertID(), $realm, $entity_id))
1888 return buildRedirectURL (__FUNCTION__, 'ERR3');
e1ae3fb4 1889
6cfedb71 1890 return buildRedirectURL (__FUNCTION__, 'OK', array (htmlspecialchars ($_FILES['file']['name'])));
e1ae3fb4
AD
1891}
1892
b6a7d936
DO
1893$msgcode['linkFileToEntity']['OK'] = 71;
1894$msgcode['linkFileToEntity']['ERR1'] = 178;
6cfedb71 1895$msgcode['linkFileToEntity']['ERR2'] = 110;
e1ae3fb4
AD
1896function linkFileToEntity ()
1897{
0cc24e9a 1898 assertUIntArg ('file_id');
482c7f35 1899 global $page, $pageno, $etype_by_pageno;
6cfedb71 1900 if (!isset ($etype_by_pageno[$pageno]) or !isset ($page[$pageno]['bypass']))
3a089a44 1901 throw new RackTablesError ('dispatching failure', RackTablesError::INTERNAL);
121496b6
DO
1902 $entity_type = $etype_by_pageno[$pageno];
1903 $bypass_name = $page[$pageno]['bypass'];
0cc24e9a 1904 assertUIntArg ($bypass_name);
121496b6 1905
d3b5008b 1906 $fi = spotEntity ('file', $_REQUEST['file_id']);
6cfedb71
DO
1907 if (FALSE === commitLinkFile ($_REQUEST['file_id'], $entity_type, $_REQUEST[$bypass_name]))
1908 return buildRedirectURL (__FUNCTION__, 'ERR2');
e1ae3fb4 1909
6cfedb71 1910 return buildRedirectURL (__FUNCTION__, 'OK', array (htmlspecialchars ($fi['name'])));
e1ae3fb4
AD
1911}
1912
b6a7d936
DO
1913$msgcode['replaceFile']['OK'] = 70;
1914$msgcode['replaceFile']['ERR1'] = 181;
1915$msgcode['replaceFile']['ERR2'] = 207;
6cfedb71 1916$msgcode['replaceFile']['ERR3'] = 109;
fd1fb420
AD
1917function replaceFile ()
1918{
db55cf54 1919 global $sic;
0cc24e9a 1920 assertUIntArg ('file_id');
fd1fb420
AD
1921
1922 // Make sure the file can be uploaded
1923 if (get_cfg_var('file_uploads') != 1)
db55cf54 1924 return buildRedirectURL (__FUNCTION__, 'ERR1');
d3b5008b 1925 $shortInfo = spotEntity ('file', $sic['file_id']);
fd1fb420
AD
1926
1927 $fp = fopen($_FILES['file']['tmp_name'], 'rb');
db55cf54
DO
1928 if ($fp === FALSE)
1929 return buildRedirectURL (__FUNCTION__, 'ERR2');
6cfedb71
DO
1930 if (FALSE === commitReplaceFile ($sic['file_id'], $fp))
1931 return buildRedirectURL (__FUNCTION__, 'ERR3');
fd1fb420 1932
db55cf54 1933 return buildRedirectURL (__FUNCTION__, 'OK', array (htmlspecialchars ($shortInfo['name'])));
fd1fb420
AD
1934}
1935
b6a7d936 1936$msgcode['updateFile']['OK'] = 70;
6cfedb71 1937$msgcode['updateFile']['ERR'] = 109;
e1ae3fb4
AD
1938function updateFile ()
1939{
0cc24e9a
DY
1940 assertUIntArg ('file_id');
1941 assertStringArg ('file_name');
1942 assertStringArg ('file_type');
1943 assertStringArg ('file_comment', TRUE);
f3d274bf 1944 global $sic;
6cfedb71
DO
1945 if (FALSE === commitUpdateFile ($sic['file_id'], $sic['file_name'], $sic['file_type'], $sic['file_comment']))
1946 return buildRedirectURL (__FUNCTION__, 'ERR');
7221c918 1947 return buildRedirectURL (__FUNCTION__, 'OK', array ($_REQUEST['file_name']));
e1ae3fb4
AD
1948}
1949
b6a7d936
DO
1950$msgcode['unlinkFile']['OK'] = 72;
1951$msgcode['unlinkFile']['ERR'] = 182;
e1ae3fb4
AD
1952function unlinkFile ()
1953{
0cc24e9a 1954 assertUIntArg ('link_id');
e1ae3fb4
AD
1955 $error = commitUnlinkFile ($_REQUEST['link_id']);
1956
1957 if ($error != '')
135080d8 1958 return buildRedirectURL (__FUNCTION__, 'ERR', array ($error));
e1ae3fb4 1959
8bc5d1e4 1960 return buildRedirectURL (__FUNCTION__, 'OK');
e1ae3fb4
AD
1961}
1962
b6a7d936
DO
1963$msgcode['deleteFile']['OK'] = 73;
1964$msgcode['deleteFile']['ERR'] = 100;
e1ae3fb4
AD
1965function deleteFile ()
1966{
0cc24e9a 1967 assertUIntArg ('file_id');
d3b5008b 1968 $shortInfo = spotEntity ('file', $_REQUEST['file_id']);
e1ae3fb4
AD
1969 $error = commitDeleteFile ($_REQUEST['file_id']);
1970
1971 if ($error != '')
135080d8 1972 return buildRedirectURL (__FUNCTION__, 'ERR', array ($error));
e1ae3fb4 1973
f8874cdb 1974 return buildRedirectURL (__FUNCTION__, 'OK', array (htmlspecialchars ($shortInfo['name'])));
e1ae3fb4
AD
1975}
1976
b6a7d936
DO
1977$msgcode['updateFileText']['OK'] = 78;
1978$msgcode['updateFileText']['ERR1'] = 179;
1979$msgcode['updateFileText']['ERR2'] = 180;
8628ae44
DO
1980function updateFileText ()
1981{
0cc24e9a
DY
1982 assertUIntArg ('file_id');
1983 assertStringArg ('mtime_copy');
1984 assertStringArg ('file_text', TRUE); // it's Ok to save empty
d3b5008b 1985 $shortInfo = spotEntity ('file', $_REQUEST['file_id']);
70cb9b56
DO
1986 if ($shortInfo['mtime'] != $_REQUEST['mtime_copy'])
1987 return buildRedirectURL (__FUNCTION__, 'ERR1');
f8874cdb 1988 global $sic;
6cfedb71
DO
1989 if (FALSE === commitReplaceFile ($sic['file_id'], $sic['file_text']))
1990 return buildRedirectURL (__FUNCTION__, 'ERR2');
1991 return buildRedirectURL (__FUNCTION__, 'OK', array (htmlspecialchars ($shortInfo['name'])));
8628ae44
DO
1992}
1993
2dfa1b73
DO
1994$msgcode['addPortInterfaceCompat']['OK'] = 48;
1995$msgcode['addPortInterfaceCompat']['ERR'] = 110;
1996function addPortInterfaceCompat ()
1997{
0cc24e9a
DY
1998 assertUIntArg ('iif_id');
1999 assertUIntArg ('oif_id');
2dfa1b73
DO
2000 if (commitSupplementPIC ($_REQUEST['iif_id'], $_REQUEST['oif_id']))
2001 return buildRedirectURL (__FUNCTION__, 'OK');
2002 return buildRedirectURL (__FUNCTION__, 'ERR');
2003}
2004
2005$msgcode['delPortInterfaceCompat']['OK'] = 49;
2006$msgcode['delPortInterfaceCompat']['ERR'] = 111;
2007function delPortInterfaceCompat ()
2008{
0cc24e9a
DY
2009 assertUIntArg ('iif_id');
2010 assertUIntArg ('oif_id');
2dfa1b73
DO
2011 if (commitReducePIC ($_REQUEST['iif_id'], $_REQUEST['oif_id']))
2012 return buildRedirectURL (__FUNCTION__, 'OK');
2013 return buildRedirectURL (__FUNCTION__, 'ERR');
2014}
2015
2400d7ec
DO
2016$ifcompatpack = array
2017(
2018 '1000cwdm80' => array (1209, 1210, 1211, 1212, 1213, 1214, 1215, 1216),
2019 '1000dwdm80' => array // ITU channels 20~61
2020 (
2021 1217, 1218, 1219, 1220, 1221, 1222, 1223, 1224, 1225, 1226,
2022 1227, 1228, 1229, 1230, 1231, 1232, 1233, 1234, 1235, 1236,
2023 1237, 1238, 1239, 1240, 1241, 1242, 1243, 1244, 1245, 1246,
2024 1247, 1248, 1249, 1250, 1251, 1252, 1253, 1254, 1255, 1256,
2025 1257, 1258
2026 ),
2027 '10000dwdm80' => array // same channels for 10GE
2028 (
2029 1259, 1260, 1261, 1262, 1263, 1264, 1265, 1266, 1267, 1268,
2030 1269, 1270, 1271, 1272, 1273, 1274, 1275, 1276, 1277, 1278,
2031 1279, 1280, 1281, 1282, 1283, 1284, 1285, 1286, 1287, 1288,
2032 1289, 1290, 1291, 1292, 1293, 1294, 1295, 1296, 1297, 1298,
2033 1299, 1300
2034 ),
2035);
2036
3d9ac3d4
DO
2037$msgcode['addPortInterfaceCompatPack']['OK'] = 44;
2038$msgcode['addPortInterfaceCompatPack']['ERR'] = 123;
2400d7ec
DO
2039function addPortInterfaceCompatPack ()
2040{
0cc24e9a
DY
2041 assertStringArg ('standard');
2042 assertUIntArg ('iif_id');
3d9ac3d4
DO
2043 global $ifcompatpack;
2044 if (!array_key_exists ($_REQUEST['standard'], $ifcompatpack) or !array_key_exists ($_REQUEST['iif_id'], getPortIIFOptions()))
2045 return buildRedirectURL (__FUNCTION__, 'ERR');
2046 $ngood = $nbad = 0;
2047 foreach ($ifcompatpack[$_REQUEST['standard']] as $oif_id)
2048 if (commitSupplementPIC ($_REQUEST['iif_id'], $oif_id))
2049 $ngood++;
2050 else
2051 $nbad++;
2052 return buildRedirectURL (__FUNCTION__, 'OK', array ($nbad, $ngood));
2400d7ec
DO
2053}
2054
3d9ac3d4
DO
2055$msgcode['delPortInterfaceCompatPack']['OK'] = 44;
2056$msgcode['delPortInterfaceCompatPack']['ERR'] = 123;
2400d7ec
DO
2057function delPortInterfaceCompatPack ()
2058{
0cc24e9a
DY
2059 assertStringArg ('standard');
2060 assertUIntArg ('iif_id');
3d9ac3d4
DO
2061 global $ifcompatpack;
2062 if (!array_key_exists ($_REQUEST['standard'], $ifcompatpack) or !array_key_exists ($_REQUEST['iif_id'], getPortIIFOptions()))
2063 return buildRedirectURL (__FUNCTION__, 'ERR');
2064 $ngood = $nbad = 0;
2065 foreach ($ifcompatpack[$_REQUEST['standard']] as $oif_id)
2066 if (commitReducePIC ($_REQUEST['iif_id'], $oif_id))
2067 $ngood++;
2068 else
2069 $nbad++;
2070 return buildRedirectURL (__FUNCTION__, 'OK', array ($nbad, $ngood));
2400d7ec
DO
2071}
2072
a310dd80
DO
2073$msgcode['addPortOIFCompat']['OK'] = 48;
2074$msgcode['addPortOIFCompat']['ERR'] = 110;
2075function addPortOIFCompat()
2076{
80ec1f4f
DO
2077 assertUIntArg('type1');
2078 assertUIntArg('type2');
a310dd80
DO
2079 if (commitSupplementPOIFC($_REQUEST['type1'], $_REQUEST['type2']))
2080 return buildRedirectURL(__FUNCTION__, 'OK');
2081 return buildRedirectURL(__FUNCTION__, 'ERR');
2082}
2083
2084$msgcode['delPortOIFCompat']['OK'] = 49;
2085$msgcode['delPortOIFCompat']['ERR'] = 111;
2086function delPortOIFCompat ()
2087{
80ec1f4f
DO
2088 assertUIntArg('type1');
2089 assertUIntArg('type2');
654e4636 2090 if (commitReducePOIFC ($_REQUEST['type1'], $_REQUEST['type2']) !== FALSE)
a310dd80
DO
2091 return buildRedirectURL (__FUNCTION__, 'OK');
2092 return buildRedirectURL (__FUNCTION__, 'ERR');
2093
2094}
2095
38cd7704
DO
2096$msgcode['add8021QOrder']['OK'] = 48;
2097$msgcode['add8021QOrder']['ERR'] = 118;
2098function add8021QOrder ()
8198f2c6 2099{
80ec1f4f
DO
2100 assertUIntArg ('vdom_id');
2101 assertUIntArg ('object_id');
38cd7704 2102 assertUIntArg ('vst_id');
c1aa3ada
DO
2103 global $sic;
2104 $result = usePreparedExecuteBlade
8198f2c6 2105 (
c1aa3ada
DO
2106 'INSERT INTO VLANSwitch (domain_id, object_id, template_id, last_change, out_of_sync) ' .
2107 'VALUES (?, ?, ?, NOW(), "yes")',
2108 array ($sic['vdom_id'], $sic['object_id'], $sic['vst_id'])
8198f2c6 2109 );
c1aa3ada 2110 return buildRedirectURL (__FUNCTION__, $result !== FALSE ? 'OK' : 'ERR');
8198f2c6
DO
2111}
2112
38cd7704
DO
2113$msgcode['del8021QOrder']['OK'] = 49;
2114$msgcode['del8021QOrder']['ERR'] = 119;
2115function del8021QOrder ()
8198f2c6 2116{
80ec1f4f 2117 assertUIntArg ('object_id');
8198f2c6 2118 global $sic;
38cd7704 2119 $result = usePreparedDeleteBlade ('VLANSwitch', array ('object_id' => $sic['object_id']));
8198f2c6
DO
2120 return buildRedirectURL (__FUNCTION__, $result ? 'OK' : 'ERR');
2121}
2122
2123$msgcode['addVLANDescription']['OK'] = 48;
2124$msgcode['addVLANDescription']['ERR1'] = 190;
2125$msgcode['addVLANDescription']['ERR2'] = 110;
2126function addVLANDescription ()
2127{
80ec1f4f 2128 assertUIntArg ('vlan_id');
5b989e4d 2129 assertStringArg ('vlan_type', TRUE);
80ec1f4f 2130 assertStringArg ('vlan_descr', TRUE);
8198f2c6 2131 global $sic;
a1b3b16b 2132 if (!($sic['vlan_id'] >= VLAN_MIN_ID + 1 and $sic['vlan_id'] <= VLAN_MAX_ID))
8198f2c6
DO
2133 return buildRedirectURL (__FUNCTION__, 'ERR1', array ($sic['vlan_id']));
2134 $result = usePreparedInsertBlade
2135 (
2136 'VLANDescription',
2137 array
2138 (
2139 'domain_id' => $sic['vdom_id'],
2140 'vlan_id' => $sic['vlan_id'],
5b989e4d 2141 'vlan_type' => $sic['vlan_type'],
5286b29f 2142 'vlan_descr' => mb_strlen ($sic['vlan_descr']) ? $sic['vlan_descr'] : NULL
8198f2c6
DO
2143 )
2144 );
2145 return buildRedirectURL (__FUNCTION__, $result ? 'OK' : 'ERR2');
2146}
2147
2148$msgcode['delVLANDescription']['OK'] = 49;
c48f2e18
DO
2149$msgcode['delVLANDescription']['ERR1'] = 105;
2150$msgcode['delVLANDescription']['ERR2'] = 111;
8198f2c6
DO
2151function delVLANDescription ()
2152{
80ec1f4f 2153 assertUIntArg ('vlan_id');
8198f2c6 2154 global $sic;
c48f2e18 2155 if ($sic['vlan_id'] == VLAN_DFL_ID)
048b0420 2156 return buildRedirectURL (__FUNCTION__, 'ERR1');
8198f2c6 2157 $result = commitReduceVLANDescription ($sic['vdom_id'], $sic['vlan_id']);
c48f2e18 2158 return buildRedirectURL (__FUNCTION__, $result ? 'OK' : 'ERR2');
8198f2c6
DO
2159}
2160
2161$msgcode['updVLANDescription']['OK'] = 51;
c48f2e18
DO
2162$msgcode['updVLANDescription']['ERR1'] = 105;
2163$msgcode['updVLANDescription']['ERR2'] = 109;
8198f2c6
DO
2164function updVLANDescription ()
2165{
80ec1f4f
DO
2166 assertUIntArg ('vlan_id');
2167 assertStringArg ('vlan_type');
2168 assertStringArg ('vlan_descr', TRUE);
8198f2c6 2169 global $sic;
c48f2e18 2170 if ($sic['vlan_id'] == VLAN_DFL_ID)
048b0420 2171 return buildRedirectURL (__FUNCTION__, 'ERR1');
8198f2c6
DO
2172 $result = commitUpdateVLANDescription
2173 (
2174 $sic['vdom_id'],
2175 $sic['vlan_id'],
0dabdc53 2176 $sic['vlan_type'],
8198f2c6
DO
2177 $sic['vlan_descr']
2178 );
6cfedb71 2179 return buildRedirectURL (__FUNCTION__, $result !== FALSE ? 'OK' : 'ERR2');
8198f2c6
DO
2180}
2181
2182$msgcode['createVLANDomain']['OK'] = 48;
2183$msgcode['createVLANDomain']['ERR'] = 110;
2184function createVLANDomain ()
2185{
80ec1f4f 2186 assertStringArg ('vdom_descr');
8198f2c6
DO
2187 global $sic;
2188 $result = usePreparedInsertBlade
2189 (
2190 'VLANDomain',
2191 array
2192 (
2193 'description' => $sic['vdom_descr'],
2194 )
2195 );
10c7f49e
DO
2196 $result = $result and usePreparedInsertBlade
2197 (
2198 'VLANDescription',
2199 array
2200 (
2201 'domain_id' => lastInsertID(),
2202 'vlan_id' => VLAN_DFL_ID,
2203 'vlan_type' => 'compulsory',
c48f2e18 2204 'vlan_descr' => 'default',
10c7f49e
DO
2205 )
2206 );
8198f2c6
DO
2207 return buildRedirectURL (__FUNCTION__, $result ? 'OK' : 'ERR');
2208}
2209
2210$msgcode['destroyVLANDomain']['OK'] = 49;
2211$msgcode['destroyVLANDomain']['ERR'] = 111;
2212function destroyVLANDomain ()
2213{
80ec1f4f 2214 assertUIntArg ('vdom_id');
8198f2c6 2215 global $sic;
bbae3611 2216 $result = FALSE !== usePreparedDeleteBlade ('VLANDomain', array ('id' => $sic['vdom_id']));
8198f2c6
DO
2217 return buildRedirectURL (__FUNCTION__, $result ? 'OK' : 'ERR');
2218}
2219
2220$msgcode['updateVLANDomain']['OK'] = 51;
2221$msgcode['updateVLANDomain']['ERR'] = 109;
2222function updateVLANDomain ()
2223{
80ec1f4f
DO
2224 assertUIntArg ('vdom_id');
2225 assertStringArg ('vdom_descr');
8198f2c6 2226 global $sic;
d3192636 2227 $result = FALSE !== commitUpdateVLANDomain ($sic['vdom_id'], $sic['vdom_descr']);
8198f2c6
DO
2228 return buildRedirectURL (__FUNCTION__, $result ? 'OK' : 'ERR');
2229}
2230
4492050b
DO
2231$msgcode['save8021QPorts']['OK1'] = 63;
2232$msgcode['save8021QPorts']['OK2'] = 41;
706d9175
DO
2233$msgcode['save8021QPorts']['ERR1'] = 160;
2234$msgcode['save8021QPorts']['ERR2'] = 109;
2235function save8021QPorts ()
8198f2c6 2236{
a7492e95 2237 global $sic, $dbxlink;
70cff23f 2238 assertUIntArg ('mutex_rev', TRUE); // counts from 0
de8aa722
DO
2239 assertStringArg ('form_mode');
2240 if ($sic['form_mode'] != 'save' and $sic['form_mode'] != 'duplicate')
2241 throw new InvalidRequestArgException ('form_mode', $sic['form_mode']);
2242 $extra = array();
a7492e95 2243 $dbxlink->beginTransaction();
2996cbbb
DO
2244 try
2245 {
a7492e95
DO
2246 if (NULL === $vswitch = getVLANSwitchInfo ($sic['object_id'], 'FOR UPDATE'))
2247 throw new InvalidArgException ('object_id', $object_id, 'VLAN domain is not set for this object');
9c45ea37 2248 if ($vswitch['mutex_rev'] != $sic['mutex_rev'])
1a43ce88 2249 throw new InvalidRequestArgException ('mutex_rev', $sic['mutex_rev'], 'expired form data');
de8aa722 2250 $after = $before = apply8021QOrder ($vswitch['template_id'], getStored8021QConfig ($sic['object_id'], 'desired'));
af204724 2251 $changes = array();
de8aa722 2252 switch ($sic['form_mode'])
706d9175 2253 {
de8aa722
DO
2254 case 'save':
2255 assertUIntArg ('nports');
2256 if ($sic['nports'] == 1)
706d9175 2257 {
de8aa722
DO
2258 assertStringArg ('pn_0');
2259 $extra = array ('port_name' => $sic['pn_0']);
2260 }
2261 for ($i = 0; $i < $sic['nports']; $i++)
2262 {
2263 assertStringArg ('pn_' . $i);
2264 assertStringArg ('pm_' . $i);
2265 // An access port only generates form input for its native VLAN,
2266 // which we derive allowed VLAN list from.
2267 $native = isset ($sic['pnv_' . $i]) ? $sic['pnv_' . $i] : 0;
2268 switch ($sic["pm_${i}"])
2269 {
2270 case 'trunk':
b36fc896 2271# assertArrayArg ('pav_' . $i);
de8aa722
DO
2272 $allowed = isset ($sic['pav_' . $i]) ? $sic['pav_' . $i] : array();
2273 break;
2274 case 'access':
2275 if ($native == 'same')
2276 continue 2;
2277 assertUIntArg ('pnv_' . $i);
2278 $allowed = array ($native);
2279 break;
2280 default:
2281 throw new InvalidRequestArgException ("pm_${i}", $_REQUEST["pm_${i}"], 'unknown port mode');
2282 }
2283 $changes[$sic['pn_' . $i]] = array
2284 (
2285 'mode' => $sic['pm_' . $i],
2286 'allowed' => $allowed,
2287 'native' => $native,
2288 );
706d9175 2289 }
de8aa722
DO
2290 break;
2291 case 'duplicate':
2292 assertStringArg ('from_port');
2293# assertArrayArg ('to_ports');
2294 if (!array_key_exists ($sic['from_port'], $before))
2295 throw new InvalidArgException ('from_port', $sic['from_port'], 'this port does not exist');
2296 foreach ($sic['to_ports'] as $tpn)
2297 if (!array_key_exists ($tpn, $before))
2298 throw new InvalidArgException ('to_ports[]', $tpn, 'this port does not exist');
2299 elseif ($tpn != $sic['from_port'])
2300 $changes[$tpn] = $before[$sic['from_port']];
2301 break;
706d9175 2302 }
af204724
DO
2303 $domain_vlanlist = getDomainVLANs ($vswitch['domain_id']);
2304 $changes = filter8021QChangeRequests
a7492e95 2305 (
af204724 2306 $domain_vlanlist,
9165e8f7 2307 $before,
af204724 2308 apply8021QOrder ($vswitch['template_id'], $changes)
a7492e95 2309 );
bb2024b9 2310 $changes = authorize8021QChangeRequests ($before, $changes);
af204724
DO
2311 foreach ($changes as $port_name => $port)
2312 $after[$port_name] = $port;
b3a27170 2313 $new_uplinks = filter8021QChangeRequests ($domain_vlanlist, $after, produceUplinkPorts ($domain_vlanlist, $after));
7455e4c0 2314 $npulled = replace8021QPorts ('desired', $vswitch['object_id'], $before, $changes);
b3a27170 2315 $nsaved_uplinks = replace8021QPorts ('desired', $vswitch['object_id'], $before, $new_uplinks);
2996cbbb
DO
2316 }
2317 catch (Exception $e)
861292ee 2318 {
a7492e95 2319 $dbxlink->rollBack();
706d9175 2320 return buildRedirectURL (__FUNCTION__, 'ERR2', array(), NULL, NULL, $extra);
861292ee 2321 }
b3a27170 2322 if ($npulled + $nsaved_uplinks)
c1aa3ada
DO
2323 $result = usePreparedExecuteBlade
2324 (
2325 'UPDATE VLANSwitch SET mutex_rev=mutex_rev+1, last_change=NOW(), out_of_sync="yes" WHERE object_id=?',
2326 array ($sic['object_id'])
2327 );
a7492e95 2328 $dbxlink->commit();
4492050b 2329 $log = oneLiner (63, array ($npulled + $nsaved_uplinks));
b3a27170 2330 if ($nsaved_uplinks)
4492050b 2331 {
b3a27170 2332 initiateUplinksReverb ($vswitch['object_id'], $new_uplinks);
4492050b
DO
2333 $log = mergeLogs ($log, oneLiner (41));
2334 }
2335 if ($npulled + $nsaved_uplinks > 0 and getConfigVar ('8021Q_INSTANT_DEPLOY') == 'yes')
2336 {
2337 try
2338 {
2339 if (FALSE === $done = exec8021QDeploy ($sic['object_id'], TRUE))
2340 $log = mergeLogs ($log, oneLiner (191));
2341 else
2342 $log = mergeLogs ($log, oneLiner (63, array ($done)));
2343 }
2344 catch (Exception $e)
2345 {
2346 $log = mergeLogs ($log, oneLiner (109));
2347 }
2348 }
2349 return buildWideRedirectURL ($log, NULL, NULL, $extra);
8198f2c6
DO
2350}
2351
8846b060
DO
2352$msgcode['bindVLANtoIPv4']['OK'] = 48;
2353$msgcode['bindVLANtoIPv4']['ERR'] = 110;
2354function bindVLANtoIPv4 ()
2355{
2356 assertUIntArg ('id'); // network id
2357 global $sic;
2358 $result = commitSupplementVLANIPv4 ($sic['vlan_ck'], $sic['id']);
2359 return buildRedirectURL (__FUNCTION__, $result ? 'OK' : 'ERR');
2360}
2361
2362$msgcode['unbindVLANfromIPv4']['OK'] = 49;
2363$msgcode['unbindVLANfromIPv4']['ERR'] = 111;
2364function unbindVLANfromIPv4 ()
2365{
2366 assertUIntArg ('id'); // network id
2367 global $sic;
2368 $result = commitReduceVLANIPv4 ($sic['vlan_ck'], $sic['id']);
2369 return buildRedirectURL (__FUNCTION__, $result ? 'OK' : 'ERR');
2370}
2371
228c430c 2372$msgcode['process8021QSyncRequest']['OK'] = 63;
ec523868 2373$msgcode['process8021QSyncRequest']['ERR'] = 191;
228c430c 2374function process8021QSyncRequest ()
be28b696 2375{
2e84a05b
DO
2376 // behave depending on current operation: exec8021QPull or exec8021QPush
2377 global $sic, $op;
ec523868
DO
2378 if (FALSE === $done = exec8021QDeploy ($sic['object_id'], $op == 'exec8021QPush'))
2379 return buildRedirectURL (__FUNCTION__, 'ERR');
2380 return buildRedirectURL (__FUNCTION__, 'OK', array ($done));
be28b696
DO
2381}
2382
2383$msgcode['resolve8021QConflicts']['OK'] = 63;
bcd14540
DO
2384$msgcode['resolve8021QConflicts']['ERR1'] = 179;
2385$msgcode['resolve8021QConflicts']['ERR2'] = 109;
be28b696 2386function resolve8021QConflicts ()
07de6bb3 2387{
a7492e95 2388 global $sic, $dbxlink;
70cff23f 2389 assertUIntArg ('mutex_rev', TRUE); // counts from 0
de47b574
DO
2390 assertUIntArg ('nrows');
2391 // Divide submitted radio buttons into 3 groups:
19d1e731 2392 // left (saved version wins)
07de6bb3 2393 // asis (ignore)
19d1e731
DO
2394 // right (running version wins)
2395 $F = array();
339534a0 2396 for ($i = 0; $i < $sic['nrows']; $i++)
07de6bb3 2397 {
de47b574 2398 if (!array_key_exists ("i_${i}", $sic))
07de6bb3 2399 continue;
de47b574
DO
2400 // let's hope other inputs are in place
2401 switch ($sic["i_${i}"])
07de6bb3
DO
2402 {
2403 case 'left':
07de6bb3 2404 case 'right':
bcd14540 2405 $F[$sic["pn_${i}"]] = array
07de6bb3 2406 (
ca9e1c9d 2407 'mode' => $sic["rm_${i}"],
de47b574
DO
2408 'allowed' => $sic["ra_${i}"],
2409 'native' => $sic["rn_${i}"],
bcd14540 2410 'decision' => $sic["i_${i}"],
07de6bb3
DO
2411 );
2412 break;
2413 default:
2414 // don't care
2415 }
2416 }
a7492e95 2417 $dbxlink->beginTransaction();
07de6bb3
DO
2418 try
2419 {
a7492e95 2420 if (NULL === $vswitch = getVLANSwitchInfo ($sic['object_id'], 'FOR UPDATE'))
ec4d604c 2421 throw new InvalidArgException ('object_id', $sic['object_id'], 'VLAN domain is not set for this object');
9c45ea37 2422 if ($vswitch['mutex_rev'] != $sic['mutex_rev'])
1a43ce88 2423 throw new InvalidRequestArgException ('mutex_rev', $sic['mutex_rev'], 'expired form (table data has changed)');
9c2201ba
DO
2424 $D = getStored8021QConfig ($vswitch['object_id'], 'desired');
2425 $C = getStored8021QConfig ($vswitch['object_id'], 'cached');
2426 $R = getRunning8021QConfig ($vswitch['object_id']);
d5e306b2 2427 $plan = get8021QSyncOptions ($vswitch, $D, $C, $R['portdata']);
bcd14540
DO
2428 $ndone = 0;
2429 foreach ($F as $port_name => $port)
2430 {
9c2201ba
DO
2431 if (!array_key_exists ($port_name, $plan))
2432 continue;
2433 elseif ($plan[$port_name]['status'] == 'merge_conflict')
bcd14540 2434 {
9c2201ba
DO
2435 // for R neither mutex nor revisions can be emulated, but revision change can be
2436 if (!same8021QConfigs ($port, $R['portdata'][$port_name]))
1a43ce88 2437 throw new InvalidRequestArgException ("port ${port_name}", '(hidden)', 'expired form (switch data has changed)');
1f8f67c2 2438 if ($port['decision'] == 'right') // D wins, frame R by writing value of R to C
9c2201ba 2439 $ndone += upd8021QPort ('cached', $vswitch['object_id'], $port_name, $port);
1f8f67c2 2440 elseif ($port['decision'] == 'left') // R wins, cross D up
9c2201ba
DO
2441 $ndone += upd8021QPort ('cached', $vswitch['object_id'], $port_name, $D[$port_name]);
2442 // otherwise there was no decision made
2443 }
1f8f67c2
DO
2444 elseif
2445 (
2446 $plan[$port_name]['status'] == 'delete_conflict' or
2447 $plan[$port_name]['status'] == 'martian_conflict'
2448 )
9c2201ba 2449 {
1f8f67c2 2450 if ($port['decision'] == 'left') // confirm deletion of local copy
9c2201ba 2451 $ndone += del8021QPort ($vswitch['object_id'], $port_name);
bcd14540 2452 }
9c2201ba 2453 // otherwise ignore a decision, which doesn't address a conflict
bcd14540 2454 }
07de6bb3 2455 }
1a43ce88 2456 catch (InvalidRequestArgException $e)
07de6bb3 2457 {
a7492e95 2458 $dbxlink->rollBack();
bcd14540 2459 return buildRedirectURL (__FUNCTION__, 'ERR1');
ec4d604c 2460 }
bcd14540 2461 catch (Exception $e)
ec4d604c 2462 {
bcd14540
DO
2463 $dbxlink->rollBack();
2464 return buildRedirectURL (__FUNCTION__, 'ERR2');
ec4d604c 2465 }
a7492e95 2466 $dbxlink->commit();
bcd14540 2467 return buildRedirectURL (__FUNCTION__, 'OK', array ($ndone));
07de6bb3
DO
2468}
2469
e0d188ef
DO
2470$msgcode['addVLANSwitchTemplate']['OK'] = 48;
2471$msgcode['addVLANSwitchTemplate']['ERR'] = 110;
2472function addVLANSwitchTemplate()
2473{
2474 assertStringArg ('vst_descr');
2475 global $sic;
2476 $max_local_vlans = NULL;
2477 if (array_key_exists ('vst_maxvlans', $sic) && mb_strlen ($sic['vst_maxvlans']))
2478 {
2479 assertUIntArg ('vst_maxvlans');
2480 $max_local_vlans = $sic['vst_maxvlans'];
2481 }
2482 $result = usePreparedInsertBlade
2483 (
2484 'VLANSwitchTemplate',
2485 array
2486 (
2487 'max_local_vlans' => $max_local_vlans,
2488 'description' => $sic['vst_descr'],
2489 )
2490 );
2491 return buildRedirectURL (__FUNCTION__, $result ? 'OK' : 'ERR');
2492}
2493
2494$msgcode['delVLANSwitchTemplate']['OK'] = 49;
2495$msgcode['delVLANSwitchTemplate']['ERR'] = 111;
2496function delVLANSwitchTemplate()
2497{
2498 assertUIntArg ('vst_id');
2499 global $sic;
2500 $result = FALSE !== usePreparedDeleteBlade ('VLANSwitchTemplate', array ('id' => $sic['vst_id']));
2501 return buildRedirectURL (__FUNCTION__, $result ? 'OK' : 'ERR');
2502}
2503
2504$msgcode['updVLANSwitchTemplate']['OK'] = 51;
2505$msgcode['updVLANSwitchTemplate']['ERR'] = 109;
2506function updVLANSwitchTemplate()
2507{
2508 assertUIntArg ('vst_id');
2509 assertStringArg ('vst_descr');
2510 global $sic;
2511 $max_local_vlans = NULL;
2512 if (array_key_exists ('vst_maxvlans', $sic) && mb_strlen ($sic['vst_maxvlans']))
2513 {
2514 assertUIntArg ('vst_maxvlans');
2515 $max_local_vlans = $sic['vst_maxvlans'];
2516 }
2517 $result = commitUpdateVST ($sic['vst_id'], $max_local_vlans, $sic['vst_descr']);
6cfedb71 2518 return buildRedirectURL (__FUNCTION__, $result !== FALSE ? 'OK' : 'ERR');
e0d188ef
DO
2519}
2520
2521$msgcode['addVSTRule']['OK'] = 48;
2522$msgcode['addVSTRule']['ERR'] = 110;
2523function addVSTRule()
2524{
2525 assertUIntArg ('vst_id');
2526 assertUIntArg ('rule_no');
2527 assertPCREArg ('port_pcre');
2528 assertStringArg ('port_role');
2529 assertStringArg ('wrt_vlans', TRUE);
638f198f 2530 assertStringArg ('description', TRUE);
e0d188ef
DO
2531 global $sic;
2532 $result = usePreparedInsertBlade
2533 (
2534 'VLANSTRule',
2535 array
2536 (
2537 'vst_id' => $sic['vst_id'],
2538 'rule_no' => $sic['rule_no'],
2539 'port_pcre' => $sic['port_pcre'],
2540 'port_role' => $sic['port_role'],
2541 'wrt_vlans' => $sic['wrt_vlans'],
638f198f 2542 'description' => $sic['description'],
e0d188ef
DO
2543 )
2544 );
2545 return buildRedirectURL (__FUNCTION__, $result ? 'OK' : 'ERR');
2546}
2547
2548$msgcode['delVSTRule']['OK'] = 49;
2549$msgcode['delVSTRule']['ERR'] = 111;
2550function delVSTRule()
2551{
2552 assertUIntArg ('vst_id');
2553 assertUIntArg ('rule_no');
2554 global $sic;
2555 $result = FALSE !== usePreparedDeleteBlade
2556 (
2557 'VLANSTRule',
2558 array
2559 (
2560 'vst_id' => $sic['vst_id'],
2561 'rule_no' => $sic['rule_no']
2562 )
2563 );
2564 return buildRedirectURL (__FUNCTION__, $result ? 'OK' : 'ERR');
2565}
2566
2567$msgcode['updVSTRule']['OK'] = 51;
2568$msgcode['updVSTRule']['ERR'] = 109;
2569function updVSTRule()
2570{
2571 assertUIntArg ('vst_id');
2572 assertUIntArg ('rule_no');
2573 assertUIntArg ('new_rule_no');
2574 assertPCREArg ('port_pcre');
2575 assertStringArg ('port_role');
2576 assertStringArg ('wrt_vlans', TRUE);
d0751ba2 2577 assertStringArg ('description', TRUE);
e0d188ef
DO
2578 global $sic;
2579 $result = commitUpdateVSTRule
2580 (
2581 $sic['vst_id'],
2582 $sic['rule_no'],
2583 $sic['new_rule_no'],
2584 $sic['port_pcre'],
2585 $sic['port_role'],
d0751ba2
DO
2586 $sic['wrt_vlans'],
2587 $sic['description']
e0d188ef 2588 );
6cfedb71 2589 return buildRedirectURL (__FUNCTION__, $result !== FALSE ? 'OK' : 'ERR');
e0d188ef
DO
2590}
2591
5b5b1cab
DO
2592$msgcode['importDPData']['OK'] = 44;
2593function importDPData()
b3247480
DO
2594{
2595 global $sic;
2596 assertUIntArg ('nports');
2597 $nignored = $ndone = 0;
1dc057f8 2598 $POIFC = getPortOIFCompat();
b3247480
DO
2599 for ($i = 0; $i < $sic['nports']; $i++)
2600 if (array_key_exists ("do_${i}", $sic))
2601 {
2602 assertUIntArg ("pid1_${i}");
2603 assertUIntArg ("pid2_${i}");
2604 $porta = getPortInfo ($_REQUEST["pid1_${i}"]);
2605 $portb = getPortInfo ($_REQUEST["pid2_${i}"]);
2606 if
2607 (
2608 $porta['linked'] or
2609 $portb['linked'] or
2610 ($porta['object_id'] != $sic['object_id'] and $portb['object_id'] != $sic['object_id'])
2611 )
2612 {
2613 $nignored++;
2614 continue;
2615 }
1dc057f8
DO
2616 foreach ($POIFC as $item)
2617 if ($item['type1'] == $porta['oif_id'] and $item['type2'] == $portb['oif_id'])
2618 {
2619 linkPorts ($_REQUEST["pid1_${i}"], $_REQUEST["pid2_${i}"]);
2620 $ndone++;
524170a8 2621 continue 2; // next port
1dc057f8
DO
2622 }
2623 $nignored++;
b3247480
DO
2624 }
2625 return buildRedirectURL (__FUNCTION__, 'OK', array ($nignored, $ndone));
2626}
2627
e673ee24 2628?>