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