r2570 - getNarrowObjectList(): accept a list of types instead of one type; escape...
[racktables] / inc / interface.php
CommitLineData
b325120a 1<?php
e673ee24
DO
2/*
3*
4* This file contains frontend functions for RackTables.
5*
6*/
7
9c0b0016
DO
8// Interface function's special.
9$nextorder['odd'] = 'even';
10$nextorder['even'] = 'odd';
11
52c836b1
DO
12// address allocation type
13$aat = array
14(
15 'regular' => 'Connected',
16 'virtual' => 'Loopback',
17 'shared' => 'Shared',
18 'router' => 'Router',
19);
beb9e88a 20// address allocation code, IPv4 addresses and objects view
52c836b1
DO
21$aac = array
22(
23 'regular' => '',
24 'virtual' => '<strong>L</strong>',
25 'shared' => '<strong>S</strong>',
26 'router' => '<strong>R</strong>',
27);
beb9e88a
DO
28// address allocation code, IPv4 networks view
29$aac2 = array
30(
31 'regular' => '',
32 'virtual' => '<strong>L:</strong>',
29025f8e 33 'shared' => '<strong>S:</strong>',
beb9e88a
DO
34 'router' => '<strong>R:</strong>',
35);
52c836b1 36
7056988c
DO
37// Let's have it here, so extensions can add their own images.
38$image = array();
39$image['error']['path'] = 'pix/error.png';
40$image['error']['width'] = 76;
41$image['error']['height'] = 17;
42$image['logo']['path'] = 'pix/defaultlogo.png';
43$image['logo']['width'] = 210;
44$image['logo']['height'] = 40;
45$image['rackspace']['path'] = 'pix/racks.png';
46$image['rackspace']['width'] = 218;
47$image['rackspace']['height'] = 200;
48$image['objects']['path'] = 'pix/server.png';
49$image['objects']['width'] = 218;
50$image['objects']['height'] = 200;
e1ae3fb4
AD
51$image['files']['path'] = 'pix/files.png';
52$image['files']['width'] = 218;
53$image['files']['height'] = 200;
7056988c
DO
54$image['ipv4space']['path'] = 'pix/addressspace.png';
55$image['ipv4space']['width'] = 218;
56$image['ipv4space']['height'] = 200;
57$image['ipv4slb']['path'] = 'pix/slb.png';
58$image['ipv4slb']['width'] = 218;
59$image['ipv4slb']['height'] = 200;
60$image['config']['path'] = 'pix/configuration.png';
61$image['config']['width'] = 218;
62$image['config']['height'] = 200;
63$image['reports']['path'] = 'pix/report.png';
64$image['reports']['width'] = 218;
65$image['reports']['height'] = 200;
e1ae3fb4
AD
66$image['download']['path'] = 'pix/download.png';
67$image['download']['width'] = 16;
68$image['download']['height'] = 16;
08cd1902
AD
69$image['DOWNLOAD']['path'] = 'pix/download-big.png';
70$image['DOWNLOAD']['width'] = 32;
71$image['DOWNLOAD']['height'] = 32;
5ccd99a0
DO
72$image['plug']['path'] = 'pix/tango-network-wired.png';
73$image['plug']['width'] = 16;
74$image['plug']['height'] = 16;
75$image['cut']['path'] = 'pix/tango-edit-cut-16x16.png';
76$image['cut']['width'] = 16;
77$image['cut']['height'] = 16;
78$image['CUT']['path'] = 'pix/tango-edit-cut-32x32.png';
79$image['CUT']['width'] = 32;
80$image['CUT']['height'] = 32;
7056988c
DO
81$image['add']['path'] = 'pix/tango-list-add.png';
82$image['add']['width'] = 16;
83$image['add']['height'] = 16;
a685a26a
DO
84$image['ADD']['path'] = 'pix/tango-list-add-big.png';
85$image['ADD']['width'] = 32;
86$image['ADD']['height'] = 32;
7056988c
DO
87$image['delete']['path'] = 'pix/tango-list-remove.png';
88$image['delete']['width'] = 16;
89$image['delete']['height'] = 16;
d3c27c5c 90$image['destroy']['path'] = 'pix/tango-user-trash-16x16.png';
1bdc2bfc
DO
91$image['destroy']['width'] = 16;
92$image['destroy']['height'] = 16;
d3c27c5c 93$image['nodestroy']['path'] = 'pix/tango-user-trash-16x16-gray.png';
1bdc2bfc
DO
94$image['nodestroy']['width'] = 16;
95$image['nodestroy']['height'] = 16;
d3c27c5c 96$image['DESTROY']['path'] = 'pix/tango-user-trash-32x32.png';
97b1f33b
DO
97$image['DESTROY']['width'] = 32;
98$image['DESTROY']['height'] = 32;
7056988c
DO
99$image['nodelete']['path'] = 'pix/tango-list-remove-shadow.png';
100$image['nodelete']['width'] = 16;
101$image['nodelete']['height'] = 16;
7056988c
DO
102$image['inservice']['path'] = 'pix/tango-emblem-system.png';
103$image['inservice']['width'] = 16;
104$image['inservice']['height'] = 16;
105$image['notinservice']['path'] = 'pix/tango-dialog-error.png';
106$image['notinservice']['width'] = 16;
107$image['notinservice']['height'] = 16;
7056988c
DO
108$image['find']['path'] = 'pix/tango-system-search.png';
109$image['find']['width'] = 16;
110$image['find']['height'] = 16;
7056988c
DO
111$image['next']['path'] = 'pix/tango-go-next.png';
112$image['next']['width'] = 32;
113$image['next']['height'] = 32;
114$image['prev']['path'] = 'pix/tango-go-previous.png';
115$image['prev']['width'] = 32;
116$image['prev']['height'] = 32;
117$image['clear']['path'] = 'pix/tango-edit-clear.png';
118$image['clear']['width'] = 16;
119$image['clear']['height'] = 16;
61a61189
DO
120$image['CLEAR']['path'] = 'pix/tango-edit-clear-big.png';
121$image['CLEAR']['width'] = 32;
122$image['CLEAR']['height'] = 32;
f3d274bf
DO
123$image['CLEAR gray']['path'] = 'pix/tango-edit-clear-gray-32x32.png';
124$image['CLEAR gray']['width'] = 32;
125$image['CLEAR gray']['height'] = 32;
7056988c
DO
126$image['save']['path'] = 'pix/tango-document-save.png';
127$image['save']['width'] = 16;
128$image['save']['height'] = 16;
129$image['SAVE']['path'] = 'pix/tango-document-save-big.png';
130$image['SAVE']['width'] = 32;
131$image['SAVE']['height'] = 32;
132$image['create']['path'] = 'pix/tango-document-new.png';
133$image['create']['width'] = 16;
134$image['create']['height'] = 16;
135$image['CREATE']['path'] = 'pix/tango-document-new-big.png';
136$image['CREATE']['width'] = 32;
137$image['CREATE']['height'] = 32;
138$image['DENIED']['path'] = 'pix/tango-dialog-error-big.png';
139$image['DENIED']['width'] = 32;
140$image['DENIED']['height'] = 32;
d28d7f4d
DO
141$image['apply']['path'] = 'pix/tango-emblem-system.png';
142$image['apply']['width'] = 16;
143$image['apply']['height'] = 16;
737a3f72
DO
144$image['node-collapsed']['path'] = 'pix/node-collapsed.png';
145$image['node-collapsed']['width'] = 16;
146$image['node-collapsed']['height'] = 16;
147$image['node-expanded']['path'] = 'pix/node-expanded.png';
148$image['node-expanded']['width'] = 16;
149$image['node-expanded']['height'] = 16;
fec0c8da
DO
150$image['node-expanded-static']['path'] = 'pix/node-expanded-static.png';
151$image['node-expanded-static']['width'] = 16;
152$image['node-expanded-static']['height'] = 16;
09620506
DO
153$image['dragons']['path'] = 'pix/mitsudragon.png';
154$image['dragons']['width'] = 125;
155$image['dragons']['height'] = 21;
b1a970c7
DO
156$image['LB']['path'] = 'pix/loadbalancer.png';
157$image['LB']['width'] = 32;
158$image['LB']['height'] = 32;
159$image['RS pool']['path'] = 'pix/serverpool.png';
160$image['RS pool']['width'] = 48;
161$image['RS pool']['height'] = 16;
162$image['VS']['path'] = 'pix/servicesign.png';
163$image['VS']['width'] = 39;
164$image['VS']['height'] = 62;
8b3874a5
DO
165$image['router']['path'] = 'pix/router.png';
166$image['router']['width'] = 32;
167$image['router']['height'] = 32;
0b9c98d7
DO
168$image['ATTACH']['path'] = 'pix/crystal-attach-32x32.png';
169$image['ATTACH']['width'] = 32;
170$image['ATTACH']['height'] = 32;
7a0f5847
DO
171$image['favorite']['path'] = 'pix/tango-emblem-favorite.png';
172$image['favorite']['width'] = 16;
173$image['favorite']['height'] = 16;
4f12d88f
DO
174$image['computer']['path'] = 'pix/tango-computer.png';
175$image['computer']['width'] = 16;
176$image['computer']['height'] = 16;
0b9c98d7
DO
177$image['empty file']['path'] = 'pix/crystal-file-empty-32x32.png';
178$image['empty file']['width'] = 32;
179$image['empty file']['height'] = 32;
180$image['text file']['path'] = 'pix/crystal-file-text-32x32.png';
181$image['text file']['width'] = 32;
182$image['text file']['height'] = 32;
183$image['image file']['path'] = 'pix/crystal-file-image-32x32.png';
184$image['image file']['width'] = 32;
185$image['image file']['height'] = 32;
186$image['NET']['path'] = 'pix/crystal-network-32x32.png';
187$image['NET']['width'] = 32;
188$image['NET']['height'] = 32;
19dac9c3
DO
189$image['USER']['path'] = 'pix/crystal-edit-user-32x32.png';
190$image['USER']['width'] = 32;
191$image['USER']['height'] = 32;
7056988c 192
e5c4506d
DO
193// This may be populated later onsite, report rendering function will use it.
194// See the $systemreport for structure.
195$localreports = array();
9db67d95
DO
196$CodePressMap = array
197(
198 'sql' => 'sql',
199 'php' => 'php',
200 'html' => 'html',
201 'css' => 'css',
202 'js' => 'javascript',
203);
e5c4506d 204
8d4f7d18
DO
205$attrtypes = array
206(
207 'uint' => '[U] unsigned integer',
208 'float' => '[F] floating point',
209 'string' => '[S] string',
210 'dict' => '[D] dictionary record'
211);
212
e673ee24
DO
213// Main menu.
214function renderIndex ()
215{
216 global $root;
217?>
218<table border=0 cellpadding=0 cellspacing=0 width='100%'>
219 <tr>
220 <td>
221 <div style='text-align: center; margin: 10px; '>
222 <table width='100%' cellspacing=0 cellpadding=30 class=mainmenu border=0>
223 <tr>
224 <td>
4fbb5a00 225 <h1><a href='<?php echo makeHref(array('page'=>'rackspace')) ?>'>Rackspace<br>
b325120a 226 <?php printImageHREF ('rackspace'); ?></a></h1>
e673ee24
DO
227 </td>
228 <td>
4fbb5a00 229 <h1><a href='<?php echo makeHref(array('page'=>'objects')) ?>'>Objects<br>
b325120a 230 <?php printImageHREF ('objects'); ?></a></h1>
e673ee24 231 </td>
e673ee24 232 <td>
4fbb5a00 233 <h1><a href='<?php echo makeHref(array('page'=>'ipv4space')) ?>'>IPv4 space<br>
e1ae3fb4 234 <?php printImageHREF ('ipv4space'); ?></a></h1>
e673ee24
DO
235 </td>
236 <td>
4fbb5a00 237 <h1><a href='<?php echo makeHref(array('page'=>'files')) ?>'>Files<br>
e1ae3fb4 238 <?php printImageHREF ('files'); ?></a></h1>
e673ee24 239 </td>
e1ae3fb4 240 </tr>
e1ae3fb4 241 <tr>
ae545907 242 <td>
4fbb5a00 243 <h1><a href='<?php echo makeHref(array('page'=>'config')) ?>'>Configuration<br>
f4d879a9 244 <?php printImageHREF ('config'); ?></a></h1>
ae545907 245 </td>
e1ae3fb4 246 <td>
4fbb5a00 247 <h1><a href='<?php echo makeHref(array('page'=>'reports')) ?>'>Reports<br>
f4d879a9 248 <?php printImageHREF ('reports'); ?></a></h1>
e1ae3fb4
AD
249 </td>
250 <td>
4fbb5a00 251 <h1><a href='<?php echo makeHref(array('page'=>'ipv4slb')) ?>'>IPv4 SLB<br>
f4d879a9 252 <?php printImageHREF ('ipv4slb'); ?></a></h1>
e1ae3fb4 253 </td>
f4d879a9 254 <td>&nbsp;</td>
e673ee24
DO
255 </tr>
256 </table>
257 </div>
258 </td>
259 </tr>
260</table>
b325120a 261<?php
e673ee24
DO
262}
263
264function renderRackspace ()
265{
932cf41f 266 $tagfilter = getTagFilter();
094a8e6e 267 $tagfilter_str = getTagFilterStr ($tagfilter);
c8187437 268 showMessageOrError();
489a7502
DO
269 echo "<table class=objview border=0 width='100%'><tr><td class=pcleft>";
270 renderTagFilterPortlet ($tagfilter, 'rack');
271 echo '</td><td class=pcright>';
272 echo '<table border=0 cellpadding=10 cellpadding=1>';
e673ee24 273 // generate thumb gallery
489a7502 274 $rackrowList = getRackspace ($tagfilter);
4fbb5a00 275 global $nextorder;
d5157018 276 $rackwidth = getRackImageWidth();
e673ee24
DO
277 $order = 'odd';
278 foreach ($rackrowList as $rackrow)
279 {
84466afa 280 echo "<tr class=row_${order}><th class=tdleft>";
4fbb5a00 281 echo "<a href='".makeHref(array('page'=>'row', 'row_id'=>$rackrow['row_id']))."${tagfilter_str}'>";
a0d54e7e
DO
282 echo "${rackrow['row_name']}</a></th>";
283 $rackList = getRacksForRow ($rackrow['row_id'], $tagfilter);
e673ee24 284 echo "<td><table border=0 cellspacing=5><tr>";
64b95774 285 foreach ($rackList as $rack)
e673ee24 286 {
4fbb5a00 287 echo "<td align=center><a href='".makeHref(array('page'=>'rack', 'rack_id'=>$rack['id']))."'>";
e673ee24 288 echo "<img border=0 width=${rackwidth} height=";
d5157018 289 echo getRackImageHeight ($rack['height']);
e673ee24 290 echo " title='${rack['height']} units'";
d2ec5490 291 echo "src='render_image.php?img=minirack&rack_id=${rack['id']}'>";
e673ee24
DO
292 echo "<br>${rack['name']}</a></td>";
293 }
294 echo "</tr></table></tr>\n";
295 $order = $nextorder[$order];
296 }
297 echo "</table>\n";
489a7502 298 echo "</td></tr></table>\n";
e673ee24
DO
299}
300
345fd640
AD
301function renderRackspaceRowEditor ()
302{
303 function printNewItemTR ()
304 {
305 printOpFormIntro ('addRow');
306 echo "<tr><td><input type=text name=name tabindex=100></td><td>";
307 printImageHREF ('create', 'Add new row', TRUE, 101);
9f14a7ef 308 echo "</td><td></td></tr></form>";
345fd640 309 }
4fbb5a00 310 global $pageno, $tabno;
345fd640
AD
311 startPortlet ('Rows');
312 showMessageOrError();
313 echo "<table border=0 cellspacing=0 cellpadding=5 align=center class=widetable>\n";
314 echo "<tr><th>Name</th></tr>\n";
315 if (getConfigVar ('ADDNEW_AT_TOP') == 'yes')
316 printNewItemTR();
317 $rackrowList = getRackspace ();
318 foreach ($rackrowList as $rackrow)
319 {
320 printOpFormIntro ('updateRow', array ('row_id' => $rackrow['row_id']));
321 echo "<tr><td><input type=text name=name value='${rackrow['row_name']}'></td><td>";
322 printImageHREF ('save', 'Save changes', TRUE);
5af82683
DY
323 echo "</td></form><td>";
324 if ($rackrow['count'] == 0)
325 {
326 echo "<a href=\"".makeHrefProcess(array('op'=>'delete', 'row_id'=>$rackrow['row_id'], 'name'=>$rackrow['row_name']))."\">";
327 printImageHREF ('delete', 'Delete row');
328 echo "</a>";
329 }
330 echo "</td></tr>\n";
345fd640
AD
331 }
332 if (getConfigVar ('ADDNEW_AT_TOP') != 'yes')
333 printNewItemTR();
334 echo "</table><br>\n";
335 finishPortlet();
336}
337
d5157018 338function renderRow ($row_id = 0)
e673ee24
DO
339{
340 if ($row_id == 0)
341 {
39a6338a 342 showError ('Invalid row_id', __FUNCTION__);
e673ee24
DO
343 return;
344 }
345 if (($rowInfo = getRackRowInfo ($row_id)) == NULL)
346 {
39a6338a 347 showError ('getRackRowInfo() failed', __FUNCTION__);
e673ee24
DO
348 return;
349 }
a0d54e7e
DO
350 $tagfilter = getTagFilter();
351 $rackList = getRacksForRow ($row_id, $tagfilter);
e673ee24
DO
352 // Main layout starts.
353 echo "<table border=0 class=objectview cellspacing=0 cellpadding=0>";
354
355 // Left portlet with row information.
356 echo "<tr><td class=pcleft>";
a8ce7234 357 startPortlet ($rowInfo['name']);
e673ee24 358 echo "<table border=0 cellspacing=0 cellpadding=3 width='100%'>\n";
5af82683
DY
359 echo "<tr><th width='50%' class=tdright>Racks:</th><td class=tdleft>${rowInfo['count']}</td></tr>\n";
360 echo "<tr><th width='50%' class=tdright>Units:</th><td class=tdleft>${rowInfo['sum']}</td></tr>\n";
04d619d0 361 echo "<tr><th width='50%' class=tdright>%% used:</th><td class=tdleft>";
114e50af
DO
362 renderProgressBar (getRSUforRackRow ($rackList));
363 echo "</td></tr>\n";
e673ee24
DO
364 echo "</table><br>\n";
365 finishPortlet();
366
a0d54e7e 367 echo "</td><td class=pcright rowspan=2>";
e673ee24 368
4fbb5a00 369 global $nextorder;
d5157018 370 $rackwidth = getRackImageWidth() * getConfigVar ('ROW_SCALE');
e673ee24
DO
371 $order = 'odd';
372 startPortlet ('Racks');
373 echo "<table border=0 cellspacing=5 align='center'><tr>";
64b95774 374 foreach ($rackList as $rack)
e673ee24 375 {
4fbb5a00 376 echo "<td align=center class=row_${order}><a href='".makeHref(array('page'=>'rack', 'rack_id'=>$rack['id']))."'>";
d5157018 377 echo "<img border=0 width=${rackwidth} height=" . (getRackImageHeight ($rack['height']) * getConfigVar ('ROW_SCALE'));
e673ee24 378 echo " title='${rack['height']} units'";
d2ec5490 379 echo "src='render_image.php?img=minirack&rack_id=${rack['id']}'>";
e673ee24
DO
380 echo "<br>${rack['name']}</a></td>";
381 $order = $nextorder[$order];
382 }
383 echo "</tr></table>\n";
384 finishPortlet();
a0d54e7e 385 echo "</td></tr>";
e673ee24 386
a0d54e7e
DO
387 echo "<tr><td class=pcleft>";
388 renderTagFilterPortlet ($tagfilter, 'rack', 'row_id', $row_id);
e673ee24
DO
389 echo "</td></tr></table>";
390}
391
04f110a0 392function showError ($info = '', $location = 'N/A')
e673ee24 393{
04f110a0
DO
394 if (preg_match ('/\.php$/', $location))
395 $location = basename ($location);
396 elseif ($location != 'N/A')
397 $location = $location . '()';
398 echo "<div class=msg_error>An error has occured in [${location}]. ";
e673ee24
DO
399 if (empty ($info))
400 echo 'No additional information is available.';
401 else
402 echo "Additional information:<br><p>\n<pre>\n${info}\n</pre></p>";
4fbb5a00 403 echo "Go back or try starting from <a href='".makeHref()."'>index page</a>.<br></div>\n";
e673ee24
DO
404}
405
406// This function renders rack as HTML table.
407function renderRack ($rack_id = 0, $hl_obj_id = 0)
408{
409 if ($rack_id == 0)
410 {
39a6338a 411 showError ('Invalid rack_id', __FUNCTION__);
e673ee24
DO
412 return;
413 }
414 if (($rackData = getRackData ($rack_id)) == NULL)
415 {
39a6338a 416 showError ('getRackData() failed', __FUNCTION__);
e673ee24
DO
417 return;
418 }
4fbb5a00 419 global $pageno, $tabno;
e673ee24
DO
420 markAllSpans ($rackData);
421 if ($hl_obj_id > 0)
422 highlightObject ($rackData, $hl_obj_id);
423 markupObjectProblems ($rackData);
424 $prev_id = getPrevIDforRack ($rackData['row_id'], $rack_id);
425 $next_id = getNextIDforRack ($rackData['row_id'], $rack_id);
d48d8820 426 echo "<center><table border=0><tr valign=middle>";
4fbb5a00 427 echo "<td><h2><a href='".makeHref(array('page'=>'row', 'row_id'=>$rackData['row_id']))."'>${rackData['row_name']}</a> :</h2></td>";
e673ee24
DO
428 // FIXME: use 'bypass'?
429 if ($prev_id != NULL)
9803c56c 430 {
4fbb5a00 431 echo "<td><a href='".makeHref(array('page'=>'rack', 'rack_id'=>$prev_id))."'>";
9803c56c 432 printImageHREF ('prev', 'previous rack');
d48d8820 433 echo "</a></td>";
9803c56c 434 }
4fbb5a00 435 echo "<td><h2><a href='".makeHref(array('page'=>'rack', 'rack_id'=>$rackData['id']))."'>${rackData['name']}</a></h2></td>";
e673ee24 436 if ($next_id != NULL)
9803c56c 437 {
4fbb5a00 438 echo "<td><a href='".makeHref(array('page'=>'rack', 'rack_id'=>$next_id))."'>";
f444c095 439 printImageHREF ('next', 'next rack');
d48d8820 440 echo "</a></td>";
9803c56c 441 }
d48d8820 442 echo "</h2></td></tr></table>\n";
e673ee24 443 echo "<table class=rack border=0 cellspacing=0 cellpadding=1>\n";
d08147d6
DO
444 echo "<tr><th width='10%'>&nbsp;</th><th width='20%'>Front</th>";
445 echo "<th width='50%'>Interior</th><th width='20%'>Back</th></tr>\n";
e673ee24
DO
446 for ($i = $rackData['height']; $i > 0; $i--)
447 {
d08147d6 448 echo "<tr><th>${i}</th>";
e673ee24
DO
449 for ($locidx = 0; $locidx < 3; $locidx++)
450 {
451 if (isset ($rackData[$i][$locidx]['skipped']))
452 continue;
453 $state = $rackData[$i][$locidx]['state'];
454 echo "<td class=state_${state}";
455 if (isset ($rackData[$i][$locidx]['hl']))
456 echo $rackData[$i][$locidx]['hl'];
457 if (isset ($rackData[$i][$locidx]['colspan']))
458 echo ' colspan=' . $rackData[$i][$locidx]['colspan'];
459 if (isset ($rackData[$i][$locidx]['rowspan']))
460 echo ' rowspan=' . $rackData[$i][$locidx]['rowspan'];
461 echo ">";
462 switch ($state)
463 {
464 case 'T':
465 $objectData = getObjectInfo ($rackData[$i][$locidx]['object_id']);
466 if (!empty ($objectData['asset_no']))
467 $prefix = "<div title='${objectData['asset_no']}";
468 else
469 $prefix = "<div title='no asset tag";
470 // Don't tell about label, if it matches common name.
471 if ($objectData['name'] != $objectData['label'] and !empty ($objectData['label']))
472 $suffix = ", visible label is \"${objectData['label']}\"'>";
473 else
474 $suffix = "'>";
475 echo $prefix . $suffix;
4fbb5a00 476 echo "<a href='".makeHref(array('page'=>'object', 'object_id'=>$objectData['id']))."'>${objectData['dname']}</a></div>";
e673ee24
DO
477 break;
478 case 'A':
479 echo '<div title="This rackspace does not exist">&nbsp;</div>';
480 break;
481 case 'F':
482 echo '<div title="Free rackspace">&nbsp;</div>';
483 break;
484 case 'U':
485 echo '<div title="Problematic rackspace, you CAN\'T mount here">&nbsp;</div>';
486 break;
487 default:
488 echo '<div title="No data">&nbsp;</div>';
489 break;
490 }
491 echo '</td>';
492 }
493 echo "</tr>\n";
494 }
495 echo "</table></center>\n";
496}
497
e673ee24
DO
498function renderNewRackForm ($row_id)
499{
f19c75d6 500 showMessageOrError();
f19c75d6 501
50b4ba85 502 startPortlet ('Add one');
f19c75d6 503 printOpFormIntro ('addRack', array ('got_data' => 'TRUE'));
e673ee24 504 echo '<table border=0 align=center>';
b901bf1f
DO
505 $defh = getConfigVar ('DEFAULT_RACK_HEIGHT');
506 if ($defh == 0)
507 $defh = '';
72d52730
DO
508 echo "<tr><th class=tdright>Rack name (*):</th><td class=tdleft><input type=text name=rack_name tabindex=1></td>";
509 echo "<td rowspan=4>Assign tags:<br>";
510 renderTagSelect();
511 echo "</td></tr>\n";
b8094ae4 512 echo "<tr><th class=tdright>Height in units (*):</th><td class=tdleft><input type=text name=rack_height1 tabindex=2 value='${defh}'></td></tr>\n";
4134b5c0 513 echo "<tr><th class=tdright>Comment:</th><td class=tdleft><input type=text name=rack_comment tabindex=3></td></tr>\n";
f19c75d6
DO
514 echo "<tr><td class=submit colspan=2>";
515 printImageHREF ('CREATE', 'Add', TRUE);
516 echo "</td></tr></table></form>";
406b54bd 517 finishPortlet();
406b54bd 518
50b4ba85 519 startPortlet ('Add many');
f19c75d6 520 printOpFormIntro ('addRack', array ('got_mdata' => 'TRUE'));
50b4ba85
DO
521 echo '<table border=0 align=center>';
522 $defh = getConfigVar ('DEFAULT_RACK_HEIGHT');
523 if ($defh == 0)
524 $defh = '';
72d52730
DO
525 echo "<tr><th class=tdright>Height in units (*):</th><td class=tdleft><input type=text name=rack_height2 value='${defh}'></td>";
526 echo "<td rowspan=3 valign=top>Assign tags:<br>";
527 renderTagSelect();
528 echo "</td></tr>\n";
50b4ba85 529 echo "<tr><th class=tdright>Rack names (*):</th><td class=tdleft><textarea name=rack_names cols=40 rows=25></textarea></td></tr>\n";
f19c75d6
DO
530 echo "<tr><td class=submit colspan=2>";
531 printImageHREF ('CREATE', 'Add', TRUE);
e673ee24
DO
532 echo '</form></table>';
533 finishPortlet();
534}
535
536function renderEditObjectForm ($object_id)
537{
538 showMessageOrError();
e673ee24 539
4fbb5a00 540 global $pageno, $tabno;
e673ee24
DO
541 $object = getObjectInfo ($object_id);
542 if ($object == NULL)
543 {
39a6338a 544 showError ('getObjectInfo() failed', __FUNCTION__);
e673ee24
DO
545 return;
546 }
cdd3efe9 547 startPortlet ();
43fb6eaf 548 printOpFormIntro ('update');
cdd3efe9
AD
549 echo '<table border=0 width=100%><tr><td class=pcleft>';
550
551 // static attributes
e673ee24 552 echo '<table border=0 align=center>';
cdd3efe9 553 echo "<tr><th colspan=2><h2>Static attributes</h2></th></tr>";
e673ee24
DO
554 echo "<tr><th class=tdright>Type:</th><td class=tdleft>";
555 printSelect (getObjectTypeList(), 'object_type_id', $object['objtype_id']);
556 echo "</td></tr>\n";
22bb04da 557 // baseline info
e673ee24
DO
558 echo "<tr><th class=tdright>Common name:</th><td class=tdleft><input type=text name=object_name value='${object['name']}'></td></tr>\n";
559 echo "<tr><th class=tdright>Visible label:</th><td class=tdleft><input type=text name=object_label value='${object['label']}'></td></tr>\n";
560 echo "<tr><th class=tdright>Asset tag:</th><td class=tdleft><input type=text name=object_asset_no value='${object['asset_no']}'></td></tr>\n";
f76c4197
DY
561 echo "<tr><th class=tdright>Barcode:</th><td class=tdleft><input type=text name=object_barcode value='${object['barcode']}'></td></tr>\n";
562 echo "<tr><th class=tdright>Has problems:</th><td class=tdleft><input type=checkbox name=object_has_problems";
e673ee24
DO
563 if ($object['has_problems'] == 'yes')
564 echo ' checked';
f76c4197 565 echo "></td></tr>\n";
4fbb5a00
DY
566 echo "<tr><th class=tdright>Actions:</th><td class=tdleft><a href='".
567 makeHrefProcess(array('op'=>'deleteObject', 'page'=>'objects', 'tab'=>'default', 'object_id'=>$object_id, 'name'=>$object['name'])).
568 "' onclick=\"javascript:return confirm('Are you sure you want to delete the object?')\">Delete object</a></td></tr>\n";
e673ee24 569 echo "<tr><td colspan=2><b>Comment:</b><br><textarea name=object_comment rows=10 cols=80>${object['comment']}</textarea></td></tr>";
cdd3efe9
AD
570 echo '</table>';
571
572 echo '</td><td class=pcright>';
e673ee24 573
cdd3efe9 574 // optional attributes
e673ee24 575 $values = getAttrValues ($object_id);
2b98d5a2 576 if (count($values) > 0)
e673ee24 577 {
2b98d5a2
AD
578 echo "<table border=0 cellspacing=0 cellpadding=5 align=center class=widetable>\n";
579 echo "<tr><th colspan=3><h2>Optional attributes</h2></th></tr>";
580 echo "<tr><th>&nbsp;</th><th>Attribute</th><th>Value</th></tr>\n";
581 echo '<input type=hidden name=num_attrs value=' . count($values) . ">\n";
582 $i = 0;
583 foreach ($values as $record)
e673ee24 584 {
2b98d5a2
AD
585 echo "<input type=hidden name=${i}_attr_id value=${record['id']}>";
586 echo '<tr><td>';
587 if (!empty ($record['value']))
588 {
4fbb5a00 589 echo "<a href='".makeHrefProcess(array('op'=>'clearSticker', 'object_id'=>$object_id, 'attr_id'=>$record['id']))."'>";
2b98d5a2
AD
590 printImageHREF ('clear', 'Clear value');
591 echo '</a>';
592 }
593 else
594 echo '&nbsp;';
595 echo '</td>';
596 echo "<td class=tdright>${record['name']}:</td><td class=tdleft>";
597 switch ($record['type'])
598 {
599 case 'uint':
600 case 'float':
601 case 'string':
602 echo "<input type=text name=${i}_value value='${record['value']}'>";
603 break;
604 case 'dict':
605 $chapter = readChapter ($record['chapter_name']);
606 $chapter[0] = '-- NOT SET --';
f3d274bf
DO
607 $chapter = cookOptgroups ($chapter, $object['objtype_id'], $record['key']);
608 printNiftySelect ($chapter, "${i}_value", $record['key']);
2b98d5a2
AD
609 break;
610 }
611 echo "</td></tr>\n";
612 $i++;
e673ee24 613 }
2b98d5a2 614 echo "</table>";
e673ee24 615 }
2b98d5a2 616 echo "</td></tr>\n";
cdd3efe9
AD
617
618 echo "<tr><th class=submit colspan=2>";
5bbbeaa2 619 printImageHREF ('SAVE', 'Save changes', TRUE);
cdd3efe9 620 echo "</form></th></tr></table>\n";
e673ee24 621 finishPortlet();
e673ee24 622
cdd3efe9 623 echo '<table border=0 width=100%><tr><td>';
e673ee24
DO
624 startPortlet ('history');
625 renderHistory ($pageno, $object_id);
626 finishPortlet();
cdd3efe9 627 echo '</td></tr></table>';
e673ee24
DO
628}
629
630// This is a clone of renderEditObjectForm().
631function renderEditRackForm ($rack_id)
632{
0c2b7c4a
DO
633 showMessageOrError();
634 global $pageno;
e673ee24
DO
635 $rack = getRackData ($rack_id);
636 if ($rack == NULL)
637 {
39a6338a 638 showError ('getRackData() failed', __FUNCTION__);
e673ee24
DO
639 return;
640 }
641
e673ee24 642 startPortlet ('Rack attributes');
7056988c 643 printOpFormIntro ('updateRack');
e673ee24
DO
644 echo '<table border=0 align=center>';
645 echo "<tr><th class=tdright>Rack row:</th><td class=tdleft>";
4fbb5a00 646 printSelect (getRackRows(), 'rack_row_id', $rack['row_id']);
e673ee24
DO
647 echo "</td></tr>\n";
648 echo "<tr><th class=tdright>Name (required):</th><td class=tdleft><input type=text name=rack_name value='${rack['name']}'></td></tr>\n";
649 echo "<tr><th class=tdright>Height (required):</th><td class=tdleft><input type=text name=rack_height value='${rack['height']}'></td></tr>\n";
650 echo "<tr><th class=tdright>Comment:</th><td class=tdleft><input type=text name=rack_comment value='${rack['comment']}'></td></tr>\n";
c8187437
DY
651 if (count ($rack['mountedObjects']) == 0)
652 {
653 echo "<tr><th class=tdright>Actions:</th><td class=tdleft><a href='".
654 makeHrefProcess(array('op'=>'deleteRack', 'rack_id'=>$rack_id)).
655 "' onclick=\"javascript:return confirm('Are you sure you want to delete the rack?')\">Delete rack</a></td></tr>\n";
656 }
7056988c
DO
657 echo "<tr><td class=submit colspan=2>";
658 printImageHREF ('SAVE', 'Save changes', TRUE);
659 echo "</td></tr>\n";
e673ee24
DO
660 echo '</form></table><br>';
661 finishPortlet();
662
663 startPortlet ('History');
664 renderHistory ($pageno, $rack_id);
665 finishPortlet();
666}
667
668// This is a helper for creators and editors.
f3d274bf
DO
669// Input array keys are OPTION VALUEs and input array values are OPTION text.
670function printSelect ($optionList, $select_name, $selected_id = NULL, $tabindex = NULL)
e673ee24 671{
f3d274bf
DO
672 echo "<select name=${select_name}" . ($tabindex ? " tabindex=${tabindex}" : '') . '>';
673 foreach ($optionList as $dict_key => $dict_value)
674 echo "<option value=${dict_key}" . ($dict_key == $selected_id ? ' selected' : '') . ">${dict_value}</option>";
675 echo "</select>";
676}
677
678// Input is a cooked list of OPTGROUPs, each with own sub-list of OPTIONs in the same
679// format as printSelect() expects.
680function printNiftySelect ($groupList, $select_name, $selected_id = NULL, $tabindex = NULL)
681{
682 // special treatment for ungrouped data
683 if (count ($groupList) == 1 and isset ($groupList['other']))
e673ee24 684 {
f3d274bf
DO
685 printSelect ($groupList['other'], $select_name, $selected_id, $tabindex);
686 return;
9e7f32a7 687 }
a65f9f54 688 echo "<select name=${select_name}" . ($tabindex ? " tabindex=${tabindex}" : '') . '>';
f3d274bf 689 foreach ($groupList as $groupname => $groupdata)
9e7f32a7 690 {
f3d274bf
DO
691 echo "<optgroup label='${groupname}'>";
692 foreach ($groupdata as $dict_key => $dict_value)
693 echo "<option value=${dict_key}" . ($dict_key == $selected_id ? ' selected' : '') . ">${dict_value}</option>";
694 echo "</optgroup>\n";
e673ee24
DO
695 }
696 echo "</select>";
697}
698
254673dd
DO
699// used by renderGridForm() and renderRackPage()
700function renderRackInfoPortlet ($rackData)
701{
702 startPortlet ('summary');
703 echo "<table border=0 cellspacing=0 cellpadding=3 width='100%'>\n";
704 echo "<tr><th width='50%' class=tdright>Rack row:</th><td class=tdleft>${rackData['row_name']}</td></tr>\n";
705 echo "<tr><th width='50%' class=tdright>Name:</th><td class=tdleft>${rackData['name']}</td></tr>\n";
706 echo "<tr><th width='50%' class=tdright>Height:</th><td class=tdleft>${rackData['height']}</td></tr>\n";
04d619d0 707 echo "<tr><th width='50%' class=tdright>%% used:</th><td class=tdleft>";
254673dd
DO
708 renderProgressBar (getRSUforRack ($rackData));
709 echo "</td></tr>\n";
710 echo "<tr><th width='50%' class=tdright>Objects:</th><td class=tdleft>";
abef7149 711 echo count (stuffInRackspace ($rackData));
254673dd 712 echo "</td></tr>\n";
4fbb5a00 713 printTagTRs (makeHref(array('page'=>'rackspace', 'tab'=>'default'))."&");
254673dd
DO
714 if (!empty ($rackData['comment']))
715 echo "<tr><th width='50%' class=tdright>Comment:</th><td class=tdleft>${rackData['comment']}</td></tr>\n";
716 echo '</table>';
717 finishPortlet();
718}
719
e673ee24 720// This is a universal editor of rack design/waste.
7056988c 721// FIXME: switch to using printOpFormIntro()
bb09cca0 722function renderGridForm ($rack_id = 0, $filter, $header, $submit, $state1, $state2)
e673ee24
DO
723{
724 if ($rack_id == 0)
725 {
591ff2c4 726 showError ('Invalid rack_id', __FUNCTION__);
e673ee24
DO
727 return;
728 }
729 if (($rackData = getRackData ($rack_id)) == NULL)
730 {
591ff2c4 731 showError ('getRackData() failed', __FUNCTION__);
e673ee24
DO
732 return;
733 }
51690ad4 734 showMessageOrError();
4fbb5a00 735 global $pageno, $tabno;
254673dd 736 $filter ($rackData);
e673ee24
DO
737 markupObjectProblems ($rackData);
738
e673ee24
DO
739 // Render the result whatever it is.
740 // Main layout.
741 echo "<table border=0 class=objectview cellspacing=0 cellpadding=0>";
742 echo "<tr><td colspan=2 align=center><h1>${rackData['name']}</h1></td></tr>\n";
743
744 // Left column with information portlet.
745 echo "<tr><td class=pcleft height='1%' width='50%'>";
254673dd 746 renderRackInfoPortlet ($rackData);
e673ee24 747 echo "</td>\n";
bb09cca0 748 echo "<td class=pcright>";
e673ee24
DO
749
750 // Grid form.
751 startPortlet ($header);
752 echo "<center>\n";
753 echo "<table class=rack border=0 cellspacing=0 cellpadding=1>\n";
754 echo "<tr><th width='10%'>&nbsp;</th><th width='20%'>Front</th>";
755 echo "<th width='50%'>Interior</th><th width='20%'>Back</th></tr>\n";
4fbb5a00 756 printOpFormIntro ('updateRack');
e673ee24
DO
757 markupAtomGrid ($rackData, $state2);
758 renderAtomGrid ($rackData);
759 echo "</table></center>\n";
760 echo "<br><input type=submit name=do_update value='${submit}'></form><br><br>\n";
761 finishPortlet();
bb09cca0 762 echo "</td></tr></table>\n";
e673ee24
DO
763}
764
765function renderRackDesign ($rack_id)
766{
bb09cca0 767 renderGridForm ($rack_id, 'applyRackDesignMask', 'Rack design', 'Set rack design', 'A', 'F');
e673ee24
DO
768}
769
770function renderRackProblems ($rack_id = 0)
771{
bb09cca0 772 renderGridForm ($rack_id, 'applyRackProblemMask', 'Rack problems', 'Mark unusable atoms', 'F', 'U');
e673ee24
DO
773}
774
775function startPortlet ($title = '')
776{
777 echo "<div class=portlet><h2>${title}</h2>";
778}
779
780function finishPortlet ()
781{
782 echo "</div>\n";
783}
784
785function printRefsOfType ($refs, $type, $eq)
786{
e673ee24
DO
787 $gotone=0;
788 foreach ($refs as $ref)
789 {
790 if ($eq($ref['type'], $type))
791 {
792 if ($gotone) echo ', ';
4fbb5a00 793 echo "<a href='".makeHref(array('page'=>'object', 'object_id'=>$ref['object_id']))."'>";
4b2bf583
DO
794 if (!empty ($ref['name']))
795 echo $ref['name'] . '@';
796 echo "${ref['object_name']}</a>";
e673ee24
DO
797 $gotone=1;
798 }
799 }
800}
801
802function renderRackObject ($object_id = 0)
803{
4fbb5a00 804 global $nextorder, $aac;
e673ee24
DO
805 if ($object_id <= 0)
806 {
591ff2c4 807 showError ('Invalid object_id', __FUNCTION__);
e673ee24
DO
808 return;
809 }
810 $info = getObjectInfo ($object_id);
811 if ($info == NULL)
812 {
591ff2c4 813 showError ('getObjectInfo() failed', __FUNCTION__);
e673ee24
DO
814 return;
815 }
816 // Main layout starts.
817 echo "<table border=0 class=objectview cellspacing=0 cellpadding=0>";
818 echo "<tr><td colspan=2 align=center><h1>${info['dname']}</h1></td></tr>\n";
819 // left column with uknown number of portlets
820 echo "<tr><td class=pcleft>";
0ab782bc 821 startPortlet ('summary');
e673ee24
DO
822 echo "<table border=0 cellspacing=0 cellpadding=3 width='100%'>\n";
823 if (!empty ($info['name']))
824 echo "<tr><th width='50%' class=tdright>Common name:</th><td class=tdleft>${info['name']}</td></tr>\n";
9c0b0016 825 elseif (in_array ($info['objtype_id'], explode (',', getConfigVar ('NAMEFUL_OBJTYPES'))))
a0ec6295 826 echo "<tr><td colspan=2 class=msg_error>Common name is missing.</td></tr>\n";
e2ac59cf 827 echo "<tr><th width='50%' class=tdright>Object type:</th>";
4fbb5a00 828 echo "<td class=tdleft><a href='".makeHref(array('page'=>'objgroup', 'group_id'=>$info['objtype_id'], 'hl_object_id'=>$object_id))."'>${info['objtype_name']}</a></td></tr>\n";
e673ee24
DO
829 if (!empty ($info['asset_no']))
830 echo "<tr><th width='50%' class=tdright>Asset tag:</th><td class=tdleft>${info['asset_no']}</td></tr>\n";
a6305acc 831 elseif (in_array ($info['objtype_id'], explode (',', getConfigVar ('REQUIRE_ASSET_TAG_FOR'))))
a0ec6295 832 echo "<tr><td colspan=2 class=msg_error>Asset tag is missing.</td></tr>\n";
e673ee24
DO
833 if (!empty ($info['label']))
834 echo "<tr><th width='50%' class=tdright>Visible label:</th><td class=tdleft>${info['label']}</td></tr>\n";
835 if (!empty ($info['barcode']))
836 echo "<tr><th width='50%' class=tdright>Barcode:</th><td class=tdleft>${info['barcode']}</td></tr>\n";
837 if ($info['has_problems'] == 'yes')
838 echo "<tr><td colspan=2 class=msg_error>Has problems</td></tr>\n";
24cbe8af 839 foreach (getAttrValues ($object_id, TRUE) as $record)
e673ee24 840 if (!empty ($record['value']))
4fb5bc8c 841 echo "<tr><th width='50%' class=tdright><span class=sticker>${record['name']}</span>:</th><td class=tdleft>${record['a_value']}</td></tr>\n";
4fbb5a00 842 printTagTRs (makeHref(array('page'=>'objgroup', 'tab'=>'default', 'group_id'=>$info['objtype_id']))."&");
e673ee24
DO
843 echo "</table><br>\n";
844 finishPortlet();
845
846 if (!empty ($info['comment']))
847 {
848 startPortlet ('Comment');
6cc5d6cd 849 echo '<div class=commentblock>' . string_insert_hrefs ($info['comment']) . '</div>';
e673ee24
DO
850 finishPortlet ();
851 }
852
e1ae3fb4
AD
853 renderFilesPortlet ('object', $object_id);
854
e673ee24
DO
855 $ports = getObjectPortsAndLinks ($object_id);
856 if (count ($ports))
857 {
0ab782bc 858 startPortlet ('ports and links');
e673ee24
DO
859 usort($ports, 'sortByName');
860 if ($ports)
861 {
862 $hl_port_id = 0;
863 if (isset ($_REQUEST['hl_port_id']))
864 {
2c6c7645 865 assertUIntArg ('hl_port_id', __FUNCTION__);
e673ee24
DO
866 $hl_port_id = $_REQUEST['hl_port_id'];
867 }
868 echo "<table cellspacing=0 cellpadding='5' align='center' class='widetable'>\n";
869 echo "<tr><th>Local name</th><th>Visible label</th><th>Port type</th><th>L2 address</th>";
870 echo "<th>Rem. Object</th><th>Rem. port</th></tr>\n";
871 foreach ($ports as $port)
872 {
873 echo '<tr';
874 if ($hl_port_id == $port['id'])
875 echo ' class=port_highlight';
876 echo "><td>${port['name']}</td><td>${port['label']}</td><td>${port['type']}</td>";
877 echo "<td>${port['l2address']}</td>";
878 if ($port['remote_object_id'])
879 {
4fbb5a00 880 echo "<td><a href='".makeHref(array('page'=>'object', 'object_id'=>$port['remote_object_id'], 'hl_port_id'=>$port['remote_id']))."'>${port['remote_object_name']}</a></td>";
e673ee24
DO
881 echo "<td>${port['remote_name']}</td>";
882 }
883 elseif (!empty ($port['reservation_comment']))
884 {
885 echo "<td><b>Reserved;</b></td>";
886 echo "<td>${port['reservation_comment']}</td>";
887 }
888 else
889 echo '<td>&nbsp;</td><td>&nbsp;</td>';
890 echo "</tr>\n";
891 }
892 echo "</table><br>\n";
893 }
894 finishPortlet();
895 }
85970da2 896
0ab782bc
DO
897 $alloclist = getObjectIPv4Allocations ($object_id);
898 if (count ($alloclist))
e673ee24 899 {
f28fbe8b 900 startPortlet ('IPv4 addresses');
e673ee24 901 echo "<table cellspacing=0 cellpadding='5' align='center' class='widetable'>\n";
f0ed1181 902 if (getConfigVar ('EXT_IPV4_VIEW') == 'yes')
0b9c98d7 903 echo "<tr><th>OS interface</th><th>IP address</th><th>network</th><th>routed by</th><th>peers</th></tr>\n";
83fdf85f
DO
904 else
905 echo "<tr><th>OS interface</th><th>IP address</th><th>peers</th></tr>\n";
fc0e3978
DO
906 $hl_ipv4_addr = '';
907 if (isset ($_REQUEST['hl_ipv4_addr']))
908 {
909 assertIPv4Arg ('hl_ipv4_addr', __FUNCTION__);
910 $hl_ipv4_addr = $_REQUEST['hl_ipv4_addr'];
911 }
85970da2 912 foreach ($alloclist as $dottedquad => $alloc)
e673ee24 913 {
0ab782bc
DO
914 $address_name = niftyString ($alloc['addrinfo']['name']);
915 $class = $alloc['addrinfo']['class'];
85970da2 916 $secondclass = ($hl_ipv4_addr == $dottedquad) ? 'tdleft port_highlight' : 'tdleft';
83fdf85f 917 $netid = getIPv4AddressNetworkId ($dottedquad);
d7a8186d 918 if (NULL !== $netid)
83fdf85f 919 {
d7a8186d
DO
920 $netinfo = getIPv4NetworkInfo ($netid);
921 loadIPv4AddrList ($netinfo);
83fdf85f 922 }
d7a8186d
DO
923 echo "<tr class='${class}' valign=top><td class=tdleft>${alloc['osif']}</td><td class='${secondclass}'>";
924 if (NULL !== $netid)
4fbb5a00 925 echo "<a href='".makeHref(array('page'=>'ipaddress', 'ip'=>$dottedquad, 'hl_object_id'=>$object_id))."'>${dottedquad}</a>";
d7a8186d
DO
926 else
927 echo $dottedquad;
928 if (getConfigVar ('EXT_IPV4_VIEW') != 'yes')
929 echo '<small>/' . (NULL === $netid ? '??' : $netinfo['mask']) . '</small>';
351b1f45 930 echo '&nbsp;' . $aac[$alloc['type']];
83fdf85f 931 if (!empty ($alloc['addrinfo']['name']))
28a664e7 932 echo ' (' . niftyString ($alloc['addrinfo']['name']) . ')';
83fdf85f 933 echo '</td>';
f0ed1181 934 if (getConfigVar ('EXT_IPV4_VIEW') == 'yes')
b90c3907 935 {
83fdf85f 936 if (NULL === $netid)
0b9c98d7 937 echo '<td class=sparenetwork>N/A</td><td class=sparenetwork>N/A</td>';
83fdf85f 938 else
83fdf85f 939 {
0b9c98d7
DO
940 echo "<td class='${secondclass}'>";
941 renderIPv4NetCell ($netinfo);
942 echo "</td>";
8b3874a5
DO
943 // filter out self-allocation
944 $other_routers = array();
d7a8186d 945 foreach (findRouters ($netinfo['addrlist']) as $router)
8b3874a5
DO
946 if ($router['id'] != $object_id)
947 $other_routers[] = $router;
0b9c98d7
DO
948 if (count ($other_routers))
949 printRoutersTD ($other_routers);
950 else
951 echo "<td class='${secondclass}'>&nbsp;</td>";
83fdf85f 952 }
b90c3907 953 }
83fdf85f 954 // peers
0ab782bc 955 echo "<td class='${secondclass}'>\n";
0ab782bc 956 $prefix = '';
2c817354 957 if ($alloc['addrinfo']['reserved'] == 'yes')
e673ee24 958 {
85970da2 959 echo $prefix . '<strong>RESERVED</strong>';
0ab782bc
DO
960 $prefix = '; ';
961 }
962 foreach ($alloc['addrinfo']['allocs'] as $allocpeer)
963 {
964 if ($allocpeer['object_id'] == $object_id)
965 continue;
4fbb5a00 966 echo $prefix . "<a href='".makeHref(array('page'=>'object', 'object_id'=>$allocpeer['object_id']))."'>";
0ab782bc
DO
967 if (!empty ($allocpeer['osif']))
968 echo $allocpeer['osif'] . '@';
969 echo $allocpeer['object_name'] . '</a>';
0ab782bc 970 $prefix = '; ';
e673ee24 971 }
e673ee24
DO
972 echo "</td></tr>\n";
973 }
974 echo "</table><br>\n";
975 finishPortlet();
976 }
977
eeb4a5d8 978 $forwards = getNATv4ForObject ($object_id);
e673ee24
DO
979 if (count($forwards['in']) or count($forwards['out']))
980 {
f28fbe8b 981 startPortlet('NATv4');
e673ee24
DO
982
983 if (count($forwards['out']))
984 {
985
f28fbe8b 986 echo "<h3>locally performed NAT</h3>";
e673ee24 987
105a3bc8 988 echo "<table class='widetable' cellpadding=5 cellspacing=0 border=0 align='center'>\n";
f28fbe8b 989 echo "<tr><th>Proto</th><th>Match endpoint</th><th>Translate to</th><th>Target object</th><th>Rule comment</th></tr>\n";
e673ee24
DO
990
991 foreach ($forwards['out'] as $pf)
992 {
2c817354
DO
993 $class = 'trerror';
994 $osif = '';
995 if (isset ($alloclist [$pf['localip']]))
996 {
997 $class = $alloclist [$pf['localip']]['addrinfo']['class'];
998 $osif = $alloclist [$pf['localip']]['osif'] . ': ';
999 }
e673ee24 1000 echo "<tr class='$class'>";
4fbb5a00
DY
1001 echo "<td>${pf['proto']}</td><td class=tdleft>${osif}<a href='".makeHref(array('page'=>'ipaddress', 'tab'=>'default', 'ip'=>$pf['localip']))."'>${pf['localip']}</a>:${pf['localport']}</td>";
1002 echo "<td class=tdleft><a href='".makeHref(array('page'=>'ipaddress', 'tab'=>'default', 'ip'=>$pf['remoteip']))."'>${pf['remoteip']}</a>:${pf['remoteport']}</td>";
53ef3908 1003 $address = getIPv4Address ($pf['remoteip']);
e673ee24 1004 echo "<td class='description'>";
53ef3908
DO
1005 if (count ($address['allocs']))
1006 foreach($address['allocs'] as $bond)
4fbb5a00 1007 echo "<a href='".makeHref(array('page'=>'object', 'tab'=>'default', 'object_id'=>$bond['object_id']))."'>${bond['object_name']}(${bond['name']})</a> ";
f28fbe8b
DO
1008 elseif (!empty ($pf['remote_addr_name']))
1009 echo '(' . $pf['remote_addr_name'] . ')';
53ef3908 1010 echo "</td><td class='description'>${pf['description']}</td></tr>";
e673ee24
DO
1011 }
1012 echo "</table><br><br>";
1013 }
1014 if (count($forwards['in']))
1015 {
f28fbe8b 1016 echo "<h3>arriving NAT connections</h3>";
105a3bc8 1017 echo "<table class='widetable' cellpadding=5 cellspacing=0 border=0 align='center'>\n";
f28fbe8b 1018 echo "<tr><th>Matched endpoint</th><th>Source object</th><th>Translated to</th><th>Rule comment</th></tr>\n";
e673ee24
DO
1019 foreach ($forwards['in'] as $pf)
1020 {
1021 echo "<tr>";
4fbb5a00
DY
1022 echo "<td>${pf['proto']}/<a href='".makeHref(array('page'=>'ipaddress', 'tab'=>'default', 'ip'=>$pf['localip']))."'>${pf['localip']}</a>:${pf['localport']}</td>";
1023 echo "<td class='description'><a href='".makeHref(array('page'=>'object', 'tab'=>'default', 'object_id'=>$pf['object_id']))."'>${pf['object_name']}</a>";
1024 echo "</td><td><a href='".makeHref(array('page'=>'ipaddress', 'tab'=>'default', 'ip'=>$pf['remoteip']))."'>${pf['remoteip']}</a>:${pf['remoteport']}</td>";
e673ee24
DO
1025 echo "<td class='description'>${pf['description']}</td></tr>";
1026 }
e673ee24
DO
1027 echo "</table><br><br>";
1028 }
1029 finishPortlet();
1030 }
1031
78e7b769
DO
1032 $pools = getRSPoolsForObject ($object_id);
1033 if (count ($pools))
1034 {
300826cb 1035 $order = 'odd';
8128c257 1036 startPortlet ('Real server pools (' . count ($pools) . ')');
78e7b769 1037 echo "<table cellspacing=0 cellpadding=5 align=center class=widetable>\n";
732e4578 1038 echo "<tr><th>VS</th><th>RS pool</th><th>RS</th><th>VS config</th><th>RS config</th></tr>\n";
748805bf 1039 foreach ($pools as $vs_id => $info)
78e7b769 1040 {
b1a970c7
DO
1041 echo "<tr valign=top class=row_${order}><td class=tdleft>";
1042 renderVSCell ($vs_id);
1043 echo "</td><td class=tdleft>";
1044 renderRSPoolCell ($info['pool_id'], $info['pool_name']);
1045 echo '</td><td class=tdleft>' . $info['rscount'] . '</td>';
1046 echo "<td class=slbconf>${info['vsconfig']}</td>";
1047 echo "<td class=slbconf>${info['rsconfig']}</td>";
78e7b769 1048 echo "</tr>\n";
300826cb 1049 $order = $nextorder[$order];
78e7b769
DO
1050 }
1051 echo "</table>\n";
1052 finishPortlet();
1053 }
e673ee24
DO
1054 echo "</td>\n";
1055
7056988c 1056 // After left column we have (surprise!) right column with rackspace portlet only.
e673ee24
DO
1057 echo "<td class=pcright>";
1058 // rackspace portlet
0ab782bc 1059 startPortlet ('rackspace allocation');
e673ee24
DO
1060 // FIXME: now we call getRackData() twice
1061 $racks = getResidentRacksData ($object_id);
1062 foreach ($racks as $rackData)
1063 renderRack ($rackData['id'], $object_id);
1064 echo '<br>';
1065 finishPortlet();
1066 echo "</td></tr>";
1067 echo "</table>\n";
1068}
1069
1070function renderRackMultiSelect ($sname, $racks, $selected)
1071{
04571888
DO
1072 // Transform the given flat list into a list of groups, each representing a rack row.
1073 $rdata = array();
e673ee24 1074 foreach ($racks as $rack)
04571888
DO
1075 if (!isset ($rdata[$rack['row_name']]))
1076 $rdata[$rack['row_name']] = array ($rack['id'] => $rack['name']);
1077 else
1078 $rdata[$rack['row_name']][$rack['id']] = $rack['name'];
4fbb5a00 1079 echo "<select name=${sname} multiple size=" . getConfigVar ('MAXSELSIZE') . " onchange='getElementsByName(\"updateObjectAllocation\")[0].submit()'>\n";
04571888 1080 foreach ($rdata as $optgroup => $racklist)
e673ee24 1081 {
04571888
DO
1082 echo "<optgroup label='${optgroup}'>";
1083 foreach ($racklist as $rack_id => $rack_name)
1084 {
1085 echo "<option value=${rack_id}";
1086 if (!(array_search ($rack_id, $selected) === FALSE))
1087 echo ' selected';
1088 echo">${rack_name}</option>\n";
1089 }
e673ee24
DO
1090 }
1091 echo "</select>\n";
1092}
1093
1094function showMessageOrError ()
1095{
bd49850d 1096 if (isset ($_SESSION['log']))
83555c04 1097 {
83555c04
DY
1098 printLog ($_SESSION['log']);
1099 unset($_SESSION['log']);
1100 }
e673ee24
DO
1101}
1102
1103// This function renders a form for port edition.
1104function renderPortsForObject ($object_id = 0)
1105{
39b4abd0
DO
1106 function printNewItemTR ()
1107 {
1108 printOpFormIntro ('addPort');
1109 echo "<tr><td>";
f5ff50f5 1110 printImageHREF ('add', 'add a port', TRUE);
39b4abd0 1111 echo "</td><td><input type=text size=8 name=port_name tabindex=100></td>\n";
3decd141
DO
1112 echo "<td><input type=text size=24 name=port_label tabindex=101></td><td>";
1113 printSelect (getPortTypes(), 'port_type_id', getConfigVar ('default_port_type'), 102);
39b4abd0 1114 echo "<td><input type=text name=port_l2address tabindex=103></td>\n";
9318d2ef
DO
1115 echo "<td colspan=3>&nbsp;</td><td>";
1116 printImageHREF ('add', 'add a port', TRUE, 104);
1117 echo "</td></tr></form>";
39b4abd0 1118 }
4fbb5a00 1119 global $pageno, $tabno;
e673ee24
DO
1120 if ($object_id <= 0)
1121 {
591ff2c4 1122 showError ('Invalid object_id', __FUNCTION__);
e673ee24
DO
1123 return;
1124 }
1125 showMessageOrError();
1126 startPortlet ('Ports and interfaces');
1127 $ports = getObjectPortsAndLinks ($object_id);
1128 usort($ports, 'sortByName');
1129 echo "<table cellspacing=0 cellpadding='5' align='center' class='widetable'>\n";
1130 echo "<tr><th>&nbsp;</th><th>Local name</th><th>Visible label</th><th>Port type</th><th>L2 address</th>";
1131 echo "<th>Rem. object</th><th>Rem. port</th><th>(Un)link or (un)reserve</th><th>&nbsp;</th></tr>\n";
39b4abd0
DO
1132 if (getConfigVar ('ADDNEW_AT_TOP') == 'yes')
1133 printNewItemTR();
e673ee24
DO
1134 foreach ($ports as $port)
1135 {
7056988c 1136 printOpFormIntro ('editPort', array ('port_id' => $port['id']));
b7f0eaec 1137 echo "<tr><td><a href='".makeHrefProcess(array('op'=>'delPort', 'port_id'=>$port['id'], 'object_id'=>$object_id, 'port_name'=>$port['name']))."'>";
e673ee24
DO
1138 printImageHREF ('delete', 'Unlink and Delete this port');
1139 echo "</a></td>\n";
1140 echo "<td><input type=text name=name value='${port['name']}' size=8></td>";
1141 echo "<td><input type=text name=label value='${port['label']}' size=24></td>";
611170af
AD
1142 if (!$port['remote_object_id'])
1143 {
1144 echo "<td>";
1145 printSelect (getPortTypes(), 'port_type_id', $port['type_id']);
1146 echo "</td>";
1147 }
1148 else
1149 {
1150 echo "<input type=hidden name=port_type_id value='${port['type_id']}'>";
f7a3c94a 1151 echo "<td class=tdleft>${port['type']}</td>\n";
611170af 1152 }
e673ee24
DO
1153 echo "<td><input type=text name=l2address value='${port['l2address']}'></td>\n";
1154 if ($port['remote_object_id'])
1155 {
4fbb5a00 1156 echo "<td><a href='".makeHref(array('page'=>'object', 'object_id'=>$port['remote_object_id']))."'>${port['remote_object_name']}</a></td>";
e673ee24 1157 echo "<td>${port['remote_name']}</td>";
4fbb5a00
DY
1158 echo "<td><a href='".
1159 makeHrefProcess(array(
1160 'op'=>'unlinkPort',
1161 'port_id'=>$port['id'],
1162 'object_id'=>$object_id,
1163 'port_name'=>$port['name'],
1164 'remote_port_name'=>$port['remote_name'],
1165 'remote_object_name'=>$port['remote_object_name'])).
1166 "'>";
5ccd99a0 1167 printImageHREF ('cut', 'Unlink this port');
e673ee24
DO
1168 echo "</a></td>";
1169 }
1170 elseif (!empty ($port['reservation_comment']))
1171 {
1172 echo "<td><b>Reserved;</b></td>";
1173 echo "<td><input type=text name=reservation_comment value='${port['reservation_comment']}'></td>";
4fbb5a00
DY
1174 echo "<td><a href='".
1175 makeHrefProcess(array(
1176 'op'=>'useup',
1177 'port_id'=>$port['id'],
1178 'object_id'=>$object_id)).
1179 "'>";
39be655e 1180 printImageHREF ('clear', 'Use up this port');
e673ee24
DO
1181 echo "</a></td>";
1182 }
1183 else
1184 {
1185 echo "<td>&nbsp;</td><td>&nbsp;</td>";
1186 echo "<td>";
39106006 1187 echo "<a href='javascript:;' onclick='window.open(\"".makeHrefForHelper('portlist', array('port'=>$port['id'], 'type'=>$port['type_id'], 'object_id'=>$object_id, 'port_name'=>$port['name']))."\",\"findlink\",\"height=700, width=400, location=no, menubar=no, resizable=yes, scrollbars=no, status=no, titlebar=no, toolbar=no\");'>";
5ccd99a0 1188 printImageHREF ('plug', 'Link this port');
e673ee24
DO
1189 echo "</a> <input type=text name=reservation_comment>";
1190 echo "</td>\n";
1191 }
5bbbeaa2
DO
1192 echo "<td>";
1193 printImageHREF ('save', 'Save changes', TRUE);
1194 echo "</td></form></tr>\n";
e673ee24 1195 }
39b4abd0
DO
1196 if (getConfigVar ('ADDNEW_AT_TOP') != 'yes')
1197 printNewItemTR();
e673ee24
DO
1198 echo "</table><br>\n";
1199 finishPortlet();
1200
1201 startPortlet ('Add/update multiple ports');
7056988c 1202 printOpFormIntro ('addMultiPorts');
f7a3c94a 1203 echo 'Format: <select name=format tabindex=201>';
e673ee24
DO
1204 echo '<option value=c3600asy>Cisco 3600 async: sh line | inc TTY</option>';
1205 echo '<option value=fiwg selected>Foundry ServerIron/FastIron WorkGroup/Edge: sh int br</option>';
e673ee24 1206 echo '<option value=fisxii>Foundry FastIron SuperX/II4000: sh int br</option>';
351d4dbf 1207 echo '<option value=ssv1>SSV:&lt;interface name&gt; &lt;MAC address&gt;</option>';
e673ee24
DO
1208 echo "</select>";
1209 echo 'Default port type: ';
f7a3c94a
DO
1210 printSelect (getPortTypes(), 'port_type', getConfigVar ('default_port_type'), 202);
1211 echo "<input type=submit value='Parse output' tabindex=204><br>\n";
1212 echo "<textarea name=input cols=100 rows=50 tabindex=203></textarea><br>\n";
e673ee24
DO
1213 echo '</form>';
1214 finishPortlet();
1215}
1216
72d8ced3 1217function renderIPv4ForObject ($object_id = 0)
e673ee24 1218{
39b4abd0
DO
1219 function printNewItemTR ()
1220 {
1221 global $aat;
1222 printOpFormIntro ('addIPv4Allocation');
1223 echo "<tr><td>";
f5ff50f5 1224 printImageHREF ('add', 'allocate', TRUE);
39b4abd0
DO
1225 echo "</td>";
1226 echo "<td class=tdleft><input type='text' size='10' name='bond_name' tabindex=100></td>\n";
1227 echo "<td class=tdleft><input type=text name='ip' tabindex=101></td>\n";
0b9c98d7 1228 echo "<td colspan=2>&nbsp;</td><td>";
f5ff50f5 1229 printSelect ($aat, 'bond_type', NULL, 102);
9318d2ef 1230 echo "</td><td>&nbsp;</td><td>";
f5ff50f5 1231 printImageHREF ('add', 'allocate', TRUE, 103);
9318d2ef 1232 echo "</td></tr></form>";
39b4abd0 1233 }
4fbb5a00 1234 global $pageno, $tabno, $aat;
e673ee24
DO
1235 if ($object_id <= 0)
1236 {
591ff2c4 1237 showError ('Invalid object_id', __FUNCTION__);
e673ee24
DO
1238 return;
1239 }
1240 showMessageOrError();
72d8ced3 1241 startPortlet ('Allocations');
85970da2 1242 $alloclist = getObjectIPv4Allocations ($object_id);
e673ee24 1243 echo "<table cellspacing=0 cellpadding='5' align='center' class='widetable'>\n";
79e45b4c
DO
1244 echo '<tr><th>&nbsp;</th><th>OS interface</th><th>IP address</th>';
1245 if (getConfigVar ('EXT_IPV4_VIEW') == 'yes')
0b9c98d7 1246 echo '<th>network</th><th>routed by</th>';
79e45b4c 1247 echo '<th>type</th><th>misc</th><th>&nbsp</th></tr>';
09620506 1248
39b4abd0
DO
1249 if (getConfigVar ('ADDNEW_AT_TOP') == 'yes')
1250 printNewItemTR();
85970da2 1251 foreach ($alloclist as $dottedquad => $alloc)
e673ee24 1252 {
85970da2 1253 $class = $alloc['addrinfo']['class'];
79e45b4c 1254 $netid = getIPv4AddressNetworkId ($dottedquad);
d7a8186d
DO
1255 if (NULL !== $netid)
1256 {
1257 $netinfo = getIPv4NetworkInfo ($netid);
1258 loadIPv4AddrList ($netinfo);
1259 }
85970da2 1260 printOpFormIntro ('updIPv4Allocation', array ('ip' => $dottedquad));
4fbb5a00 1261 echo "<tr class='$class' valign=top><td><a href='".makeHrefProcess(array('op'=>'delIPv4Allocation', 'ip'=>$dottedquad, 'object_id'=>$object_id))."'>";
e673ee24
DO
1262 printImageHREF ('delete', 'Delete this IPv4 address');
1263 echo "</a></td>";
d7a8186d
DO
1264 echo "<td class=tdleft><input type='text' name='bond_name' value='${alloc['osif']}' size=10></td><td class=tdleft>";
1265 if (NULL !== $netid)
4fbb5a00 1266 echo "<a href='".makeHref(array('page'=>'ipaddress', 'ip'=>$dottedquad))."'>${dottedquad}</a>";
d7a8186d
DO
1267 else
1268 echo $dottedquad;
79e45b4c 1269 if (getConfigVar ('EXT_IPV4_VIEW') != 'yes')
d7a8186d 1270 echo '<small>/' . (NULL === $netid ? '??' : $netinfo['mask']) . '</small>';
79e45b4c 1271 if (!empty ($alloc['addrinfo']['name']))
28a664e7 1272 echo ' (' . niftyString ($alloc['addrinfo']['name']) . ')';
79e45b4c
DO
1273 echo '</td>';
1274 // FIXME: this a copy-and-paste from renderRackObject()
1275 if (getConfigVar ('EXT_IPV4_VIEW') == 'yes')
1276 {
1277 if (NULL === $netid)
0b9c98d7 1278 echo '<td class=sparenetwork>N/A</td><td class=sparenetwork>N/A</td>';
79e45b4c 1279 else
79e45b4c 1280 {
0b9c98d7
DO
1281 echo '<td>';
1282 renderIPv4NetCell ($netinfo);
d7a8186d 1283 echo '</td>';
0b9c98d7
DO
1284 // filter out self-allocation
1285 $other_routers = array();
1286 foreach (findRouters ($netinfo['addrlist']) as $router)
1287 if ($router['id'] != $object_id)
1288 $other_routers[] = $router;
1289 if (count ($other_routers))
1290 printRoutersTD ($other_routers);
1291 else
1292 echo "<td>&nbsp;</td>";
79e45b4c 1293 }
79e45b4c
DO
1294 }
1295 echo '<td>';
85970da2 1296 printSelect ($aat, 'bond_type', $alloc['type']);
e673ee24 1297 echo "</td><td>";
85970da2 1298 $prefix = '';
4940e4d5 1299 if ($alloc['addrinfo']['reserved'] == 'yes')
e673ee24 1300 {
85970da2
DO
1301 echo $prefix . '<strong>RESERVED</strong>';
1302 $prefix = '; ';
e673ee24 1303 }
85970da2 1304 foreach ($alloc['addrinfo']['allocs'] as $allocpeer)
e673ee24 1305 {
85970da2
DO
1306 if ($allocpeer['object_id'] == $object_id)
1307 continue;
4fbb5a00 1308 echo $prefix . "<a href='".makeHref(array('page'=>'object', 'object_id'=>$allocpeer['object_id']))."'>";
85970da2
DO
1309 if (!empty ($allocpeer['osif']))
1310 echo $allocpeer['osif'] . '@';
1311 echo $allocpeer['object_name'] . '</a>';
1312 $prefix = '; ';
e673ee24 1313 }
d54b9495
DO
1314 echo "</td><td>";
1315 printImageHREF ('save', 'Save changes', TRUE);
1316 echo "</td></form></tr>\n";
e673ee24 1317 }
39b4abd0
DO
1318 if (getConfigVar ('ADDNEW_AT_TOP') != 'yes')
1319 printNewItemTR();
e673ee24 1320
09620506 1321 echo "</table><br>\n";
e673ee24
DO
1322 finishPortlet();
1323
1324}
1325
baf37d01
DO
1326// Log structure versions:
1327// 1: the whole structure is a list of code-message pairs
1328// 2 and later: there's a "v" field set, which indicates the version
1329// 2: there's a "m" list set to hold message code and optional arguments
e673ee24
DO
1330function printLog ($log)
1331{
baf37d01
DO
1332 switch (TRUE)
1333 {
1334 case !isset ($log['v']):
ebb5441d 1335 case $log['v'] == 1:
baf37d01 1336 foreach ($log as $key => $record)
ebb5441d 1337 if ($key !== 'v')
baf37d01
DO
1338 echo "<div class=msg_${record['code']}>${record['message']}</div>";
1339 break;
1340 case $log['v'] == 2:
1341 $msginfo = array
1342 (
8628ae44 1343// records 0~99 with success messages
ebb5441d 1344 0 => array ('code' => 'success', 'format' => 'Success: %s'),
baf37d01
DO
1345 1 => array ('code' => 'success', 'format' => '%u new records done, %u already existed'),
1346 2 => array ('code' => 'success', 'format' => 'NATv4 rule was successfully added.'),
1347 3 => array ('code' => 'success', 'format' => 'NATv4 rule was successfully deleted.'),
1348 4 => array ('code' => 'success', 'format' => 'NATv4 rule was successfully updated'),
1349 5 => array ('code' => 'success', 'format' => 'Port %s was added successfully'),
1350 6 => array ('code' => 'success', 'format' => 'Port %s was updated successfully'),
1351 7 => array ('code' => 'success', 'format' => 'Port %s was deleted successfully'),
1352 8 => array ('code' => 'success', 'format' => 'Port %s successfully linked with port %s at object %s'),
1353 9 => array ('code' => 'success', 'format' => 'Port %s was successfully unlinked from %s@%s'),
1354 10 => array ('code' => 'success', 'format' => 'Added %u ports, updated %u ports, encountered %u errors.'),
1355 11 => array ('code' => 'success', 'format' => 'Reservation removed.'),
1356 12 => array ('code' => 'success', 'format' => 'allocation updated'),
1357 13 => array ('code' => 'success', 'format' => 'allocated'),
1358 14 => array ('code' => 'success', 'format' => 'deallocated'),
1359 15 => array ('code' => 'success', 'format' => 'Reset succeeded.'),
1360 16 => array ('code' => 'success', 'format' => 'Update done'),
1361 17 => array ('code' => 'success', 'format' => 'Update(s) succeeded.'),
1362 18 => array ('code' => 'success', 'format' => 'Load balancer was successfully added'),
1363 19 => array ('code' => 'success', 'format' => 'Load balancer was successfully deleted'),
1364 20 => array ('code' => 'success', 'format' => 'Load balancer info was successfully updated'),
1365 21 => array ('code' => 'success', 'format' => 'Generation complete'),
1366 22 => array ('code' => 'success', 'format' => 'Chained %u tags'),
1367 23 => array ('code' => 'success', 'format' => 'IPv4 prefix successfully added'),
1368 24 => array ('code' => 'success', 'format' => 'IPv4 prefix deleted'),
1369 25 => array ('code' => 'success', 'format' => 'IPv4 prefix updated'),
1370 26 => array ('code' => 'success', 'format' => '%u IP address(es) were successfully updated'),
1371 27 => array ('code' => 'success', 'format' => 'IPv4 address updated'),
1372 28 => array ('code' => 'success', 'format' => 'Virtual service was successfully created'),
1373 29 => array ('code' => 'success', 'format' => 'Virtual service was successfully deleted'),
1374 30 => array ('code' => 'success', 'format' => 'Virtual service was successfully updated'),
1375 31 => array ('code' => 'success', 'format' => 'RS pool was successfully created'),
1376 32 => array ('code' => 'success', 'format' => 'RS pool was successfully deleted'),
1377 33 => array ('code' => 'success', 'format' => 'RS pool was successfully updated'),
1378 34 => array ('code' => 'success', 'format' => 'Real server was successfully added'),
1379 35 => array ('code' => 'success', 'format' => 'Real server was successfully deleted'),
1380 36 => array ('code' => 'success', 'format' => 'Real server was successfully updated'),
1381 37 => array ('code' => 'success', 'format' => 'Successfully added %u real servers'),
1382 38 => array ('code' => 'success', 'format' => '%u real server(s) were successfully (de)activated'),
1383 39 => array ('code' => 'success', 'format' => 'User account %s updated.'),
1384 40 => array ('code' => 'success', 'format' => 'User account %s created.'),
79b8ad1e
DO
1385// ...
1386// ...
baf37d01
DO
1387 43 => array ('code' => 'success', 'format' => 'Saved successfully.'),
1388 44 => array ('code' => 'success', 'format' => '%s failures and %s successfull changes.'),
1389 45 => array ('code' => 'success', 'format' => "Attribute '%s' created."),
1390 46 => array ('code' => 'success', 'format' => 'Rename successful.'),
1391 47 => array ('code' => 'success', 'format' => 'Attribute was deleted.'),
1392 48 => array ('code' => 'success', 'format' => 'Supplement succeeded.'),
1393 49 => array ('code' => 'success', 'format' => 'Reduction succeeded.'),
1394 50 => array ('code' => 'success', 'format' => 'Reduction succeeded.'),
1395 51 => array ('code' => 'success', 'format' => 'Update succeeded.'),
1396 52 => array ('code' => 'success', 'format' => 'Supplement succeeded.'),
1397 53 => array ('code' => 'success', 'format' => 'Chapter was deleted.'),
1398 54 => array ('code' => 'success', 'format' => 'Chapter was updated.'),
1399 55 => array ('code' => 'success', 'format' => 'Chapter was added.'),
1400 56 => array ('code' => 'success', 'format' => 'Update succeeded.'),
1401 57 => array ('code' => 'success', 'format' => 'Reset complete'),
1402 58 => array ('code' => 'success', 'format' => "Successfully deleted tag ."),
1403 59 => array ('code' => 'success', 'format' => "Created tag '%s'."),
1404 60 => array ('code' => 'success', 'format' => "Updated tag '%s'."),
ebb5441d 1405 61 => array ('code' => 'success', 'format' => 'Password changed successfully.'),
24dcb9d8 1406 62 => array ('code' => 'success', 'format' => 'gw: %s'),
f0ff4930
DO
1407 63 => array ('code' => 'success', 'format' => '%u change request(s) have been processed'),
1408 64 => array ('code' => 'success', 'format' => 'Port %s@%s has been assigned to VLAN %u'),
f19c75d6 1409 65 => array ('code' => 'success', 'format' => "Added new rack '%s'"),
03e6ef01 1410 66 => array ('code' => 'success', 'format' => "File sent Ok via handler '%s'"),
abef7149 1411 67 => array ('code' => 'success', 'format' => "Tag rolling done, %u objects involved"),
0c2b7c4a 1412 68 => array ('code' => 'success', 'format' => "Updated rack '%s'"),
e1ae3fb4
AD
1413 69 => array ('code' => 'success', 'format' => 'File %s was added successfully'),
1414 70 => array ('code' => 'success', 'format' => 'File %s was updated successfully'),
1415 71 => array ('code' => 'success', 'format' => 'File %s was linked successfully'),
1416 72 => array ('code' => 'success', 'format' => 'File %s was unlinked successfully'),
1417 73 => array ('code' => 'success', 'format' => 'File %s was deleted successfully'),
52b34485
AD
1418 74 => array ('code' => 'success', 'format' => 'Row %s was added successfully'),
1419 75 => array ('code' => 'success', 'format' => 'Row %s was updated successfully'),
1420 76 => array ('code' => 'success', 'format' => 'Object %s was deleted successfully'),
8628ae44
DO
1421 77 => array ('code' => 'success', 'format' => 'Row %s was deleted successfully'),
1422 78 => array ('code' => 'success', 'format' => 'File %s saved Ok'),
c8187437 1423 79 => array ('code' => 'success', 'format' => 'Rack %s was deleted successfully'),
f0ff4930 1424
8628ae44 1425// records 100~199 with fatal error messages
ebb5441d
DO
1426 100 => array ('code' => 'error', 'format' => 'Generic error: %s'),
1427 101 => array ('code' => 'error', 'format' => 'Port name cannot be empty'),
1428 102 => array ('code' => 'error', 'format' => "Error creating user account '%s'"),
1429 103 => array ('code' => 'error', 'format' => 'getHashByID() failed'),
1430 104 => array ('code' => 'error', 'format' => "Error updating user account '%s'"),
79b8ad1e
DO
1431// ...
1432// ...
1433// ...
ebb5441d
DO
1434 108 => array ('code' => 'error', 'format' => '%u failures and %u successfull changes.'),
1435 109 => array ('code' => 'error', 'format' => 'Update failed!'),
1436 110 => array ('code' => 'error', 'format' => 'Supplement failed!'),
1437 111 => array ('code' => 'error', 'format' => 'Reduction failed!'),
1438 112 => array ('code' => 'error', 'format' => 'Error adding chapter.'),
1439 113 => array ('code' => 'error', 'format' => 'Error updating chapter.'),
1440 114 => array ('code' => 'error', 'format' => 'Error deleting chapter.'),
1441 115 => array ('code' => 'error', 'format' => 'Error renaming attribute.'),
1442 116 => array ('code' => 'error', 'format' => 'Error creating attribute.'),
1443 117 => array ('code' => 'error', 'format' => 'Error deleting attribute.'),
1444 118 => array ('code' => 'error', 'format' => 'Supplement failed!'),
1445 119 => array ('code' => 'error', 'format' => 'Reduction failed!'),
1446 120 => array ('code' => 'error', 'format' => 'Reset failed!'),
1447 121 => array ('code' => 'error', 'format' => 'commitUpdateObject() failed'),
1448 122 => array ('code' => 'error', 'format' => 'One or more update(s) failed!'),
1449 123 => array ('code' => 'error', 'format' => 'Cannot process submitted data: unknown format code.'),
1450 124 => array ('code' => 'error', 'format' => 'Error removing reservation!'),
1451 125 => array ('code' => 'error', 'format' => "Update failed with error: '%s'"),
1452 126 => array ('code' => 'error', 'format' => 'addRStoRSPool() failed'),
1453 127 => array ('code' => 'error', 'format' => 'Added %u real servers and encountered %u errors'),
1454 128 => array ('code' => 'error', 'format' => 'commitDeleteRS() failed'),
1455 129 => array ('code' => 'error', 'format' => 'commitDeleteLB() failed'),
1456 130 => array ('code' => 'error', 'format' => 'commitDeleteVS() failed'),
1457 131 => array ('code' => 'error', 'format' => 'invalid format requested'),
1458 132 => array ('code' => 'error', 'format' => 'invalid protocol'),
1459 133 => array ('code' => 'error', 'format' => 'commitUpdateRS() failed'),
1460 134 => array ('code' => 'error', 'format' => 'commitUpdateLB() failed'),
1461 135 => array ('code' => 'error', 'format' => 'commitUpdateVS() failed'),
1462 136 => array ('code' => 'error', 'format' => 'addLBtoRSPool() failed'),
1463 137 => array ('code' => 'error', 'format' => 'addLBtoRSPool() failed'),
1464 138 => array ('code' => 'error', 'format' => 'commitDeleteRSPool() failed'),
1465 139 => array ('code' => 'error', 'format' => 'commitUpdateRSPool() failed'),
1466 140 => array ('code' => 'error', 'format' => 'Encountered %u errors, (de)activated %u real servers'),
1467 141 => array ('code' => 'error', 'format' => 'Encountered %u errors, updated %u IP address(es)'),
1468 142 => array ('code' => 'error', 'format' => 'executeAutoPorts() failed'),
1469 143 => array ('code' => 'error', 'format' => 'Tried chaining %u tags, but experienced %u errors.'),
1470 144 => array ('code' => 'error', 'format' => "Error deleting tag: '%s'"),
1471 145 => array ('code' => 'error', 'format' => "Invalid tag name '%s'"),
1472 146 => array ('code' => 'error', 'format' => "Tag '%s' (or similar name) already exists"),
1473 147 => array ('code' => 'error', 'format' => "Could not create tag '%s' because of error '%s'"),
1474 148 => array ('code' => 'error', 'format' => "Could not update tag '%s' because of error '%s'"),
1475 149 => array ('code' => 'error', 'format' => 'Turing test failed'),
1476 150 => array ('code' => 'error', 'format' => 'Can only change password under DB authentication.'),
1477 151 => array ('code' => 'error', 'format' => 'Old password doesn\'t match.'),
1478 152 => array ('code' => 'error', 'format' => 'New passwords don\'t match.'),
1479 153 => array ('code' => 'error', 'format' => 'Password change failed.'),
1480 154 => array ('code' => 'error', 'format' => "Verification error: %s"),
1481 155 => array ('code' => 'error', 'format' => 'Save failed.'),
1482 156 => array ('code' => 'error', 'format' => 'getSwitchVLANs() failed'),
e81fb764 1483 157 => array ('code' => 'error', 'format' => 'operation not permitted'),
24dcb9d8
DO
1484 158 => array ('code' => 'error', 'format' => 'Ignoring malformed record #%u in form submit'),
1485 159 => array ('code' => 'error', 'format' => 'Permission denied moving port %s from VLAN%u to VLAN%u'),
1486 160 => array ('code' => 'error', 'format' => 'Invalid arguments'),
1487 161 => array ('code' => 'error', 'format' => 'Endpoint not found. Please either set FQDN attribute or assign an IP address to the object.'),
1488 162 => array ('code' => 'error', 'format' => 'More than one IP address is assigned to this object, please configure FQDN attribute.'),
1489 163 => array ('code' => 'error', 'format' => 'Failed to get any response from queryGateway() or the gateway died'),
c030232f 1490 164 => array ('code' => 'error', 'format' => 'Gateway failure: %s.'),
24dcb9d8
DO
1491 165 => array ('code' => 'error', 'format' => 'Gateway failure: malformed reply.'),
1492 166 => array ('code' => 'error', 'format' => 'gw: %s'),
f0ff4930
DO
1493 167 => array ('code' => 'error', 'format' => 'Could not find port %s'),
1494 168 => array ('code' => 'error', 'format' => 'Port %s is a trunk'),
1495 169 => array ('code' => 'error', 'format' => 'Failed to configure %s, connector returned code %u'),
5222f192 1496 170 => array ('code' => 'error', 'format' => 'There is no network for IP address "%s"'),
f19c75d6
DO
1497 171 => array ('code' => 'error', 'format' => "Failed creating rack '%s'. Already exists in this row?"),
1498 172 => array ('code' => 'error', 'format' => 'Malformed request'),
e5c4506d
DO
1499 173 => array ('code' => 'error', 'format' => "Invalid IPv4 prefix '%s'"),
1500 174 => array ('code' => 'error', 'format' => 'Bad IPv4 address'),
1501 175 => array ('code' => 'error', 'format' => 'Invalid netmask'),
1502 176 => array ('code' => 'error', 'format' => 'This network already exists'),
0c2b7c4a 1503 177 => array ('code' => 'error', 'format' => 'commitUpdateRack() failed'),
121496b6 1504 178 => array ('code' => 'error', 'format' => 'file not found'),
70cb9b56
DO
1505 179 => array ('code' => 'error', 'format' => 'Declining outdated text. Re-edit the file for consistency.'),
1506 180 => array ('code' => 'error', 'format' => 'Error saving file, all changes lost!'),
f0ff4930 1507
8628ae44 1508// records 200~299 with warnings
24dcb9d8
DO
1509 200 => array ('code' => 'warning', 'format' => 'generic warning: %s'),
1510 201 => array ('code' => 'warning', 'format' => 'nothing happened...'),
1511 202 => array ('code' => 'warning', 'format' => 'gw: %s'),
f0ff4930
DO
1512 203 => array ('code' => 'warning', 'format' => 'Port %s seems to be the first in VLAN %u at this switch.'),
1513 204 => array ('code' => 'warning', 'format' => 'Check uplink/downlink configuration for proper operation.'),
1514 205 => array ('code' => 'warning', 'format' => '%u change request(s) have been ignored'),
c8187437 1515 206 => array ('code' => 'warning', 'format' => 'Rack is not empty'),
baf37d01
DO
1516 );
1517 // Handle the arguments. Is there any better way to do it?
1518 foreach ($log['m'] as $record)
1519 {
5222f192
DO
1520 if (!isset ($record['c']) or !isset ($msginfo[$record['c']]))
1521 {
1522 echo '<div class=msg_neutral>(this message was lost)</div>';
1523 continue;
1524 }
baf37d01
DO
1525 if (isset ($record['a']))
1526 switch (count ($record['a']))
1527 {
1528 case 1:
1529 $msgtext = sprintf
1530 (
1531 $msginfo[$record['c']]['format'],
1532 $record['a'][0]
1533 );
1534 break;
1535 case 2:
1536 $msgtext = sprintf
1537 (
1538 $msginfo[$record['c']]['format'],
1539 $record['a'][0],
1540 $record['a'][1]
1541 );
1542 break;
1543 case 3:
1544 $msgtext = sprintf
1545 (
1546 $msginfo[$record['c']]['format'],
1547 $record['a'][0],
1548 $record['a'][1],
1549 $record['a'][2]
1550 );
1551 break;
1552 case 4:
1553 default:
1554 $msgtext = sprintf
1555 (
1556 $msginfo[$record['c']]['format'],
1557 $record['a'][0],
1558 $record['a'][1],
1559 $record['a'][2],
1560 $record['a'][3]
1561 );
1562 break;
1563 }
1564 else
1565 $msgtext = $msginfo[$record['c']]['format'];
1566 echo '<div class=msg_' . $msginfo[$record['c']]['code'] . ">${msgtext}</div>";
1567 }
1568 break;
1569 default:
1570 echo '<div class=msg_error>' . __FUNCTION__ . ': internal error</div>';
1571 break;
1572 }
e673ee24
DO
1573}
1574
1575/*
1576The following conditions must be followed:
15771. We can mount onto free atoms only. This means: if any record for an atom
1578already exists in RackSpace, it can't be used for mounting.
15792. We can't unmount from 'W' atoms. Operator should review appropriate comments
1580and either delete them before unmounting or refuse to unmount the object.
1581*/
1582
1583// We extensively use $_REQUEST in the function.
7056988c 1584// FIXME: move related code into ophandler
e673ee24
DO
1585function renderRackSpaceForObject ($object_id = 0)
1586{
1587 if ($object_id <= 0)
1588 {
591ff2c4 1589 showError ('Invalid object_id', __FUNCTION__);
e673ee24
DO
1590 return;
1591 }
1592 $is_submit = isset ($_REQUEST['got_atoms']);
1593 $is_update = isset ($_REQUEST['rackmulti'][0]);
1594 $info = getObjectInfo ($object_id);
1595 if ($info == NULL)
1596 {
591ff2c4 1597 showError ('getObjectInfo() failed', __FUNCTION__);
e673ee24
DO
1598 return;
1599 }
1600 // Always process occupied racks plus racks chosen by user. First get racks with
1601 // already allocated rackspace...
1602 $workingRacksData = getResidentRacksData ($object_id);
1603 if ($workingRacksData === NULL)
1604 {
1605 print_r ($workingRacksData);
591ff2c4 1606 showError ('getResidentRacksData() failed', __FUNCTION__);
e673ee24
DO
1607 return;
1608 }
1609
1610 // ...and then add those chosen by user (if any).
2135fd83 1611 if (isset($_REQUEST['rackmulti']))
e673ee24
DO
1612 foreach ($_REQUEST['rackmulti'] as $cand_id)
1613 {
1614 if (!isset ($workingRacksData[$cand_id]))
1615 {
1616 $rackData = getRackData ($cand_id);
1617 if ($rackData == NULL)
1618 {
591ff2c4 1619 showError ('getRackData() failed', __FUNCTION__);
e673ee24
DO
1620 return NULL;
1621 }
1622 $workingRacksData[$cand_id] = $rackData;
1623 }
1624 }
1625
2135fd83
DY
1626 printOpFormIntro ('updateObjectAllocation');
1627
e673ee24 1628 // Do it only once...
2135fd83
DY
1629 foreach ($workingRacksData as $rackId => &$rackData)
1630 {
e673ee24 1631 applyObjectMountMask ($rackData, $object_id);
2135fd83
DY
1632 echo "<input type=\"hidden\" name=\"rackmulti[]\" value=\"$rackId\">";
1633 }
e673ee24
DO
1634 // Now we workaround an old caveat: http://bugs.php.net/bug.php?id=37410
1635 unset ($rackData);
1636
e673ee24 1637 // This is the time for rendering.
4fbb5a00
DY
1638 global $pageno, $tabno;
1639
51690ad4
DY
1640 showMessageOrError();
1641
4fbb5a00 1642
e673ee24
DO
1643 // Main layout starts.
1644 echo "<table border=0 class=objectview cellspacing=0 cellpadding=0><tr>";
1645
1646 // Left portlet with rack list.
1647 echo "<td class=pcleft height='1%'>";
1648 startPortlet ('Racks');
1649 $allRacksData = getRacksForRow();
4b8d413e
DO
1650 if (count ($allRacksData) <= getConfigVar ('RACK_PRESELECT_THRESHOLD'))
1651 {
1652 foreach (array_keys ($allRacksData) as $rack_id)
1653 {
1654 $rackData = getRackData ($rack_id);
1655 if ($rackData == NULL)
1656 {
1657 showError ('getRackData() failed', __FUNCTION__);
1658 return NULL;
1659 }
1660 $workingRacksData[$rack_id] = $rackData;
1661 }
1662 foreach ($workingRacksData as &$rackData)
1663 applyObjectMountMask ($rackData, $object_id);
1664 unset ($rackData);
1665 }
1666 renderRackMultiSelect ('rackmulti[]', $allRacksData, array_keys ($workingRacksData));
e673ee24
DO
1667 echo "<br>";
1668 echo "<br>";
1669 finishPortlet();
1670 echo "</td>";
1671
1672 // Middle portlet with comment and submit.
1673 echo "<td class=pcleft>";
1674 startPortlet ('Comment');
1675 echo "<textarea name=comment rows=10 cols=40></textarea><br>\n";
1676 echo "<input type=submit value='Save' name=got_atoms>\n";
1677 echo "<br>";
1678 echo "<br>";
1679 finishPortlet();
1680 echo "</td>";
1681
1682 // Right portlet with rendered racks. If this form submit is not final, we have to
1683 // reflect the former state of the grid in current form.
1684 echo "<td class=pcright rowspan=2 height='1%'>";
1685 startPortlet ('Working copy');
1686 echo '<table border=0 cellspacing=10 align=center><tr>';
1687 foreach ($workingRacksData as $rack_id => $rackData)
1688 {
1689 // Order is important here: only original allocation is highlighted.
1690 highlightObject ($rackData, $object_id);
1691 markupAtomGrid ($rackData, 'T');
1692 // If we have a form processed, discard user input and show new database
1693 // contents.
1694 if (!$is_submit and $is_update)
1695 mergeGridFormToRack ($rackData);
1696 echo "<td valign=top>";
1697 echo "<center>\n<h2>${rackData['name']}</h2>\n";
1698 echo "<table class=rack border=0 cellspacing=0 cellpadding=1>\n";
1699 echo "<tr><th width='10%'>&nbsp;</th><th width='20%'>Front</th>";
1700 echo "<th width='50%'>Interior</th><th width='20%'>Back</th></tr>\n";
1701 renderAtomGrid ($rackData);
9b7468b7
DO
1702 echo "<tr><th width='10%'>&nbsp;</th><th width='20%'>Front</th>";
1703 echo "<th width='50%'>Interior</th><th width='20%'>Back</th></tr>\n";
e673ee24
DO
1704 echo "</table></center>\n";
1705 echo '</td>';
1706 }
1707 echo "</tr></table>";
1708 finishPortlet();
1709 echo "</td>\n";
1710
2135fd83 1711
e673ee24
DO
1712 echo "</form>\n";
1713 echo "</tr></table>\n";
1714}
1715
1716function renderMolecule ($mdata, $object_id)
1717{
1718 // sort data out
1719 $rackpack = array();
1720 global $loclist;
64b95774 1721 foreach ($mdata as $rua)
e673ee24
DO
1722 {
1723 $rack_id = $rua['rack_id'];
1724 $unit_no = $rua['unit_no'];
1725 $atom = $rua['atom'];
1726 if (!isset ($rackpack[$rack_id]))
1727 {
1728 $rackData = getRackData ($rack_id);
1729 for ($i = $rackData['height']; $i > 0; $i--)
1730 for ($locidx = 0; $locidx < 3; $locidx++)
1731 $rackData[$i][$locidx]['state'] = 'F';
1732 $rackpack[$rack_id] = $rackData;
1733 }
1734 $rackpack[$rack_id][$unit_no][$loclist[$atom]]['state'] = 'T';
1735 $rackpack[$rack_id][$unit_no][$loclist[$atom]]['object_id'] = $object_id;
1736 }
1737 // now we have some racks to render
64b95774 1738 foreach ($rackpack as $rackData)
e673ee24
DO
1739 {
1740 markAllSpans ($rackData);
1741 echo "<table class=molecule cellspacing=0>\n";
1742 echo "<caption>${rackData['name']}</caption>\n";
1743 echo "<tr><th width='10%'>&nbsp;</th><th width='20%'>Front</th><th width='50%'>Interior</th><th width='20%'>Back</th></tr>\n";
1744 for ($i = $rackData['height']; $i > 0; $i--)
1745 {
1746 echo "<tr><th>$i</th>";
1747 for ($locidx = 0; $locidx < 3; $locidx++)
1748 {
1749 $state = $rackData[$i][$locidx]['state'];
1750 echo "<td class=state_${state}>&nbsp;</td>\n";
1751 }
1752 echo "</tr>\n";
1753 }
1754 echo "</table>\n";
1755 }
1756}
1757
1758function renderUnmountedObjectsPortlet ()
1759{
1760 startPortlet ('Unmounted objects');
1761 $objs = getUnmountedObjects();
1762 if ($objs === NULL)
1763 {
591ff2c4 1764 showError ('getUnmountedObjects() failed', __FUNCTION__);
e673ee24
DO
1765 return;
1766 }
4fbb5a00 1767 global $nextorder;
e673ee24
DO
1768 $order = 'odd';
1769 echo '<br><br><table border=0 cellpadding=5 cellspacing=0 align=center class=cooltable>';
f76c4197 1770 echo '<tr><th>Common name</th><th>Visible label</th><th>Asset number</th><th>Barcode</th></tr>';
e673ee24
DO
1771 foreach ($objs as $obj)
1772 {
4fbb5a00 1773 echo "<tr class=row_${order}><td><a href='".makeHref(array('page'=>'object', 'object_id'=>$obj['id']))."'>${obj['dname']}</a></td>";
e673ee24 1774 echo "<td>${obj['label']}</td>";
18d94c29 1775 echo "<td>${obj['asset_no']}</td>";
f76c4197 1776 echo "<td>${obj['barcode']}</td>";
4fbb5a00 1777 echo "</tr>";
e673ee24
DO
1778 $order = $nextorder[$order];
1779 }
1780 echo "</table><br>\n";
1781 finishPortlet();
1782}
1783
1784function renderProblematicObjectsPortlet ()
1785{
1786 startPortlet ('Problematic objects');
1787 $objs = getProblematicObjects();
1788 if ($objs === NULL)
1789 {
591ff2c4 1790 showError ('getProblematicObjects() failed', __FUNCTION__);
e673ee24
DO
1791 return;
1792 }
4fbb5a00 1793 global $nextorder;
e673ee24
DO
1794 $order = 'odd';
1795 echo '<br><br><table border=0 cellpadding=5 cellspacing=0 align=center class=cooltable>';
1796 echo '<tr><th>Type</th><th>Common name</th></tr>';
1797 foreach ($objs as $obj)
1798 {
1799 echo "<tr class=row_${order}><td>${obj['objtype_name']}</td>";
4fbb5a00 1800 echo "<td><a href='".makeHref(array('page'=>'object', 'object_id'=>$obj['id']))."'>${obj['dname']}</a></tr>";
e673ee24
DO
1801 $order = $nextorder[$order];
1802 }
1803 echo "</table><br>\n";
1804 finishPortlet();
1805}
1806
7cc02fc1
DO
1807function renderObjectSpace ()
1808{
4fbb5a00 1809 global $taglist, $tagtree;
52b34485 1810 showMessageOrError();
7cc02fc1
DO
1811 echo "<table border=0 class=objectview>\n";
1812 echo "<tr><td class=pcleft width='50%'>";
1813 startPortlet ('View all by type');
1814 $groupInfo = getObjectGroupInfo();
1815 if ($groupInfo === NULL)
1816 {
1817 showError ('getObjectGroupInfo() failed', __FUNCTION__);
1818 return;
1819 }
1820 if (count ($groupInfo) == 0)
1821 echo "No objects exist in DB";
1822 else
1823 {
1824 echo '<div align=left><ul>';
1825 foreach ($groupInfo as $gi)
4fbb5a00 1826 echo "<li><a href='".makeHref(array('page'=>'objgroup', 'group_id'=>$gi['id']))."'>${gi['name']}</a> (${gi['count']})</li>";
7cc02fc1
DO
1827 echo '</ul></div>';
1828 }
1829 finishPortlet();
1830
1831 echo '</td><td class=pcright>';
1832
1833 startPortlet ('View all by tag');
1834 if (count ($taglist) == 0)
1835 echo "No tags exist in DB";
1836 else
1837 renderTagCloud ('object');
1838 finishPortlet();
e673ee24
DO
1839 echo "</td></tr></table>\n";
1840}
1841
466dcbe6 1842function renderObjectGroup ()
7cc02fc1 1843{
4fbb5a00 1844 global $pageno, $tabno, $nextorder, $taglist, $tagtree;
52b34485 1845 showMessageOrError();
2c6c7645 1846 assertUIntArg ('group_id', __FUNCTION__, TRUE);
7cc02fc1 1847 $group_id = $_REQUEST['group_id'];
a0d54e7e
DO
1848 $tagfilter = getTagFilter();
1849 $tagfilter_str = getTagFilterStr ($tagfilter);
7cc02fc1
DO
1850 echo "<table border=0 class=objectview>\n";
1851 echo "<tr><td class=pcleft width='25%'>";
1852 startPortlet ('change type');
1853 $groupInfo = getObjectGroupInfo();
1854 if ($groupInfo === NULL)
1855 {
1856 showError ('getObjectGroupInfo() failed', __FUNCTION__);
1857 return;
1858 }
1859 if (count ($groupInfo) == 0)
1860 echo "No objects exist in DB";
1861 else
1862 {
1863 echo '<div align=left><ul>';
1864 foreach ($groupInfo as $gi)
1865 {
4fbb5a00 1866 echo "<li><a href='".makeHref(array('page'=>$pageno, 'group_id'=>$gi['id']))."${tagfilter_str}'>";
105cea6e
DO
1867 if ($gi['id'] == $group_id)
1868 echo '<strong>';
1869 echo "${gi['name']}</a>";
1870 if ($gi['id'] == $group_id)
1871 echo '</strong>';
1872 echo " (${gi['count']})";
1873 if ($gi['id'] == $group_id)
1874 echo ' &larr;';
1875 echo "</li>";
7cc02fc1
DO
1876 }
1877 echo '</ul></div>';
1878 }
1879 finishPortlet();
1880
1881 echo '</td><td class=pcleft>';
1882
11c8e4be 1883 $objects = getObjectList ($group_id, $tagfilter, getTFMode());
922b8da6 1884 startPortlet ('Objects (' . count ($objects) . ')');
7cc02fc1
DO
1885 if ($objects === NULL)
1886 {
1887 showError ('getObjectList() failed', __FUNCTION__);
1888 return;
1889 }
1890 echo '<br><br><table border=0 cellpadding=5 cellspacing=0 align=center class=cooltable>';
f76c4197 1891 echo '<tr><th>Common name</th><th>Visible label</th><th>Asset tag</th><th>Barcode</th><th>Row/Rack</th><th></th></tr>';
7cc02fc1
DO
1892 $order = 'odd';
1893 foreach ($objects as $obj)
1894 {
8e700dd1
DO
1895 if (isset ($_REQUEST['hl_object_id']) and $_REQUEST['hl_object_id'] == $obj['id'])
1896 $secondclass = 'tdleft port_highlight';
1897 else
1898 $secondclass = 'tdleft';
2b3d64c5 1899 $tags = loadRackObjectTags ($obj['id']);
4fbb5a00 1900 echo "<tr class=row_${order} valign=top><td class='${secondclass}'><a href='".makeHref(array('page'=>'object', 'object_id'=>$obj['id']))."'><strong>${obj['dname']}</strong></a>";
2b3d64c5 1901 if (count ($tags))
4fbb5a00 1902 echo '<br><small>' . serializeTags ($tags, makeHref(array('page'=>$pageno, 'tab'=>'default', 'group_id'=>$group_id))."&") . '</small>';
2b3d64c5 1903 echo "</td><td class='${secondclass}'>${obj['label']}</td>";
8e700dd1 1904 echo "<td class='${secondclass}'>${obj['asset_no']}</td>";
f76c4197 1905 echo "<td class='${secondclass}'>${obj['barcode']}</td>";
7cc02fc1 1906 if ($obj['rack_id'])
4fbb5a00 1907 echo "<td class='${secondclass}'><a href='".makeHref(array('page'=>'row', 'row_id'=>$obj['row_id']))."'>${obj['Row_name']}</a>/<a href='".makeHref(array('page'=>'rack', 'rack_id'=>$obj['rack_id']))."'>${obj['Rack_name']}</a></td>";
7cc02fc1 1908 else
8e700dd1 1909 echo "<td class='${secondclass}'>Unmounted</td>";
7cc02fc1
DO
1910 echo '</tr>';
1911 $order = $nextorder[$order];
1912 }
1913 echo '</table>';
1914 finishPortlet();
1915
1916 echo "</td><td class=pcright width='25%'>";
1917
a0d54e7e 1918 renderTagFilterPortlet ($tagfilter, 'object', 'group_id', $group_id);
7cc02fc1 1919 echo "</td></tr></table>\n";
e673ee24
DO
1920}
1921
1922function renderEmptyPortsSelect ($port_id, $type_id)
1923{
1924 $ports = getEmptyPortsOfType($type_id);
1925 usort($ports, 'sortEmptyPorts');
1926 foreach ($ports as $port)
1927 {
1928 if ($port_id == $port['Port_id'])
1929 continue;
1930 echo "<option value='${port['Port_id']}' onclick='getElementById(\"remote_port_name\").value=\"${port['Port_name']}\"; getElementById(\"remote_object_name\").value=\"${port['Object_name']}\";'>${port['Object_name']} ${port['Port_name']}</option>\n";
1931 }
1932}
1933
6ef9683b 1934function renderAllIPv4Allocations ()
e673ee24 1935{
6ef9683b 1936 $addresses = getAllIPv4Allocations();
e673ee24
DO
1937 usort($addresses, 'sortObjectAddressesAndNames');
1938 foreach ($addresses as $address)
1939 {
1940 echo "<option value='${address['ip']}' onclick='getElementById(\"ip\").value=\"${address['ip']}\";'>${address['object_name']} ${address['name']} ${address['ip']}</option>\n";
1941 }
1942}
1943
1944// History viewer for history-enabled simple dictionaries.
1945function renderHistory ($object_type, $object_id)
1946{
1947 switch ($object_type)
1948 {
1949 case 'row':
1950 $query = "select ctime, user_name, name, deleted, comment from RackRowHistory where id = ${object_id} order by ctime";
1951 $header = '<tr><th>change time</th><th>author</th><th>rack row name</th><th>is deleted?</th><th>rack row comment</th></tr>';
1952 $extra = 4;
1953 break;
1954 case 'rack':
1955 $query =
51690ad4
DY
1956 "select ctime, user_name, rh.name, rh.deleted, rr.name as name, rh.height, rh.comment " .
1957 "from RackHistory as rh left join RackRow as rr on rh.row_id = rr.id " .
1958 "where rh.id = ${object_id} order by ctime";
e673ee24
DO
1959 $header = '<tr><th>change time</th><th>author</th><th>rack name</th><th>is deleted?</th><th>rack row name</th><th>rack height</th><th>rack comment</th></tr>';
1960 $extra = 6;
1961 break;
1962 case 'object':
1963 $query =
f76c4197 1964 "select ctime, user_name, RackObjectHistory.name as name, label, barcode, asset_no, deleted, has_problems, dict_value, comment " .
00f6f1e4
DY
1965 "from RackObjectHistory inner join Dictionary on objtype_id = dict_key join Chapter on Dictionary.chapter_id = Chapter.id " .
1966 "where Chapter.name = 'RackObjectType' and RackObjectHistory.id=${object_id} order by ctime";
f76c4197 1967 $header = '<tr><th>change time</th><th>author</th><th>common name</th><th>visible label</th><th>barcode</th><th>asset no</th><th>is deleted?</th><th>has problems?</th><th>object type</th><th>comment</th></tr>';
e673ee24
DO
1968 $extra = 9;
1969 break;
1970 default:
591ff2c4 1971 showError ("Uknown object type '${object_type}'", __FUNCTION__);
e673ee24
DO
1972 return;
1973 }
1974 global $dbxlink;
1975 $result = $dbxlink->query ($query);
1976 if ($result == NULL)
1977 {
591ff2c4 1978 showError ('SQL query failed', __FUNCTION__);
e673ee24
DO
1979 return;
1980 }
1981 echo '<table border=0 cellpadding=5 cellspacing=0 align=center class=cooltable>';
1982 $order = 'odd';
1983 global $nextorder;
1984 echo $header;
1985 while ($row = $result->fetch (PDO::FETCH_NUM))
1986 {
1987 echo "<tr class=row_${order}><td>${row[0]}</td>";
1988 for ($i = 1; $i <= $extra; $i++)
1989 echo "<td>" . $row[$i] . "</td>";
1990 echo "</tr>\n";
1991 $order = $nextorder[$order];
1992 }
1993 echo "</table><br>\n";
1994}
1995
1996function renderRackspaceHistory ()
1997{
4fbb5a00 1998 global $nextorder, $pageno, $tabno;
e673ee24
DO
1999 $order = 'odd';
2000 $history = getRackspaceHistory();
2001 // Show the last operation by default.
2002 if (isset ($_REQUEST['op_id']))
2003 $op_id = $_REQUEST['op_id'];
2004 elseif (isset ($history[0]['mo_id']))
2005 $op_id = $history[0]['mo_id'];
2006 else $op_id = NULL;
2007
2008 $omid = NULL;
2009 $nmid = NULL;
2010 $object_id = 1;
2011 if ($op_id)
2012 list ($omid, $nmid) = getOperationMolecules ($op_id);
2013
2014 // Main layout starts.
2015 echo "<table border=0 class=objectview cellspacing=0 cellpadding=0>";
2016
2017 // Left top portlet with old allocation.
2018 echo "<tr><td class=pcleft>";
2019 startPortlet ('Old allocation');
2020 if ($omid)
2021 {
2022 $oldMolecule = getMolecule ($omid);
2023 renderMolecule ($oldMolecule, $object_id);
2024 }
2025 else
2026 echo "nothing";
2027 finishPortlet();
2028
2029 echo '</td><td class=pcright>';
2030
2031 // Right top portlet with new allocation
2032 startPortlet ('New allocation');
2033 if ($nmid)
2034 {
2035 $newMolecule = getMolecule ($nmid);
2036 renderMolecule ($newMolecule, $object_id);
2037 }
2038 else
2039 echo "nothing";
2040 finishPortlet();
737a3f72 2041
e673ee24 2042 echo '</td></tr><tr><td colspan=2>';
737a3f72 2043
e673ee24
DO
2044 // Bottom portlet with list
2045
2046 startPortlet ('Rackspace allocation history');
2047 echo "<table border=0 cellpadding=5 cellspacing=0 align=center class=cooltable>\n";
2048 echo "<tr><th>timestamp</th><th>author</th><th>rack object ID</th><th>rack object type</th><th>rack object name</th><th>comment</th></tr>\n";
2049 foreach ($history as $row)
2050 {
2051 if ($row['mo_id'] == $op_id)
2052 $class = 'hl';
2053 else
2054 $class = "row_${order}";
4fbb5a00 2055 echo "<tr class=${class}><td><a href='".makeHref(array('page'=>$pageno, 'tab'=>$tabno, 'op_id'=>$row['mo_id']))."'>${row['ctime']}</a></td>";
e673ee24
DO
2056 echo "<td>${row['user_name']}</td>";
2057 echo "<td>${row['ro_id']}</td><td>${row['objtype_name']}</td><td>${row['name']}</td><td>${row['comment']}</td>\n";
2058 echo "</tr>\n";
2059 $order = $nextorder[$order];
2060 }
2061 echo "</table>\n";
2062 finishPortlet();
737a3f72 2063
e673ee24 2064 echo '</td></tr></table>';
e673ee24
DO
2065}
2066
d9f8a37a 2067function renderIPv4SpaceRecords ($tree, &$tagcache, $baseurl, $target = 0, $level = 1)
d65353ad
DO
2068{
2069 $self = __FUNCTION__;
2070 foreach ($tree as $item)
2071 {
737a3f72 2072 $total = $item['addrt'];
64347dcf
DO
2073 if (getConfigVar ('IPV4_TREE_SHOW_USAGE') == 'yes')
2074 {
2075 loadIPv4AddrList ($item); // necessary to compute router list and address counter
2076 $used = $item['addrc'];
2077 }
2078 else
2079 {
2080 $item['addrlist'] = array();
2081 $item['addrc'] = 0;
2082 }
0137d53c
DO
2083 if (isset ($item['id']))
2084 {
fec0c8da 2085 if ($item['symbol'] == 'node-collapsed')
d9f8a37a 2086 $expandurl = "${baseurl}&eid=" . $item['id'] . "#netid" . $item['id'];
fec0c8da 2087 elseif ($item['symbol'] == 'node-expanded')
d9f8a37a 2088 $expandurl = $baseurl . ($item['parent_id'] ? "&eid=${item['parent_id']}#netid${item['parent_id']}" : '');
fec0c8da
DO
2089 else
2090 $expandurl = '';
0137d53c 2091 echo "<tr valign=top>";
fec0c8da 2092 printIPv4NetInfoTDs ($item, 'tdleft', $level, $item['symbol'], $expandurl);
0137d53c 2093 echo "<td class=tdcenter>";
d9f8a37a
DO
2094 if ($target == $item['id'])
2095 echo "<a name=netid${target}></a>";
64347dcf
DO
2096 if (getConfigVar ('IPV4_TREE_SHOW_USAGE') == 'yes')
2097 {
2098 renderProgressBar ($total ? $used/$total : 0);
2099 echo "<br><small>${used}/${total}</small>";
2100 }
2101 else
2102 echo "<small>${total}</small>";
2103 echo "</td>";
0137d53c 2104 if (getConfigVar ('EXT_IPV4_VIEW') == 'yes')
b6b87070 2105 printRoutersTD (findRouters ($item['addrlist']), $tagcache);
0137d53c 2106 echo "</tr>";
fec0c8da 2107 if ($item['symbol'] == 'node-expanded' or $item['symbol'] == 'node-expanded-static')
d9f8a37a 2108 $self ($item['kids'], $tagcache, $baseurl, $target, $level + 1);
0137d53c
DO
2109 }
2110 else
2111 {
0137d53c 2112 echo "<tr valign=top>";
fec0c8da 2113 printIPv4NetInfoTDs ($item, 'tdleft sparenetwork', $level, $item['symbol']);
0137d53c 2114 echo "<td class=tdcenter>";
64347dcf
DO
2115 if (getConfigVar ('IPV4_TREE_SHOW_USAGE') == 'yes')
2116 {
2117 renderProgressBar ($used/$total, 'sparenetwork');
2118 echo "<br><small>${used}/${total}</small>";
2119 }
2120 else
2121 echo "<small>${total}</small>";
2122 echo "</td><td>&nbsp;</td></tr>";
0137d53c 2123 }
d65353ad
DO
2124 }
2125}
2126
04d619d0 2127function renderIPv4Space ()
e673ee24 2128{
4fbb5a00 2129 global $pageno, $tabno;
932cf41f 2130 $tagfilter = getTagFilter();
94a40058 2131 $netlist = getIPv4NetworkList ($tagfilter, getTFMode());
4fbb5a00
DY
2132
2133
94a40058 2134 $netcount = count ($netlist);
5388794d
DO
2135 // expand request can take either natural values or "ALL". Zero means no expanding.
2136 $eid = isset ($_REQUEST['eid']) ? $_REQUEST['eid'] : 0;
2137 $tree = prepareIPv4Tree ($netlist, $eid);
3630d1fb
DO
2138
2139 echo "<table border=0 class=objectview>\n";
2140 echo "<tr><td class=pcleft>";
94a40058 2141 startPortlet ("networks (${netcount})");
5388794d
DO
2142 echo '<h4>';
2143 if ($eid === 0)
4fbb5a00 2144 echo 'auto-collapsing at threshold ' . getConfigVar ('TREE_THRESHOLD') . " (<a href='".makeHref(array('page'=>$pageno, 'tab'=>$tabno, 'eid'=>'ALL'))."'>expand all</a>)";
5388794d 2145 elseif ($eid === 'ALL')
4fbb5a00 2146 echo "expanding all (<a href='".makeHref(array('page'=>$pageno, 'tab'=>$tabno))."'>auto-collapse</a>)";
5388794d
DO
2147 else
2148 {
2149 $netinfo = getIPv4NetworkInfo ($eid);
4fbb5a00 2150 echo "expanding ${netinfo['ip']}/${netinfo['mask']} (<a href='".makeHref(array('page'=>$pageno, 'tab'=>$tabno))."'>auto-collapse</a> / <a href='".makeHref(array('page'=>$pageno, 'tab'=>$tabno, 'eid'=>'ALL'))."'>expand&nbsp;all</a>)";
5388794d
DO
2151 }
2152 echo "</h4><table class='widetable' border=0 cellpadding=5 cellspacing=0 align='center'>\n";
64347dcf 2153 echo "<tr><th>prefix</th><th>name/tags</th><th>capacity</th>";
f0ed1181 2154 if (getConfigVar ('EXT_IPV4_VIEW') == 'yes')
57dece2f
DO
2155 echo "<th>routed by</th>";
2156 echo "</tr>\n";
fec0c8da 2157 $tagcache = array();
4fbb5a00 2158 $baseurl = makeHref(array('page'=>$pageno, 'tab'=>$tabno)) . getTagFilterStr ($tagfilter);
5388794d 2159 renderIPv4SpaceRecords ($tree, $tagcache, $baseurl, $eid);
e673ee24 2160 echo "</table>\n";
a7fe7729 2161 finishPortlet();
74ccacff 2162 echo '</td><td class=pcright>';
5b7bd02e 2163 renderTagFilterPortlet ($tagfilter, 'ipv4net');
74ccacff 2164 echo "</td></tr></table>\n";
f973f491 2165}
a7fe7729 2166
f973f491
DO
2167function renderIPv4SLB ()
2168{
4fbb5a00 2169 global $page, $nextorder;
a7fe7729 2170
6fec9f39 2171 startPortlet ('SLB configuration');
b3c50e6c 2172 echo "<table border=0 width='100%'><tr>";
ee437dab 2173 foreach (array ('ipv4vslist', 'ipv4rsplist', 'rservers', 'lbs') as $pno)
4fbb5a00 2174 echo "<td><h3><a href='".makeHref(array('page'=>$pno))."'>" . $page[$pno]['title'] . "</a></h3></td>";
b3c50e6c
DO
2175 echo '</tr></table>';
2176 finishPortlet();
2177
c3bdc503 2178 $summary = getSLBSummary();
6fec9f39 2179 startPortlet ('SLB tactical overview');
4cadac8f
DO
2180 // A single id-keyed array isn't used here to preserve existing
2181 // order of LBs returned by getSLBSummary()
c3bdc503
DO
2182 $lblist = array();
2183 $lbdname = array();
4cadac8f 2184 foreach ($summary as $vipdata)
da04825a 2185 foreach (array_keys ($vipdata['lblist']) as $lb_object_id)
c3bdc503
DO
2186 if (!in_array ($lb_object_id, $lblist))
2187 {
2188 $oi = getObjectInfo ($lb_object_id);
2189 $lbdname[$lb_object_id] = $oi['dname'];
2190 $lblist[] = $lb_object_id;
2191 }
2192 if (!count ($summary))
2193 echo 'none configured';
2194 else
2195 {
80e85ea1 2196 $order = 'odd';
c3bdc503 2197 echo "<table class='widetable' border=0 cellpadding=5 cellspacing=0 align='center'>\n";
b1a970c7 2198 echo "<tr valign=top><td>&nbsp;</td>";
c3bdc503 2199 foreach ($lblist as $lb_object_id)
b1a970c7 2200 {
4fbb5a00 2201 #echo "<th><a href='".makeHref(array('page'=>'object', 'tab'=>'default', 'object_id'=>$lb_object_id))."'>" . $lbdname[$lb_object_id] . "</a></th>";
b1a970c7
DO
2202 echo '<td>';
2203 renderLBCell ($lb_object_id);
2204 echo '</td>';
2205 }
c3bdc503 2206 echo "</tr>\n";
4cadac8f
DO
2207 foreach ($summary as $vsid => $vsdata)
2208 {
b1a970c7
DO
2209 echo "<tr class=row_${order}><td class=tdleft>";
2210 renderVSCell ($vsid);
6fec9f39 2211 echo "</td>";
4cadac8f 2212 foreach ($lblist as $lb_object_id)
da04825a 2213 {
60fbcece 2214 echo '<td class=tdleft>';
2b4eee17 2215 if (!isset ($vsdata['lblist'][$lb_object_id]))
da04825a
DO
2216 echo '&nbsp;';
2217 else
6fec9f39
DO
2218 {
2219 echo $vsdata['lblist'][$lb_object_id]['size'];
4fbb5a00 2220// echo " (<a href='".makeHref(array('page'=>'ipv4rspool', 'pool_id'=>$vsdata['lblist'][$lb_object_id]['id'])). "'>";
79a9edb4 2221// echo $vsdata['lblist'][$lb_object_id]['name'] . '</a>)';
6fec9f39 2222 }
da04825a
DO
2223 echo '</td>';
2224 }
2225 echo "</tr>\n";
80e85ea1 2226 $order = $nextorder[$order];
4cadac8f 2227 }
c3bdc503
DO
2228 echo "</table>\n";
2229 }
a7fe7729 2230 finishPortlet ();
e673ee24
DO
2231}
2232
04d619d0 2233function renderIPv4SpaceEditor ()
e673ee24 2234{
4fbb5a00 2235 global $pageno, $tabno;
e673ee24 2236 showMessageOrError();
2a201216 2237
a262e150
DO
2238 // IPv4 validator
2239?>
2240 <script type="text/javascript">
2241 function init() {
2242 document.add_new_range.range.setAttribute('match', "^\\d\\d?\\d?\\.\\d\\d?\\d?\\.\\d\\d?\\d?\\.\\d\\d?\\d?\\/\\d\\d?$");
2243
2244 Validate.init();
2245 }
2246 window.onload=init;
2247 </script>
2248<?php
2249
4c0653e2 2250 startPortlet ("Add new");
04d619d0 2251 echo '<table border=0 cellpadding=10 align=center>';
7056988c
DO
2252 // This form requires a name, so JavaScript validator can find it.
2253 // No printOpFormIntro() hence
4fbb5a00 2254 echo "<form method=post name='add_new_range' action='".makeHrefProcess()."'>\n";
42023f03 2255 echo "<input type=hidden name=op value=addIPv4Prefix>\n";
04d619d0
DO
2256 // tags column
2257 echo '<tr><td rowspan=4><h3>assign tags</h3>';
5c0bb421 2258 renderTagSelect();
04d619d0
DO
2259 echo '</td>';
2260 // inputs column
2261 echo "<th class=tdright>prefix</th><td class=tdleft><input type=text name='range' size=18 class='live-validate' tabindex=1></td>";
2262 echo "<tr><th class=tdright>name</th><td class=tdleft><input type=text name='name' size='20' tabindex=2></td></tr>";
0c16ef0c 2263 echo "<tr><th class=tdright>connected network</th><td class=tdleft><input type=checkbox name='is_bcast' tabindex=3></td></tr>";
04d619d0 2264 echo "<tr><td colspan=2>";
4c0653e2 2265 printImageHREF ('CREATE', 'Add a new network', TRUE, 4);
04d619d0 2266 echo '</td></tr>';
2a201216 2267 echo "</form></table><br><br>\n";
5c0bb421 2268 finishPortlet();
2a201216 2269
b18d26dc 2270 $addrspaceList = getIPv4NetworkList();
e43a2de4 2271 if (count ($addrspaceList))
e673ee24 2272 {
e43a2de4 2273 startPortlet ('Manage existing (' . count ($addrspaceList) . ')');
04d619d0
DO
2274 echo "<table class='widetable' border=0 cellpadding=5 cellspacing=0 align='center'>\n";
2275 echo "<tr><th>&nbsp;</th><th>prefix</th><th>name</th><th>&nbsp;</th></tr>";
0c16ef0c 2276 foreach ($addrspaceList as $netinfo)
e673ee24 2277 {
0b9c98d7 2278 echo "<form method=post action='".makeHrefProcess(array('op'=>'updIPv4Prefix', 'id'=>$netinfo['id']))."'>";
e43a2de4
DO
2279 echo "<tr valign=top><td>";
2280 if (getConfigVar ('IPV4_JAYWALK') == 'yes')
2281 {
2282 echo "<a href='".makeHrefProcess(array('op'=>'delIPv4Prefix', 'id'=>$netinfo['id']))."'>";
2283 printImageHREF ('destroy', 'Delete this prefix');
2284 echo "</a>";
2285 }
2286 else // only render clickable image for empty networks
2287 {
2288 $netdata = getIPv4NetworkInfo ($netinfo['id']);
2289 loadIPv4AddrList ($netdata);
2290 if (count ($netdata['addrlist']))
2291 printImageHREF ('nodestroy', 'There are ' . count ($netdata['addrlist']) . ' allocations inside');
2292 else
2293 {
2294 echo "<a href='".makeHrefProcess(array('op'=>'delIPv4Prefix', 'id'=>$netinfo['id']))."'>";
2295 printImageHREF ('destroy', 'Delete this prefix');
2296 echo "</a>";
2297 }
2298
2299 }
2300 echo "</td>\n<td class=tdleft>${netinfo['ip']}/${netinfo['mask']}</td>";
0c16ef0c 2301 echo "<td><input type=text name=name size=40 value='${netinfo['name']}'>";
04d619d0
DO
2302 echo "</td><td>";
2303 printImageHREF ('save', 'Save changes', TRUE);
2304 echo "</td></tr></form>\n";
e673ee24 2305 }
04d619d0
DO
2306 echo "</table>";
2307 finishPortlet();
e673ee24 2308 }
e673ee24
DO
2309}
2310
beb9e88a 2311function renderIPv4Network ($id)
e673ee24 2312{
4fbb5a00 2313 global $pageno, $tabno, $aac2;
545478d0
DO
2314 $netmaskbylen = array
2315 (
2316 32 => '255.255.255.255',
2317 31 => '255.255.255.254',
2318 30 => '255.255.255.252',
2319 29 => '255.255.255.248',
2320 28 => '255.255.255.240',
2321 27 => '255.255.255.224',
2322 26 => '255.255.255.192',
2323 25 => '255.255.255.128',
2324 24 => '255.255.255.0',
2325 23 => '255.255.254.0',
2326 22 => '255.255.252.0',
2327 21 => '255.255.248.0',
2328 20 => '255.255.240.0',
2329 19 => '255.255.224.0',
2330 18 => '255.255.192.0',
2331 17 => '255.255.128.0',
2332 16 => '255.255.0.0',
2333 15 => '255.254.0.0',
2334 14 => '255.252.0.0',
2335 13 => '255.248.0.0',
2336 12 => '255.240.0.0',
2337 11 => '255.224.0.0',
2338 10 => '255.192.0.0',
2339 9 => '255.128.0.0',
2340 8 => '255.0.0.0',
2341 7 => '254.0.0.0',
2342 6 => '252.0.0.0',
2343 5 => '248.0.0.0',
2344 4 => '240.0.0.0',
2345 3 => '224.0.0.0',
2346 2 => '192.0.0.0',
2347 1 => '128.0.0.0'
2348 );
2349 $wildcardbylen = array
2350 (
2351 32 => '0.0.0.0',
2352 31 => '0.0.0.1',
2353 30 => '0.0.0.3',
2354 29 => '0.0.0.7',
2355 28 => '0.0.0.15',
2356 27 => '0.0.0.31',
2357 26 => '0.0.0.63',
2358 25 => '0.0.0.127',
2359 24 => '0.0.0.255',
2360 23 => '0.0.1.255',
2361 22 => '0.0.3.255',
2362 21 => '0.0.7.255',
2363 20 => '0.0.15.255',
2364 19 => '0.0.31.255',
2365 18 => '0.0.63.255',
2366 17 => '0.0.127.255',
2367 16 => '0.0.255.25',
2368 15 => '0.1.255.255',
2369 14 => '0.3.255.255',
2370 13 => '0.7.255.255',
2371 12 => '0.15.255.255',
2372 11 => '0.31.255.255',
2373 10 => '0.63.255.255',
2374 9 => '0.127.255.255',
2375 8 => '0.255.255.255',
2376 7 => '1.255.255.255',
2377 6 => '3.255.255.255',
2378 5 => '7.255.255.255',
2379 4 => '15.255.255.255',
2380 3 => '31.255.255.255',
2381 2 => '63.255.255.255',
2382 1 => '127.255.255.255'
2383 );
b901bf1f 2384 $maxperpage = getConfigVar ('IPV4_ADDRS_PER_PAGE');
e673ee24
DO
2385 if (isset($_REQUEST['pg']))
2386 $page = $_REQUEST['pg'];
2387 else
2388 $page=0;
2389
b6b87070
DO
2390 $range = getIPv4NetworkInfo ($id);
2391 loadIPv4AddrList ($range);
2034d968
DO
2392 echo "<table border=0 class=objectview cellspacing=0 cellpadding=0>";
2393 echo "<tr><td colspan=2 align=center><h1>${range['ip']}/${range['mask']}</h1><h2>${range['name']}</h2></td></tr>\n";
2394
2395 echo "<tr><td class=pcleft width='50%'>";
2396 startPortlet ('summary');
2397 $total = ($range['ip_bin'] | $range['mask_bin_inv']) - ($range['ip_bin'] & $range['mask_bin']) + 1;
2398 $used = count ($range['addrlist']);
2399 echo "<table border=0 cellspacing=0 cellpadding=3 width='100%'>\n";
04d619d0
DO
2400
2401 echo "<tr><th width='50%' class=tdright>%% used:</th><td class=tdleft>";
2034d968
DO
2402 renderProgressBar ($used/$total);
2403 echo "&nbsp;${used}/${total}</td></tr>\n";
04d619d0 2404
001e61fa
DO
2405 if (getConfigVar ('EXT_IPV4_VIEW') == 'yes')
2406 {
3444ecf2
DO
2407 // Build a backtrace from all parent networks.
2408 $clen = $range['mask'];
2409 $backtrace = array();
2410 while (NULL !== ($upperid = getIPv4AddressNetworkId ($range['ip'], $clen)))
2411 {
2412 $upperinfo = getIPv4NetworkInfo ($upperid);
2413 $clen = $upperinfo['mask'];
2414 $backtrace[] = $upperid;
2415 }
2416 $arrows = count ($backtrace);
2417 foreach (array_reverse ($backtrace) as $ancestorid)
001e61fa
DO
2418 {
2419 $ainfo = getIPv4NetworkInfo ($ancestorid);
3444ecf2
DO
2420 echo "<tr><th width='50%' class=tdright>";
2421 for ($i = 0; $i < $arrows; $i++)
2422 echo '&uarr;';
2423 $arrows--;
4fbb5a00 2424 echo "</th><td class=tdleft><a href='".makeHref(array('page'=>$pageno, 'tab'=>$tabno, 'id'=>$ainfo['id']))."'>${ainfo['ip']}/${ainfo['mask']}</a></td></tr>";
001e61fa 2425 }
3444ecf2
DO
2426 echo "<tr><th width='50%' class=tdright>&rarr;</th>";
2427 echo "<td class=tdleft>${range['ip']}/${range['mask']}</td></tr>";
001e61fa
DO
2428 // FIXME: get and display nested networks
2429 // $theitem = pickLeaf ($ipv4tree, $id);
2430 }
2431
545478d0
DO
2432 echo "<tr><th width='50%' class=tdright>Netmask:</th><td class=tdleft>";
2433 echo $netmaskbylen[$range['mask']];
2434 echo "</td></tr>\n";
04d619d0 2435
c607ab55
DO
2436 echo "<tr><th width='50%' class=tdright>Netmask:</th><td class=tdleft>";
2437 printf ('0x%08X', binMaskFromDec ($range['mask']));
2438 echo "</td></tr>\n";
2439
545478d0
DO
2440 echo "<tr><th width='50%' class=tdright>Wildcard bits:</th><td class=tdleft>";
2441 echo $wildcardbylen[$range['mask']];
2442 echo "</td></tr>\n";
04d619d0 2443
f3d0cb20 2444 $routers = findRouters ($range['addrlist']);
f0ed1181 2445 if (getConfigVar ('EXT_IPV4_VIEW') == 'yes' and count ($routers))
04d619d0 2446 {
57dece2f 2447 echo "<tr><th width='50%' class=tdright>Routed by:</th>";
f3d0cb20 2448 printRoutersTD ($routers);
57dece2f 2449 echo "</tr>\n";
04d619d0
DO
2450 }
2451
4fbb5a00 2452 printTagTRs (makeHref(array('page'=>'ipv4space', 'tab'=>'default'))."&");
2034d968
DO
2453 echo "</table><br>\n";
2454 finishPortlet();
e1ae3fb4
AD
2455
2456 renderFilesPortlet ('ipv4net', $id);
2034d968 2457 echo "</td>\n";
e673ee24 2458
2034d968
DO
2459 echo "<td class=pcright>";
2460 startPortlet ('details');
e673ee24
DO
2461 $startip = $range['ip_bin'] & $range['mask_bin'];
2462 $endip = $range['ip_bin'] | $range['mask_bin_inv'];
2463 $realstartip = $startip;
2464 $realendip = $endip;
2465 $numpages = 0;
2466 if($endip - $startip > $maxperpage)
2467 {
e673ee24
DO
2468 $numpages = ($endip - $startip)/$maxperpage;
2469 $startip = $startip + $page * $maxperpage;
2470 $endip = $startip + $maxperpage-1;
2471 }
2472 echo "<center>";
b901bf1f
DO
2473 if ($numpages)
2474 echo '<h3>' . long2ip ($startip) . ' ~ ' . long2ip ($endip) . '</h3>';
e673ee24
DO
2475 for ($i=0; $i<$numpages; $i++)
2476 {
2477 if ($i == $page)
2478 echo "<b>$i</b> ";
2479 else
4fbb5a00 2480 echo "<a href='".makeHref(array('page'=>$pageno, 'tab'=>$tabno, 'id'=>$id, 'pg'=>$i))."'>$i</a> ";
e673ee24
DO
2481 }
2482 echo "</center>";
2483
beb9e88a 2484 echo "<table class='widetable' border=0 cellspacing=0 cellpadding=5 align='center' width='100%'>\n";
e673ee24
DO
2485 echo "<tr><th>Address</th><th>Name</th><th>Allocation</th></tr>\n";
2486
2487
b2035dca
DO
2488 for ($ip = $startip; $ip <= $endip; $ip++) :
2489 if (isset ($_REQUEST['hl_ipv4_addr']) and ip2long ($_REQUEST['hl_ipv4_addr']) == $ip)
2490 $secondstyle = 'tdleft port_highlight';
2727c7df 2491 else
b2035dca
DO
2492 $secondstyle = 'tdleft';
2493 if (!isset ($range['addrlist'][$ip]))
e673ee24 2494 {
4fbb5a00 2495 echo "<tr><td class=tdleft><a href='".makeHref(array('page'=>'ipaddress', 'ip'=>ip_long2quad($ip)))."'>" . ip_long2quad($ip);
b2035dca
DO
2496 echo "</a></td><td class='${secondstyle}'>&nbsp;</td><td class='${secondstyle}'>&nbsp;</td></tr>\n";
2497 continue;
2498 }
b2035dca 2499 $addr = $range['addrlist'][$ip];
2d318652 2500 echo "<tr class='${addr['class']}'>";
e673ee24 2501
4fbb5a00 2502 echo "<td class=tdleft><a href='".makeHref(array('page'=>'ipaddress', 'ip'=>$addr['ip']))."'>${addr['ip']}</a></td>";
b2035dca
DO
2503 echo "<td class='${secondstyle}'>${addr['name']}</td><td class='${secondstyle}'>";
2504 $delim = '';
2505 $prologue = '';
2506 if ( $addr['reserved'] == 'yes')
2507 {
2d318652 2508 echo "<strong>RESERVED</strong> ";
b2035dca
DO
2509 $delim = '; ';
2510 }
2d318652 2511 foreach ($range['addrlist'][$ip]['allocs'] as $ref)
b2035dca 2512 {
beb9e88a 2513 echo $delim . $aac2[$ref['type']];
4fbb5a00 2514 echo "<a href='".makeHref(array('page'=>'object', 'object_id'=>$ref['object_id'], 'hl_ipv4_addr'=>$addr['ip']))."'>";
b2035dca
DO
2515 echo $ref['name'] . (empty ($ref['name']) ? '' : '@');
2516 echo "${ref['object_name']}</a>";
2517 $delim = '; ';
2518 }
2519 if ($delim != '')
2520 {
6131056c 2521 $delim = '';
b2035dca
DO
2522 $prologue = '<br>';
2523 }
2d318652 2524 foreach ($range['addrlist'][$ip]['lblist'] as $ref)
b2035dca
DO
2525 {
2526 echo $prologue;
602663f4 2527 $prologue = '';
4fbb5a00
DY
2528 echo "${delim}<a href='".makeHref(array('page'=>'object', 'object_id'=>$ref['object_id']))."'>";
2529 echo "${ref['object_name']}</a>:<a href='".makeHref(array('page'=>'ipv4vs', 'vs_id'=>$ref['vs_id']))."'>";
b2035dca
DO
2530 echo "${ref['vport']}/${ref['proto']}</a>&rarr;";
2531 $delim = '; ';
2532 }
2533 if ($delim != '')
2534 {
2535 $delim = '';
2536 $prologue = '<br>';
e673ee24 2537 }
2d318652 2538 foreach ($range['addrlist'][$ip]['rslist'] as $ref)
b2035dca
DO
2539 {
2540 echo $prologue;
2541 $prologue = '';
4fbb5a00 2542 echo "${delim}&rarr;${ref['rsport']}@<a href='".makeHref(array('page'=>'ipv4rspool', 'pool_id'=>$ref['rspool_id']))."'>";
b2035dca
DO
2543 echo "${ref['rspool_name']}</a>";
2544 $delim = '; ';
2545 }
2546 echo "</td></tr>\n";
2547 endfor;
2727c7df 2548 // end of iteration
e673ee24
DO
2549
2550 echo "</table>";
2034d968
DO
2551 finishPortlet();
2552 echo "</td></tr></table>\n";
e673ee24
DO
2553}
2554
53ef3908 2555function renderIPv4NetworkProperties ($id)
e673ee24 2556{
e673ee24 2557 showMessageOrError();
53ef3908
DO
2558 $netdata = getIPv4NetworkInfo ($id);
2559 echo "<center><h1>${netdata['ip']}/${netdata['mask']}</h1></center>\n";
e673ee24 2560 echo "<table border=0 cellpadding=10 cellpadding=1 align='center'>\n";
7056988c 2561 printOpFormIntro ('editRange');
53ef3908
DO
2562 echo "<tr><td class='tdright'>Name:</td><td class='tdleft'><input type=text name=name size=20 value='${netdata['name']}'></tr>";
2563 echo "<tr><td colspan=2 class=tdcenter>";
2564 printImageHREF ('SAVE', 'Save changes', TRUE);
2565 echo "</td></form></tr></table>\n";
e673ee24
DO
2566}
2567
2d318652 2568function renderIPv4Address ($dottedquad)
e673ee24 2569{
4fbb5a00 2570 global $aat;
2d318652 2571 $address = getIPv4Address ($dottedquad);
68225375 2572 echo "<table border=0 class=objectview cellspacing=0 cellpadding=0>";
2d318652
DO
2573 echo "<tr><td colspan=2 align=center><h1>${dottedquad}</h1></td></tr>\n";
2574 if (!empty ($address['name']))
68225375 2575 echo "<tr><td colspan=2 align=center><h2>${address['name']}</h2></td></tr>\n";
e673ee24 2576
68225375
DO
2577 echo "<tr><td class=pcleft>";
2578 startPortlet ('summary');
2579 echo "<table border=0 cellspacing=0 cellpadding=3 width='100%'>\n";
04d619d0 2580 echo "<tr><th width='50%' class=tdright>Allocations:</th><td class=tdleft>" . count ($address['allocs']) . "</td></tr>\n";
68225375
DO
2581 echo "<tr><th width='50%' class=tdright>Originated NAT connections:</th><td class=tdleft>" . count ($address['outpf']) . "</td></tr>\n";
2582 echo "<tr><th width='50%' class=tdright>Arriving NAT connections:</th><td class=tdleft>" . count ($address['inpf']) . "</td></tr>\n";
04d619d0 2583 echo "<tr><th width='50%' class=tdright>SLB virtual services:</th><td class=tdleft>" . count ($address['lblist']) . "</td></tr>\n";
68225375
DO
2584 echo "<tr><th width='50%' class=tdright>SLB real servers:</th><td class=tdleft>" . count ($address['rslist']) . "</td></tr>\n";
2585 printTagTRs();
2586 echo "</table><br>\n";
2587 finishPortlet();
2588 echo "</td>\n";
e673ee24 2589
68225375 2590 echo "<td class=pcright>";
e673ee24 2591
f74d96c6 2592 if (isset ($address['class']))
59bebe2b 2593 {
8e700dd1 2594 startPortlet ('allocations');
2d318652
DO
2595 echo "<table class='widetable' cellpadding=5 cellspacing=0 border=0 align='center' width='100%'>\n";
2596 echo "<tr><th>object</th><th>OS interface</th><th>allocation type</th></tr>\n";
2597 $class = $address['class'];
2598 // render all allocation records for this address the same way
59bebe2b 2599 if ($address['reserved'] == 'yes')
2d318652
DO
2600 echo "<tr class='${class}'><td colspan=2>&nbsp;</td><td class=tdleft><strong>RESERVED</strong></td></tr>";
2601 foreach ($address['allocs'] as $bond)
59bebe2b 2602 {
8e700dd1
DO
2603 if (isset ($_REQUEST['hl_object_id']) and $_REQUEST['hl_object_id'] == $bond['object_id'])
2604 $secondclass = 'tdleft port_highlight';
2605 else
2606 $secondclass = 'tdleft';
4fbb5a00 2607 echo "<tr class='$class'><td class=tdleft><a href='".makeHref(array('page'=>'object', 'object_id'=>$bond['object_id'], 'hl_ipv4_addr'=>$dottedquad))."'>${bond['object_name']}</td><td class='${secondclass}'>${bond['name']}</td><td class='${secondclass}'><strong>";
52c836b1
DO
2608 echo $aat[$bond['type']];
2609 echo "</strong></td></tr>\n";
59bebe2b
DO
2610 }
2611 echo "</table><br><br>";
2612 finishPortlet();
2613 }
e673ee24 2614
f3d0cb20
DO
2615 // FIXME: The returned list is structured differently, than we expect it to be. One of the sides
2616 // must be fixed.
2d318652 2617 if (count ($address['lblist']))
e673ee24 2618 {
2d318652
DO
2619 startPortlet ('Virtual services (' . count ($address['lblist']) . ')');
2620 echo "<table class='widetable' cellpadding=5 cellspacing=0 border=0 align='center' width='100%'>\n";
59bebe2b 2621 echo "<tr><th>VS</th><th>name</th></tr>\n";
2d318652 2622 foreach ($address['lblist'] as $vsinfo)
e673ee24 2623 {
4fbb5a00 2624 echo "<tr><td class=tdleft><a href='".makeHref(array('page'=>'ipv4vs', 'vs_id'=>$vsinfo['vs_id']))."'>";
59bebe2b 2625 echo buildVServiceName ($vsinfo) . "</a></td><td class=tdleft>";
5fe1ed76 2626 echo $vsinfo['name'] . "</td></tr>\n";
e673ee24 2627 }
59bebe2b
DO
2628 echo "</table><br><br>";
2629 finishPortlet();
e673ee24 2630 }
5fe1ed76
DO
2631
2632 if (count ($address['rslist']))
2633 {
2634 startPortlet ('Real servers (' . count ($address['rslist']) . ')');
2d318652 2635 echo "<table class='widetable' cellpadding=5 cellspacing=0 border=0 align='center' width='100%'>\n";
53f4b619 2636 echo "<tr><th>&nbsp;</th><th>port</th><th>RS pool</th></tr>\n";
5fe1ed76
DO
2637 foreach ($address['rslist'] as $rsinfo)
2638 {
2639 echo "<tr><td>";
2640 if ($rsinfo['inservice'] == 'yes')
2641 printImageHREF ('inservice', 'in service');
2642 else
2643 printImageHREF ('notinservice', 'NOT in service');
4fbb5a00 2644 echo "</td><td class=tdleft>${rsinfo['rsport']}</td><td class=tdleft><a href='".makeHref(array('page'=>'ipv4rspool', 'pool_id'=>$rsinfo['rspool_id']))."'>";
2d318652 2645 echo $rsinfo['rspool_name'] . "</a></td></tr>\n";
5fe1ed76
DO
2646 }
2647 echo "</table><br><br>";
2648 finishPortlet();
2649 }
2650
68225375
DO
2651 if (count ($address['outpf']))
2652 {
105a3bc8 2653 startPortlet ('departing NAT rules');
2d318652 2654 echo "<table class='widetable' cellpadding=5 cellspacing=0 border=0 align='center' width='100%'>\n";
105a3bc8
DO
2655 echo "<tr><th>proto</th><th>from</th><th>to</th><th>comment</th></tr>\n";
2656 foreach ($address['outpf'] as $rule)
b62ff880 2657 echo "<tr><td>${rule['proto']}</td><td>${rule['localip']}:${rule['localport']}</td><td>${rule['remoteip']}:${rule['remoteport']}</td><td>${rule['description']}</td></tr>";
105a3bc8 2658 echo "</table>";
68225375
DO
2659 finishPortlet();
2660 }
105a3bc8
DO
2661
2662 if (count ($address['inpf']))
2663 {
2664 startPortlet ('arriving NAT rules');
2d318652 2665 echo "<table class='widetable' cellpadding=5 cellspacing=0 border=0 align='center' width='100%'>\n";
105a3bc8
DO
2666 echo "<tr><th>proto</th><th>from</th><th>to</th><th>comment</th></tr>\n";
2667 foreach ($address['inpf'] as $rule)
b62ff880 2668 echo "<tr><td>${rule['proto']}</td><td>${rule['localip']}:${rule['localport']}</td><td>${rule['remoteip']}:${rule['remoteport']}</td><td>${rule['description']}</td></tr>";
105a3bc8
DO
2669 echo "</table>";
2670 finishPortlet();
2671 }
2672
68225375
DO
2673 echo "</td></tr>";
2674 echo "</table>\n";
e673ee24
DO
2675}
2676
2d318652 2677function renderIPv4AddressProperties ($dottedquad)
e673ee24 2678{
e673ee24 2679 showMessageOrError();
2d318652
DO
2680 $address = getIPv4Address ($dottedquad);
2681 echo "<center><h1>$dottedquad</h1></center>\n";
7056988c 2682
1fbc9fd6 2683 startPortlet ('update');
e673ee24 2684 echo "<table border=0 cellpadding=10 cellpadding=1 align='center'>\n";
7056988c 2685 printOpFormIntro ('editAddress');
2d318652
DO
2686 echo "<tr><td class='tdright'>Name:</td><td class='tdleft'><input type=text name=name size=20 value='${address['name']}'></tr>";
2687 echo "<td class='tdright'>Reserved:</td><td class='tdleft'><input type=checkbox name=reserved size=20 ";
2688 echo ($address['reserved']=='yes') ? 'checked' : '';
f3d274bf 2689 echo "></tr><tr><td class=tdleft>";
53ef3908 2690 printImageHREF ('SAVE', 'Save changes', TRUE);
f3d274bf 2691 echo "</td></form><td class=tdright>";
1fbc9fd6 2692 if (empty ($address['name']) and $address['reserved'] == 'no')
f3d274bf
DO
2693 printImageHREF ('CLEAR gray');
2694 else
2695 {
2696 printOpFormIntro ('editAddress', array ('name' => '', 'reserved' => ''));
2697 printImageHREF ('CLEAR', 'Release', TRUE);
2698 echo "</form>";
2699 }
2700 echo "</td></tr></table>\n";
1fbc9fd6 2701 finishPortlet();
e673ee24
DO
2702}
2703
2d318652 2704function renderIPv4AddressAllocations ($dottedquad)
e673ee24 2705{
e673ee24 2706 showMessageOrError();
39b4abd0
DO
2707 function printNewItemTR ()
2708 {
2709 global $aat;
2710 printOpFormIntro ('addIPv4Allocation');
2711 echo "<tr><td>";
9318d2ef 2712 printImageHREF ('add', 'allocate', TRUE);
8d4f7d18
DO
2713 echo "</td><td>";
2714 printSelect (getNarrowObjectList (explode (',', getConfigVar ('IPV4_PERFORMERS'))), 'object_id', NULL, 100);
2715 echo "</td><td><input type=text tabindex=101 name=bond_name size=10></td><td>";
f5ff50f5 2716 printSelect ($aat, 'bond_type', NULL, 102);
9318d2ef 2717 echo "</td><td>";
f5ff50f5 2718 printImageHREF ('add', 'allocate', TRUE, 103);
9318d2ef 2719 echo "</td></form></tr>";
39b4abd0 2720 }
4fbb5a00 2721 global $pageno, $tabno, $aat;
e673ee24 2722
2d318652 2723 $address = getIPv4Address ($dottedquad);
f74d96c6 2724
2d318652 2725 echo "<center><h1>${dottedquad}</h1></center>\n";
105a3bc8 2726 echo "<table class='widetable' cellpadding=5 cellspacing=0 border=0 align='center'>\n";
2d318652 2727 echo "<tr><th>&nbsp;</th><th>object</th><th>OS interface</th><th>allocation type</th><th>&nbsp;</th></tr>\n";
e673ee24 2728
39b4abd0
DO
2729 if (getConfigVar ('ADDNEW_AT_TOP') == 'yes')
2730 printNewItemTR();
f74d96c6 2731 if (isset ($address['class']))
e673ee24 2732 {
f74d96c6
DO
2733 $class = $address['class'];
2734 if ($address['reserved'] == 'yes')
2735 echo "<tr class='${class}'><td colspan=3>&nbsp;</td><td class=tdleft><strong>RESERVED</strong></td><td>&nbsp;</td></tr>";
2736 foreach ($address['allocs'] as $bond)
2737 {
2738 echo "<tr class='$class'>";
2739 printOpFormIntro ('updIPv4Allocation', array ('object_id' => $bond['object_id']));
4fbb5a00 2740 echo "<td><a href='".makeHrefProcess(array('op'=>'delIPv4Allocation', 'ip'=>$dottedquad, 'object_id'=>$bond['object_id']))."'>";
f74d96c6
DO
2741 printImageHREF ('delete', 'Unallocate address');
2742 echo "</a></td>";
4fbb5a00 2743 echo "<td><a href='".makeHref(array('page'=>'object', 'object_id'=>$bond['object_id'], 'hl_ipv4_addr'=>$dottedquad))."'>${bond['object_name']}</td>";
f74d96c6
DO
2744 echo "<td><input type='text' name='bond_name' value='${bond['name']}' size=10></td><td>";
2745 printSelect ($aat, 'bond_type', $bond['type']);
2746 echo "</td><td>";
2747 printImageHREF ('save', 'Save changes', TRUE);
2748 echo "</td></form></tr>\n";
2749 }
e673ee24 2750 }
39b4abd0
DO
2751 if (getConfigVar ('ADDNEW_AT_TOP') != 'yes')
2752 printNewItemTR();
e673ee24 2753 echo "</table><br><br>";
e673ee24
DO
2754}
2755
eeb4a5d8 2756function renderNATv4ForObject ($object_id = 0)
e673ee24 2757{
0b72ada2 2758 global $root;
9318d2ef
DO
2759 function printNewItemTR ($alloclist)
2760 {
0b72ada2 2761 global $root;
9318d2ef
DO
2762 printOpFormIntro ('addNATv4Rule');
2763 echo "<tr align='center'><td>";
2764 printImageHREF ('add', 'Add new NAT rule', TRUE);
2765 echo '</td><td>';
2766 printSelect (array ('TCP' => 'TCP', 'UDP' => 'UDP'), 'proto');
2767 echo "<select name='localip' tabindex=1>";
2768
2769 foreach ($alloclist as $dottedquad => $alloc)
2770 {
2771 $name = empty ($alloc['addrinfo']['name']) ? '' : (' (' . niftyString ($alloc['addrinfo']['name']) . ')');
2772 $osif = empty ($alloc['osif']) ? '' : ($alloc['osif'] . ': ');
2773 echo "<option value='${dottedquad}'>${osif}${dottedquad}${name}</option>";
2774 }
2775
2776 echo "</select>:<input type='text' name='localport' size='4' tabindex=2></td>";
2777 echo "<td><input type='text' name='remoteip' id='remoteip' size='10' tabindex=3>";
39106006
DO
2778 echo "<a href='javascript:;' onclick='window.open(\"" . makeHrefForHelper ('inet4list');
2779 echo "\", \"findobjectip\", \"height=700, width=400, location=no, menubar=no, resizable=yes, scrollbars=no, status=no, titlebar=no, toolbar=no\");'>";
9318d2ef
DO
2780 printImageHREF ('find', 'Find object');
2781 echo "</a>";
2782 echo ":<input type='text' name='remoteport' size='4' tabindex=4></td><td></td>";
2783 echo "<td colspan=1><input type='text' name='description' size='20' tabindex=5></td><td>";
f5ff50f5 2784 printImageHREF ('add', 'Add new NAT rule', TRUE, 6);
9318d2ef
DO
2785 echo "</td></tr></form>";
2786 }
4fbb5a00 2787 global $pageno, $tabno;
e673ee24
DO
2788
2789 $info = getObjectInfo ($object_id);
eeb4a5d8 2790 $forwards = getNATv4ForObject ($object_id);
2c817354 2791 $alloclist = getObjectIPv4Allocations ($object_id);
e673ee24 2792 showMessageOrError();
f28fbe8b 2793 echo "<center><h2>locally performed NAT</h2></center>";
e673ee24 2794
105a3bc8 2795 echo "<table class='widetable' cellpadding=5 cellspacing=0 border=0 align='center'>\n";
d54b9495 2796 echo "<tr><th></th><th>Match endpoint</th><th>Translate to</th><th>Target object</th><th>Comment</th><th>&nbsp;</th></tr>\n";
e673ee24 2797
9318d2ef
DO
2798 if (getConfigVar ('ADDNEW_AT_TOP') == 'yes')
2799 printNewItemTR ($alloclist);
e673ee24
DO
2800 foreach ($forwards['out'] as $pf)
2801 {
2c817354
DO
2802 $class = 'trerror';
2803 $osif = '';
2804 if (isset ($alloclist [$pf['localip']]))
2805 {
2806 $class = $alloclist [$pf['localip']]['addrinfo']['class'];
2807 $osif = $alloclist [$pf['localip']]['osif'] . ': ';
2808 }
e673ee24
DO
2809
2810 echo "<tr class='$class'>";
4fbb5a00
DY
2811 echo "<td><a href='".
2812 makeHrefProcess(array(
2813 'op'=>'delNATv4Rule',
2814 'localip'=>$pf['localip'],
2815 'localport'=>$pf['localport'],
2816 'remoteip'=>$pf['remoteip'],
2817 'remoteport'=>$pf['remoteport'],
2818 'proto'=>$pf['proto'],
2819 'object_id'=>$object_id)).
2820 "'>";
4de22e7e
DO
2821 printImageHREF ('delete', 'Delete NAT rule');
2822 echo "</a></td>";
4fbb5a00 2823 echo "<td>${pf['proto']}/${osif}<a href='".makeHref(array('page'=>'ipaddress', 'tab'=>'default', 'ip'=>$pf['localip']))."'>${pf['localip']}</a>:${pf['localport']}";
f28fbe8b
DO
2824 if (!empty ($pf['local_addr_name']))
2825 echo ' (' . $pf['local_addr_name'] . ')';
2826 echo "</td>";
4fbb5a00 2827 echo "<td><a href='".makeHref(array('page'=>'ipaddress', 'tab'=>'default', 'ip'=>$pf['remoteip']))."'>${pf['remoteip']}</a>:${pf['remoteport']}</td>";
e673ee24 2828
53ef3908 2829 $address = getIPv4Address ($pf['remoteip']);
e673ee24
DO
2830
2831 echo "<td class='description'>";
53ef3908
DO
2832 if (count ($address['allocs']))
2833 foreach ($address['allocs'] as $bond)
4fbb5a00 2834 echo "<a href='".makeHref(array('page'=>'object', 'tab'=>'default', 'object_id'=>$bond['object_id']))."'>${bond['object_name']}(${bond['name']})</a> ";
f28fbe8b
DO
2835 elseif (!empty ($pf['remote_addr_name']))
2836 echo '(' . $pf['remote_addr_name'] . ')';
7056988c
DO
2837 printOpFormIntro
2838 (
2839 'updNATv4Rule',
2840 array
2841 (
2842 'localip' => $pf['localip'],
2843 'localport' => $pf['localport'],
2844 'remoteip' => $pf['remoteip'],
2845 'remoteport' => $pf['remoteport'],
2846 'proto' => $pf['proto']
2847 )
2848 );
2849 echo "</td><td class='description'>";
d54b9495
DO
2850 echo "<input type='text' name='description' value='${pf['description']}'></td><td>";
2851 printImageHREF ('save', 'Save changes', TRUE);
2852 echo "</td></form></tr>";
e673ee24 2853 }
9318d2ef
DO
2854 if (getConfigVar ('ADDNEW_AT_TOP') != 'yes')
2855 printNewItemTR ($alloclist);
e673ee24
DO
2856
2857 echo "</table><br><br>";
2858
f28fbe8b 2859 echo "<center><h2>arriving NAT connections</h2></center>";
105a3bc8 2860 echo "<table class='widetable' cellpadding=5 cellspacing=0 border=0 align='center'>\n";
e673ee24
DO
2861 echo "<tr><th></th><th>Source</th><th>Source objects</th><th>Target</th><th>Description</th></tr>\n";
2862
2863 foreach ($forwards['in'] as $pf)
2864 {
4fbb5a00
DY
2865 echo "<tr><td><a href='".
2866 makeHrefProcess(array(
2867 'op'=>'delNATv4Rule',
2868 'localip'=>$pf['localip'],
2869 'localport'=>$pf['localport'],
2870 'remoteip'=>$pf['remoteip'],
2871 'remoteport'=>$pf['remoteport'],
2872 'proto'=>$pf['proto'],
2873 'object_id'=>$pf['object_id']
2874 )).
2875 "'>";
4de22e7e
DO
2876 printImageHREF ('delete', 'Delete NAT rule');
2877 echo "</a></td>";
4fbb5a00
DY
2878 echo "<td>${pf['proto']}/<a href='".makeHref(array('page'=>'ipaddress', 'tab'=>'default', 'ip'=>$pf['localip']))."'>${pf['localip']}</a>:${pf['localport']}</td>";
2879 echo "<td class='description'><a href='".makeHref(array('page'=>'object', 'tab'=>'default', 'object_id'=>$pf['object_id']))."'>${pf['object_name']}</a>";
2880 echo "</td><td><a href='".makeHref(array('page'=>'ipaddress', 'tab'=>'default', 'ip'=>$pf['remoteip']))."'>${pf['remoteip']}</a>:${pf['remoteport']}</td>";
e673ee24
DO
2881 echo "<td class='description'>${pf['description']}</td></tr>";
2882 }
2883
e673ee24 2884 echo "</table><br><br>";
e673ee24
DO
2885}
2886
7056988c 2887// FIXME: move related code away into ophandler(s)
e673ee24
DO
2888function renderAddMultipleObjectsForm ()
2889{
20c901a7 2890 global $root, $pageno, $tabno, $nextorder;
e673ee24
DO
2891
2892 $type_id = array();
7f791d1d 2893 $global_type_id = 0;
e673ee24
DO
2894 $name = array();
2895 $asset_no = array();
ce4d1a79 2896 $keepvalues1 = $keepvalues2 = FALSE;
42d73cbf 2897 showMessageOrError();
e673ee24
DO
2898
2899 // Render a form for the next.
2900 $typelist = getObjectTypeList();
4c330a14 2901 $typelist[0] = 'select type...';
7f791d1d 2902
f60bb422
DO
2903 startPortlet ('Distinct types, same tags');
2904 $max = getConfigVar ('MASSCOUNT');
42d73cbf 2905 printOpFormIntro ('addObjects');
e673ee24 2906 echo '<table border=0 align=center>';
f60bb422
DO
2907 echo "<tr><th>Object type</th><th>Common name</th><th>Visible label</th>";
2908 echo "<th>Asset tag</th><th>Barcode</th><th>Tags</th></tr>\n";
7f791d1d 2909 // If a user forgot to select object type on input, we keep his
e673ee24 2910 // previous input in the form.
9c0b0016 2911 for ($i = 0; $i < $max; $i++)
e673ee24 2912 {
7f791d1d 2913 echo '<tr><td>';
e7ade6bf
DO
2914 // Don't employ DEFAULT_OBJECT_TYPE to avoid creating ghost records for pre-selected empty rows.
2915 printSelect ($typelist, "${i}_object_type_id", 0);
e673ee24
DO
2916 echo '</td>';
2917 echo "<td><input type=text size=30 name=${i}_object_name";
ce4d1a79 2918 if ($keepvalues1 and isset ($name[$i]) and (!isset ($type_id[$i]) or $type_id[$i] == 0))
e673ee24
DO
2919 echo " value='${name[$i]}'";
2920 echo "></td>";
2921 echo "<td><input type=text size=30 name=${i}_object_label";
ce4d1a79 2922 if ($keepvalues1 and isset ($label[$i]) and (!isset ($type_id[$i]) or $type_id[$i] == 0))
e673ee24
DO
2923 echo " value='${label[$i]}'";
2924 echo "></td>";
2925 echo "<td><input type=text size=20 name=${i}_object_asset_no";
ce4d1a79 2926 if ($keepvalues1 and isset ($asset_no[$i]) and (!isset ($type_id[$i]) or $type_id[$i] == 0))
e673ee24
DO
2927 echo " value='${asset_no[$i]}'";
2928 echo "></td>";
2929 echo "<td><input type=text size=10 name=${i}_object_barcode";
ce4d1a79 2930 if ($keepvalues1 and isset ($barcode[$i]) and (!isset ($type_id[$i]) or $type_id[$i] == 0))
e673ee24
DO
2931 echo " value='${barcode[$i]}'";
2932 echo "></td>";
f60bb422
DO
2933 if ($i == 0)
2934 {
2935 echo "<td valign=top rowspan=${max}>";
2936 renderTagSelect();
2937 echo "</td>\n";
2938 }
e673ee24 2939 echo "</tr>\n";
e673ee24 2940 }
216c84bb 2941 echo "<tr><td class=submit colspan=5><input type=submit name=got_fast_data value='Go!'></td></tr>\n";
e673ee24
DO
2942 echo "</form></table>\n";
2943 finishPortlet();
7f791d1d 2944
f60bb422 2945 startPortlet ('Same type, same tags');
42d73cbf 2946 printOpFormIntro ('addLotOfObjects');
f60bb422
DO
2947 echo "<table border=0 align=center><tr><th>names</th><th>type</th></tr>";
2948 echo "<tr><td rowspan=3><textarea name=namelist cols=40 rows=25>\n";
ce4d1a79 2949 if ($keepvalues2 and $global_type_id == 0)
7f791d1d 2950 echo $_REQUEST['namelist'];
f60bb422
DO
2951 echo "</textarea></td><td valign=top>";
2952 printSelect ($typelist, "global_type_id", getConfigVar ('DEFAULT_OBJECT_TYPE'));
2953 echo "</td></tr>";
2954 echo "<tr><th>Tags</th></tr>";
2955 echo "<tr><td valign=top>";
2956 renderTagSelect();
2957 echo "</td></tr>";
2958 echo "<tr><td colspan=2><input type=submit name=got_very_fast_data value='Go!'></td></tr></table>\n";
2959 echo "</form>\n";
7f791d1d 2960 finishPortlet();
e673ee24
DO
2961}
2962
2963function printGreeting ()
2964{
d6d79c36
DO
2965 global $root, $remote_username, $remote_displayname;
2966 echo "Hello, <a href='${root}?page=myaccount&tab=default'>${remote_displayname}</a>. This is RackTables " .
2967 CODE_VERSION .
2968 ". Click <a href='${root}?logout'>here</a> to logout.";
e673ee24
DO
2969}
2970
2971function renderSearchResults ()
2972{
0b9c98d7 2973 global $root;
e673ee24
DO
2974 $terms = trim ($_REQUEST['q']);
2975 if (empty ($terms))
2976 {
591ff2c4 2977 showError ('Search string cannot be empty.', __FUNCTION__);
e673ee24
DO
2978 return;
2979 }
54522168 2980 if (!permitted ('objects', 'default'))
e673ee24 2981 {
591ff2c4 2982 showError ('You are not authorized for viewing information about objects.', __FUNCTION__);
e673ee24
DO
2983 return;
2984 }
ea5fc465 2985 $nhits = 0;
e673ee24
DO
2986 // If we search for L2 address, we can either find one or find none.
2987 if
2988 (
05771508
DO
2989 preg_match (RE_L2_IFCFG, $terms) or
2990 preg_match (RE_L2_SOLID, $terms) or
2991 preg_match (RE_L2_CISCO, $terms) or
1930dc7f 2992 preg_match (RE_L2_IPCFG, $terms) or
05771508
DO
2993 // Foundry STP bridge ID: bridge priotity + port MAC address. Cut off first 4 chars and look for MAC address.
2994 preg_match (RE_L2_FDRYSTP, $terms)
e673ee24
DO
2995 )
2996 // Search for L2 address.
2997 {
3ec29bf4
DO
2998 $terms = str_replace ('.', '', $terms);
2999 $terms = str_replace (':', '', $terms);
1930dc7f 3000 $terms = str_replace ('-', '', $terms);
ea5fc465 3001 $terms = substr ($terms, -12);
e673ee24
DO
3002 $result = searchByl2address ($terms);
3003 if ($result !== NULL)
3004 {
ea5fc465
DO
3005 $nhits++;
3006 $lasthit = 'port';
3007 $summary['port'][] = $result;
e673ee24 3008 }
e673ee24 3009 }
05771508 3010 elseif (preg_match (RE_IP4_ADDR, $terms))
64347dcf 3011 // Search for IPv4 address.
e673ee24 3012 {
bb0a44e9 3013 if (NULL !== getIPv4AddressNetworkId ($terms))
e673ee24 3014 {
ea5fc465 3015 $nhits++;
f3d0cb20
DO
3016 $lasthit = 'ipv4addressbydq';
3017 $summary['ipv4addressbydq'][] = $terms;
e673ee24 3018 }
e673ee24 3019 }
05771508 3020 elseif (preg_match (RE_IP4_NET, $terms))
64347dcf
DO
3021 // Search for IPv4 network
3022 {
3023 list ($base, $len) = explode ('/', $terms);
3024 if (NULL !== ($tmp = getIPv4AddressNetworkId ($base, $len + 1)))
3025 {
3026 $nhits++;
3027 $lasthit = 'ipv4network';
3028 $summary['ipv4network'][] = getIPv4NetworkInfo ($tmp);
3029 }
3030 }
e673ee24 3031 else
ea5fc465 3032 // Search for objects, addresses, networks, virtual services and RS pools by their description.
e673ee24 3033 {
ea5fc465
DO
3034 $tmp = getObjectSearchResults ($terms);
3035 if (count ($tmp))
e673ee24 3036 {
ea5fc465
DO
3037 $nhits += count ($tmp);
3038 $lasthit = 'object';
3039 $summary['object'] = $tmp;
e673ee24 3040 }
ea5fc465
DO
3041 $tmp = getIPv4AddressSearchResult ($terms);
3042 if (count ($tmp))
e673ee24 3043 {
ea5fc465 3044 $nhits += count ($tmp);
f3d0cb20
DO
3045 $lasthit = 'ipv4addressbydescr';
3046 $summary['ipv4addressbydescr'] = $tmp;
ea5fc465
DO
3047 }
3048 $tmp = getIPv4PrefixSearchResult ($terms);
3049 if (count ($tmp))
3050 {
3051 $nhits += count ($tmp);
3052 $lasthit = 'ipv4network';
3053 $summary['ipv4network'] = $tmp;
3054 }
05411ccd
DO
3055 $tmp = getIPv4RSPoolSearchResult ($terms);
3056 if (count ($tmp))
3057 {
3058 $nhits += count ($tmp);
3059 $lasthit = 'ipv4rspool';
3060 $summary['ipv4rspool'] = $tmp;
3061 }
3062 $tmp = getIPv4VServiceSearchResult ($terms);
3063 if (count ($tmp))
3064 {
3065 $nhits += count ($tmp);
3066 $lasthit = 'ipv4vs';
3067 $summary['ipv4vs'] = $tmp;
3068 }
6a88e734
DO
3069 $tmp = getAccountSearchResult ($terms);
3070 if (count ($tmp))
3071 {
3072 $nhits += count ($tmp);
3073 $lasthit = 'user';
3074 $summary['user'] = $tmp;
3075 }
e1ae3fb4
AD
3076 $tmp = getFileSearchResult ($terms);
3077 if (count ($tmp))
3078 {
3079 $nhits += count ($tmp);
3080 $lasthit = 'file';
3081 $summary['file'] = $tmp;
3082 }
ea5fc465
DO
3083 }
3084 if ($nhits == 0)
3085 echo "<center><h2>Nothing found for '${terms}'</h2></center>";
3086 elseif ($nhits == 1)
3087 {
3088 $record = current ($summary[$lasthit]);
3089 switch ($lasthit)
3090 {
3091 case 'port':
3092 echo "<script language='Javascript'>document.location='${root}?page=object";
3093 echo "&hl_port_id=" . $record['port_id'];
3094 echo "&object_id=" . $record['object_id'] . "';//</script>";
3095 break;
f3d0cb20
DO
3096 case 'ipv4addressbydq':
3097 $parentnet = getIPv4AddressNetworkId ($record);
3098 if ($parentnet !== NULL)
e1ae3fb4 3099 echo "<script language='Javascript'>document.location='${root}?page=ipv4net&tab=default&id=${parentnet}&hl_ipv4_addr=${record}';//</script>";
f3d0cb20
DO
3100 else
3101 echo "<script language='Javascript'>document.location='${root}?page=ipaddress&ip=${record}';//</script>";
ea5fc465 3102 break;
f3d0cb20
DO
3103 case 'ipv4addressbydescr':
3104 $parentnet = getIPv4AddressNetworkId ($record['ip']);
3105 if ($parentnet !== NULL)
e1ae3fb4 3106 echo "<script language='Javascript'>document.location='${root}?page=ipv4net&tab=default&id=${parentnet}&hl_ipv4_addr=${record['ip']}';//</script>";
f3d0cb20
DO
3107 else
3108 echo "<script language='Javascript'>document.location='${root}?page=ipaddress&ip=${record['ip']}';//</script>";
ea5fc465
DO
3109 break;
3110 case 'ipv4network':
e1ae3fb4 3111 echo "<script language='Javascript'>document.location='${root}?page=ipv4net";
ea5fc465
DO
3112 echo "&id=${record['id']}";
3113 echo "';//</script>";
3114 break;
3115 case 'object':
3116 echo "<script language='Javascript'>document.location='${root}?page=object&object_id=${record['id']}';//</script>";
3117 break;
05411ccd 3118 case 'ipv4rspool':
e1ae3fb4 3119 echo "<script language='Javascript'>document.location='${root}?page=ipv4rspool&pool_id=${record['pool_id']}';//</script>";
05411ccd
DO
3120 break;
3121 case 'ipv4vs':
49fb2686 3122 echo "<script language='Javascript'>document.location='${root}?page=ipv4vs&vs_id=${record['id']}';//</script>";
05411ccd 3123 break;
6a88e734
DO
3124 case 'user':
3125 echo "<script language='Javascript'>document.location='${root}?page=user&user_id=${record['user_id']}';//</script>";
3126 break;
e1ae3fb4
AD
3127 case 'file':
3128 echo "<script language='Javascript'>document.location='${root}?page=file&file_id=${record['id']}';//</script>";
3129 break;
ea5fc465
DO
3130 }
3131 return;
3132 }
3133 else
3134 {
3135 global $nextorder;
3136 $order = 'odd';
3137 echo "<center><h2>${nhits} result(s) found for '${terms}'</h2></center>";
3138 foreach ($summary as $where => $what)
3139 switch ($where)
e673ee24 3140 {
ea5fc465 3141 case 'object':
06adfe89 3142 startPortlet ("<a href='${root}?page=objects'>Objects</a>");
ea5fc465 3143 echo '<table border=0 cellpadding=5 cellspacing=0 align=center class=cooltable>';
e1ae3fb4 3144 echo '<tr><th>Common name</th><th>Visible label</th><th>Asset tag</th><th>Barcode</th></tr>';
ea5fc465
DO
3145 foreach ($what as $obj)
3146 {
2b3d64c5
DO
3147 $tags = loadRackObjectTags ($obj['id']);
3148 echo "<tr class=row_${order} valign=top><td class=tdleft><a href=\"${root}?page=object&object_id=${obj['id']}\">${obj['dname']}</a>";
3149 if (count ($tags))
3150 echo '<br><small>' . serializeTags ($tags) . '</small>';
3151 echo "</td><td>${obj['label']}</td>";
ea5fc465
DO
3152 echo "<td>${obj['asset_no']}</td>";
3153 echo "<td>${obj['barcode']}</td></tr>";
3154 $order = $nextorder[$order];
3155 }
3156 echo '</table>';
3157 finishPortlet();
3158 break;
3159 case 'ipv4network':
06adfe89 3160 startPortlet ("<a href='${root}?page=ipv4space'>IPv4 networks</a>");
ea5fc465 3161 echo '<table border=0 cellpadding=5 cellspacing=0 align=center class=cooltable>';
71287f1c 3162 foreach ($what as $netinfo)
ea5fc465 3163 {
0b9c98d7
DO
3164 echo "<tr class=row_${order} valign=top><td>";
3165 renderIPv4NetCell ($netinfo);
3166 echo "</td></tr>\n";
ea5fc465
DO
3167 $order = $nextorder[$order];
3168 }
3169 echo '</table>';
3170 finishPortlet();
3171 break;
f3d0cb20 3172 case 'ipv4addressbydescr':
ea5fc465
DO
3173 startPortlet ('IPv4 addresses');
3174 echo '<table border=0 cellpadding=5 cellspacing=0 align=center class=cooltable>';
f3d0cb20 3175 // FIXME: address, parent network, routers (if extended view is enabled)
e1ae3fb4 3176 echo '<tr><th>Address</th><th>Description</th></tr>';
ea5fc465
DO
3177 foreach ($what as $addr)
3178 {
f3d0cb20
DO
3179 echo "<tr class=row_${order}><td class=tdleft>";
3180 $parentnet = getIPv4AddressNetworkId ($addr['ip']);
3181 if ($parentnet !== NULL)
e1ae3fb4 3182 echo "<a href='${root}?page=ipv4net&tab=default&id=${parentnet}&hl_ipv4_addr=${addr['ip']}'>${addr['ip']}</a></td>";
f3d0cb20
DO
3183 else
3184 echo "<a href='${root}?page=ipaddress&ip=${addr['ip']}'>${addr['ip']}</a></td>";
ea5fc465
DO
3185 echo "<td class=tdleft>${addr['name']}</td></tr>";
3186 $order = $nextorder[$order];
3187 }
3188 echo '</table>';
3189 finishPortlet();
3190 break;
05411ccd 3191 case 'ipv4rspool':
ee437dab 3192 startPortlet ("<a href='${root}?page=ipv4rsplist'>RS pools</a>");
05411ccd
DO
3193 echo '<table border=0 cellpadding=5 cellspacing=0 align=center class=cooltable>';
3194 foreach ($what as $rspool)
3195 {
216136d2
DO
3196 echo "<tr class=row_${order}><td class=tdleft>";
3197 renderRSPoolCell ($rspool['pool_id'], $rspool['name']);
3198 echo "</td></tr>";
05411ccd
DO
3199 $order = $nextorder[$order];
3200 }
3201 echo '</table>';
3202 finishPortlet();
3203 break;
3204 case 'ipv4vs':
a239e016 3205 startPortlet ("<a href='${root}?page=ipv4vslist'>Virtual services</a>");
05411ccd 3206 echo '<table border=0 cellpadding=5 cellspacing=0 align=center class=cooltable>';
8128c257 3207 foreach ($what as $vsinfo)
05411ccd 3208 {
8128c257
DO
3209 echo "<tr class=row_${order}><td class=tdleft>";
3210 renderIPv4VSCell ($vsinfo);
3211 echo "</td></tr>";
6a88e734
DO
3212 $order = $nextorder[$order];
3213 }
3214 echo '</table>';
3215 finishPortlet();
3216 break;
3217 case 'user':
3218 startPortlet ("<a href='${root}?page=userlist'>Users</a>");
3219 echo '<table border=0 cellpadding=5 cellspacing=0 align=center class=cooltable>';
6a88e734
DO
3220 foreach ($what as $item)
3221 {
19dac9c3
DO
3222 echo "<tr class=row_${order}><td class=tdleft>";
3223 renderUserCell ($item);
3224 echo "</td></tr>";
05411ccd
DO
3225 $order = $nextorder[$order];
3226 }
3227 echo '</table>';
3228 finishPortlet();
3229 break;
e1ae3fb4
AD
3230 case 'file':
3231 startPortlet ("<a href='${root}?page=files'>Files</a>");
3232 echo '<table border=0 cellpadding=5 cellspacing=0 align=center class=cooltable>';
e1ae3fb4
AD
3233 foreach ($what as $item)
3234 {
35d10b16
DO
3235 echo "<tr class=row_${order}><td class=tdleft>";
3236 renderFileCell ($item);
3237 echo "</td></tr>";
e1ae3fb4
AD
3238 $order = $nextorder[$order];
3239 }
3240 echo '</table>';
3241 finishPortlet();
3242 break;
e673ee24 3243 }
e673ee24
DO
3244 }
3245}
3246