r3138 - renderPortOIFCompatViewer(): don't produce a warning (ticket:291)
[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{
b6a7d936
DO
12 global $root, $page, $pageno, $tabno;
13 if ($nextpage === NULL)
14 $nextpage = $pageno;
15 if ($nexttab === NULL)
16 $nexttab = $tabno;
17 $url = "${root}?page=${nextpage}&tab=${nexttab}";
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
b6a7d936 41function buildRedirectURL ($callfunc, $status, $args = array(), $nextpage = NULL, $nexttab = NULL)
17c32f4c 42{
b6a7d936
DO
43 global $pageno, $tabno, $msgcode;
44 if ($nextpage === NULL)
45 $nextpage = $pageno;
46 if ($nexttab === NULL)
47 $nexttab = $tabno;
48 return buildWideRedirectURL (oneLiner ($msgcode[$callfunc][$status], $args), $nextpage, $nexttab);
17c32f4c
DO
49}
50
b6a7d936
DO
51$msgcode['addPortForwarding']['OK'] = 2;
52$msgcode['addPortForwarding']['ERR'] = 100;
e673ee24
DO
53function addPortForwarding ()
54{
2c6c7645
DO
55 assertUIntArg ('object_id', __FUNCTION__);
56 assertIPv4Arg ('localip', __FUNCTION__);
57 assertIPv4Arg ('remoteip', __FUNCTION__);
58 assertUIntArg ('localport', __FUNCTION__);
9bea3a8b 59 assertStringArg ('proto', __FUNCTION__);
2c6c7645 60 assertStringArg ('description', __FUNCTION__, 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{
103b1e1e
DO
86 assertUIntArg ('object_id', __FUNCTION__);
87 assertIPv4Arg ('localip', __FUNCTION__);
88 assertIPv4Arg ('remoteip', __FUNCTION__);
89 assertUIntArg ('localport', __FUNCTION__);
90 assertUIntArg ('remoteport', __FUNCTION__);
91 assertStringArg ('proto', __FUNCTION__);
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{
103b1e1e
DO
112 assertUIntArg ('object_id', __FUNCTION__);
113 assertIPv4Arg ('localip', __FUNCTION__);
114 assertIPv4Arg ('remoteip', __FUNCTION__);
115 assertUIntArg ('localport', __FUNCTION__);
116 assertUIntArg ('remoteport', __FUNCTION__);
117 assertStringArg ('proto', __FUNCTION__);
118 assertStringArg ('description', __FUNCTION__);
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{
103b1e1e
DO
141 assertUIntArg ('object_id', __FUNCTION__);
142 assertStringArg ('port_name', __FUNCTION__, TRUE);
59a83bd8 143 if (!strlen ($_REQUEST['port_name']))
135080d8 144 return buildRedirectURL (__FUNCTION__, 'ERR1');
103b1e1e
DO
145 $error = commitAddPort ($_REQUEST['object_id'], $_REQUEST['port_name'], $_REQUEST['port_type_id'], $_REQUEST['port_label'], $_REQUEST['port_l2address']);
146 if ($error != '')
135080d8 147 return buildRedirectURL (__FUNCTION__, 'ERR2', array ($error));
e673ee24 148 else
135080d8 149 return buildRedirectURL (__FUNCTION__, 'OK', array ($_REQUEST['port_name']));
e673ee24
DO
150}
151
b6a7d936
DO
152$msgcode['editPortForObject']['OK'] = 6;
153$msgcode['editPortForObject']['ERR1'] = 101;
154$msgcode['editPortForObject']['ERR2'] = 100;
e673ee24
DO
155function editPortForObject ()
156{
6be06cbb 157 assertUIntArg ('object_id', __FUNCTION__);
2c6c7645 158 assertUIntArg ('port_id', __FUNCTION__);
611170af 159 assertUIntArg ('port_type_id', __FUNCTION__);
d0a69ce8 160 // tolerate empty value now to produce custom informative message later
103b1e1e 161 assertStringArg ('name', __FUNCTION__, TRUE);
59a83bd8 162 if (!strlen ($_REQUEST['name']))
135080d8 163 return buildRedirectURL (__FUNCTION__, 'ERR1');
103b1e1e 164
59a83bd8 165 if (isset ($_REQUEST['reservation_comment']) and strlen ($_REQUEST['reservation_comment']))
e673ee24
DO
166 $port_rc = '"' . $_REQUEST['reservation_comment'] . '"';
167 else
168 $port_rc = 'NULL';
6be06cbb 169 $error = commitUpdatePort ($_REQUEST['object_id'], $_REQUEST['port_id'], $_REQUEST['name'], $_REQUEST['port_type_id'], $_REQUEST['label'], $_REQUEST['l2address'], $port_rc);
103b1e1e 170 if ($error != '')
135080d8 171 return buildRedirectURL (__FUNCTION__, 'ERR2', array ($error));
e673ee24 172 else
135080d8 173 return buildRedirectURL (__FUNCTION__, 'OK', array ($_REQUEST['name']));
e673ee24
DO
174}
175
b6a7d936
DO
176$msgcode['delPortFromObject']['OK'] = 7;
177$msgcode['delPortFromObject']['ERR'] = 100;
e673ee24
DO
178function delPortFromObject ()
179{
103b1e1e 180 assertUIntArg ('port_id', __FUNCTION__);
103b1e1e 181 $error = delObjectPort ($_REQUEST['port_id']);
e673ee24
DO
182
183 if ($error != '')
135080d8 184 return buildRedirectURL (__FUNCTION__, 'ERR', array ($error));
e673ee24 185 else
135080d8 186 return buildRedirectURL (__FUNCTION__, 'OK', array ($_REQUEST['port_name']));
e673ee24
DO
187}
188
b6a7d936
DO
189$msgcode['linkPortForObject']['OK'] = 8;
190$msgcode['linkPortForObject']['ERR'] = 100;
e673ee24
DO
191function linkPortForObject ()
192{
103b1e1e
DO
193 assertUIntArg ('port_id', __FUNCTION__);
194 assertUIntArg ('remote_port_id', __FUNCTION__);
baf37d01
DO
195 assertStringArg ('port_name', __FUNCTION__, TRUE);
196 assertStringArg ('remote_port_name', __FUNCTION__, TRUE);
197 assertStringArg ('remote_object_name', __FUNCTION__, TRUE);
e673ee24 198
103b1e1e 199 $error = linkPorts ($_REQUEST['port_id'], $_REQUEST['remote_port_id']);
e673ee24 200 if ($error != '')
135080d8 201 return buildRedirectURL (__FUNCTION__, 'ERR', array ($error));
e673ee24 202 else
135080d8 203 return buildRedirectURL (__FUNCTION__, 'OK', array ($_REQUEST['port_name'], $_REQUEST['remote_port_name'], $_REQUEST['remote_object_name']));
e673ee24
DO
204}
205
b6a7d936
DO
206$msgcode['unlinkPortForObject']['OK'] = 9;
207$msgcode['unlinkPortForObject']['ERR'] = 100;
e673ee24
DO
208function unlinkPortForObject ()
209{
103b1e1e 210 assertUIntArg ('port_id', __FUNCTION__);
baf37d01
DO
211 assertStringArg ('port_name', __FUNCTION__, TRUE);
212 assertStringArg ('remote_port_name', __FUNCTION__, TRUE);
213 assertStringArg ('remote_object_name', __FUNCTION__, TRUE);
e673ee24 214
103b1e1e 215 $error = unlinkPort ($_REQUEST['port_id']);
e673ee24 216 if ($error != '')
135080d8 217 return buildRedirectURL (__FUNCTION__, 'ERR', array ($error));
e673ee24 218 else
135080d8 219 return buildRedirectURL (__FUNCTION__, 'OK', array ($_REQUEST['port_name'], $_REQUEST['remote_port_name'], $_REQUEST['remote_object_name']));
e673ee24
DO
220}
221
b6a7d936
DO
222$msgcode['addMultiPorts']['OK'] = 10;
223$msgcode['addMultiPorts']['ERR'] = 123;
e673ee24
DO
224function addMultiPorts ()
225{
2c6c7645
DO
226 assertStringArg ('format', __FUNCTION__);
227 assertStringArg ('input', __FUNCTION__);
228 assertUIntArg ('port_type', __FUNCTION__);
229 assertUIntArg ('object_id', __FUNCTION__);
e673ee24
DO
230 $format = $_REQUEST['format'];
231 $port_type = $_REQUEST['port_type'];
232 $object_id = $_REQUEST['object_id'];
233 // Input lines are escaped, so we have to explode and to chop by 2-char
234 // \n and \r respectively.
235 $lines1 = explode ('\n', $_REQUEST['input']);
236 foreach ($lines1 as $line)
237 {
238 $parts = explode ('\r', $line);
239 reset ($parts);
59a83bd8 240 if (!strlen ($parts[0]))
e673ee24
DO
241 continue;
242 else
243 $lines2[] = rtrim ($parts[0]);
244 }
245 $ports = array();
246 foreach ($lines2 as $line)
247 {
248 switch ($format)
249 {
250 case 'fisxii':
251 $words = explode (' ', ereg_replace ('[[:space:]]+', ' ', $line));
252 list ($slot, $port) = explode ('/', $words[0]);
253 $ports[] = array
254 (
255 'name' => "e ${slot}/${port}",
256 'l2address' => $words[8],
257 'label' => "slot ${slot} port ${port}"
258 );
259 break;
260 case 'c3600asy':
261 $words = explode (' ', ereg_replace ('[[:space:]]+', ' ', trim (substr ($line, 3))));
262/*
263How Async Lines are Numbered in Cisco 3600 Series Routers
264http://www.cisco.com/en/US/products/hw/routers/ps274/products_tech_note09186a00801ca70b.shtml
265
266Understanding 16- and 32-Port Async Network Modules
267http://www.cisco.com/en/US/products/hw/routers/ps274/products_tech_note09186a00800a93f0.shtml
268*/
269 $async = $words[0];
270 $slot = floor (($async - 1) / 32);
271 $octalgroup = floor (($async - 1 - $slot * 32) / 8);
272 $cable = $async - $slot * 32 - $octalgroup * 8;
273 $og_label[0] = 'async 0-7';
274 $og_label[1] = 'async 8-15';
275 $og_label[2] = 'async 16-23';
276 $og_label[3] = 'async 24-31';
277 $ports[] = array
278 (
279 'name' => "async ${async}",
280 'l2address' => '',
281 'label' => "slot ${slot} " . $og_label[$octalgroup] . " cable ${cable}"
282 );
283 break;
284 case 'fiwg':
285 $words = explode (' ', ereg_replace ('[[:space:]]+', ' ', $line));
286 $ifnumber = $words[0] * 1;
287 $ports[] = array
288 (
289 'name' => "e ${ifnumber}",
290 'l2address' => "${words[8]}",
291 'label' => "${ifnumber}"
292 );
293 break;
351d4dbf 294 case 'ssv1':
5b585342 295 $words = explode (' ', $line);
59a83bd8 296 if (!strlen ($words[0]) or !strlen ($words[1]))
351d4dbf
DO
297 continue;
298 $ports[] = array
299 (
300 'name' => $words[0],
301 'l2address' => $words[1],
302 'label' => ''
303 );
304 break;
e673ee24 305 default:
135080d8 306 return buildRedirectURL (__FUNCTION__, 'ERR');
e673ee24
DO
307 break;
308 }
309 }
310 // Create ports, if they don't exist.
311 $added_count = $updated_count = $error_count = 0;
312 foreach ($ports as $port)
313 {
314 $port_id = getPortID ($object_id, $port['name']);
315 if ($port_id === NULL)
316 {
317 $result = commitAddPort ($object_id, $port['name'], $port_type, $port['label'], $port['l2address']);
318 if ($result == '')
319 $added_count++;
320 else
321 $error_count++;
322 }
323 else
324 {
6be06cbb 325 $result = commitUpdatePort ($object_id, $port_id, $port['name'], $port_type, $port['label'], $port['l2address']);
e673ee24
DO
326 if ($result == '')
327 $updated_count++;
328 else
329 $error_count++;
330 }
331 }
135080d8 332 return buildRedirectURL (__FUNCTION__, 'OK', array ($added_count, $updated_count, $error_count));
e673ee24
DO
333}
334
b6a7d936
DO
335$msgcode['updIPv4Allocation']['OK'] = 12;
336$msgcode['updIPv4Allocation']['ERR'] = 100;
b4c1ef87 337function updIPv4Allocation ()
e673ee24 338{
b4c1ef87
DO
339 assertIPv4Arg ('ip', __FUNCTION__);
340 assertUIntArg ('object_id', __FUNCTION__);
341 assertStringArg ('bond_name', __FUNCTION__, TRUE);
342 assertStringArg ('bond_type', __FUNCTION__);
e673ee24 343
b4c1ef87 344 $error = updateBond ($_REQUEST['ip'], $_REQUEST['object_id'], $_REQUEST['bond_name'], $_REQUEST['bond_type']);
e673ee24 345 if ($error != '')
135080d8 346 return buildRedirectURL (__FUNCTION__, 'ERR', array ($error));
e673ee24 347 else
135080d8 348 return buildRedirectURL (__FUNCTION__, 'OK');
e673ee24
DO
349}
350
b6a7d936
DO
351$msgcode['delIPv4Allocation']['OK'] = 14;
352$msgcode['delIPv4Allocation']['ERR'] = 100;
b4c1ef87 353function delIPv4Allocation ()
e673ee24 354{
b4c1ef87
DO
355 assertIPv4Arg ('ip', __FUNCTION__);
356 assertUIntArg ('object_id', __FUNCTION__);
e673ee24 357
b4c1ef87 358 $error = unbindIpFromObject ($_REQUEST['ip'], $_REQUEST['object_id']);
e673ee24 359 if ($error != '')
135080d8 360 return buildRedirectURL (__FUNCTION__, 'ERR', array ($error));
e673ee24 361 else
135080d8 362 return buildRedirectURL (__FUNCTION__, 'OK');
e673ee24
DO
363}
364
b6a7d936
DO
365$msgcode['addIPv4Allocation']['OK'] = 13;
366$msgcode['addIPv4Allocation']['ERR1'] = 170;
367$msgcode['addIPv4Allocation']['ERR2'] = 100;
b4c1ef87 368function addIPv4Allocation ()
e673ee24 369{
b4c1ef87
DO
370 assertIPv4Arg ('ip', __FUNCTION__);
371 assertUIntArg ('object_id', __FUNCTION__);
372 assertStringArg ('bond_name', __FUNCTION__, TRUE);
373 assertStringArg ('bond_type', __FUNCTION__);
da958e52 374
b4c1ef87
DO
375 // Strip masklen.
376 $ip = ereg_replace ('/[[:digit:]]+$', '', $_REQUEST['ip']);
2be3fd23 377 if (getConfigVar ('IPV4_JAYWALK') != 'yes' and NULL === getIPv4AddressNetworkId ($ip))
135080d8 378 return buildRedirectURL (__FUNCTION__, 'ERR1', array ($ip));
5222f192 379
b4c1ef87 380 $error = bindIpToObject ($ip, $_REQUEST['object_id'], $_REQUEST['bond_name'], $_REQUEST['bond_type']);
5222f192 381 if ($error != '')
135080d8 382 return buildRedirectURL (__FUNCTION__, 'ERR2', array ($error));
53ef3908 383 $address = getIPv4Address ($ip);
59a83bd8 384 if ($address['reserved'] == 'yes' or strlen ($address['name']))
b4c1ef87
DO
385 {
386 $release = getConfigVar ('IPV4_AUTO_RELEASE');
387 if ($release >= 1)
388 $address['reserved'] = 'no';
389 if ($release >= 2)
390 $address['name'] = '';
391 updateAddress ($ip, $address['name'], $address['reserved']);
392 }
135080d8 393 return buildRedirectURL (__FUNCTION__, 'OK');
e673ee24
DO
394}
395
b6a7d936
DO
396$msgcode['addIPv4Prefix']['OK'] = 23;
397$msgcode['addIPv4Prefix']['ERR'] = 100;
398$msgcode['addIPv4Prefix']['ERR1'] = 173;
399$msgcode['addIPv4Prefix']['ERR2'] = 174;
400$msgcode['addIPv4Prefix']['ERR3'] = 175;
401$msgcode['addIPv4Prefix']['ERR4'] = 176;
42023f03 402function addIPv4Prefix ()
e673ee24 403{
2c6c7645 404 assertStringArg ('range', __FUNCTION__);
e4b9a099 405 assertStringArg ('name', __FUNCTION__, TRUE);
e673ee24 406
fa05e3de
DO
407 $is_bcast = isset ($_REQUEST['is_bcast']) ? $_REQUEST['is_bcast'] : 'off';
408 $taglist = isset ($_REQUEST['taglist']) ? $_REQUEST['taglist'] : array();
42023f03 409 $error = createIPv4Prefix ($_REQUEST['range'], $_REQUEST['name'], $is_bcast == 'on', $taglist);
e673ee24 410 if ($error != '')
135080d8 411 return buildRedirectURL (__FUNCTION__, 'ERR', array ($error));
e673ee24 412 else
135080d8 413 return buildRedirectURL (__FUNCTION__, 'OK');
e673ee24
DO
414}
415
b6a7d936
DO
416$msgcode['delIPv4Prefix']['OK'] = 24;
417$msgcode['delIPv4Prefix']['ERR'] = 100;
42023f03 418function delIPv4Prefix ()
e673ee24 419{
da958e52 420 assertUIntArg ('id', __FUNCTION__);
42023f03 421 $error = destroyIPv4Prefix ($_REQUEST['id']);
e673ee24 422 if ($error != '')
135080d8 423 return buildRedirectURL (__FUNCTION__, 'ERR', array ($error));
e673ee24 424 else
135080d8 425 return buildRedirectURL (__FUNCTION__, 'OK');
e673ee24
DO
426}
427
b6a7d936
DO
428$msgcode['updIPv4Prefix']['OK'] = 25;
429$msgcode['updIPv4Prefix']['ERR'] = 100;
04d619d0 430function updIPv4Prefix ()
e673ee24 431{
da958e52 432 assertUIntArg ('id', __FUNCTION__);
e4b9a099 433 assertStringArg ('name', __FUNCTION__, TRUE);
99ab184f
DO
434 assertStringArg ('comment', __FUNCTION__, TRUE);
435 global $sic;
436 if (strlen ($error = updateIPv4Network_real ($sic['id'], $sic['name'], $sic['comment'])))
135080d8 437 return buildRedirectURL (__FUNCTION__, 'ERR', array ($error));
e673ee24 438 else
135080d8 439 return buildRedirectURL (__FUNCTION__, 'OK');
e673ee24
DO
440}
441
b6a7d936
DO
442$msgcode['editAddress']['OK'] = 27;
443$msgcode['editAddress']['ERR'] = 100;
e673ee24
DO
444function editAddress ()
445{
da958e52
DO
446 assertIPv4Arg ('ip', __FUNCTION__);
447 assertStringArg ('name', __FUNCTION__, TRUE);
e673ee24 448
e673ee24
DO
449 if (isset ($_REQUEST['reserved']))
450 $reserved = $_REQUEST['reserved'];
451 else
452 $reserved = 'off';
da958e52 453 $error = updateAddress ($_REQUEST['ip'], $_REQUEST['name'], $reserved == 'on' ? 'yes' : 'no');
e673ee24 454 if ($error != '')
135080d8 455 return buildRedirectURL (__FUNCTION__, 'ERR', array ($error));
e673ee24 456 else
135080d8 457 return buildRedirectURL (__FUNCTION__, 'OK');
e673ee24
DO
458}
459
b6a7d936
DO
460$msgcode['createUser']['OK'] = 40;
461$msgcode['createUser']['ERR'] = 102;
cced6b7d 462function createUser ()
e673ee24 463{
2c6c7645
DO
464 assertStringArg ('username', __FUNCTION__);
465 assertStringArg ('realname', __FUNCTION__, TRUE);
466 assertStringArg ('password', __FUNCTION__);
e673ee24 467 $username = $_REQUEST['username'];
93bdb7ba 468 $password = sha1 ($_REQUEST['password']);
e673ee24 469 $result = commitCreateUserAccount ($username, $_REQUEST['realname'], $password);
f857f71f 470 if ($result != TRUE)
135080d8 471 return buildRedirectURL (__FUNCTION__, 'ERR', array ($username));
f857f71f
DO
472 if (isset ($_REQUEST['taglist']))
473 produceTagsForLastRecord ('user', $_REQUEST['taglist']);
474 return buildRedirectURL (__FUNCTION__, 'OK', array ($username));
e673ee24
DO
475}
476
b6a7d936
DO
477$msgcode['updateUser']['OK'] = 39;
478$msgcode['updateUser']['ERR1'] = 103;
479$msgcode['updateUser']['ERR1'] = 104;
cced6b7d 480function updateUser ()
e673ee24 481{
cced6b7d 482 assertUIntArg ('user_id', __FUNCTION__);
2c6c7645
DO
483 assertStringArg ('username', __FUNCTION__);
484 assertStringArg ('realname', __FUNCTION__, TRUE);
485 assertStringArg ('password', __FUNCTION__);
e673ee24
DO
486 $username = $_REQUEST['username'];
487 $new_password = $_REQUEST['password'];
0b2c74cb 488 if (NULL == ($userinfo = spotEntity ('user', $_REQUEST['user_id'])))
135080d8 489 return buildRedirectURL (__FUNCTION__, 'ERR1');
e673ee24 490 // Update user password only if provided password is not the same as current password hash.
b82cce3f 491 if ($new_password != $userinfo['user_password_hash'])
93bdb7ba 492 $new_password = sha1 ($new_password);
103b1e1e 493 $result = commitUpdateUserAccount ($_REQUEST['user_id'], $username, $_REQUEST['realname'], $new_password);
e673ee24 494 if ($result == TRUE)
135080d8 495 return buildRedirectURL (__FUNCTION__, 'OK', array ($username));
e673ee24 496 else
135080d8 497 return buildRedirectURL (__FUNCTION__, 'ERR2', array ($username));
e673ee24
DO
498}
499
b6a7d936
DO
500$msgcode['updateDictionary']['OK'] = 51;
501$msgcode['updateDictionary']['ERR'] = 109;
e673ee24
DO
502function updateDictionary ()
503{
2c6c7645
DO
504 assertUIntArg ('chapter_no', __FUNCTION__);
505 assertUIntArg ('dict_key', __FUNCTION__);
506 assertStringArg ('dict_value', __FUNCTION__);
e673ee24 507 if (commitUpdateDictionary ($_REQUEST['chapter_no'], $_REQUEST['dict_key'], $_REQUEST['dict_value']) === TRUE)
135080d8 508 return buildRedirectURL (__FUNCTION__, 'OK');
e673ee24 509 else
135080d8 510 return buildRedirectURL (__FUNCTION__, 'ERR');
e673ee24
DO
511}
512
b6a7d936
DO
513$msgcode['supplementDictionary']['OK'] = 52;
514$msgcode['supplementDictionary']['ERR'] = 110;
e673ee24
DO
515function supplementDictionary ()
516{
2c6c7645
DO
517 assertUIntArg ('chapter_no', __FUNCTION__);
518 assertStringArg ('dict_value', __FUNCTION__);
e673ee24 519 if (commitSupplementDictionary ($_REQUEST['chapter_no'], $_REQUEST['dict_value']) === TRUE)
135080d8 520 return buildRedirectURL (__FUNCTION__, 'OK');
e673ee24 521 else
135080d8 522 return buildRedirectURL (__FUNCTION__, 'ERR');
e673ee24
DO
523}
524
b6a7d936
DO
525$msgcode['reduceDictionary']['OK'] = 50;
526$msgcode['reduceDictionary']['ERR'] = 111;
e673ee24
DO
527function reduceDictionary ()
528{
2c6c7645
DO
529 assertUIntArg ('chapter_no', __FUNCTION__);
530 assertUIntArg ('dict_key', __FUNCTION__);
e673ee24 531 if (commitReduceDictionary ($_REQUEST['chapter_no'], $_REQUEST['dict_key']) === TRUE)
135080d8 532 return buildRedirectURL (__FUNCTION__, 'OK');
e673ee24 533 else
135080d8 534 return buildRedirectURL (__FUNCTION__, 'ERR');
e673ee24
DO
535}
536
b6a7d936
DO
537$msgcode['addChapter']['OK'] = 55;
538$msgcode['addChapter']['ERR'] = 112;
e673ee24
DO
539function addChapter ()
540{
2c6c7645 541 assertStringArg ('chapter_name', __FUNCTION__);
e673ee24 542 if (commitAddChapter ($_REQUEST['chapter_name']) === TRUE)
135080d8 543 return buildRedirectURL (__FUNCTION__, 'OK');
e673ee24 544 else
135080d8 545 return buildRedirectURL (__FUNCTION__, 'ERR');
e673ee24
DO
546}
547
b6a7d936
DO
548$msgcode['updateChapter']['OK'] = 54;
549$msgcode['updateChapter']['ERR'] = 113;
e673ee24
DO
550function updateChapter ()
551{
2c6c7645
DO
552 assertUIntArg ('chapter_no', __FUNCTION__);
553 assertStringArg ('chapter_name', __FUNCTION__);
e673ee24 554 if (commitUpdateChapter ($_REQUEST['chapter_no'], $_REQUEST['chapter_name']) === TRUE)
135080d8 555 return buildRedirectURL (__FUNCTION__, 'OK');
e673ee24 556 else
135080d8 557 return buildRedirectURL (__FUNCTION__, 'ERR');
e673ee24
DO
558}
559
b6a7d936
DO
560$msgcode['delChapter']['OK'] = 53;
561$msgcode['delChapter']['ERR'] = 114;
e673ee24
DO
562function delChapter ()
563{
2c6c7645 564 assertUIntArg ('chapter_no', __FUNCTION__);
e673ee24 565 if (commitDeleteChapter ($_REQUEST['chapter_no']))
135080d8 566 return buildRedirectURL (__FUNCTION__, 'OK');
e673ee24 567 else
135080d8 568 return buildRedirectURL (__FUNCTION__, 'ERR');
e673ee24
DO
569}
570
b6a7d936
DO
571$msgcode['changeAttribute']['OK'] = 46;
572$msgcode['changeAttribute']['ERR'] = 115;
e673ee24
DO
573function changeAttribute ()
574{
2c6c7645
DO
575 assertUIntArg ('attr_id', __FUNCTION__);
576 assertStringArg ('attr_name', __FUNCTION__);
e673ee24 577 if (commitUpdateAttribute ($_REQUEST['attr_id'], $_REQUEST['attr_name']))
135080d8 578 return buildRedirectURL (__FUNCTION__, 'OK');
e673ee24 579 else
135080d8 580 return buildRedirectURL (__FUNCTION__, 'ERR');
e673ee24
DO
581}
582
b6a7d936
DO
583$msgcode['createAttribute']['OK'] = 45;
584$msgcode['createAttribute']['ERR'] = 116;
e673ee24
DO
585function createAttribute ()
586{
2c6c7645
DO
587 assertStringArg ('attr_name', __FUNCTION__);
588 assertStringArg ('attr_type', __FUNCTION__);
e673ee24 589 if (commitAddAttribute ($_REQUEST['attr_name'], $_REQUEST['attr_type']))
135080d8 590 return buildRedirectURL (__FUNCTION__, 'OK', array ($_REQUEST['attr_name']));
e673ee24 591 else
135080d8 592 return buildRedirectURL (__FUNCTION__, 'ERR');
e673ee24
DO
593}
594
b6a7d936
DO
595$msgcode['deleteAttribute']['OK'] = 47;
596$msgcode['deleteAttribute']['ERR'] = 117;
e673ee24
DO
597function deleteAttribute ()
598{
2c6c7645 599 assertUIntArg ('attr_id', __FUNCTION__);
e673ee24 600 if (commitDeleteAttribute ($_REQUEST['attr_id']))
135080d8 601 return buildRedirectURL (__FUNCTION__, 'OK');
e673ee24 602 else
135080d8 603 return buildRedirectURL (__FUNCTION__, 'ERR');
e673ee24
DO
604}
605
b6a7d936 606$msgcode['supplementAttrMap']['OK'] = 48;
7028a42c
DO
607$msgcode['supplementAttrMap']['ERR1'] = 154;
608$msgcode['supplementAttrMap']['ERR2'] = 118;
e673ee24
DO
609function supplementAttrMap ()
610{
2c6c7645
DO
611 assertUIntArg ('attr_id', __FUNCTION__);
612 assertUIntArg ('objtype_id', __FUNCTION__);
7028a42c
DO
613 $attrMap = getAttrMap();
614 if ($attrMap[$_REQUEST['attr_id']]['type'] != 'dict')
615 $chapter_id = 'NULL';
616 else
617 {
618 assertUIntArg ('chapter_no', __FUNCTION__); // FIXME: this doesn't fail on 0 (ticket:272)
619 if (0 == ($chapter_id = $_REQUEST['chapter_no']))
620 return buildRedirectURL (__FUNCTION__, 'ERR1', array ('chapter not selected'));
621 }
622 if (commitSupplementAttrMap ($_REQUEST['attr_id'], $_REQUEST['objtype_id'], $chapter_id) === TRUE)
135080d8 623 return buildRedirectURL (__FUNCTION__, 'OK');
e673ee24 624 else
7028a42c 625 return buildRedirectURL (__FUNCTION__, 'ERR2');
e673ee24
DO
626}
627
b6a7d936
DO
628$msgcode['reduceAttrMap']['OK'] = 49;
629$msgcode['reduceAttrMap']['ERR'] = 119;
e673ee24
DO
630function reduceAttrMap ()
631{
2c6c7645
DO
632 assertUIntArg ('attr_id', __FUNCTION__);
633 assertUIntArg ('objtype_id', __FUNCTION__);
e673ee24 634 if (commitReduceAttrMap ($_REQUEST['attr_id'], $_REQUEST['objtype_id']) === TRUE)
135080d8 635 return buildRedirectURL (__FUNCTION__, 'OK');
e673ee24 636 else
135080d8 637 return buildRedirectURL (__FUNCTION__, 'ERR');
e673ee24
DO
638}
639
b6a7d936
DO
640$msgcode['clearSticker']['OK'] = 15;
641$msgcode['clearSticker']['ERR'] = 120;
22bb04da 642function clearSticker ()
e673ee24 643{
2c6c7645
DO
644 assertUIntArg ('attr_id', __FUNCTION__);
645 assertUIntArg ('object_id', __FUNCTION__);
22bb04da 646 if (commitResetAttrValue ($_REQUEST['object_id'], $_REQUEST['attr_id']) === TRUE)
135080d8 647 return buildRedirectURL (__FUNCTION__, 'OK');
e673ee24 648 else
135080d8 649 return buildRedirectURL (__FUNCTION__, 'ERR');
e673ee24
DO
650}
651
e97e8866 652$msgcode['updateObjectAllocation']['OK'] = 63;
4fbb5a00
DY
653function updateObjectAllocation ()
654{
655 assertUIntArg ('object_id', __FUNCTION__);
656
e97e8866
DO
657 if (!isset ($_REQUEST['got_atoms']))
658 {
659 unset($_GET['page']);
660 unset($_GET['tab']);
661 unset($_GET['op']);
662 unset($_POST['page']);
663 unset($_POST['tab']);
664 unset($_POST['op']);
665 return buildWideRedirectURL (array(), NULL, NULL, array_merge ($_GET, $_POST));
666 }
667 $object_id = $_REQUEST['object_id'];
668 $workingRacksData = array();
669 foreach ($_REQUEST['rackmulti'] as $cand_id)
4fbb5a00 670 {
e97e8866 671 if (!isset ($workingRacksData[$cand_id]))
4fbb5a00 672 {
e97e8866
DO
673 $rackData = spotEntity ('rack', $cand_id);
674 if ($rackData == NULL)
4fbb5a00 675 {
e97e8866
DO
676 showError ('rack not found', __FUNCTION__);
677 return;
4fbb5a00 678 }
e97e8866
DO
679 amplifyCell ($rackData);
680 $workingRacksData[$cand_id] = $rackData;
4fbb5a00 681 }
e97e8866 682 }
2135fd83 683
e97e8866
DO
684 foreach ($workingRacksData as &$rd)
685 applyObjectMountMask ($rd, $object_id);
4fbb5a00 686
e97e8866
DO
687 $oldMolecule = getMoleculeForObject ($object_id);
688 $changecnt = 0;
689 $log = array();
690 foreach ($workingRacksData as $rack_id => $rackData)
4fbb5a00 691 {
e97e8866
DO
692 $logrecord = processGridForm ($rackData, 'F', 'T', $object_id);
693 $log[] = $logrecord;
694 if ($logrecord['code'] == 300)
695 continue;
696 $changecnt++;
697 // Reload our working copy after form processing.
698 $rackData = spotEntity ('rack', $cand_id);
699 amplifyCell ($rackData);
700 applyObjectMountMask ($rackData, $object_id);
701 $workingRacksData[$rack_id] = $rackData;
4fbb5a00 702 }
e97e8866
DO
703 if (!$changecnt)
704 return buildRedirectURL (__FUNCTION__, 'OK', $changecnt);
705 // Log a record.
706 $newMolecule = getMoleculeForObject ($object_id);
707 $oc = count ($oldMolecule);
708 $nc = count ($newMolecule);
709 $omid = $oc ? createMolecule ($oldMolecule) : 'NULL';
710 $nmid = $nc ? createMolecule ($newMolecule) : 'NULL';
711 global $remote_username;
712 $comment = empty ($_REQUEST['comment']) ? 'NULL' : "'${_REQUEST['comment']}'";
713 $query =
714 "insert into MountOperation(object_id, old_molecule_id, new_molecule_id, user_name, comment) " .
715 "values (${object_id}, ${omid}, ${nmid}, '${remote_username}', ${comment})";
716 global $dbxlink;
717 $result = $dbxlink->query ($query);
718 if ($result == NULL)
719 $log[] = array ('code' => 500, 'message' => 'SQL query failed during history logging.');
720 else
721 $log[] = array ('code' => 200, 'message' => 'History logged.');
722 return buildWideRedirectURL ($log);
4fbb5a00
DY
723}
724
b6a7d936
DO
725$msgcode['updateObject']['OK'] = 16;
726$msgcode['updateObject']['ERR'] = 121;
22bb04da
DO
727function updateObject ()
728{
0f63538a 729 assertUIntArg ('num_attrs', __FUNCTION__, TRUE);
22bb04da
DO
730 assertUIntArg ('object_id', __FUNCTION__);
731 assertUIntArg ('object_type_id', __FUNCTION__);
732 assertStringArg ('object_name', __FUNCTION__, TRUE);
733 assertStringArg ('object_label', __FUNCTION__, TRUE);
734 assertStringArg ('object_barcode', __FUNCTION__, TRUE);
735 assertStringArg ('object_asset_no', __FUNCTION__, TRUE);
736 if (isset ($_REQUEST['object_has_problems']) and $_REQUEST['object_has_problems'] == 'on')
737 $has_problems = 'yes';
738 else
739 $has_problems = 'no';
740
741 if (commitUpdateObject (
742 $_REQUEST['object_id'],
743 $_REQUEST['object_name'],
744 $_REQUEST['object_label'],
745 $_REQUEST['object_barcode'],
746 $_REQUEST['object_type_id'],
747 $has_problems,
748 $_REQUEST['object_asset_no'],
749 $_REQUEST['object_comment']
750 ) !== TRUE)
135080d8 751 return buildRedirectURL (__FUNCTION__, 'ERR');
22bb04da 752
cdd3efe9 753 // Update optional attributes
f59e8cf5 754 $oldvalues = getAttrValues ($_REQUEST['object_id']);
0dfb8a2a 755 $result = array();
0f63538a
DO
756 $num_attrs = isset ($_REQUEST['num_attrs']) ? $_REQUEST['num_attrs'] : 0;
757 for ($i = 0; $i < $num_attrs; $i++)
0dfb8a2a 758 {
2c6c7645 759 assertUIntArg ("${i}_attr_id", __FUNCTION__);
0dfb8a2a
DO
760 $attr_id = $_REQUEST["${i}_attr_id"];
761
762 // Field is empty, delete attribute and move on.
59a83bd8 763 if (!strlen ($_REQUEST["${i}_value"]))
0dfb8a2a 764 {
103b1e1e 765 commitResetAttrValue ($_REQUEST['object_id'], $attr_id);
0dfb8a2a
DO
766 continue;
767 }
768
769 // The value could be uint/float, but we don't know ATM. Let SQL
770 // server check this and complain.
2c6c7645 771 assertStringArg ("${i}_value", __FUNCTION__);
0dfb8a2a
DO
772 $value = $_REQUEST["${i}_value"];
773 switch ($oldvalues[$attr_id]['type'])
774 {
775 case 'uint':
776 case 'float':
777 case 'string':
778 $oldvalue = $oldvalues[$attr_id]['value'];
779 break;
780 case 'dict':
781 $oldvalue = $oldvalues[$attr_id]['key'];
782 break;
783 default:
61e269b5 784 showError ('Internal structure error', __FUNCTION__);
0dfb8a2a
DO
785 die;
786 }
59a83bd8 787 if ($value === $oldvalue) // ('' == 0), but ('' !== 0)
0dfb8a2a
DO
788 continue;
789
790 // Note if the queries succeed or not, it determines which page they see.
103b1e1e 791 $result[] = commitUpdateAttrValue ($_REQUEST['object_id'], $attr_id, $value);
0dfb8a2a 792 }
103b1e1e 793 if (in_array (FALSE, $result))
135080d8 794 return buildRedirectURL (__FUNCTION__, 'ERR');
0dfb8a2a 795
cdd3efe9
AD
796 // Invalidate thumb cache of all racks objects could occupy.
797 foreach (getResidentRacksData ($_REQUEST['object_id'], FALSE) as $rack_id)
798 resetThumbCache ($rack_id);
799
135080d8 800 return buildRedirectURL (__FUNCTION__, 'OK');
e673ee24
DO
801}
802
42d73cbf
DY
803
804function addMultipleObjects()
805{
7abce0b7 806 $log = emptyLog();
42d73cbf 807 $taglist = isset ($_REQUEST['taglist']) ? $_REQUEST['taglist'] : array();
42d73cbf
DY
808 $max = getConfigVar ('MASSCOUNT');
809 for ($i = 0; $i < $max; $i++)
810 {
811 if (!isset ($_REQUEST["${i}_object_type_id"]))
812 {
57777e4a 813 $log = mergeLogs ($log, oneLiner (184, array ($i + 1)));
42d73cbf
DY
814 break;
815 }
816 assertUIntArg ("${i}_object_type_id", __FUNCTION__, TRUE);
817 assertStringArg ("${i}_object_name", __FUNCTION__, TRUE);
818 assertStringArg ("${i}_object_label", __FUNCTION__, TRUE);
819 assertStringArg ("${i}_object_asset_no", __FUNCTION__, TRUE);
820 assertStringArg ("${i}_object_barcode", __FUNCTION__, TRUE);
7abce0b7 821 $name = $_REQUEST["${i}_object_name"];
42d73cbf
DY
822
823 // It's better to skip silently, than to print a notice.
7abce0b7 824 if ($_REQUEST["${i}_object_type_id"] == 0)
42d73cbf 825 continue;
fee7977b 826 if (($object_id = commitAddObject
7abce0b7
DO
827 (
828 $name,
829 $_REQUEST["${i}_object_label"],
830 $_REQUEST["${i}_object_barcode"],
831 $_REQUEST["${i}_object_type_id"],
832 $_REQUEST["${i}_object_asset_no"],
833 $taglist
fee7977b
DO
834 )) !== FALSE){
835 $info = spotEntity ('object', $object_id);
836 // FIXME: employ amplifyCell() instead of calling loader functions directly
837 amplifyCell ($info);
838 $log = mergeLogs ($log, oneLiner (80, array ('<a href="' . makeHref (array ('page' => 'object', 'tab' => 'default', 'object_id' => $object_id)) . '">' . $info['dname'] . '</a>')));
839 }else{
57777e4a 840 $log = mergeLogs ($log, oneLiner (185, array ($name)));
fee7977b 841 }
42d73cbf 842 }
7abce0b7 843 return buildWideRedirectURL ($log);
42d73cbf
DY
844}
845
846function addLotOfObjects()
847{
7abce0b7 848 $log = emptyLog();
42d73cbf 849 $taglist = isset ($_REQUEST['taglist']) ? $_REQUEST['taglist'] : array();
42d73cbf
DY
850 assertUIntArg ('global_type_id', __FUNCTION__, TRUE);
851 assertStringArg ('namelist', __FUNCTION__, TRUE);
852 $global_type_id = $_REQUEST['global_type_id'];
59a83bd8 853 if ($global_type_id == 0 or !strlen ($_REQUEST['namelist']))
57777e4a 854 $log = mergeLogs ($log, oneLiner (186));
42d73cbf
DY
855 else
856 {
857 // The name extractor below was stolen from ophandlers.php:addMultiPorts()
858 $names1 = explode ('\n', $_REQUEST['namelist']);
859 $names2 = array();
860 foreach ($names1 as $line)
861 {
862 $parts = explode ('\r', $line);
863 reset ($parts);
59a83bd8 864 if (!strlen ($parts[0]))
42d73cbf
DY
865 continue;
866 else
867 $names2[] = rtrim ($parts[0]);
868 }
57777e4a 869 foreach ($names2 as $name)
fee7977b 870 if (commitAddObject ($name, '', '', $global_type_id, '', $taglist) !== FALSE)
57777e4a 871 $log = mergeLogs ($log, oneLiner (80, array ($name)));
42d73cbf 872 else
57777e4a 873 $log = mergeLogs ($log, oneLiner (185, array ($name)));
42d73cbf 874 }
7abce0b7 875 return buildWideRedirectURL ($log);
42d73cbf
DY
876}
877
b6a7d936
DO
878$msgcode['deleteObject']['OK'] = 76;
879$msgcode['deleteObject']['ERR'] = 100;
52b34485
AD
880function deleteObject ()
881{
882 assertUIntArg ('object_id', __FUNCTION__);
6297d584 883 if (NULL === ($oinfo = spotEntity ('object', $_REQUEST['object_id'])))
c78a40ec
DO
884 return buildRedirectURL (__FUNCTION__, 'ERR', array ('object not found'));
885
f0e2c99f 886 $racklist = getResidentRacksData ($_REQUEST['object_id'], FALSE);
52b34485 887 $error = commitDeleteObject ($_REQUEST['object_id']);
f0e2c99f
DO
888 foreach ($racklist as $rack_id)
889 resetThumbCache ($rack_id);
52b34485
AD
890
891 if ($error != '')
135080d8 892 return buildRedirectURL (__FUNCTION__, 'ERR', array ($error));
52b34485 893
c78a40ec 894 return buildRedirectURL (__FUNCTION__, 'OK', array ($oinfo['dname']));
52b34485
AD
895}
896
b6a7d936
DO
897$msgcode['useupPort']['OK'] = 11;
898$msgcode['useupPort']['ERR'] = 124;
e673ee24
DO
899function useupPort ()
900{
2c6c7645 901 assertUIntArg ('port_id', __FUNCTION__);
e673ee24 902 if (commitUseupPort ($_REQUEST['port_id']) === TRUE)
135080d8 903 return buildRedirectURL (__FUNCTION__, 'OK');
e673ee24 904 else
135080d8 905 return buildRedirectURL (__FUNCTION__, 'ERR');
e673ee24
DO
906}
907
b6a7d936
DO
908$msgcode['updateUI']['OK'] = 56;
909$msgcode['updateUI']['ERR'] = 125;
4fe32e78
DY
910function updateUI ()
911{
2c6c7645 912 assertUIntArg ('num_vars', __FUNCTION__);
4fe32e78 913
103b1e1e 914 for ($i = 0; $i < $_REQUEST['num_vars']; $i++)
4fe32e78 915 {
2c6c7645
DO
916 assertStringArg ("${i}_varname", __FUNCTION__);
917 assertStringArg ("${i}_varvalue", __FUNCTION__, TRUE);
4fe32e78 918 $varname = $_REQUEST["${i}_varname"];
4fe32e78 919 $varvalue = $_REQUEST["${i}_varvalue"];
4fe32e78 920
c461c579 921 // If form value = value in DB, don't bother updating DB
59a83bd8 922 if ($varvalue === getConfigVar ($varname))
4fe32e78
DY
923 continue;
924
925 // Note if the queries succeed or not, it determines which page they see.
c461c579 926 $error = setConfigVar ($varname, $varvalue, TRUE);
59a83bd8
DO
927 if (strlen ($error))
928 return buildRedirectURL (__FUNCTION__, 'ERR', array ($error));
4fe32e78 929 }
135080d8 930 return buildRedirectURL (__FUNCTION__, 'OK');
4fe32e78
DY
931}
932
b6a7d936 933$msgcode['resetUIConfig']['OK'] = 57;
b07f617c
DO
934function resetUIConfig()
935{
b07f617c
DO
936 setConfigVar ('MASSCOUNT','15');
937 setConfigVar ('MAXSELSIZE','30');
b07f617c
DO
938 setConfigVar ('ROW_SCALE','2');
939 setConfigVar ('PORTS_PER_ROW','12');
940 setConfigVar ('IPV4_ADDRS_PER_PAGE','256');
941 setConfigVar ('DEFAULT_RACK_HEIGHT','42');
b5ce46aa
DO
942 setConfigVar ('DEFAULT_SLB_VS_PORT','');
943 setConfigVar ('DEFAULT_SLB_RS_PORT','');
72281138 944 setConfigVar ('DETECT_URLS','no');
4b8d413e 945 setConfigVar ('RACK_PRESELECT_THRESHOLD','1');
b108de49 946 setConfigVar ('DEFAULT_IPV4_RS_INSERVICE','no');
8dfb997c 947 setConfigVar ('AUTOPORTS_CONFIG','4 = 1*33*kvm + 2*24*eth%u;15 = 1*446*kvm');
194e3748
DO
948 setConfigVar ('SHOW_EXPLICIT_TAGS','yes');
949 setConfigVar ('SHOW_IMPLICIT_TAGS','yes');
950 setConfigVar ('SHOW_AUTOMATIC_TAGS','no');
a477e405 951 setConfigVar ('DEFAULT_OBJECT_TYPE','4');
2754cefc 952 setConfigVar ('IPV4_AUTO_RELEASE','1');
a53dc9df 953 setConfigVar ('SHOW_LAST_TAB', 'no');
f0ed1181 954 setConfigVar ('EXT_IPV4_VIEW', 'yes');
efee2692 955 setConfigVar ('TREE_THRESHOLD', '25');
2be3fd23 956 setConfigVar ('IPV4_JAYWALK', 'no');
9318d2ef 957 setConfigVar ('ADDNEW_AT_TOP', 'yes');
64347dcf 958 setConfigVar ('IPV4_TREE_SHOW_USAGE', 'yes');
37e59768
DO
959 setConfigVar ('PREVIEW_TEXT_MAXCHARS', '10240');
960 setConfigVar ('PREVIEW_TEXT_ROWS', '25');
961 setConfigVar ('PREVIEW_TEXT_COLS', '80');
962 setConfigVar ('PREVIEW_IMAGE_MAXPXS', '320');
f3d274bf 963 setConfigVar ('VENDOR_SIEVE', '');
35bf153d
DO
964 setConfigVar ('IPV4LB_LISTSRC', '{$typeid_4}');
965 setConfigVar ('IPV4OBJ_LISTSRC','{$typeid_4} or {$typeid_7} or {$typeid_8} or {$typeid_12} or {$typeid_445} or {$typeid_447}');
966 setConfigVar ('IPV4NAT_LISTSRC','{$typeid_4} or {$typeid_7} or {$typeid_8}');
967 setConfigVar ('ASSETWARN_LISTSRC','{$typeid_4} or {$typeid_7} or {$typeid_8}');
968 setConfigVar ('NAMEWARN_LISTSRC','{$typeid_4} or {$typeid_7} or {$typeid_8}');
f5883ec1 969 setConfigVar ('RACKS_PER_ROW','12');
590e1281 970 setConfigVar ('FILTER_PREDICATE_SIEVE','');
23cdc7e9
DO
971 setConfigVar ('FILTER_DEFAULT_ANDOR','or');
972 setConfigVar ('FILTER_SUGGEST_ANDOR','yes');
973 setConfigVar ('FILTER_SUGGEST_TAGS','yes');
974 setConfigVar ('FILTER_SUGGEST_PREDICATES','yes');
975 setConfigVar ('FILTER_SUGGEST_EXTRA','no');
49b605d9 976 setConfigVar ('DEFAULT_SNMP_COMMUNITY','public');
f06fe423 977 setConfigVar ('IPV4_ENABLE_KNIGHT','yes');
9e51318b
DO
978 setConfigVar ('TAGS_TOPLIST_SIZE','50');
979 setConfigVar ('TAGS_QUICKLIST_SIZE','20');
980 setConfigVar ('TAGS_QUICKLIST_THRESHOLD','50');
f44fdef9 981 setConfigVar ('ENABLE_MULTIPORT_FORM', 'no');
2400d7ec
DO
982 setConfigVar ('DEFAULT_PORT_IIF_ID', '1');
983 setConfigVar ('DEFAULT_PORT_OIF_IDS', '1=24; 3=1078; 4=1077; 5=1079; 6=1080; 8=1082; 9=1084');
4a47d34b 984 setConfigVar ('IPV4_TREE_RTR_AS_CELL', 'yes');
135080d8 985 return buildRedirectURL (__FUNCTION__, 'OK');
b07f617c
DO
986}
987
b6a7d936
DO
988$msgcode['addRealServer']['OK'] = 34;
989$msgcode['addRealServer']['ERR'] = 126;
732e4578 990// Add single record.
ca461127
DO
991function addRealServer ()
992{
2c6c7645
DO
993 assertUIntArg ('pool_id', __FUNCTION__);
994 assertIPv4Arg ('remoteip', __FUNCTION__);
79a9edb4 995 assertStringArg ('rsport', __FUNCTION__, TRUE);
2c6c7645 996 assertStringArg ('rsconfig', __FUNCTION__, TRUE);
103b1e1e
DO
997 if (!addRStoRSPool (
998 $_REQUEST['pool_id'],
999 $_REQUEST['remoteip'],
1000 $_REQUEST['rsport'],
1001 getConfigVar ('DEFAULT_IPV4_RS_INSERVICE'),
1002 $_REQUEST['rsconfig']
1003 ))
135080d8 1004 return buildRedirectURL (__FUNCTION__, 'ERR');
d6517a21 1005 else
135080d8 1006 return buildRedirectURL (__FUNCTION__, 'OK');
d6517a21
DO
1007}
1008
b6a7d936
DO
1009$msgcode['addRealServers']['OK'] = 37;
1010$msgcode['addRealServers']['ERR1'] = 131;
1011$msgcode['addRealServers']['ERR2'] = 127;
732e4578
DO
1012// Parse textarea submitted and try adding a real server for each line.
1013function addRealServers ()
1014{
cbadbb38 1015 assertUIntArg ('pool_id', __FUNCTION__);
2c6c7645
DO
1016 assertStringArg ('format', __FUNCTION__);
1017 assertStringArg ('rawtext', __FUNCTION__);
732e4578
DO
1018 $rawtext = str_replace ('\r', '', $_REQUEST['rawtext']);
1019 $ngood = $nbad = 0;
1020 $rsconfig = '';
1021 // Keep in mind, that the text will have HTML entities (namely '>') escaped.
1022 foreach (explode ('\n', $rawtext) as $line)
1023 {
59a83bd8 1024 if (!strlen ($line))
732e4578
DO
1025 continue;
1026 $match = array ();
1027 switch ($_REQUEST['format'])
1028 {
1029 case 'ipvs_2': // address and port only
1030 if (!preg_match ('/^ -&gt; ([0-9\.]+):([0-9]+) /', $line, $match))
1031 continue;
103b1e1e 1032 if (addRStoRSPool ($_REQUEST['pool_id'], $match[1], $match[2], getConfigVar ('DEFAULT_IPV4_RS_INSERVICE'), ''))
732e4578
DO
1033 $ngood++;
1034 else
1035 $nbad++;
1036 break;
1037 case 'ipvs_3': // address, port and weight
1038 if (!preg_match ('/^ -&gt; ([0-9\.]+):([0-9]+) +[a-zA-Z]+ +([0-9]+) /', $line, $match))
1039 continue;
103b1e1e 1040 if (addRStoRSPool ($_REQUEST['pool_id'], $match[1], $match[2], getConfigVar ('DEFAULT_IPV4_RS_INSERVICE'), 'weight ' . $match[3]))
732e4578
DO
1041 $ngood++;
1042 else
1043 $nbad++;
1044 break;
e69c2aa3
DO
1045 case 'ssv_2': // IP address and port
1046 if (!preg_match ('/^([0-9\.]+) ([0-9]+)$/', $line, $match))
1047 continue;
103b1e1e 1048 if (addRStoRSPool ($_REQUEST['pool_id'], $match[1], $match[2], getConfigVar ('DEFAULT_IPV4_RS_INSERVICE'), ''))
e69c2aa3
DO
1049 $ngood++;
1050 else
1051 $nbad++;
1052 break;
948c37e3
DO
1053 case 'ssv_1': // IP address
1054 if (!preg_match ('/^([0-9\.]+)$/', $line, $match))
1055 continue;
1056 if (addRStoRSPool ($_REQUEST['pool_id'], $match[1], 0, getConfigVar ('DEFAULT_IPV4_RS_INSERVICE'), ''))
1057 $ngood++;
1058 else
1059 $nbad++;
1060 break;
732e4578 1061 default:
135080d8 1062 return buildRedirectURL (__FUNCTION__, 'ERR1');
732e4578
DO
1063 break;
1064 }
1065 }
1066 if ($nbad == 0 and $ngood > 0)
135080d8 1067 return buildRedirectURL (__FUNCTION__, 'OK', array ($ngood));
732e4578 1068 else
135080d8 1069 return buildRedirectURL (__FUNCTION__, 'ERR2', array ($ngood, $nbad));
732e4578
DO
1070}
1071
b6a7d936
DO
1072$msgcode['addVService']['OK'] = 28;
1073$msgcode['addVService']['ERR1'] = 132;
1074$msgcode['addVService']['ERR2'] = 100;
d6517a21
DO
1075function addVService ()
1076{
2c6c7645
DO
1077 assertIPv4Arg ('vip', __FUNCTION__);
1078 assertUIntArg ('vport', __FUNCTION__);
1079 assertStringArg ('proto', __FUNCTION__);
103b1e1e 1080 if ($_REQUEST['proto'] != 'TCP' and $_REQUEST['proto'] != 'UDP')
135080d8 1081 return buildRedirectURL (__FUNCTION__, 'ERR1');
2c6c7645
DO
1082 assertStringArg ('name', __FUNCTION__, TRUE);
1083 assertStringArg ('vsconfig', __FUNCTION__, TRUE);
1084 assertStringArg ('rsconfig', __FUNCTION__, TRUE);
c63a8d6e
DO
1085 $error = commitCreateVS
1086 (
103b1e1e
DO
1087 $_REQUEST['vip'],
1088 $_REQUEST['vport'],
7320b661 1089 $_REQUEST['proto'],
103b1e1e
DO
1090 $_REQUEST['name'],
1091 $_REQUEST['vsconfig'],
c63a8d6e
DO
1092 $_REQUEST['rsconfig'],
1093 isset ($_REQUEST['taglist']) ? $_REQUEST['taglist'] : array()
1094 );
1095 if ($error != '')
135080d8 1096 return buildRedirectURL (__FUNCTION__, 'ERR2', array ($error));
ca461127 1097 else
135080d8 1098 return buildRedirectURL (__FUNCTION__, 'OK');
fb1c4a54
DO
1099}
1100
b6a7d936
DO
1101$msgcode['deleteRealServer']['OK'] = 35;
1102$msgcode['deleteRealServer']['ERR'] = 128;
fb1c4a54
DO
1103function deleteRealServer ()
1104{
2c6c7645 1105 assertUIntArg ('id', __FUNCTION__);
d6517a21 1106 if (!commitDeleteRS ($_REQUEST['id']))
135080d8 1107 return buildRedirectURL (__FUNCTION__, 'ERR');
fb1c4a54 1108 else
135080d8 1109 return buildRedirectURL (__FUNCTION__, 'OK');
fb1c4a54
DO
1110}
1111
b6a7d936
DO
1112$msgcode['deleteLoadBalancer']['OK'] = 19;
1113$msgcode['deleteLoadBalancer']['ERR'] = 129;
3241551e
DO
1114function deleteLoadBalancer ()
1115{
2c6c7645
DO
1116 assertUIntArg ('object_id', __FUNCTION__);
1117 assertUIntArg ('pool_id', __FUNCTION__);
1118 assertUIntArg ('vs_id', __FUNCTION__);
103b1e1e
DO
1119 if (!commitDeleteLB (
1120 $_REQUEST['object_id'],
1121 $_REQUEST['pool_id'],
1122 $_REQUEST['vs_id']
1123 ))
135080d8 1124 return buildRedirectURL (__FUNCTION__, 'ERR');
d6517a21 1125 else
135080d8 1126 return buildRedirectURL (__FUNCTION__, 'OK');
d6517a21
DO
1127}
1128
b6a7d936
DO
1129$msgcode['deleteVService']['OK'] = 29;
1130$msgcode['deleteVService']['ERR'] = 130;
d6517a21
DO
1131function deleteVService ()
1132{
e02e1941
DO
1133 assertUIntArg ('vs_id', __FUNCTION__);
1134 if (!commitDeleteVS ($_REQUEST['vs_id']))
135080d8 1135 return buildRedirectURL (__FUNCTION__, 'ERR');
3241551e 1136 else
135080d8 1137 return buildRedirectURL (__FUNCTION__, 'OK');
3241551e
DO
1138}
1139
b6a7d936
DO
1140$msgcode['updateRealServer']['OK'] = 36;
1141$msgcode['updateRealServer']['ERR'] = 133;
fb1c4a54
DO
1142function updateRealServer ()
1143{
2c6c7645
DO
1144 assertUIntArg ('rs_id', __FUNCTION__);
1145 assertIPv4Arg ('rsip', __FUNCTION__);
79a9edb4 1146 assertStringArg ('rsport', __FUNCTION__, TRUE);
2c6c7645 1147 assertStringArg ('rsconfig', __FUNCTION__, TRUE);
103b1e1e
DO
1148 if (!commitUpdateRS (
1149 $_REQUEST['rs_id'],
1150 $_REQUEST['rsip'],
1151 $_REQUEST['rsport'],
1152 $_REQUEST['rsconfig']
1153 ))
135080d8 1154 return buildRedirectURL (__FUNCTION__, 'ERR');
fb1c4a54 1155 else
135080d8 1156 return buildRedirectURL (__FUNCTION__, 'OK');
ca461127
DO
1157}
1158
b6a7d936
DO
1159$msgcode['updateLoadBalancer']['OK'] = 20;
1160$msgcode['updateLoadBalancer']['ERR'] = 134;
c1ca768c 1161function updateLoadBalancer ()
3241551e 1162{
2c6c7645
DO
1163 assertUIntArg ('object_id', __FUNCTION__);
1164 assertUIntArg ('pool_id', __FUNCTION__);
1165 assertUIntArg ('vs_id', __FUNCTION__);
1166 assertStringArg ('vsconfig', __FUNCTION__, TRUE);
1167 assertStringArg ('rsconfig', __FUNCTION__, TRUE);
103b1e1e
DO
1168 if (!commitUpdateLB (
1169 $_REQUEST['object_id'],
1170 $_REQUEST['pool_id'],
1171 $_REQUEST['vs_id'],
1172 $_REQUEST['vsconfig'],
1173 $_REQUEST['rsconfig']
1174 ))
135080d8 1175 return buildRedirectURL (__FUNCTION__, 'ERR');
d6517a21 1176 else
135080d8 1177 return buildRedirectURL (__FUNCTION__, 'OK');
d6517a21
DO
1178}
1179
b6a7d936
DO
1180$msgcode['updateVService']['OK'] = 30;
1181$msgcode['updateVService']['ERR'] = 135;
d6517a21
DO
1182function updateVService ()
1183{
e02e1941 1184 assertUIntArg ('vs_id', __FUNCTION__);
2c6c7645
DO
1185 assertIPv4Arg ('vip', __FUNCTION__);
1186 assertUIntArg ('vport', __FUNCTION__);
1187 assertStringArg ('proto', __FUNCTION__);
1188 assertStringArg ('name', __FUNCTION__, TRUE);
1189 assertStringArg ('vsconfig', __FUNCTION__, TRUE);
1190 assertStringArg ('rsconfig', __FUNCTION__, TRUE);
103b1e1e
DO
1191 if (!commitUpdateVS (
1192 $_REQUEST['vs_id'],
1193 $_REQUEST['vip'],
1194 $_REQUEST['vport'],
1195 $_REQUEST['proto'],
1196 $_REQUEST['name'],
1197 $_REQUEST['vsconfig'],
1198 $_REQUEST['rsconfig']
1199 ))
135080d8 1200 return buildRedirectURL (__FUNCTION__, 'ERR');
3241551e 1201 else
135080d8 1202 return buildRedirectURL (__FUNCTION__, 'OK');
3241551e
DO
1203}
1204
b6a7d936
DO
1205$msgcode['addLoadBalancer']['OK'] = 18;
1206$msgcode['addLoadBalancer']['ERR'] = 137;
3241551e
DO
1207function addLoadBalancer ()
1208{
2c6c7645
DO
1209 assertUIntArg ('pool_id', __FUNCTION__);
1210 assertUIntArg ('object_id', __FUNCTION__);
1211 assertUIntArg ('vs_id', __FUNCTION__);
1212 assertStringArg ('vsconfig', __FUNCTION__, TRUE);
1213 assertStringArg ('rsconfig', __FUNCTION__, TRUE);
103b1e1e
DO
1214 if (!addLBtoRSPool (
1215 $_REQUEST['pool_id'],
1216 $_REQUEST['object_id'],
1217 $_REQUEST['vs_id'],
1218 $_REQUEST['vsconfig'],
1219 $_REQUEST['rsconfig']
1220 ))
135080d8 1221 return buildRedirectURL (__FUNCTION__, 'ERR');
3241551e 1222 else
135080d8 1223 return buildRedirectURL (__FUNCTION__, 'OK');
3241551e
DO
1224}
1225
b6a7d936
DO
1226$msgcode['addRSPool']['OK'] = 31;
1227$msgcode['addRSPool']['ERR'] = 100;
5ad76f01
DO
1228function addRSPool ()
1229{
2c6c7645
DO
1230 assertStringArg ('name', __FUNCTION__, TRUE);
1231 assertStringArg ('vsconfig', __FUNCTION__, TRUE);
1232 assertStringArg ('rsconfig', __FUNCTION__, TRUE);
c63a8d6e
DO
1233 $error = commitCreateRSPool
1234 (
103b1e1e
DO
1235 $_REQUEST['name'],
1236 $_REQUEST['vsconfig'],
c63a8d6e
DO
1237 $_REQUEST['rsconfig'],
1238 isset ($_REQUEST['taglist']) ? $_REQUEST['taglist'] : array()
1239 );
1240 if ($error != '')
135080d8 1241 return buildRedirectURL (__FUNCTION__, 'ERR', array ($error));
5ad76f01 1242 else
135080d8 1243 return buildRedirectURL (__FUNCTION__, 'OK');
5ad76f01
DO
1244}
1245
b6a7d936
DO
1246$msgcode['deleteRSPool']['OK'] = 32;
1247$msgcode['deleteRSPool']['ERR'] = 138;
5ad76f01
DO
1248function deleteRSPool ()
1249{
2c6c7645 1250 assertUIntArg ('pool_id', __FUNCTION__);
841a7a7a 1251 if (!commitDeleteRSPool ($_REQUEST['pool_id']))
135080d8 1252 return buildRedirectURL (__FUNCTION__, 'ERR');
5ad76f01 1253 else
135080d8 1254 return buildRedirectURL (__FUNCTION__, 'OK');
5ad76f01
DO
1255}
1256
b6a7d936
DO
1257$msgcode['updateRSPool']['OK'] = 33;
1258$msgcode['updateRSPool']['ERR'] = 139;
5ad76f01
DO
1259function updateRSPool ()
1260{
2c6c7645
DO
1261 assertUIntArg ('pool_id', __FUNCTION__);
1262 assertStringArg ('name', __FUNCTION__, TRUE);
1263 assertStringArg ('vsconfig', __FUNCTION__, TRUE);
1264 assertStringArg ('rsconfig', __FUNCTION__, TRUE);
841a7a7a 1265 if (!commitUpdateRSPool ($_REQUEST['pool_id'], $_REQUEST['name'], $_REQUEST['vsconfig'], $_REQUEST['rsconfig']))
135080d8 1266 return buildRedirectURL (__FUNCTION__, 'ERR');
5ad76f01 1267 else
135080d8 1268 return buildRedirectURL (__FUNCTION__, 'OK');
5ad76f01
DO
1269}
1270
b6a7d936
DO
1271$msgcode['updateRSInService']['OK'] = 38;
1272$msgcode['updateRSInService']['ERR'] = 140;
1f7d18fa
DO
1273function updateRSInService ()
1274{
2c6c7645 1275 assertUIntArg ('rscount', __FUNCTION__);
841a7a7a 1276 $pool_id = $_REQUEST['pool_id'];
a6e91ac2
DO
1277 $orig = spotEntity ('ipv4rspool', $pool_id);
1278 amplifyCell ($orig);
1f7d18fa
DO
1279 $nbad = $ngood = 0;
1280 for ($i = 1; $i <= $_REQUEST['rscount']; $i++)
1281 {
1282 $rs_id = $_REQUEST["rsid_${i}"];
1283 if (isset ($_REQUEST["inservice_${i}"]) and $_REQUEST["inservice_${i}"] == 'on')
1284 $newval = 'yes';
1285 else
1286 $newval = 'no';
1287 if ($newval != $orig['rslist'][$rs_id]['inservice'])
1288 {
1289 if (commitSetInService ($rs_id, $newval))
1290 $ngood++;
1291 else
1292 $nbad++;
1293 }
1294 }
1295 if (!$nbad)
135080d8 1296 return buildRedirectURL (__FUNCTION__, 'OK', array ($ngood));
1f7d18fa 1297 else
135080d8 1298 return buildRedirectURL (__FUNCTION__, 'ERR', array ($nbad, $ngood));
1f7d18fa
DO
1299}
1300
b6a7d936
DO
1301$msgcode['importPTRData']['OK'] = 26;
1302$msgcode['importPTRData']['ERR'] = 141;
8d9c16e7
DO
1303// FIXME: check, that each submitted address belongs to the prefix we
1304// are operating on.
03eb5209
DO
1305function importPTRData ()
1306{
2c6c7645 1307 assertUIntArg ('addrcount', __FUNCTION__);
03eb5209 1308 $nbad = $ngood = 0;
03eb5209
DO
1309 for ($i = 0; $i < $_REQUEST['addrcount']; $i++)
1310 {
3f3bd41e 1311 $inputname = "import_${i}";
03eb5209
DO
1312 if (!isset ($_REQUEST[$inputname]) or $_REQUEST[$inputname] != 'on')
1313 continue;
2c6c7645
DO
1314 assertIPv4Arg ("addr_${i}", __FUNCTION__);
1315 assertStringArg ("descr_${i}", __FUNCTION__, TRUE);
1316 assertStringArg ("rsvd_${i}", __FUNCTION__);
3f3bd41e
DO
1317 // Non-existent addresses will not have this argument set in request.
1318 $rsvd = 'no';
03eb5209
DO
1319 if ($_REQUEST["rsvd_${i}"] == 'yes')
1320 $rsvd = 'yes';
3f3bd41e 1321 if (updateAddress ($_REQUEST["addr_${i}"], $_REQUEST["descr_${i}"], $rsvd) == '')
03eb5209
DO
1322 $ngood++;
1323 else
1324 $nbad++;
1325 }
1326 if (!$nbad)
135080d8 1327 return buildRedirectURL (__FUNCTION__, 'OK', array ($ngood));
03eb5209 1328 else
135080d8 1329 return buildRedirectURL (__FUNCTION__, 'ERR', array ($nbad, $ngood));
03eb5209
DO
1330}
1331
b6a7d936
DO
1332$msgcode['generateAutoPorts']['OK'] = 21;
1333$msgcode['generateAutoPorts']['ERR'] = 142;
f3f0161f
DO
1334function generateAutoPorts ()
1335{
103b1e1e 1336 global $pageno;
2c6c7645 1337 assertUIntArg ('object_id', __FUNCTION__);
6297d584 1338 $info = spotEntity ('object', $_REQUEST['object_id']);
f3f0161f 1339 // Navigate away in case of success, stay at the place otherwise.
103b1e1e 1340 if (executeAutoPorts ($_REQUEST['object_id'], $info['objtype_id']))
135080d8 1341 return buildRedirectURL (__FUNCTION__, 'OK', array(), $pageno, 'ports');
f3f0161f 1342 else
135080d8 1343 return buildRedirectURL (__FUNCTION__, 'ERR');
f3f0161f
DO
1344}
1345
b6a7d936
DO
1346$msgcode['saveEntityTags']['OK'] = 22;
1347$msgcode['saveEntityTags']['ERR1'] = 143;
1348$msgcode['saveEntityTags']['ERR2'] = 187;
24cbe8af 1349// Filter out implicit tags before storing the new tag set.
3355ca56 1350function saveEntityTags ()
24cbe8af 1351{
eb27afad 1352 global $page, $pageno, $etype_by_pageno;
be2ae2a2 1353 if (!isset ($etype_by_pageno[$pageno]) or !isset ($page[$pageno]['bypass']))
9a61c175 1354 return buildRedirectURL (__FUNCTION__, 'ERR2', array (__FUNCTION__));
be2ae2a2 1355 $realm = $etype_by_pageno[$pageno];
3355ca56 1356 $bypass = $page[$pageno]['bypass'];
2c6c7645 1357 assertUIntArg ($bypass, __FUNCTION__);
2034d968 1358 $entity_id = $_REQUEST[$bypass];
e04931c8 1359 $taglist = isset ($_REQUEST['taglist']) ? $_REQUEST['taglist'] : array();
6e49bd1f 1360 // Build a chain from the submitted data, minimize it,
ab379543 1361 // then wipe existing records and store the new set instead.
01b6b4d6 1362 destroyTagsForEntity ($realm, $entity_id);
eb27afad
DO
1363 // TODO: these actions are very close to what rebuildTagChainForEntity() does,
1364 // so why not use it?
6e49bd1f 1365 $newchain = getExplicitTagsOnly (buildTagChainFromIds ($taglist));
ab379543 1366 $n_succeeds = $n_errors = 0;
6e49bd1f 1367 foreach ($newchain as $taginfo)
eb6ea26f 1368 if (addTagForEntity ($realm, $entity_id, $taginfo['id']))
ab379543
DO
1369 $n_succeeds++;
1370 else
1371 $n_errors++;
ab379543 1372 if ($n_errors)
9a61c175 1373 return buildRedirectURL (__FUNCTION__, 'ERR1', array ($n_succeeds, $n_errors));
ab379543 1374 else
135080d8 1375 return buildRedirectURL (__FUNCTION__, 'OK', array ($n_succeeds));
2034d968
DO
1376}
1377
b6a7d936
DO
1378$msgcode['destroyTag']['OK'] = 58;
1379$msgcode['destroyTag']['ERR1'] = 183;
1380$msgcode['destroyTag']['ERR2'] = 144;
fe7044ad
DO
1381function destroyTag ()
1382{
49fb1027 1383 assertUIntArg ('tag_id', __FUNCTION__);
c615a655
DO
1384 global $taglist;
1385 if (!isset ($taglist[$_REQUEST['tag_id']]))
1386 return buildRedirectURL (__FUNCTION__, 'ERR1', array ($_REQUEST['tag_id']));
49fb1027 1387 if (($ret = commitDestroyTag ($_REQUEST['tag_id'])) == '')
c615a655 1388 return buildRedirectURL (__FUNCTION__, 'OK', array ($taglist[$_REQUEST['tag_id']]['tag']));
fe7044ad 1389 else
c615a655 1390 return buildRedirectURL (__FUNCTION__, 'ERR2');
fe7044ad
DO
1391}
1392
b6a7d936
DO
1393$msgcode['createTag']['OK'] = 59;
1394$msgcode['createTag']['ERR1'] = 145;
1395$msgcode['createTag']['ERR3'] = 147;
fe7044ad
DO
1396function createTag ()
1397{
49fb1027 1398 assertStringArg ('tag_name', __FUNCTION__);
2c6c7645 1399 assertUIntArg ('parent_id', __FUNCTION__, TRUE);
49fb1027 1400 $tagname = trim ($_REQUEST['tag_name']);
2eeeca80 1401 if (!validTagName ($tagname))
135080d8 1402 return buildRedirectURL (__FUNCTION__, 'ERR1', array ($tagname));
fe7044ad
DO
1403 if (($parent_id = $_REQUEST['parent_id']) <= 0)
1404 $parent_id = 'NULL';
1405 if (($ret = commitCreateTag ($tagname, $parent_id)) == '')
135080d8 1406 return buildRedirectURL (__FUNCTION__, 'OK', array ($tagname));
fe7044ad 1407 else
135080d8 1408 return buildRedirectURL (__FUNCTION__, 'ERR3', array ($tagname, $ret));
fe7044ad
DO
1409}
1410
b6a7d936
DO
1411$msgcode['updateTag']['OK'] = 60;
1412$msgcode['updateTag']['ERR1'] = 145;
1413$msgcode['updateTag']['ERR2'] = 148;
49fb1027
DO
1414function updateTag ()
1415{
49fb1027
DO
1416 assertUIntArg ('tag_id', __FUNCTION__);
1417 assertUIntArg ('parent_id', __FUNCTION__, TRUE);
1418 assertStringArg ('tag_name', __FUNCTION__);
1419 $tagname = trim ($_REQUEST['tag_name']);
2eeeca80 1420 if (!validTagName ($tagname))
135080d8 1421 return buildRedirectURL (__FUNCTION__, 'ERR1', array ($tagname));
49fb1027
DO
1422 if (($parent_id = $_REQUEST['parent_id']) <= 0)
1423 $parent_id = 'NULL';
1424 if (($ret = commitUpdateTag ($_REQUEST['tag_id'], $tagname, $parent_id)) == '')
135080d8 1425 return buildRedirectURL (__FUNCTION__, 'OK', array ($tagname));
590e1281
DO
1426 // Use old name in the message, cause update failed.
1427 global $taglist;
1428 return buildRedirectURL (__FUNCTION__, 'ERR2', array ($taglist[$_REQUEST['tag_id']]['tag'], $ret));
49fb1027
DO
1429}
1430
b6a7d936
DO
1431$msgcode['rollTags']['OK'] = 67;
1432$msgcode['rollTags']['ERR'] = 149;
eb6ea26f
DO
1433function rollTags ()
1434{
eb6ea26f
DO
1435 assertUIntArg ('row_id', __FUNCTION__);
1436 assertStringArg ('sum', __FUNCTION__, TRUE);
1437 assertUIntArg ('realsum', __FUNCTION__);
eb6ea26f 1438 if ($_REQUEST['sum'] != $_REQUEST['realsum'])
135080d8 1439 return buildRedirectURL (__FUNCTION__, 'ERR');
abef7149
DO
1440 // Even if the user requested an empty tag list, don't bail out, but process existing
1441 // tag chains with "zero" extra. This will make sure, that the stuff processed will
1442 // have its chains refined to "normal" form.
1443 $extratags = isset ($_REQUEST['taglist']) ? $_REQUEST['taglist'] : array();
1444 $n_ok = 0;
1445 // Minimizing the extra chain early, so that tag rebuilder doesn't have to
1446 // filter out the same tag again and again. It will have own noise to cancel.
1447 $extrachain = getExplicitTagsOnly (buildTagChainFromIds ($extratags));
61a1d996 1448 foreach (listCells ('rack', $_REQUEST['row_id']) as $rack)
abef7149 1449 {
61a1d996 1450 if (rebuildTagChainForEntity ('rack', $rack['id'], $extrachain))
abef7149 1451 $n_ok++;
61a1d996
DO
1452 amplifyCell ($rack);
1453 foreach ($rack['mountedObjects'] as $object_id)
abef7149
DO
1454 if (rebuildTagChainForEntity ('object', $object_id, $extrachain))
1455 $n_ok++;
1456 }
135080d8 1457 return buildRedirectURL (__FUNCTION__, 'OK', array ($n_ok));
eb6ea26f
DO
1458}
1459
b6a7d936
DO
1460$msgcode['changeMyPassword']['OK'] = 61;
1461$msgcode['changeMyPassword']['ERR1'] = 150;
1462$msgcode['changeMyPassword']['ERR2'] = 151;
1463$msgcode['changeMyPassword']['ERR3'] = 152;
1464$msgcode['changeMyPassword']['ERR4'] = 153;
9457ca59 1465function changeMyPassword ()
cced6b7d 1466{
b82cce3f 1467 global $remote_username, $user_auth_src;
204284ba 1468 if ($user_auth_src != 'database')
135080d8 1469 return buildRedirectURL (__FUNCTION__, 'ERR1');
0ac7e4b3
DO
1470 assertStringArg ('oldpassword', __FUNCTION__);
1471 assertStringArg ('newpassword1', __FUNCTION__);
1472 assertStringArg ('newpassword2', __FUNCTION__);
b82cce3f 1473 $remote_userid = getUserIDByUsername ($remote_username);
0b2c74cb 1474 $userinfo = spotEntity ('user', $remote_userid);
b82cce3f 1475 if ($userinfo['user_password_hash'] != sha1 ($_REQUEST['oldpassword']))
135080d8 1476 return buildRedirectURL (__FUNCTION__, 'ERR2');
cced6b7d 1477 if ($_REQUEST['newpassword1'] != $_REQUEST['newpassword2'])
135080d8 1478 return buildRedirectURL (__FUNCTION__, 'ERR3');
b82cce3f 1479 if (commitUpdateUserAccount ($remote_userid, $userinfo['user_name'], $userinfo['user_realname'], sha1 ($_REQUEST['newpassword1'])))
135080d8 1480 return buildRedirectURL (__FUNCTION__, 'OK');
cced6b7d 1481 else
135080d8 1482 return buildRedirectURL (__FUNCTION__, 'ERR4');
cced6b7d
DO
1483}
1484
b6a7d936
DO
1485$msgcode['saveRackCode']['OK'] = 43;
1486$msgcode['saveRackCode']['ERR1'] = 154;
1487$msgcode['saveRackCode']['ERR2'] = 155;
cced6b7d
DO
1488function saveRackCode ()
1489{
cced6b7d 1490 assertStringArg ('rackcode');
e6a4adb9
DO
1491 // For the test to succeed, unescape LFs, strip CRs.
1492 $newcode = str_replace ('\r', '', str_replace ('\n', "\n", $_REQUEST['rackcode']));
cf25e649
DO
1493 $parseTree = getRackCode ($newcode);
1494 if ($parseTree['result'] != 'ACK')
135080d8 1495 return buildRedirectURL (__FUNCTION__, 'ERR1', array ($parseTree['load']));
4a6a28f1 1496 saveScript ('RackCodeCache', '');
cf25e649 1497 if (saveScript ('RackCode', $newcode))
135080d8 1498 return buildRedirectURL (__FUNCTION__, 'OK');
cced6b7d 1499 else
135080d8 1500 return buildRedirectURL (__FUNCTION__, 'ERR2');
cced6b7d
DO
1501}
1502
b6a7d936 1503$msgcode['setPortVLAN']['ERR1'] = 156;
46f92ff7
DO
1504// This handler's context is pre-built, but not authorized. It is assumed, that the
1505// handler will take existing context and before each commit check authorization
1506// on the base chain plus necessary context added.
1507function setPortVLAN ()
1508{
1509 assertUIntArg ('portcount', __FUNCTION__);
1510 $data = getSwitchVLANs ($_REQUEST['object_id']);
1511 if ($data === NULL)
135080d8 1512 return buildRedirectURL (__FUNCTION__, 'ERR1');
46f92ff7
DO
1513 list ($vlanlist, $portlist) = $data;
1514 // Here we just build up 1 set command for the gateway with all of the ports
1515 // included. The gateway is expected to filter unnecessary changes silently
1516 // and to provide a list of responses with either error or success message
1517 // for each of the rest.
1518 $nports = $_REQUEST['portcount'];
1519 $prefix = 'set ';
db55cf54 1520 $log = emptyLog();
46f92ff7
DO
1521 $setcmd = '';
1522 for ($i = 0; $i < $nports; $i++)
1523 if
1524 (
1525 !isset ($_REQUEST['portname_' . $i]) ||
1526 !isset ($_REQUEST['vlanid_' . $i]) ||
1527 $_REQUEST['portname_' . $i] != $portlist[$i]['portname']
1528 )
24dcb9d8 1529 $log['m'][] = array ('c' => 158, 'a' => array ($i));
46f92ff7
DO
1530 elseif
1531 (
1532 $_REQUEST['vlanid_' . $i] == $portlist[$i]['vlanid'] ||
1533 $portlist[$i]['vlaind'] == 'TRUNK'
1534 )
1535 continue;
1536 else
1537 {
1538 $portname = $_REQUEST['portname_' . $i];
1539 $oldvlanid = $portlist[$i]['vlanid'];
1540 $newvlanid = $_REQUEST['vlanid_' . $i];
1541 // Finish the security context and evaluate it.
1542 $annex = array();
1543 $annex[] = array ('tag' => '$fromvlan_' . $oldvlanid);
1544 $annex[] = array ('tag' => '$tovlan_' . $newvlanid);
1545 if (!permitted (NULL, NULL, NULL, $annex))
1546 {
24dcb9d8 1547 $log['m'][] = array ('c' => 159, 'a' => array ($portname, $oldvlanid, $newvlanid));
46f92ff7
DO
1548 continue;
1549 }
1550 $setcmd .= $prefix . $portname . '=' . $newvlanid;
1551 $prefix = ';';
1552 }
1553 // Feed the gateway and interpret its (non)response.
1554 if ($setcmd != '')
f0ff4930 1555 $log['m'] = array_merge ($log['m'], setSwitchVLANs ($_REQUEST['object_id'], $setcmd));
46f92ff7 1556 else
24dcb9d8 1557 $log['m'][] = array ('c' => 201);
46f92ff7
DO
1558 return buildWideRedirectURL ($log);
1559}
1560
2987fc1f
DO
1561function submitSLBConfig ()
1562{
1563 assertUIntArg ('object_id', __FUNCTION__);
1564 $newconfig = buildLVSConfig ($_REQUEST['object_id']);
ff0df5c3 1565 $msglog = gwSendFileToObject ($_REQUEST['object_id'], 'slbconfig', html_entity_decode ($newconfig, ENT_QUOTES, 'UTF-8'));
2987fc1f
DO
1566 return buildWideRedirectURL ($msglog);
1567}
1568
b6a7d936
DO
1569$msgcode['addRow']['OK'] = 74;
1570$msgcode['addRow']['ERR'] = 100;
345fd640
AD
1571function addRow ()
1572{
1573 assertStringArg ('name', __FUNCTION__);
1574
10bac82a 1575 if (commitAddRow ($_REQUEST['name']) === TRUE)
135080d8 1576 return buildRedirectURL (__FUNCTION__, 'OK', array ($_REQUEST['name']));
345fd640 1577 else
135080d8 1578 return buildRedirectURL (__FUNCTION__, 'ERR', array ($_REQUEST['name']));
345fd640
AD
1579}
1580
b6a7d936
DO
1581$msgcode['updateRow']['OK'] = 75;
1582$msgcode['updateRow']['ERR'] = 100;
345fd640
AD
1583function updateRow ()
1584{
1585 assertUIntArg ('row_id', __FUNCTION__);
1586 assertStringArg ('name', __FUNCTION__);
1587
10bac82a 1588 if (TRUE === commitUpdateRow ($_REQUEST['row_id'], $_REQUEST['name']))
135080d8 1589 return buildRedirectURL (__FUNCTION__, 'OK', array ($_REQUEST['name']));
345fd640 1590 else
135080d8 1591 return buildRedirectURL (__FUNCTION__, 'ERR', array ($_REQUEST['name']));
345fd640
AD
1592}
1593
b6a7d936
DO
1594$msgcode['deleteRow']['OK'] = 77;
1595$msgcode['deleteRow']['ERR'] = 100;
9f14a7ef
DY
1596function deleteRow ()
1597{
1598 assertUIntArg ('row_id', __FUNCTION__);
7be51fea 1599 $rowinfo = getRackRowInfo ($_REQUEST['row_id']);
9f14a7ef
DY
1600
1601 if (TRUE === commitDeleteRow ($_REQUEST['row_id']))
7be51fea 1602 return buildRedirectURL (__FUNCTION__, 'OK', array ($rowinfo['name']));
9f14a7ef 1603 else
7be51fea 1604 return buildRedirectURL (__FUNCTION__, 'ERR', array ($rowinfo['name']));
9f14a7ef
DY
1605}
1606
b6a7d936
DO
1607$msgcode['addRack']['OK'] = 65;
1608$msgcode['addRack']['ERR1'] = 171;
1609$msgcode['addRack']['ERR2'] = 172;
f19c75d6
DO
1610function addRack ()
1611{
1612 assertUIntArg ('row_id', __FUNCTION__);
1613 $taglist = isset ($_REQUEST['taglist']) ? $_REQUEST['taglist'] : array();
1614 if (isset ($_REQUEST['got_data']))
1615 {
1616 assertStringArg ('rack_name', __FUNCTION__);
1617 assertUIntArg ('rack_height1', __FUNCTION__);
1618 assertStringArg ('rack_comment', __FUNCTION__, TRUE);
1619
1620 if (commitAddRack ($_REQUEST['rack_name'], $_REQUEST['rack_height1'], $_REQUEST['row_id'], $_REQUEST['rack_comment'], $taglist) === TRUE)
135080d8 1621 return buildRedirectURL (__FUNCTION__, 'OK', array ($_REQUEST['rack_name']));
f19c75d6 1622 else
135080d8 1623 return buildRedirectURL (__FUNCTION__, 'ERR1', array ($_REQUEST['rack_name']));
f19c75d6
DO
1624 }
1625 elseif (isset ($_REQUEST['got_mdata']))
1626 {
1627 assertUIntArg ('rack_height2', __FUNCTION__);
1628 assertStringArg ('rack_names', __FUNCTION__, TRUE);
db55cf54 1629 $log = emptyLog();
f19c75d6
DO
1630 // copy-and-paste from renderAddMultipleObjectsForm()
1631 $names1 = explode ('\n', $_REQUEST['rack_names']);
1632 $names2 = array();
1633 foreach ($names1 as $line)
1634 {
1635 $parts = explode ('\r', $line);
1636 reset ($parts);
59a83bd8 1637 if (!strlen ($parts[0]))
f19c75d6
DO
1638 continue;
1639 else
1640 $names2[] = rtrim ($parts[0]);
1641 }
b3029d5c 1642 global $msgcode;
f19c75d6
DO
1643 foreach ($names2 as $cname)
1644 if (commitAddRack ($cname, $_REQUEST['rack_height2'], $_REQUEST['row_id'], '', $taglist) === TRUE)
b3029d5c 1645 $log['m'][] = array ('c' => $msgcode[__FUNCTION__]['OK'], 'a' => array ($cname));
f19c75d6 1646 else
b3029d5c 1647 $log['m'][] = array ('c' => $msgcode[__FUNCTION__]['ERR1'], 'a' => array ($cname));
f19c75d6
DO
1648 return buildWideRedirectURL ($log);
1649 }
1650 else
135080d8 1651 return buildRedirectURL (__FUNCTION__, 'ERR2');
f19c75d6
DO
1652}
1653
b6a7d936
DO
1654$msgcode['deleteRack']['OK'] = 79;
1655$msgcode['deleteRack']['ERR'] = 100;
1656$msgcode['deleteRack']['ERR1'] = 206;
c8187437
DY
1657function deleteRack ()
1658{
1659 assertUIntArg ('rack_id', __FUNCTION__);
61a1d996
DO
1660 if (NULL == ($rackData = spotEntity ('rack', $_REQUEST['rack_id'])))
1661 return buildRedirectURL (__FUNCTION__, 'ERR', array ('Rack not found'), 'rackspace', 'default');
1662 amplifyCell ($rackData);
1663 if (count ($rackData['mountedObjects']))
c8187437 1664 return buildRedirectURL (__FUNCTION__, 'ERR1');
61a1d996
DO
1665 if (TRUE !== commitDeleteRack ($_REQUEST['rack_id']))
1666 return buildRedirectURL (__FUNCTION__, 'ERR', array(), 'rackspace', 'default');
1667 return buildRedirectURL (__FUNCTION__, 'OK', array ($rackData['name']), 'rackspace', 'default');
c8187437
DY
1668}
1669
b6a7d936
DO
1670$msgcode['updateRack']['OK'] = 68;
1671$msgcode['updateRack']['ERR'] = 177;
7056988c
DO
1672function updateRack ()
1673{
7056988c
DO
1674 assertUIntArg ('rack_id', __FUNCTION__);
1675 assertUIntArg ('rack_row_id', __FUNCTION__);
1676 assertUIntArg ('rack_height', __FUNCTION__);
1677 assertStringArg ('rack_name', __FUNCTION__);
1678 assertStringArg ('rack_comment', __FUNCTION__, TRUE);
7056988c 1679
7056988c 1680 resetThumbCache ($_REQUEST['rack_id']);
0c2b7c4a 1681 if (TRUE === commitUpdateRack ($_REQUEST['rack_id'], $_REQUEST['rack_name'], $_REQUEST['rack_height'], $_REQUEST['rack_row_id'], $_REQUEST['rack_comment']))
135080d8 1682 return buildRedirectURL (__FUNCTION__, 'OK', array ($_REQUEST['rack_name']));
0c2b7c4a 1683 else
135080d8 1684 return buildRedirectURL (__FUNCTION__, 'ERR');
7056988c
DO
1685}
1686
61a1d996 1687$msgcode['updateRackDesign']['ERR'] = 100;
4fbb5a00
DY
1688function updateRackDesign ()
1689{
1690 assertUIntArg ('rack_id', __FUNCTION__);
61a1d996
DO
1691 if (NULL == ($rackData = spotEntity ('rack', $_REQUEST['rack_id'])))
1692 return buildRedirectURL (__FUNCTION__, 'ERR', array ('Rack not found'), 'rackspace', 'default');
1693 amplifyCell ($rackData);
4fbb5a00
DY
1694 applyRackDesignMask($rackData);
1695 markupObjectProblems ($rackData);
1696 $response = processGridForm ($rackData, 'A', 'F');
51690ad4 1697 return buildWideRedirectURL (array($response));
4fbb5a00
DY
1698}
1699
61a1d996 1700$msgcode['updateRackProblems']['ERR'] = 100;
4fbb5a00
DY
1701function updateRackProblems ()
1702{
1703 assertUIntArg ('rack_id', __FUNCTION__);
61a1d996
DO
1704 if (NULL == ($rackData = spotEntity ('rack', $_REQUEST['rack_id'])))
1705 return buildRedirectURL (__FUNCTION__, 'ERR', array ('Rack not found'), 'rackspace', 'default');
1706 amplifyCell ($rackData);
4fbb5a00
DY
1707 applyRackProblemMask($rackData);
1708 markupObjectProblems ($rackData);
1709 $response = processGridForm ($rackData, 'F', 'U');
51690ad4 1710 return buildWideRedirectURL (array($response));
4fbb5a00
DY
1711}
1712
7056988c
DO
1713function querySNMPData ()
1714{
1715 assertUIntArg ('object_id', __FUNCTION__);
1716 assertStringArg ('community', __FUNCTION__);
8536e20a 1717 return doSNMPmining ($_REQUEST['object_id'], $_REQUEST['community']);
7056988c
DO
1718}
1719
b6a7d936
DO
1720$msgcode['addFileWithoutLink']['OK'] = 69;
1721$msgcode['addFileWithoutLink']['ERR'] = 100;
e1ae3fb4
AD
1722// File-related functions
1723function addFileWithoutLink ()
1724{
1725 assertStringArg ('comment', __FUNCTION__, TRUE);
1726
1727 // Make sure the file can be uploaded
1728 if (get_cfg_var('file_uploads') != 1)
135080d8 1729 return buildRedirectURL (__FUNCTION__, 'ERR', array ("file uploads not allowed, change 'file_uploads' parameter in php.ini"));
e1ae3fb4
AD
1730
1731 $fp = fopen($_FILES['file']['tmp_name'], 'rb');
4bb95650
DO
1732 global $sic;
1733 // commitAddFile() uses prepared statements
1734 $error = commitAddFile ($_FILES['file']['name'], $_FILES['file']['type'], $_FILES['file']['size'], $fp, $sic['comment']);
f857f71f
DO
1735 if (isset ($_REQUEST['taglist']))
1736 produceTagsForLastRecord ('file', $_REQUEST['taglist']);
e1ae3fb4
AD
1737
1738 if ($error != '')
135080d8 1739 return buildRedirectURL (__FUNCTION__, 'ERR', array ($error));
e1ae3fb4 1740
135080d8 1741 return buildRedirectURL (__FUNCTION__, 'OK', array ($_FILES['file']['name']));
e1ae3fb4
AD
1742}
1743
b6a7d936
DO
1744$msgcode['addFileToEntity']['OK'] = 69;
1745$msgcode['addFileToEntity']['ERR1'] = 187;
1746$msgcode['addFileToEntity']['ERR2'] = 181;
1747$msgcode['addFileToEntity']['ERR3'] = 182;
e1ae3fb4
AD
1748function addFileToEntity ()
1749{
9a61c175
DO
1750 global $page, $pageno, $etype_by_pageno;
1751 if (!isset ($etype_by_pageno[$pageno]) or !isset ($page[$pageno]['bypass']))
1752 return buildRedirectURL (__FUNCTION__, 'ERR1', array (__FUNCTION__));
1753 $realm = $etype_by_pageno[$pageno];
1754 $bypass = $page[$pageno]['bypass'];
1755 assertUIntArg ($bypass, __FUNCTION__);
1756 $entity_id = $_REQUEST[$bypass];
e1ae3fb4 1757 assertStringArg ('comment', __FUNCTION__, TRUE);
e1ae3fb4
AD
1758
1759 // Make sure the file can be uploaded
1760 if (get_cfg_var('file_uploads') != 1)
9a61c175 1761 return buildRedirectURL (__FUNCTION__, 'ERR2');
e1ae3fb4
AD
1762
1763 $fp = fopen($_FILES['file']['tmp_name'], 'rb');
4bb95650
DO
1764 global $sic;
1765 // commitAddFile() uses prepared statements
1766 $error = commitAddFile ($_FILES['file']['name'], $_FILES['file']['type'], $_FILES['file']['size'], $fp, $sic['comment']);
e1ae3fb4 1767 if ($error != '')
9a61c175 1768 return buildRedirectURL (__FUNCTION__, 'ERR3', array ($error));
e1ae3fb4 1769
9a61c175 1770 $error = commitLinkFile (lastInsertID(), $realm, $entity_id);
e1ae3fb4 1771 if ($error != '')
9a61c175 1772 return buildRedirectURL (__FUNCTION__, 'ERR3', array ($error));
e1ae3fb4 1773
135080d8 1774 return buildRedirectURL (__FUNCTION__, 'OK', array ($_FILES['file']['name']));
e1ae3fb4
AD
1775}
1776
b6a7d936
DO
1777$msgcode['linkFileToEntity']['OK'] = 71;
1778$msgcode['linkFileToEntity']['ERR1'] = 178;
1779$msgcode['linkFileToEntity']['ERR2'] = 100;
e1ae3fb4
AD
1780function linkFileToEntity ()
1781{
e1ae3fb4 1782 assertUIntArg ('file_id', __FUNCTION__);
482c7f35 1783 global $page, $pageno, $etype_by_pageno;
121496b6
DO
1784 $entity_type = $etype_by_pageno[$pageno];
1785 $bypass_name = $page[$pageno]['bypass'];
1786 assertUIntArg ($bypass_name, __FUNCTION__);
1787
d3b5008b 1788 $fi = spotEntity ('file', $_REQUEST['file_id']);
121496b6 1789 if ($fi === NULL)
135080d8 1790 return buildRedirectURL (__FUNCTION__, 'ERR1'); // file not found
121496b6 1791 $error = commitLinkFile ($_REQUEST['file_id'], $entity_type, $_REQUEST[$bypass_name]);
e1ae3fb4 1792 if ($error != '')
135080d8 1793 return buildRedirectURL (__FUNCTION__, 'ERR2', array ($error)); // linking failed
e1ae3fb4 1794
135080d8 1795 return buildRedirectURL (__FUNCTION__, 'OK', array ($fi['name']));
e1ae3fb4
AD
1796}
1797
b6a7d936
DO
1798$msgcode['replaceFile']['OK'] = 70;
1799$msgcode['replaceFile']['ERR1'] = 181;
1800$msgcode['replaceFile']['ERR2'] = 207;
1801$msgcode['replaceFile']['ERR3'] = 182;
fd1fb420
AD
1802function replaceFile ()
1803{
db55cf54 1804 global $sic;
fd1fb420
AD
1805 assertUIntArg ('file_id', __FUNCTION__);
1806
1807 // Make sure the file can be uploaded
1808 if (get_cfg_var('file_uploads') != 1)
db55cf54 1809 return buildRedirectURL (__FUNCTION__, 'ERR1');
d3b5008b 1810 $shortInfo = spotEntity ('file', $sic['file_id']);
fd1fb420
AD
1811
1812 $fp = fopen($_FILES['file']['tmp_name'], 'rb');
db55cf54
DO
1813 if ($fp === FALSE)
1814 return buildRedirectURL (__FUNCTION__, 'ERR2');
f8874cdb 1815 $error = commitReplaceFile ($sic['file_id'], $fp);
fd1fb420 1816 if ($error != '')
db55cf54 1817 return buildRedirectURL (__FUNCTION__, 'ERR3', array ($error));
fd1fb420 1818
db55cf54 1819 return buildRedirectURL (__FUNCTION__, 'OK', array (htmlspecialchars ($shortInfo['name'])));
fd1fb420
AD
1820}
1821
b6a7d936
DO
1822$msgcode['updateFile']['OK'] = 70;
1823$msgcode['updateFile']['ERR'] = 100;
e1ae3fb4
AD
1824function updateFile ()
1825{
1826 assertUIntArg ('file_id', __FUNCTION__);
9db67d95
DO
1827 assertStringArg ('file_name', __FUNCTION__);
1828 assertStringArg ('file_type', __FUNCTION__);
1829 assertStringArg ('file_comment', __FUNCTION__, TRUE);
f3d274bf
DO
1830 // prepared statement params below
1831 global $sic;
1832 $error = commitUpdateFile ($sic['file_id'], $sic['file_name'], $sic['file_type'], $sic['file_comment']);
e1ae3fb4 1833 if ($error != '')
135080d8 1834 return buildRedirectURL (__FUNCTION__, 'ERR', array ($error));
e1ae3fb4 1835
135080d8 1836 return buildRedirectURL (__FUNCTION__, 'OK', array ($_REQUEST['name']));
e1ae3fb4
AD
1837}
1838
b6a7d936
DO
1839$msgcode['unlinkFile']['OK'] = 72;
1840$msgcode['unlinkFile']['ERR'] = 182;
e1ae3fb4
AD
1841function unlinkFile ()
1842{
1843 assertUIntArg ('link_id', __FUNCTION__);
1844 $error = commitUnlinkFile ($_REQUEST['link_id']);
1845
1846 if ($error != '')
135080d8 1847 return buildRedirectURL (__FUNCTION__, 'ERR', array ($error));
e1ae3fb4 1848
8bc5d1e4 1849 return buildRedirectURL (__FUNCTION__, 'OK');
e1ae3fb4
AD
1850}
1851
b6a7d936
DO
1852$msgcode['deleteFile']['OK'] = 73;
1853$msgcode['deleteFile']['ERR'] = 100;
e1ae3fb4
AD
1854function deleteFile ()
1855{
1856 assertUIntArg ('file_id', __FUNCTION__);
d3b5008b 1857 $shortInfo = spotEntity ('file', $_REQUEST['file_id']);
e1ae3fb4
AD
1858 $error = commitDeleteFile ($_REQUEST['file_id']);
1859
1860 if ($error != '')
135080d8 1861 return buildRedirectURL (__FUNCTION__, 'ERR', array ($error));
e1ae3fb4 1862
f8874cdb 1863 return buildRedirectURL (__FUNCTION__, 'OK', array (htmlspecialchars ($shortInfo['name'])));
e1ae3fb4
AD
1864}
1865
b6a7d936
DO
1866$msgcode['updateFileText']['OK'] = 78;
1867$msgcode['updateFileText']['ERR1'] = 179;
1868$msgcode['updateFileText']['ERR2'] = 180;
8628ae44
DO
1869function updateFileText ()
1870{
1871 assertUIntArg ('file_id', __FUNCTION__);
70cb9b56 1872 assertStringArg ('mtime_copy', __FUNCTION__);
8628ae44 1873 assertStringArg ('file_text', __FUNCTION__, TRUE); // it's Ok to save empty
d3b5008b 1874 $shortInfo = spotEntity ('file', $_REQUEST['file_id']);
70cb9b56
DO
1875 if ($shortInfo['mtime'] != $_REQUEST['mtime_copy'])
1876 return buildRedirectURL (__FUNCTION__, 'ERR1');
f8874cdb
DO
1877 global $sic;
1878 $error = commitReplaceFile ($sic['file_id'], $sic['file_text']);
8628ae44 1879 if ($error == '')
f8874cdb 1880 return buildRedirectURL (__FUNCTION__, 'OK', array (htmlspecialchars ($shortInfo['name'])));
70cb9b56 1881 return buildRedirectURL (__FUNCTION__, 'ERR2');
8628ae44
DO
1882}
1883
2dfa1b73
DO
1884$msgcode['addPortInterfaceCompat']['OK'] = 48;
1885$msgcode['addPortInterfaceCompat']['ERR'] = 110;
1886function addPortInterfaceCompat ()
1887{
1888 assertUIntArg ('iif_id', __FUNCTION__);
1889 assertUIntArg ('oif_id', __FUNCTION__);
1890 if (commitSupplementPIC ($_REQUEST['iif_id'], $_REQUEST['oif_id']))
1891 return buildRedirectURL (__FUNCTION__, 'OK');
1892 return buildRedirectURL (__FUNCTION__, 'ERR');
1893}
1894
1895$msgcode['delPortInterfaceCompat']['OK'] = 49;
1896$msgcode['delPortInterfaceCompat']['ERR'] = 111;
1897function delPortInterfaceCompat ()
1898{
1899 assertUIntArg ('iif_id', __FUNCTION__);
1900 assertUIntArg ('oif_id', __FUNCTION__);
1901 if (commitReducePIC ($_REQUEST['iif_id'], $_REQUEST['oif_id']))
1902 return buildRedirectURL (__FUNCTION__, 'OK');
1903 return buildRedirectURL (__FUNCTION__, 'ERR');
1904}
1905
2400d7ec
DO
1906$ifcompatpack = array
1907(
1908 '1000cwdm80' => array (1209, 1210, 1211, 1212, 1213, 1214, 1215, 1216),
1909 '1000dwdm80' => array // ITU channels 20~61
1910 (
1911 1217, 1218, 1219, 1220, 1221, 1222, 1223, 1224, 1225, 1226,
1912 1227, 1228, 1229, 1230, 1231, 1232, 1233, 1234, 1235, 1236,
1913 1237, 1238, 1239, 1240, 1241, 1242, 1243, 1244, 1245, 1246,
1914 1247, 1248, 1249, 1250, 1251, 1252, 1253, 1254, 1255, 1256,
1915 1257, 1258
1916 ),
1917 '10000dwdm80' => array // same channels for 10GE
1918 (
1919 1259, 1260, 1261, 1262, 1263, 1264, 1265, 1266, 1267, 1268,
1920 1269, 1270, 1271, 1272, 1273, 1274, 1275, 1276, 1277, 1278,
1921 1279, 1280, 1281, 1282, 1283, 1284, 1285, 1286, 1287, 1288,
1922 1289, 1290, 1291, 1292, 1293, 1294, 1295, 1296, 1297, 1298,
1923 1299, 1300
1924 ),
1925);
1926
3d9ac3d4
DO
1927$msgcode['addPortInterfaceCompatPack']['OK'] = 44;
1928$msgcode['addPortInterfaceCompatPack']['ERR'] = 123;
2400d7ec
DO
1929function addPortInterfaceCompatPack ()
1930{
3d9ac3d4
DO
1931 assertStringArg ('standard', __FUNCTION__);
1932 assertUIntArg ('iif_id', __FUNCTION__);
1933 global $ifcompatpack;
1934 if (!array_key_exists ($_REQUEST['standard'], $ifcompatpack) or !array_key_exists ($_REQUEST['iif_id'], getPortIIFOptions()))
1935 return buildRedirectURL (__FUNCTION__, 'ERR');
1936 $ngood = $nbad = 0;
1937 foreach ($ifcompatpack[$_REQUEST['standard']] as $oif_id)
1938 if (commitSupplementPIC ($_REQUEST['iif_id'], $oif_id))
1939 $ngood++;
1940 else
1941 $nbad++;
1942 return buildRedirectURL (__FUNCTION__, 'OK', array ($nbad, $ngood));
2400d7ec
DO
1943}
1944
3d9ac3d4
DO
1945$msgcode['delPortInterfaceCompatPack']['OK'] = 44;
1946$msgcode['delPortInterfaceCompatPack']['ERR'] = 123;
2400d7ec
DO
1947function delPortInterfaceCompatPack ()
1948{
3d9ac3d4
DO
1949 assertStringArg ('standard', __FUNCTION__);
1950 assertUIntArg ('iif_id', __FUNCTION__);
1951 global $ifcompatpack;
1952 if (!array_key_exists ($_REQUEST['standard'], $ifcompatpack) or !array_key_exists ($_REQUEST['iif_id'], getPortIIFOptions()))
1953 return buildRedirectURL (__FUNCTION__, 'ERR');
1954 $ngood = $nbad = 0;
1955 foreach ($ifcompatpack[$_REQUEST['standard']] as $oif_id)
1956 if (commitReducePIC ($_REQUEST['iif_id'], $oif_id))
1957 $ngood++;
1958 else
1959 $nbad++;
1960 return buildRedirectURL (__FUNCTION__, 'OK', array ($nbad, $ngood));
2400d7ec
DO
1961}
1962
e673ee24 1963?>