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