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