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