r2598 - display CTXMOD counter in RackCode stats
[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 311 showMessageOrError();
d732e47e 312 startPortlet ('Rows');
345fd640
AD
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)
ca0cc77e 674 echo "<option value='${dict_key}'" . ($dict_key == $selected_id ? ' selected' : '') . ">${dict_value}</option>";
f3d274bf
DO
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)
ca0cc77e 693 echo "<option value='${dict_key}'" . ($dict_key == $selected_id ? ' selected' : '') . ">${dict_value}</option>";
f3d274bf 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'),
c615a655 1402 58 => array ('code' => 'success', 'format' => "Deleted tag '%s'."),
baf37d01
DO
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!'),
db55cf54
DO
1507 181 => array ('code' => 'error', 'format' => "file uploads not allowed, change 'file_uploads' parameter in php.ini"),
1508 182 => array ('code' => 'error', 'format' => 'SQL query failed: %s'),
c615a655 1509 183 => array ('code' => 'error', 'format' => "Tag id '%s' does not exist."),
f0ff4930 1510
8628ae44 1511// records 200~299 with warnings
24dcb9d8
DO
1512 200 => array ('code' => 'warning', 'format' => 'generic warning: %s'),
1513 201 => array ('code' => 'warning', 'format' => 'nothing happened...'),
1514 202 => array ('code' => 'warning', 'format' => 'gw: %s'),
f0ff4930
DO
1515 203 => array ('code' => 'warning', 'format' => 'Port %s seems to be the first in VLAN %u at this switch.'),
1516 204 => array ('code' => 'warning', 'format' => 'Check uplink/downlink configuration for proper operation.'),
1517 205 => array ('code' => 'warning', 'format' => '%u change request(s) have been ignored'),
c8187437 1518 206 => array ('code' => 'warning', 'format' => 'Rack is not empty'),
db55cf54 1519 207 => array ('code' => 'warning', 'format' => 'Ignored empty request'),
baf37d01
DO
1520 );
1521 // Handle the arguments. Is there any better way to do it?
1522 foreach ($log['m'] as $record)
1523 {
5222f192
DO
1524 if (!isset ($record['c']) or !isset ($msginfo[$record['c']]))
1525 {
1526 echo '<div class=msg_neutral>(this message was lost)</div>';
1527 continue;
1528 }
baf37d01
DO
1529 if (isset ($record['a']))
1530 switch (count ($record['a']))
1531 {
1532 case 1:
1533 $msgtext = sprintf
1534 (
1535 $msginfo[$record['c']]['format'],
1536 $record['a'][0]
1537 );
1538 break;
1539 case 2:
1540 $msgtext = sprintf
1541 (
1542 $msginfo[$record['c']]['format'],
1543 $record['a'][0],
1544 $record['a'][1]
1545 );
1546 break;
1547 case 3:
1548 $msgtext = sprintf
1549 (
1550 $msginfo[$record['c']]['format'],
1551 $record['a'][0],
1552 $record['a'][1],
1553 $record['a'][2]
1554 );
1555 break;
1556 case 4:
1557 default:
1558 $msgtext = sprintf
1559 (
1560 $msginfo[$record['c']]['format'],
1561 $record['a'][0],
1562 $record['a'][1],
1563 $record['a'][2],
1564 $record['a'][3]
1565 );
1566 break;
1567 }
1568 else
1569 $msgtext = $msginfo[$record['c']]['format'];
1570 echo '<div class=msg_' . $msginfo[$record['c']]['code'] . ">${msgtext}</div>";
1571 }
1572 break;
1573 default:
1574 echo '<div class=msg_error>' . __FUNCTION__ . ': internal error</div>';
1575 break;
1576 }
e673ee24
DO
1577}
1578
1579/*
1580The following conditions must be followed:
15811. We can mount onto free atoms only. This means: if any record for an atom
1582already exists in RackSpace, it can't be used for mounting.
15832. We can't unmount from 'W' atoms. Operator should review appropriate comments
1584and either delete them before unmounting or refuse to unmount the object.
1585*/
1586
1587// We extensively use $_REQUEST in the function.
7056988c 1588// FIXME: move related code into ophandler
e673ee24
DO
1589function renderRackSpaceForObject ($object_id = 0)
1590{
1591 if ($object_id <= 0)
1592 {
591ff2c4 1593 showError ('Invalid object_id', __FUNCTION__);
e673ee24
DO
1594 return;
1595 }
1596 $is_submit = isset ($_REQUEST['got_atoms']);
1597 $is_update = isset ($_REQUEST['rackmulti'][0]);
1598 $info = getObjectInfo ($object_id);
1599 if ($info == NULL)
1600 {
591ff2c4 1601 showError ('getObjectInfo() failed', __FUNCTION__);
e673ee24
DO
1602 return;
1603 }
1604 // Always process occupied racks plus racks chosen by user. First get racks with
1605 // already allocated rackspace...
1606 $workingRacksData = getResidentRacksData ($object_id);
1607 if ($workingRacksData === NULL)
1608 {
1609 print_r ($workingRacksData);
591ff2c4 1610 showError ('getResidentRacksData() failed', __FUNCTION__);
e673ee24
DO
1611 return;
1612 }
1613
1614 // ...and then add those chosen by user (if any).
2135fd83 1615 if (isset($_REQUEST['rackmulti']))
e673ee24
DO
1616 foreach ($_REQUEST['rackmulti'] as $cand_id)
1617 {
1618 if (!isset ($workingRacksData[$cand_id]))
1619 {
1620 $rackData = getRackData ($cand_id);
1621 if ($rackData == NULL)
1622 {
591ff2c4 1623 showError ('getRackData() failed', __FUNCTION__);
e673ee24
DO
1624 return NULL;
1625 }
1626 $workingRacksData[$cand_id] = $rackData;
1627 }
1628 }
1629
2135fd83
DY
1630 printOpFormIntro ('updateObjectAllocation');
1631
e673ee24 1632 // Do it only once...
2135fd83
DY
1633 foreach ($workingRacksData as $rackId => &$rackData)
1634 {
e673ee24 1635 applyObjectMountMask ($rackData, $object_id);
2135fd83
DY
1636 echo "<input type=\"hidden\" name=\"rackmulti[]\" value=\"$rackId\">";
1637 }
e673ee24
DO
1638 // Now we workaround an old caveat: http://bugs.php.net/bug.php?id=37410
1639 unset ($rackData);
1640
e673ee24 1641 // This is the time for rendering.
4fbb5a00
DY
1642 global $pageno, $tabno;
1643
51690ad4
DY
1644 showMessageOrError();
1645
4fbb5a00 1646
e673ee24
DO
1647 // Main layout starts.
1648 echo "<table border=0 class=objectview cellspacing=0 cellpadding=0><tr>";
1649
1650 // Left portlet with rack list.
1651 echo "<td class=pcleft height='1%'>";
1652 startPortlet ('Racks');
1653 $allRacksData = getRacksForRow();
4b8d413e
DO
1654 if (count ($allRacksData) <= getConfigVar ('RACK_PRESELECT_THRESHOLD'))
1655 {
1656 foreach (array_keys ($allRacksData) as $rack_id)
1657 {
1658 $rackData = getRackData ($rack_id);
1659 if ($rackData == NULL)
1660 {
1661 showError ('getRackData() failed', __FUNCTION__);
1662 return NULL;
1663 }
1664 $workingRacksData[$rack_id] = $rackData;
1665 }
1666 foreach ($workingRacksData as &$rackData)
1667 applyObjectMountMask ($rackData, $object_id);
1668 unset ($rackData);
1669 }
1670 renderRackMultiSelect ('rackmulti[]', $allRacksData, array_keys ($workingRacksData));
e673ee24
DO
1671 echo "<br>";
1672 echo "<br>";
1673 finishPortlet();
1674 echo "</td>";
1675
1676 // Middle portlet with comment and submit.
1677 echo "<td class=pcleft>";
1678 startPortlet ('Comment');
1679 echo "<textarea name=comment rows=10 cols=40></textarea><br>\n";
1680 echo "<input type=submit value='Save' name=got_atoms>\n";
1681 echo "<br>";
1682 echo "<br>";
1683 finishPortlet();
1684 echo "</td>";
1685
1686 // Right portlet with rendered racks. If this form submit is not final, we have to
1687 // reflect the former state of the grid in current form.
1688 echo "<td class=pcright rowspan=2 height='1%'>";
1689 startPortlet ('Working copy');
1690 echo '<table border=0 cellspacing=10 align=center><tr>';
1691 foreach ($workingRacksData as $rack_id => $rackData)
1692 {
1693 // Order is important here: only original allocation is highlighted.
1694 highlightObject ($rackData, $object_id);
1695 markupAtomGrid ($rackData, 'T');
1696 // If we have a form processed, discard user input and show new database
1697 // contents.
1698 if (!$is_submit and $is_update)
1699 mergeGridFormToRack ($rackData);
1700 echo "<td valign=top>";
1701 echo "<center>\n<h2>${rackData['name']}</h2>\n";
1702 echo "<table class=rack border=0 cellspacing=0 cellpadding=1>\n";
1703 echo "<tr><th width='10%'>&nbsp;</th><th width='20%'>Front</th>";
1704 echo "<th width='50%'>Interior</th><th width='20%'>Back</th></tr>\n";
1705 renderAtomGrid ($rackData);
9b7468b7
DO
1706 echo "<tr><th width='10%'>&nbsp;</th><th width='20%'>Front</th>";
1707 echo "<th width='50%'>Interior</th><th width='20%'>Back</th></tr>\n";
e673ee24
DO
1708 echo "</table></center>\n";
1709 echo '</td>';
1710 }
1711 echo "</tr></table>";
1712 finishPortlet();
1713 echo "</td>\n";
1714
2135fd83 1715
e673ee24
DO
1716 echo "</form>\n";
1717 echo "</tr></table>\n";
1718}
1719
1720function renderMolecule ($mdata, $object_id)
1721{
1722 // sort data out
1723 $rackpack = array();
1724 global $loclist;
64b95774 1725 foreach ($mdata as $rua)
e673ee24
DO
1726 {
1727 $rack_id = $rua['rack_id'];
1728 $unit_no = $rua['unit_no'];
1729 $atom = $rua['atom'];
1730 if (!isset ($rackpack[$rack_id]))
1731 {
1732 $rackData = getRackData ($rack_id);
1733 for ($i = $rackData['height']; $i > 0; $i--)
1734 for ($locidx = 0; $locidx < 3; $locidx++)
1735 $rackData[$i][$locidx]['state'] = 'F';
1736 $rackpack[$rack_id] = $rackData;
1737 }
1738 $rackpack[$rack_id][$unit_no][$loclist[$atom]]['state'] = 'T';
1739 $rackpack[$rack_id][$unit_no][$loclist[$atom]]['object_id'] = $object_id;
1740 }
1741 // now we have some racks to render
64b95774 1742 foreach ($rackpack as $rackData)
e673ee24
DO
1743 {
1744 markAllSpans ($rackData);
1745 echo "<table class=molecule cellspacing=0>\n";
1746 echo "<caption>${rackData['name']}</caption>\n";
1747 echo "<tr><th width='10%'>&nbsp;</th><th width='20%'>Front</th><th width='50%'>Interior</th><th width='20%'>Back</th></tr>\n";
1748 for ($i = $rackData['height']; $i > 0; $i--)
1749 {
1750 echo "<tr><th>$i</th>";
1751 for ($locidx = 0; $locidx < 3; $locidx++)
1752 {
1753 $state = $rackData[$i][$locidx]['state'];
1754 echo "<td class=state_${state}>&nbsp;</td>\n";
1755 }
1756 echo "</tr>\n";
1757 }
1758 echo "</table>\n";
1759 }
1760}
1761
1762function renderUnmountedObjectsPortlet ()
1763{
1764 startPortlet ('Unmounted objects');
1765 $objs = getUnmountedObjects();
1766 if ($objs === NULL)
1767 {
591ff2c4 1768 showError ('getUnmountedObjects() failed', __FUNCTION__);
e673ee24
DO
1769 return;
1770 }
4fbb5a00 1771 global $nextorder;
e673ee24
DO
1772 $order = 'odd';
1773 echo '<br><br><table border=0 cellpadding=5 cellspacing=0 align=center class=cooltable>';
f76c4197 1774 echo '<tr><th>Common name</th><th>Visible label</th><th>Asset number</th><th>Barcode</th></tr>';
e673ee24
DO
1775 foreach ($objs as $obj)
1776 {
4fbb5a00 1777 echo "<tr class=row_${order}><td><a href='".makeHref(array('page'=>'object', 'object_id'=>$obj['id']))."'>${obj['dname']}</a></td>";
e673ee24 1778 echo "<td>${obj['label']}</td>";
18d94c29 1779 echo "<td>${obj['asset_no']}</td>";
f76c4197 1780 echo "<td>${obj['barcode']}</td>";
4fbb5a00 1781 echo "</tr>";
e673ee24
DO
1782 $order = $nextorder[$order];
1783 }
1784 echo "</table><br>\n";
1785 finishPortlet();
1786}
1787
1788function renderProblematicObjectsPortlet ()
1789{
1790 startPortlet ('Problematic objects');
1791 $objs = getProblematicObjects();
1792 if ($objs === NULL)
1793 {
591ff2c4 1794 showError ('getProblematicObjects() failed', __FUNCTION__);
e673ee24
DO
1795 return;
1796 }
4fbb5a00 1797 global $nextorder;
e673ee24
DO
1798 $order = 'odd';
1799 echo '<br><br><table border=0 cellpadding=5 cellspacing=0 align=center class=cooltable>';
1800 echo '<tr><th>Type</th><th>Common name</th></tr>';
1801 foreach ($objs as $obj)
1802 {
1803 echo "<tr class=row_${order}><td>${obj['objtype_name']}</td>";
4fbb5a00 1804 echo "<td><a href='".makeHref(array('page'=>'object', 'object_id'=>$obj['id']))."'>${obj['dname']}</a></tr>";
e673ee24
DO
1805 $order = $nextorder[$order];
1806 }
1807 echo "</table><br>\n";
1808 finishPortlet();
1809}
1810
7cc02fc1
DO
1811function renderObjectSpace ()
1812{
4fbb5a00 1813 global $taglist, $tagtree;
52b34485 1814 showMessageOrError();
7cc02fc1
DO
1815 echo "<table border=0 class=objectview>\n";
1816 echo "<tr><td class=pcleft width='50%'>";
1817 startPortlet ('View all by type');
1818 $groupInfo = getObjectGroupInfo();
1819 if ($groupInfo === NULL)
1820 {
1821 showError ('getObjectGroupInfo() failed', __FUNCTION__);
1822 return;
1823 }
1824 if (count ($groupInfo) == 0)
1825 echo "No objects exist in DB";
1826 else
1827 {
1828 echo '<div align=left><ul>';
1829 foreach ($groupInfo as $gi)
4fbb5a00 1830 echo "<li><a href='".makeHref(array('page'=>'objgroup', 'group_id'=>$gi['id']))."'>${gi['name']}</a> (${gi['count']})</li>";
7cc02fc1
DO
1831 echo '</ul></div>';
1832 }
1833 finishPortlet();
1834
1835 echo '</td><td class=pcright>';
1836
1837 startPortlet ('View all by tag');
1838 if (count ($taglist) == 0)
1839 echo "No tags exist in DB";
1840 else
1841 renderTagCloud ('object');
1842 finishPortlet();
e673ee24
DO
1843 echo "</td></tr></table>\n";
1844}
1845
466dcbe6 1846function renderObjectGroup ()
7cc02fc1 1847{
4fbb5a00 1848 global $pageno, $tabno, $nextorder, $taglist, $tagtree;
52b34485 1849 showMessageOrError();
2c6c7645 1850 assertUIntArg ('group_id', __FUNCTION__, TRUE);
7cc02fc1 1851 $group_id = $_REQUEST['group_id'];
a0d54e7e
DO
1852 $tagfilter = getTagFilter();
1853 $tagfilter_str = getTagFilterStr ($tagfilter);
7cc02fc1
DO
1854 echo "<table border=0 class=objectview>\n";
1855 echo "<tr><td class=pcleft width='25%'>";
1856 startPortlet ('change type');
1857 $groupInfo = getObjectGroupInfo();
1858 if ($groupInfo === NULL)
1859 {
1860 showError ('getObjectGroupInfo() failed', __FUNCTION__);
1861 return;
1862 }
1863 if (count ($groupInfo) == 0)
1864 echo "No objects exist in DB";
1865 else
1866 {
1867 echo '<div align=left><ul>';
1868 foreach ($groupInfo as $gi)
1869 {
4fbb5a00 1870 echo "<li><a href='".makeHref(array('page'=>$pageno, 'group_id'=>$gi['id']))."${tagfilter_str}'>";
105cea6e
DO
1871 if ($gi['id'] == $group_id)
1872 echo '<strong>';
1873 echo "${gi['name']}</a>";
1874 if ($gi['id'] == $group_id)
1875 echo '</strong>';
1876 echo " (${gi['count']})";
1877 if ($gi['id'] == $group_id)
1878 echo ' &larr;';
1879 echo "</li>";
7cc02fc1
DO
1880 }
1881 echo '</ul></div>';
1882 }
1883 finishPortlet();
1884
1885 echo '</td><td class=pcleft>';
1886
11c8e4be 1887 $objects = getObjectList ($group_id, $tagfilter, getTFMode());
7f3dc533
DO
1888 if (isset ($_REQUEST['pfilter']))
1889 $objects = filterEntityList ($objects, 'object', interpretPredicate ($_REQUEST['pfilter']));
922b8da6 1890 startPortlet ('Objects (' . count ($objects) . ')');
7cc02fc1
DO
1891 if ($objects === NULL)
1892 {
1893 showError ('getObjectList() failed', __FUNCTION__);
1894 return;
1895 }
1896 echo '<br><br><table border=0 cellpadding=5 cellspacing=0 align=center class=cooltable>';
e3805a56 1897 echo '<tr><th>Common name</th><th>Visible label</th><th>Asset tag</th><th>Barcode</th><th>Row/Rack</th></tr>';
7cc02fc1
DO
1898 $order = 'odd';
1899 foreach ($objects as $obj)
1900 {
8e700dd1
DO
1901 if (isset ($_REQUEST['hl_object_id']) and $_REQUEST['hl_object_id'] == $obj['id'])
1902 $secondclass = 'tdleft port_highlight';
1903 else
1904 $secondclass = 'tdleft';
2c21a10c 1905 $tags = loadEntityTags ('object', $obj['id']);
4fbb5a00 1906 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 1907 if (count ($tags))
4fbb5a00 1908 echo '<br><small>' . serializeTags ($tags, makeHref(array('page'=>$pageno, 'tab'=>'default', 'group_id'=>$group_id))."&") . '</small>';
2b3d64c5 1909 echo "</td><td class='${secondclass}'>${obj['label']}</td>";
8e700dd1 1910 echo "<td class='${secondclass}'>${obj['asset_no']}</td>";
f76c4197 1911 echo "<td class='${secondclass}'>${obj['barcode']}</td>";
7cc02fc1 1912 if ($obj['rack_id'])
4fbb5a00 1913 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 1914 else
8e700dd1 1915 echo "<td class='${secondclass}'>Unmounted</td>";
7cc02fc1
DO
1916 echo '</tr>';
1917 $order = $nextorder[$order];
1918 }
1919 echo '</table>';
1920 finishPortlet();
1921
1922 echo "</td><td class=pcright width='25%'>";
1923
a0d54e7e 1924 renderTagFilterPortlet ($tagfilter, 'object', 'group_id', $group_id);
7cc02fc1 1925 echo "</td></tr></table>\n";
e673ee24
DO
1926}
1927
1928function renderEmptyPortsSelect ($port_id, $type_id)
1929{
1930 $ports = getEmptyPortsOfType($type_id);
1931 usort($ports, 'sortEmptyPorts');
1932 foreach ($ports as $port)
1933 {
1934 if ($port_id == $port['Port_id'])
1935 continue;
1936 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";
1937 }
1938}
1939
6ef9683b 1940function renderAllIPv4Allocations ()
e673ee24 1941{
6ef9683b 1942 $addresses = getAllIPv4Allocations();
e673ee24
DO
1943 usort($addresses, 'sortObjectAddressesAndNames');
1944 foreach ($addresses as $address)
1945 {
1946 echo "<option value='${address['ip']}' onclick='getElementById(\"ip\").value=\"${address['ip']}\";'>${address['object_name']} ${address['name']} ${address['ip']}</option>\n";
1947 }
1948}
1949
1950// History viewer for history-enabled simple dictionaries.
1951function renderHistory ($object_type, $object_id)
1952{
1953 switch ($object_type)
1954 {
1955 case 'row':
1956 $query = "select ctime, user_name, name, deleted, comment from RackRowHistory where id = ${object_id} order by ctime";
1957 $header = '<tr><th>change time</th><th>author</th><th>rack row name</th><th>is deleted?</th><th>rack row comment</th></tr>';
1958 $extra = 4;
1959 break;
1960 case 'rack':
1961 $query =
51690ad4
DY
1962 "select ctime, user_name, rh.name, rh.deleted, rr.name as name, rh.height, rh.comment " .
1963 "from RackHistory as rh left join RackRow as rr on rh.row_id = rr.id " .
1964 "where rh.id = ${object_id} order by ctime";
e673ee24
DO
1965 $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>';
1966 $extra = 6;
1967 break;
1968 case 'object':
1969 $query =
f76c4197 1970 "select ctime, user_name, RackObjectHistory.name as name, label, barcode, asset_no, deleted, has_problems, dict_value, comment " .
00f6f1e4
DY
1971 "from RackObjectHistory inner join Dictionary on objtype_id = dict_key join Chapter on Dictionary.chapter_id = Chapter.id " .
1972 "where Chapter.name = 'RackObjectType' and RackObjectHistory.id=${object_id} order by ctime";
f76c4197 1973 $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
1974 $extra = 9;
1975 break;
1976 default:
591ff2c4 1977 showError ("Uknown object type '${object_type}'", __FUNCTION__);
e673ee24
DO
1978 return;
1979 }
1980 global $dbxlink;
1981 $result = $dbxlink->query ($query);
1982 if ($result == NULL)
1983 {
591ff2c4 1984 showError ('SQL query failed', __FUNCTION__);
e673ee24
DO
1985 return;
1986 }
1987 echo '<table border=0 cellpadding=5 cellspacing=0 align=center class=cooltable>';
1988 $order = 'odd';
1989 global $nextorder;
1990 echo $header;
1991 while ($row = $result->fetch (PDO::FETCH_NUM))
1992 {
1993 echo "<tr class=row_${order}><td>${row[0]}</td>";
1994 for ($i = 1; $i <= $extra; $i++)
1995 echo "<td>" . $row[$i] . "</td>";
1996 echo "</tr>\n";
1997 $order = $nextorder[$order];
1998 }
1999 echo "</table><br>\n";
2000}
2001
2002function renderRackspaceHistory ()
2003{
4fbb5a00 2004 global $nextorder, $pageno, $tabno;
e673ee24
DO
2005 $order = 'odd';
2006 $history = getRackspaceHistory();
2007 // Show the last operation by default.
2008 if (isset ($_REQUEST['op_id']))
2009 $op_id = $_REQUEST['op_id'];
2010 elseif (isset ($history[0]['mo_id']))
2011 $op_id = $history[0]['mo_id'];
2012 else $op_id = NULL;
2013
2014 $omid = NULL;
2015 $nmid = NULL;
2016 $object_id = 1;
2017 if ($op_id)
2018 list ($omid, $nmid) = getOperationMolecules ($op_id);
2019
2020 // Main layout starts.
2021 echo "<table border=0 class=objectview cellspacing=0 cellpadding=0>";
2022
2023 // Left top portlet with old allocation.
2024 echo "<tr><td class=pcleft>";
2025 startPortlet ('Old allocation');
2026 if ($omid)
2027 {
2028 $oldMolecule = getMolecule ($omid);
2029 renderMolecule ($oldMolecule, $object_id);
2030 }
2031 else
2032 echo "nothing";
2033 finishPortlet();
2034
2035 echo '</td><td class=pcright>';
2036
2037 // Right top portlet with new allocation
2038 startPortlet ('New allocation');
2039 if ($nmid)
2040 {
2041 $newMolecule = getMolecule ($nmid);
2042 renderMolecule ($newMolecule, $object_id);
2043 }
2044 else
2045 echo "nothing";
2046 finishPortlet();
737a3f72 2047
e673ee24 2048 echo '</td></tr><tr><td colspan=2>';
737a3f72 2049
e673ee24
DO
2050 // Bottom portlet with list
2051
2052 startPortlet ('Rackspace allocation history');
2053 echo "<table border=0 cellpadding=5 cellspacing=0 align=center class=cooltable>\n";
2054 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";
2055 foreach ($history as $row)
2056 {
2057 if ($row['mo_id'] == $op_id)
2058 $class = 'hl';
2059 else
2060 $class = "row_${order}";
4fbb5a00 2061 echo "<tr class=${class}><td><a href='".makeHref(array('page'=>$pageno, 'tab'=>$tabno, 'op_id'=>$row['mo_id']))."'>${row['ctime']}</a></td>";
e673ee24
DO
2062 echo "<td>${row['user_name']}</td>";
2063 echo "<td>${row['ro_id']}</td><td>${row['objtype_name']}</td><td>${row['name']}</td><td>${row['comment']}</td>\n";
2064 echo "</tr>\n";
2065 $order = $nextorder[$order];
2066 }
2067 echo "</table>\n";
2068 finishPortlet();
737a3f72 2069
e673ee24 2070 echo '</td></tr></table>';
e673ee24
DO
2071}
2072
d9f8a37a 2073function renderIPv4SpaceRecords ($tree, &$tagcache, $baseurl, $target = 0, $level = 1)
d65353ad
DO
2074{
2075 $self = __FUNCTION__;
2076 foreach ($tree as $item)
2077 {
737a3f72 2078 $total = $item['addrt'];
64347dcf
DO
2079 if (getConfigVar ('IPV4_TREE_SHOW_USAGE') == 'yes')
2080 {
2081 loadIPv4AddrList ($item); // necessary to compute router list and address counter
2082 $used = $item['addrc'];
2083 }
2084 else
2085 {
2086 $item['addrlist'] = array();
2087 $item['addrc'] = 0;
2088 }
0137d53c
DO
2089 if (isset ($item['id']))
2090 {
fec0c8da 2091 if ($item['symbol'] == 'node-collapsed')
d9f8a37a 2092 $expandurl = "${baseurl}&eid=" . $item['id'] . "#netid" . $item['id'];
fec0c8da 2093 elseif ($item['symbol'] == 'node-expanded')
d9f8a37a 2094 $expandurl = $baseurl . ($item['parent_id'] ? "&eid=${item['parent_id']}#netid${item['parent_id']}" : '');
fec0c8da
DO
2095 else
2096 $expandurl = '';
0137d53c 2097 echo "<tr valign=top>";
fec0c8da 2098 printIPv4NetInfoTDs ($item, 'tdleft', $level, $item['symbol'], $expandurl);
0137d53c 2099 echo "<td class=tdcenter>";
d9f8a37a
DO
2100 if ($target == $item['id'])
2101 echo "<a name=netid${target}></a>";
64347dcf
DO
2102 if (getConfigVar ('IPV4_TREE_SHOW_USAGE') == 'yes')
2103 {
2104 renderProgressBar ($total ? $used/$total : 0);
2105 echo "<br><small>${used}/${total}</small>";
2106 }
2107 else
2108 echo "<small>${total}</small>";
2109 echo "</td>";
0137d53c 2110 if (getConfigVar ('EXT_IPV4_VIEW') == 'yes')
b6b87070 2111 printRoutersTD (findRouters ($item['addrlist']), $tagcache);
0137d53c 2112 echo "</tr>";
fec0c8da 2113 if ($item['symbol'] == 'node-expanded' or $item['symbol'] == 'node-expanded-static')
d9f8a37a 2114 $self ($item['kids'], $tagcache, $baseurl, $target, $level + 1);
0137d53c
DO
2115 }
2116 else
2117 {
0137d53c 2118 echo "<tr valign=top>";
fec0c8da 2119 printIPv4NetInfoTDs ($item, 'tdleft sparenetwork', $level, $item['symbol']);
0137d53c 2120 echo "<td class=tdcenter>";
64347dcf
DO
2121 if (getConfigVar ('IPV4_TREE_SHOW_USAGE') == 'yes')
2122 {
2123 renderProgressBar ($used/$total, 'sparenetwork');
2124 echo "<br><small>${used}/${total}</small>";
2125 }
2126 else
2127 echo "<small>${total}</small>";
2128 echo "</td><td>&nbsp;</td></tr>";
0137d53c 2129 }
d65353ad
DO
2130 }
2131}
2132
04d619d0 2133function renderIPv4Space ()
e673ee24 2134{
4fbb5a00 2135 global $pageno, $tabno;
932cf41f 2136 $tagfilter = getTagFilter();
94a40058 2137 $netlist = getIPv4NetworkList ($tagfilter, getTFMode());
4fbb5a00
DY
2138
2139
94a40058 2140 $netcount = count ($netlist);
5388794d
DO
2141 // expand request can take either natural values or "ALL". Zero means no expanding.
2142 $eid = isset ($_REQUEST['eid']) ? $_REQUEST['eid'] : 0;
2143 $tree = prepareIPv4Tree ($netlist, $eid);
3630d1fb
DO
2144
2145 echo "<table border=0 class=objectview>\n";
2146 echo "<tr><td class=pcleft>";
94a40058 2147 startPortlet ("networks (${netcount})");
5388794d
DO
2148 echo '<h4>';
2149 if ($eid === 0)
4fbb5a00 2150 echo 'auto-collapsing at threshold ' . getConfigVar ('TREE_THRESHOLD') . " (<a href='".makeHref(array('page'=>$pageno, 'tab'=>$tabno, 'eid'=>'ALL'))."'>expand all</a>)";
5388794d 2151 elseif ($eid === 'ALL')
4fbb5a00 2152 echo "expanding all (<a href='".makeHref(array('page'=>$pageno, 'tab'=>$tabno))."'>auto-collapse</a>)";
5388794d
DO
2153 else
2154 {
2155 $netinfo = getIPv4NetworkInfo ($eid);
4fbb5a00 2156 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
2157 }
2158 echo "</h4><table class='widetable' border=0 cellpadding=5 cellspacing=0 align='center'>\n";
64347dcf 2159 echo "<tr><th>prefix</th><th>name/tags</th><th>capacity</th>";
f0ed1181 2160 if (getConfigVar ('EXT_IPV4_VIEW') == 'yes')
57dece2f
DO
2161 echo "<th>routed by</th>";
2162 echo "</tr>\n";
fec0c8da 2163 $tagcache = array();
4fbb5a00 2164 $baseurl = makeHref(array('page'=>$pageno, 'tab'=>$tabno)) . getTagFilterStr ($tagfilter);
5388794d 2165 renderIPv4SpaceRecords ($tree, $tagcache, $baseurl, $eid);
e673ee24 2166 echo "</table>\n";
a7fe7729 2167 finishPortlet();
74ccacff 2168 echo '</td><td class=pcright>';
5b7bd02e 2169 renderTagFilterPortlet ($tagfilter, 'ipv4net');
74ccacff 2170 echo "</td></tr></table>\n";
f973f491 2171}
a7fe7729 2172
f973f491
DO
2173function renderIPv4SLB ()
2174{
4fbb5a00 2175 global $page, $nextorder;
a7fe7729 2176
6fec9f39 2177 startPortlet ('SLB configuration');
b3c50e6c 2178 echo "<table border=0 width='100%'><tr>";
ee437dab 2179 foreach (array ('ipv4vslist', 'ipv4rsplist', 'rservers', 'lbs') as $pno)
4fbb5a00 2180 echo "<td><h3><a href='".makeHref(array('page'=>$pno))."'>" . $page[$pno]['title'] . "</a></h3></td>";
b3c50e6c
DO
2181 echo '</tr></table>';
2182 finishPortlet();
2183
c3bdc503 2184 $summary = getSLBSummary();
6fec9f39 2185 startPortlet ('SLB tactical overview');
4cadac8f
DO
2186 // A single id-keyed array isn't used here to preserve existing
2187 // order of LBs returned by getSLBSummary()
c3bdc503
DO
2188 $lblist = array();
2189 $lbdname = array();
4cadac8f 2190 foreach ($summary as $vipdata)
da04825a 2191 foreach (array_keys ($vipdata['lblist']) as $lb_object_id)
c3bdc503
DO
2192 if (!in_array ($lb_object_id, $lblist))
2193 {
2194 $oi = getObjectInfo ($lb_object_id);
2195 $lbdname[$lb_object_id] = $oi['dname'];
2196 $lblist[] = $lb_object_id;
2197 }
2198 if (!count ($summary))
2199 echo 'none configured';
2200 else
2201 {
80e85ea1 2202 $order = 'odd';
c3bdc503 2203 echo "<table class='widetable' border=0 cellpadding=5 cellspacing=0 align='center'>\n";
b1a970c7 2204 echo "<tr valign=top><td>&nbsp;</td>";
c3bdc503 2205 foreach ($lblist as $lb_object_id)
b1a970c7 2206 {
4fbb5a00 2207 #echo "<th><a href='".makeHref(array('page'=>'object', 'tab'=>'default', 'object_id'=>$lb_object_id))."'>" . $lbdname[$lb_object_id] . "</a></th>";
b1a970c7
DO
2208 echo '<td>';
2209 renderLBCell ($lb_object_id);
2210 echo '</td>';
2211 }
c3bdc503 2212 echo "</tr>\n";
4cadac8f
DO
2213 foreach ($summary as $vsid => $vsdata)
2214 {
b1a970c7
DO
2215 echo "<tr class=row_${order}><td class=tdleft>";
2216 renderVSCell ($vsid);
6fec9f39 2217 echo "</td>";
4cadac8f 2218 foreach ($lblist as $lb_object_id)
da04825a 2219 {
60fbcece 2220 echo '<td class=tdleft>';
2b4eee17 2221 if (!isset ($vsdata['lblist'][$lb_object_id]))
da04825a
DO
2222 echo '&nbsp;';
2223 else
6fec9f39
DO
2224 {
2225 echo $vsdata['lblist'][$lb_object_id]['size'];
4fbb5a00 2226// echo " (<a href='".makeHref(array('page'=>'ipv4rspool', 'pool_id'=>$vsdata['lblist'][$lb_object_id]['id'])). "'>";
79a9edb4 2227// echo $vsdata['lblist'][$lb_object_id]['name'] . '</a>)';
6fec9f39 2228 }
da04825a
DO
2229 echo '</td>';
2230 }
2231 echo "</tr>\n";
80e85ea1 2232 $order = $nextorder[$order];
4cadac8f 2233 }
c3bdc503
DO
2234 echo "</table>\n";
2235 }
a7fe7729 2236 finishPortlet ();
e673ee24
DO
2237}
2238
04d619d0 2239function renderIPv4SpaceEditor ()
e673ee24 2240{
4fbb5a00 2241 global $pageno, $tabno;
e673ee24 2242 showMessageOrError();
2a201216 2243
a262e150
DO
2244 // IPv4 validator
2245?>
2246 <script type="text/javascript">
2247 function init() {
2248 document.add_new_range.range.setAttribute('match', "^\\d\\d?\\d?\\.\\d\\d?\\d?\\.\\d\\d?\\d?\\.\\d\\d?\\d?\\/\\d\\d?$");
2249
2250 Validate.init();
2251 }
2252 window.onload=init;
2253 </script>
2254<?php
2255
4c0653e2 2256 startPortlet ("Add new");
04d619d0 2257 echo '<table border=0 cellpadding=10 align=center>';
7056988c
DO
2258 // This form requires a name, so JavaScript validator can find it.
2259 // No printOpFormIntro() hence
4fbb5a00 2260 echo "<form method=post name='add_new_range' action='".makeHrefProcess()."'>\n";
42023f03 2261 echo "<input type=hidden name=op value=addIPv4Prefix>\n";
04d619d0
DO
2262 // tags column
2263 echo '<tr><td rowspan=4><h3>assign tags</h3>';
5c0bb421 2264 renderTagSelect();
04d619d0
DO
2265 echo '</td>';
2266 // inputs column
2267 echo "<th class=tdright>prefix</th><td class=tdleft><input type=text name='range' size=18 class='live-validate' tabindex=1></td>";
2268 echo "<tr><th class=tdright>name</th><td class=tdleft><input type=text name='name' size='20' tabindex=2></td></tr>";
0c16ef0c 2269 echo "<tr><th class=tdright>connected network</th><td class=tdleft><input type=checkbox name='is_bcast' tabindex=3></td></tr>";
04d619d0 2270 echo "<tr><td colspan=2>";
4c0653e2 2271 printImageHREF ('CREATE', 'Add a new network', TRUE, 4);
04d619d0 2272 echo '</td></tr>';
2a201216 2273 echo "</form></table><br><br>\n";
5c0bb421 2274 finishPortlet();
2a201216 2275
b18d26dc 2276 $addrspaceList = getIPv4NetworkList();
e43a2de4 2277 if (count ($addrspaceList))
e673ee24 2278 {
e43a2de4 2279 startPortlet ('Manage existing (' . count ($addrspaceList) . ')');
04d619d0
DO
2280 echo "<table class='widetable' border=0 cellpadding=5 cellspacing=0 align='center'>\n";
2281 echo "<tr><th>&nbsp;</th><th>prefix</th><th>name</th><th>&nbsp;</th></tr>";
0c16ef0c 2282 foreach ($addrspaceList as $netinfo)
e673ee24 2283 {
0b9c98d7 2284 echo "<form method=post action='".makeHrefProcess(array('op'=>'updIPv4Prefix', 'id'=>$netinfo['id']))."'>";
e43a2de4
DO
2285 echo "<tr valign=top><td>";
2286 if (getConfigVar ('IPV4_JAYWALK') == 'yes')
2287 {
2288 echo "<a href='".makeHrefProcess(array('op'=>'delIPv4Prefix', 'id'=>$netinfo['id']))."'>";
2289 printImageHREF ('destroy', 'Delete this prefix');
2290 echo "</a>";
2291 }
2292 else // only render clickable image for empty networks
2293 {
2294 $netdata = getIPv4NetworkInfo ($netinfo['id']);
2295 loadIPv4AddrList ($netdata);
2296 if (count ($netdata['addrlist']))
2297 printImageHREF ('nodestroy', 'There are ' . count ($netdata['addrlist']) . ' allocations inside');
2298 else
2299 {
2300 echo "<a href='".makeHrefProcess(array('op'=>'delIPv4Prefix', 'id'=>$netinfo['id']))."'>";
2301 printImageHREF ('destroy', 'Delete this prefix');
2302 echo "</a>";
2303 }
2304
2305 }
2306 echo "</td>\n<td class=tdleft>${netinfo['ip']}/${netinfo['mask']}</td>";
0c16ef0c 2307 echo "<td><input type=text name=name size=40 value='${netinfo['name']}'>";
04d619d0
DO
2308 echo "</td><td>";
2309 printImageHREF ('save', 'Save changes', TRUE);
2310 echo "</td></tr></form>\n";
e673ee24 2311 }
04d619d0
DO
2312 echo "</table>";
2313 finishPortlet();
e673ee24 2314 }
e673ee24
DO
2315}
2316
beb9e88a 2317function renderIPv4Network ($id)
e673ee24 2318{
4fbb5a00 2319 global $pageno, $tabno, $aac2;
545478d0
DO
2320 $netmaskbylen = array
2321 (
2322 32 => '255.255.255.255',
2323 31 => '255.255.255.254',
2324 30 => '255.255.255.252',
2325 29 => '255.255.255.248',
2326 28 => '255.255.255.240',
2327 27 => '255.255.255.224',
2328 26 => '255.255.255.192',
2329 25 => '255.255.255.128',
2330 24 => '255.255.255.0',
2331 23 => '255.255.254.0',
2332 22 => '255.255.252.0',
2333 21 => '255.255.248.0',
2334 20 => '255.255.240.0',
2335 19 => '255.255.224.0',
2336 18 => '255.255.192.0',
2337 17 => '255.255.128.0',
2338 16 => '255.255.0.0',
2339 15 => '255.254.0.0',
2340 14 => '255.252.0.0',
2341 13 => '255.248.0.0',
2342 12 => '255.240.0.0',
2343 11 => '255.224.0.0',
2344 10 => '255.192.0.0',
2345 9 => '255.128.0.0',
2346 8 => '255.0.0.0',
2347 7 => '254.0.0.0',
2348 6 => '252.0.0.0',
2349 5 => '248.0.0.0',
2350 4 => '240.0.0.0',
2351 3 => '224.0.0.0',
2352 2 => '192.0.0.0',
2353 1 => '128.0.0.0'
2354 );
2355 $wildcardbylen = array
2356 (
2357 32 => '0.0.0.0',
2358 31 => '0.0.0.1',
2359 30 => '0.0.0.3',
2360 29 => '0.0.0.7',
2361 28 => '0.0.0.15',
2362 27 => '0.0.0.31',
2363 26 => '0.0.0.63',
2364 25 => '0.0.0.127',
2365 24 => '0.0.0.255',
2366 23 => '0.0.1.255',
2367 22 => '0.0.3.255',
2368 21 => '0.0.7.255',
2369 20 => '0.0.15.255',
2370 19 => '0.0.31.255',
2371 18 => '0.0.63.255',
2372 17 => '0.0.127.255',
2373 16 => '0.0.255.25',
2374 15 => '0.1.255.255',
2375 14 => '0.3.255.255',
2376 13 => '0.7.255.255',
2377 12 => '0.15.255.255',
2378 11 => '0.31.255.255',
2379 10 => '0.63.255.255',
2380 9 => '0.127.255.255',
2381 8 => '0.255.255.255',
2382 7 => '1.255.255.255',
2383 6 => '3.255.255.255',
2384 5 => '7.255.255.255',
2385 4 => '15.255.255.255',
2386 3 => '31.255.255.255',
2387 2 => '63.255.255.255',
2388 1 => '127.255.255.255'
2389 );
b901bf1f 2390 $maxperpage = getConfigVar ('IPV4_ADDRS_PER_PAGE');
e673ee24
DO
2391 if (isset($_REQUEST['pg']))
2392 $page = $_REQUEST['pg'];
2393 else
2394 $page=0;
2395
b6b87070
DO
2396 $range = getIPv4NetworkInfo ($id);
2397 loadIPv4AddrList ($range);
2034d968
DO
2398 echo "<table border=0 class=objectview cellspacing=0 cellpadding=0>";
2399 echo "<tr><td colspan=2 align=center><h1>${range['ip']}/${range['mask']}</h1><h2>${range['name']}</h2></td></tr>\n";
2400
2401 echo "<tr><td class=pcleft width='50%'>";
2402 startPortlet ('summary');
2403 $total = ($range['ip_bin'] | $range['mask_bin_inv']) - ($range['ip_bin'] & $range['mask_bin']) + 1;
2404 $used = count ($range['addrlist']);
2405 echo "<table border=0 cellspacing=0 cellpadding=3 width='100%'>\n";
04d619d0
DO
2406
2407 echo "<tr><th width='50%' class=tdright>%% used:</th><td class=tdleft>";
2034d968
DO
2408 renderProgressBar ($used/$total);
2409 echo "&nbsp;${used}/${total}</td></tr>\n";
04d619d0 2410
001e61fa
DO
2411 if (getConfigVar ('EXT_IPV4_VIEW') == 'yes')
2412 {
3444ecf2
DO
2413 // Build a backtrace from all parent networks.
2414 $clen = $range['mask'];
2415 $backtrace = array();
2416 while (NULL !== ($upperid = getIPv4AddressNetworkId ($range['ip'], $clen)))
2417 {
2418 $upperinfo = getIPv4NetworkInfo ($upperid);
2419 $clen = $upperinfo['mask'];
2420 $backtrace[] = $upperid;
2421 }
2422 $arrows = count ($backtrace);
2423 foreach (array_reverse ($backtrace) as $ancestorid)
001e61fa
DO
2424 {
2425 $ainfo = getIPv4NetworkInfo ($ancestorid);
3444ecf2
DO
2426 echo "<tr><th width='50%' class=tdright>";
2427 for ($i = 0; $i < $arrows; $i++)
2428 echo '&uarr;';
2429 $arrows--;
5d3dcb8d
DO
2430 echo "</th><td class=tdleft>";
2431 renderIPv4NetCell ($ainfo);
2432 echo "</td></tr>";
001e61fa 2433 }
3444ecf2 2434 echo "<tr><th width='50%' class=tdright>&rarr;</th>";
5d3dcb8d
DO
2435 echo "<td class=tdleft>";
2436 renderIPv4NetCell ($range);
2437 echo "</td></tr>";
001e61fa
DO
2438 // FIXME: get and display nested networks
2439 // $theitem = pickLeaf ($ipv4tree, $id);
2440 }
2441
545478d0
DO
2442 echo "<tr><th width='50%' class=tdright>Netmask:</th><td class=tdleft>";
2443 echo $netmaskbylen[$range['mask']];
2444 echo "</td></tr>\n";
04d619d0 2445
c607ab55
DO
2446 echo "<tr><th width='50%' class=tdright>Netmask:</th><td class=tdleft>";
2447 printf ('0x%08X', binMaskFromDec ($range['mask']));
2448 echo "</td></tr>\n";
2449
545478d0
DO
2450 echo "<tr><th width='50%' class=tdright>Wildcard bits:</th><td class=tdleft>";
2451 echo $wildcardbylen[$range['mask']];
2452 echo "</td></tr>\n";
04d619d0 2453
f3d0cb20 2454 $routers = findRouters ($range['addrlist']);
f0ed1181 2455 if (getConfigVar ('EXT_IPV4_VIEW') == 'yes' and count ($routers))
04d619d0 2456 {
57dece2f 2457 echo "<tr><th width='50%' class=tdright>Routed by:</th>";
f3d0cb20 2458 printRoutersTD ($routers);
57dece2f 2459 echo "</tr>\n";
04d619d0
DO
2460 }
2461
4fbb5a00 2462 printTagTRs (makeHref(array('page'=>'ipv4space', 'tab'=>'default'))."&");
2034d968
DO
2463 echo "</table><br>\n";
2464 finishPortlet();
e1ae3fb4
AD
2465
2466 renderFilesPortlet ('ipv4net', $id);
2034d968 2467 echo "</td>\n";
e673ee24 2468
2034d968
DO
2469 echo "<td class=pcright>";
2470 startPortlet ('details');
e673ee24
DO
2471 $startip = $range['ip_bin'] & $range['mask_bin'];
2472 $endip = $range['ip_bin'] | $range['mask_bin_inv'];
2473 $realstartip = $startip;
2474 $realendip = $endip;
2475 $numpages = 0;
2476 if($endip - $startip > $maxperpage)
2477 {
e673ee24
DO
2478 $numpages = ($endip - $startip)/$maxperpage;
2479 $startip = $startip + $page * $maxperpage;
2480 $endip = $startip + $maxperpage-1;
2481 }
2482 echo "<center>";
b901bf1f
DO
2483 if ($numpages)
2484 echo '<h3>' . long2ip ($startip) . ' ~ ' . long2ip ($endip) . '</h3>';
e673ee24
DO
2485 for ($i=0; $i<$numpages; $i++)
2486 {
2487 if ($i == $page)
2488 echo "<b>$i</b> ";
2489 else
4fbb5a00 2490 echo "<a href='".makeHref(array('page'=>$pageno, 'tab'=>$tabno, 'id'=>$id, 'pg'=>$i))."'>$i</a> ";
e673ee24
DO
2491 }
2492 echo "</center>";
2493
beb9e88a 2494 echo "<table class='widetable' border=0 cellspacing=0 cellpadding=5 align='center' width='100%'>\n";
e673ee24
DO
2495 echo "<tr><th>Address</th><th>Name</th><th>Allocation</th></tr>\n";
2496
2497
b2035dca
DO
2498 for ($ip = $startip; $ip <= $endip; $ip++) :
2499 if (isset ($_REQUEST['hl_ipv4_addr']) and ip2long ($_REQUEST['hl_ipv4_addr']) == $ip)
2500 $secondstyle = 'tdleft port_highlight';
2727c7df 2501 else
b2035dca
DO
2502 $secondstyle = 'tdleft';
2503 if (!isset ($range['addrlist'][$ip]))
e673ee24 2504 {
4fbb5a00 2505 echo "<tr><td class=tdleft><a href='".makeHref(array('page'=>'ipaddress', 'ip'=>ip_long2quad($ip)))."'>" . ip_long2quad($ip);
b2035dca
DO
2506 echo "</a></td><td class='${secondstyle}'>&nbsp;</td><td class='${secondstyle}'>&nbsp;</td></tr>\n";
2507 continue;
2508 }
b2035dca 2509 $addr = $range['addrlist'][$ip];
2d318652 2510 echo "<tr class='${addr['class']}'>";
e673ee24 2511
4fbb5a00 2512 echo "<td class=tdleft><a href='".makeHref(array('page'=>'ipaddress', 'ip'=>$addr['ip']))."'>${addr['ip']}</a></td>";
b2035dca
DO
2513 echo "<td class='${secondstyle}'>${addr['name']}</td><td class='${secondstyle}'>";
2514 $delim = '';
2515 $prologue = '';
2516 if ( $addr['reserved'] == 'yes')
2517 {
2d318652 2518 echo "<strong>RESERVED</strong> ";
b2035dca
DO
2519 $delim = '; ';
2520 }
2d318652 2521 foreach ($range['addrlist'][$ip]['allocs'] as $ref)
b2035dca 2522 {
beb9e88a 2523 echo $delim . $aac2[$ref['type']];
4fbb5a00 2524 echo "<a href='".makeHref(array('page'=>'object', 'object_id'=>$ref['object_id'], 'hl_ipv4_addr'=>$addr['ip']))."'>";
b2035dca
DO
2525 echo $ref['name'] . (empty ($ref['name']) ? '' : '@');
2526 echo "${ref['object_name']}</a>";
2527 $delim = '; ';
2528 }
2529 if ($delim != '')
2530 {
6131056c 2531 $delim = '';
b2035dca
DO
2532 $prologue = '<br>';
2533 }
2d318652 2534 foreach ($range['addrlist'][$ip]['lblist'] as $ref)
b2035dca
DO
2535 {
2536 echo $prologue;
602663f4 2537 $prologue = '';
4fbb5a00
DY
2538 echo "${delim}<a href='".makeHref(array('page'=>'object', 'object_id'=>$ref['object_id']))."'>";
2539 echo "${ref['object_name']}</a>:<a href='".makeHref(array('page'=>'ipv4vs', 'vs_id'=>$ref['vs_id']))."'>";
b2035dca
DO
2540 echo "${ref['vport']}/${ref['proto']}</a>&rarr;";
2541 $delim = '; ';
2542 }
2543 if ($delim != '')
2544 {
2545 $delim = '';
2546 $prologue = '<br>';
e673ee24 2547 }
2d318652 2548 foreach ($range['addrlist'][$ip]['rslist'] as $ref)
b2035dca
DO
2549 {
2550 echo $prologue;
2551 $prologue = '';
4fbb5a00 2552 echo "${delim}&rarr;${ref['rsport']}@<a href='".makeHref(array('page'=>'ipv4rspool', 'pool_id'=>$ref['rspool_id']))."'>";
b2035dca
DO
2553 echo "${ref['rspool_name']}</a>";
2554 $delim = '; ';
2555 }
2556 echo "</td></tr>\n";
2557 endfor;
2727c7df 2558 // end of iteration
e673ee24
DO
2559
2560 echo "</table>";
2034d968
DO
2561 finishPortlet();
2562 echo "</td></tr></table>\n";
e673ee24
DO
2563}
2564
53ef3908 2565function renderIPv4NetworkProperties ($id)
e673ee24 2566{
e673ee24 2567 showMessageOrError();
53ef3908
DO
2568 $netdata = getIPv4NetworkInfo ($id);
2569 echo "<center><h1>${netdata['ip']}/${netdata['mask']}</h1></center>\n";
e673ee24 2570 echo "<table border=0 cellpadding=10 cellpadding=1 align='center'>\n";
7056988c 2571 printOpFormIntro ('editRange');
53ef3908
DO
2572 echo "<tr><td class='tdright'>Name:</td><td class='tdleft'><input type=text name=name size=20 value='${netdata['name']}'></tr>";
2573 echo "<tr><td colspan=2 class=tdcenter>";
2574 printImageHREF ('SAVE', 'Save changes', TRUE);
2575 echo "</td></form></tr></table>\n";
e673ee24
DO
2576}
2577
2d318652 2578function renderIPv4Address ($dottedquad)
e673ee24 2579{
4fbb5a00 2580 global $aat;
2d318652 2581 $address = getIPv4Address ($dottedquad);
68225375 2582 echo "<table border=0 class=objectview cellspacing=0 cellpadding=0>";
2d318652
DO
2583 echo "<tr><td colspan=2 align=center><h1>${dottedquad}</h1></td></tr>\n";
2584 if (!empty ($address['name']))
68225375 2585 echo "<tr><td colspan=2 align=center><h2>${address['name']}</h2></td></tr>\n";
e673ee24 2586
68225375
DO
2587 echo "<tr><td class=pcleft>";
2588 startPortlet ('summary');
2589 echo "<table border=0 cellspacing=0 cellpadding=3 width='100%'>\n";
04d619d0 2590 echo "<tr><th width='50%' class=tdright>Allocations:</th><td class=tdleft>" . count ($address['allocs']) . "</td></tr>\n";
68225375
DO
2591 echo "<tr><th width='50%' class=tdright>Originated NAT connections:</th><td class=tdleft>" . count ($address['outpf']) . "</td></tr>\n";
2592 echo "<tr><th width='50%' class=tdright>Arriving NAT connections:</th><td class=tdleft>" . count ($address['inpf']) . "</td></tr>\n";
04d619d0 2593 echo "<tr><th width='50%' class=tdright>SLB virtual services:</th><td class=tdleft>" . count ($address['lblist']) . "</td></tr>\n";
68225375
DO
2594 echo "<tr><th width='50%' class=tdright>SLB real servers:</th><td class=tdleft>" . count ($address['rslist']) . "</td></tr>\n";
2595 printTagTRs();
2596 echo "</table><br>\n";
2597 finishPortlet();
2598 echo "</td>\n";
e673ee24 2599
68225375 2600 echo "<td class=pcright>";
e673ee24 2601
f74d96c6 2602 if (isset ($address['class']))
59bebe2b 2603 {
8e700dd1 2604 startPortlet ('allocations');
2d318652
DO
2605 echo "<table class='widetable' cellpadding=5 cellspacing=0 border=0 align='center' width='100%'>\n";
2606 echo "<tr><th>object</th><th>OS interface</th><th>allocation type</th></tr>\n";
2607 $class = $address['class'];
2608 // render all allocation records for this address the same way
59bebe2b 2609 if ($address['reserved'] == 'yes')
2d318652
DO
2610 echo "<tr class='${class}'><td colspan=2>&nbsp;</td><td class=tdleft><strong>RESERVED</strong></td></tr>";
2611 foreach ($address['allocs'] as $bond)
59bebe2b 2612 {
8e700dd1
DO
2613 if (isset ($_REQUEST['hl_object_id']) and $_REQUEST['hl_object_id'] == $bond['object_id'])
2614 $secondclass = 'tdleft port_highlight';
2615 else
2616 $secondclass = 'tdleft';
4fbb5a00 2617 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
2618 echo $aat[$bond['type']];
2619 echo "</strong></td></tr>\n";
59bebe2b
DO
2620 }
2621 echo "</table><br><br>";
2622 finishPortlet();
2623 }
e673ee24 2624
f3d0cb20
DO
2625 // FIXME: The returned list is structured differently, than we expect it to be. One of the sides
2626 // must be fixed.
2d318652 2627 if (count ($address['lblist']))
e673ee24 2628 {
2d318652
DO
2629 startPortlet ('Virtual services (' . count ($address['lblist']) . ')');
2630 echo "<table class='widetable' cellpadding=5 cellspacing=0 border=0 align='center' width='100%'>\n";
59bebe2b 2631 echo "<tr><th>VS</th><th>name</th></tr>\n";
2d318652 2632 foreach ($address['lblist'] as $vsinfo)
e673ee24 2633 {
4fbb5a00 2634 echo "<tr><td class=tdleft><a href='".makeHref(array('page'=>'ipv4vs', 'vs_id'=>$vsinfo['vs_id']))."'>";
59bebe2b 2635 echo buildVServiceName ($vsinfo) . "</a></td><td class=tdleft>";
5fe1ed76 2636 echo $vsinfo['name'] . "</td></tr>\n";
e673ee24 2637 }
59bebe2b
DO
2638 echo "</table><br><br>";
2639 finishPortlet();
e673ee24 2640 }
5fe1ed76
DO
2641
2642 if (count ($address['rslist']))
2643 {
2644 startPortlet ('Real servers (' . count ($address['rslist']) . ')');
2d318652 2645 echo "<table class='widetable' cellpadding=5 cellspacing=0 border=0 align='center' width='100%'>\n";
53f4b619 2646 echo "<tr><th>&nbsp;</th><th>port</th><th>RS pool</th></tr>\n";
5fe1ed76
DO
2647 foreach ($address['rslist'] as $rsinfo)
2648 {
2649 echo "<tr><td>";
2650 if ($rsinfo['inservice'] == 'yes')
2651 printImageHREF ('inservice', 'in service');
2652 else
2653 printImageHREF ('notinservice', 'NOT in service');
4fbb5a00 2654 echo "</td><td class=tdleft>${rsinfo['rsport']}</td><td class=tdleft><a href='".makeHref(array('page'=>'ipv4rspool', 'pool_id'=>$rsinfo['rspool_id']))."'>";
2d318652 2655 echo $rsinfo['rspool_name'] . "</a></td></tr>\n";
5fe1ed76
DO
2656 }
2657 echo "</table><br><br>";
2658 finishPortlet();
2659 }
2660
68225375
DO
2661 if (count ($address['outpf']))
2662 {
105a3bc8 2663 startPortlet ('departing NAT rules');
2d318652 2664 echo "<table class='widetable' cellpadding=5 cellspacing=0 border=0 align='center' width='100%'>\n";
105a3bc8
DO
2665 echo "<tr><th>proto</th><th>from</th><th>to</th><th>comment</th></tr>\n";
2666 foreach ($address['outpf'] as $rule)
b62ff880 2667 echo "<tr><td>${rule['proto']}</td><td>${rule['localip']}:${rule['localport']}</td><td>${rule['remoteip']}:${rule['remoteport']}</td><td>${rule['description']}</td></tr>";
105a3bc8 2668 echo "</table>";
68225375
DO
2669 finishPortlet();
2670 }
105a3bc8
DO
2671
2672 if (count ($address['inpf']))
2673 {
2674 startPortlet ('arriving NAT rules');
2d318652 2675 echo "<table class='widetable' cellpadding=5 cellspacing=0 border=0 align='center' width='100%'>\n";
105a3bc8
DO
2676 echo "<tr><th>proto</th><th>from</th><th>to</th><th>comment</th></tr>\n";
2677 foreach ($address['inpf'] as $rule)
b62ff880 2678 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
2679 echo "</table>";
2680 finishPortlet();
2681 }
2682
68225375
DO
2683 echo "</td></tr>";
2684 echo "</table>\n";
e673ee24
DO
2685}
2686
2d318652 2687function renderIPv4AddressProperties ($dottedquad)
e673ee24 2688{
e673ee24 2689 showMessageOrError();
2d318652
DO
2690 $address = getIPv4Address ($dottedquad);
2691 echo "<center><h1>$dottedquad</h1></center>\n";
7056988c 2692
1fbc9fd6 2693 startPortlet ('update');
e673ee24 2694 echo "<table border=0 cellpadding=10 cellpadding=1 align='center'>\n";
7056988c 2695 printOpFormIntro ('editAddress');
2d318652
DO
2696 echo "<tr><td class='tdright'>Name:</td><td class='tdleft'><input type=text name=name size=20 value='${address['name']}'></tr>";
2697 echo "<td class='tdright'>Reserved:</td><td class='tdleft'><input type=checkbox name=reserved size=20 ";
2698 echo ($address['reserved']=='yes') ? 'checked' : '';
f3d274bf 2699 echo "></tr><tr><td class=tdleft>";
53ef3908 2700 printImageHREF ('SAVE', 'Save changes', TRUE);
f3d274bf 2701 echo "</td></form><td class=tdright>";
1fbc9fd6 2702 if (empty ($address['name']) and $address['reserved'] == 'no')
f3d274bf
DO
2703 printImageHREF ('CLEAR gray');
2704 else
2705 {
2706 printOpFormIntro ('editAddress', array ('name' => '', 'reserved' => ''));
2707 printImageHREF ('CLEAR', 'Release', TRUE);
2708 echo "</form>";
2709 }
2710 echo "</td></tr></table>\n";
1fbc9fd6 2711 finishPortlet();
e673ee24
DO
2712}
2713
2d318652 2714function renderIPv4AddressAllocations ($dottedquad)
e673ee24 2715{
e673ee24 2716 showMessageOrError();
39b4abd0
DO
2717 function printNewItemTR ()
2718 {
2719 global $aat;
2720 printOpFormIntro ('addIPv4Allocation');
2721 echo "<tr><td>";
9318d2ef 2722 printImageHREF ('add', 'allocate', TRUE);
8d4f7d18
DO
2723 echo "</td><td>";
2724 printSelect (getNarrowObjectList (explode (',', getConfigVar ('IPV4_PERFORMERS'))), 'object_id', NULL, 100);
2725 echo "</td><td><input type=text tabindex=101 name=bond_name size=10></td><td>";
f5ff50f5 2726 printSelect ($aat, 'bond_type', NULL, 102);
9318d2ef 2727 echo "</td><td>";
f5ff50f5 2728 printImageHREF ('add', 'allocate', TRUE, 103);
9318d2ef 2729 echo "</td></form></tr>";
39b4abd0 2730 }
4fbb5a00 2731 global $pageno, $tabno, $aat;
e673ee24 2732
2d318652 2733 $address = getIPv4Address ($dottedquad);
f74d96c6 2734
2d318652 2735 echo "<center><h1>${dottedquad}</h1></center>\n";
105a3bc8 2736 echo "<table class='widetable' cellpadding=5 cellspacing=0 border=0 align='center'>\n";
2d318652 2737 echo "<tr><th>&nbsp;</th><th>object</th><th>OS interface</th><th>allocation type</th><th>&nbsp;</th></tr>\n";
e673ee24 2738
39b4abd0
DO
2739 if (getConfigVar ('ADDNEW_AT_TOP') == 'yes')
2740 printNewItemTR();
f74d96c6 2741 if (isset ($address['class']))
e673ee24 2742 {
f74d96c6
DO
2743 $class = $address['class'];
2744 if ($address['reserved'] == 'yes')
2745 echo "<tr class='${class}'><td colspan=3>&nbsp;</td><td class=tdleft><strong>RESERVED</strong></td><td>&nbsp;</td></tr>";
2746 foreach ($address['allocs'] as $bond)
2747 {
2748 echo "<tr class='$class'>";
2749 printOpFormIntro ('updIPv4Allocation', array ('object_id' => $bond['object_id']));
4fbb5a00 2750 echo "<td><a href='".makeHrefProcess(array('op'=>'delIPv4Allocation', 'ip'=>$dottedquad, 'object_id'=>$bond['object_id']))."'>";
f74d96c6
DO
2751 printImageHREF ('delete', 'Unallocate address');
2752 echo "</a></td>";
4fbb5a00 2753 echo "<td><a href='".makeHref(array('page'=>'object', 'object_id'=>$bond['object_id'], 'hl_ipv4_addr'=>$dottedquad))."'>${bond['object_name']}</td>";
f74d96c6
DO
2754 echo "<td><input type='text' name='bond_name' value='${bond['name']}' size=10></td><td>";
2755 printSelect ($aat, 'bond_type', $bond['type']);
2756 echo "</td><td>";
2757 printImageHREF ('save', 'Save changes', TRUE);
2758 echo "</td></form></tr>\n";
2759 }
e673ee24 2760 }
39b4abd0
DO
2761 if (getConfigVar ('ADDNEW_AT_TOP') != 'yes')
2762 printNewItemTR();
e673ee24 2763 echo "</table><br><br>";
e673ee24
DO
2764}
2765
eeb4a5d8 2766function renderNATv4ForObject ($object_id = 0)
e673ee24 2767{
0b72ada2 2768 global $root;
9318d2ef
DO
2769 function printNewItemTR ($alloclist)
2770 {
9318d2ef
DO
2771 printOpFormIntro ('addNATv4Rule');
2772 echo "<tr align='center'><td>";
2773 printImageHREF ('add', 'Add new NAT rule', TRUE);
2774 echo '</td><td>';
2775 printSelect (array ('TCP' => 'TCP', 'UDP' => 'UDP'), 'proto');
2776 echo "<select name='localip' tabindex=1>";
2777
2778 foreach ($alloclist as $dottedquad => $alloc)
2779 {
2780 $name = empty ($alloc['addrinfo']['name']) ? '' : (' (' . niftyString ($alloc['addrinfo']['name']) . ')');
2781 $osif = empty ($alloc['osif']) ? '' : ($alloc['osif'] . ': ');
2782 echo "<option value='${dottedquad}'>${osif}${dottedquad}${name}</option>";
2783 }
2784
2785 echo "</select>:<input type='text' name='localport' size='4' tabindex=2></td>";
2786 echo "<td><input type='text' name='remoteip' id='remoteip' size='10' tabindex=3>";
39106006
DO
2787 echo "<a href='javascript:;' onclick='window.open(\"" . makeHrefForHelper ('inet4list');
2788 echo "\", \"findobjectip\", \"height=700, width=400, location=no, menubar=no, resizable=yes, scrollbars=no, status=no, titlebar=no, toolbar=no\");'>";
9318d2ef
DO
2789 printImageHREF ('find', 'Find object');
2790 echo "</a>";
2791 echo ":<input type='text' name='remoteport' size='4' tabindex=4></td><td></td>";
2792 echo "<td colspan=1><input type='text' name='description' size='20' tabindex=5></td><td>";
f5ff50f5 2793 printImageHREF ('add', 'Add new NAT rule', TRUE, 6);
9318d2ef
DO
2794 echo "</td></tr></form>";
2795 }
4fbb5a00 2796 global $pageno, $tabno;
e673ee24
DO
2797
2798 $info = getObjectInfo ($object_id);
eeb4a5d8 2799 $forwards = getNATv4ForObject ($object_id);
2c817354 2800 $alloclist = getObjectIPv4Allocations ($object_id);
e673ee24 2801 showMessageOrError();
f28fbe8b 2802 echo "<center><h2>locally performed NAT</h2></center>";
e673ee24 2803
105a3bc8 2804 echo "<table class='widetable' cellpadding=5 cellspacing=0 border=0 align='center'>\n";
d54b9495 2805 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 2806
9318d2ef
DO
2807 if (getConfigVar ('ADDNEW_AT_TOP') == 'yes')
2808 printNewItemTR ($alloclist);
e673ee24
DO
2809 foreach ($forwards['out'] as $pf)
2810 {
2c817354
DO
2811 $class = 'trerror';
2812 $osif = '';
2813 if (isset ($alloclist [$pf['localip']]))
2814 {
2815 $class = $alloclist [$pf['localip']]['addrinfo']['class'];
2816 $osif = $alloclist [$pf['localip']]['osif'] . ': ';
2817 }
e673ee24
DO
2818
2819 echo "<tr class='$class'>";
4fbb5a00
DY
2820 echo "<td><a href='".
2821 makeHrefProcess(array(
2822 'op'=>'delNATv4Rule',
2823 'localip'=>$pf['localip'],
2824 'localport'=>$pf['localport'],
2825 'remoteip'=>$pf['remoteip'],
2826 'remoteport'=>$pf['remoteport'],
2827 'proto'=>$pf['proto'],
2828 'object_id'=>$object_id)).
2829 "'>";
4de22e7e
DO
2830 printImageHREF ('delete', 'Delete NAT rule');
2831 echo "</a></td>";
4fbb5a00 2832 echo "<td>${pf['proto']}/${osif}<a href='".makeHref(array('page'=>'ipaddress', 'tab'=>'default', 'ip'=>$pf['localip']))."'>${pf['localip']}</a>:${pf['localport']}";
f28fbe8b
DO
2833 if (!empty ($pf['local_addr_name']))
2834 echo ' (' . $pf['local_addr_name'] . ')';
2835 echo "</td>";
4fbb5a00 2836 echo "<td><a href='".makeHref(array('page'=>'ipaddress', 'tab'=>'default', 'ip'=>$pf['remoteip']))."'>${pf['remoteip']}</a>:${pf['remoteport']}</td>";
e673ee24 2837
53ef3908 2838 $address = getIPv4Address ($pf['remoteip']);
e673ee24
DO
2839
2840 echo "<td class='description'>";
53ef3908
DO
2841 if (count ($address['allocs']))
2842 foreach ($address['allocs'] as $bond)
4fbb5a00 2843 echo "<a href='".makeHref(array('page'=>'object', 'tab'=>'default', 'object_id'=>$bond['object_id']))."'>${bond['object_name']}(${bond['name']})</a> ";
f28fbe8b
DO
2844 elseif (!empty ($pf['remote_addr_name']))
2845 echo '(' . $pf['remote_addr_name'] . ')';
7056988c
DO
2846 printOpFormIntro
2847 (
2848 'updNATv4Rule',
2849 array
2850 (
2851 'localip' => $pf['localip'],
2852 'localport' => $pf['localport'],
2853 'remoteip' => $pf['remoteip'],
2854 'remoteport' => $pf['remoteport'],
2855 'proto' => $pf['proto']
2856 )
2857 );
2858 echo "</td><td class='description'>";
d54b9495
DO
2859 echo "<input type='text' name='description' value='${pf['description']}'></td><td>";
2860 printImageHREF ('save', 'Save changes', TRUE);
2861 echo "</td></form></tr>";
e673ee24 2862 }
9318d2ef
DO
2863 if (getConfigVar ('ADDNEW_AT_TOP') != 'yes')
2864 printNewItemTR ($alloclist);
e673ee24
DO
2865
2866 echo "</table><br><br>";
2867
f28fbe8b 2868 echo "<center><h2>arriving NAT connections</h2></center>";
105a3bc8 2869 echo "<table class='widetable' cellpadding=5 cellspacing=0 border=0 align='center'>\n";
e673ee24
DO
2870 echo "<tr><th></th><th>Source</th><th>Source objects</th><th>Target</th><th>Description</th></tr>\n";
2871
2872 foreach ($forwards['in'] as $pf)
2873 {
4fbb5a00
DY
2874 echo "<tr><td><a href='".
2875 makeHrefProcess(array(
2876 'op'=>'delNATv4Rule',
2877 'localip'=>$pf['localip'],
2878 'localport'=>$pf['localport'],
2879 'remoteip'=>$pf['remoteip'],
2880 'remoteport'=>$pf['remoteport'],
2881 'proto'=>$pf['proto'],
2882 'object_id'=>$pf['object_id']
2883 )).
2884 "'>";
4de22e7e
DO
2885 printImageHREF ('delete', 'Delete NAT rule');
2886 echo "</a></td>";
4fbb5a00
DY
2887 echo "<td>${pf['proto']}/<a href='".makeHref(array('page'=>'ipaddress', 'tab'=>'default', 'ip'=>$pf['localip']))."'>${pf['localip']}</a>:${pf['localport']}</td>";
2888 echo "<td class='description'><a href='".makeHref(array('page'=>'object', 'tab'=>'default', 'object_id'=>$pf['object_id']))."'>${pf['object_name']}</a>";
2889 echo "</td><td><a href='".makeHref(array('page'=>'ipaddress', 'tab'=>'default', 'ip'=>$pf['remoteip']))."'>${pf['remoteip']}</a>:${pf['remoteport']}</td>";
e673ee24
DO
2890 echo "<td class='description'>${pf['description']}</td></tr>";
2891 }
2892
e673ee24 2893 echo "</table><br><br>";
e673ee24
DO
2894}
2895
7056988c 2896// FIXME: move related code away into ophandler(s)
e673ee24
DO
2897function renderAddMultipleObjectsForm ()
2898{
20c901a7 2899 global $root, $pageno, $tabno, $nextorder;
e673ee24
DO
2900
2901 $type_id = array();
7f791d1d 2902 $global_type_id = 0;
e673ee24
DO
2903 $name = array();
2904 $asset_no = array();
ce4d1a79 2905 $keepvalues1 = $keepvalues2 = FALSE;
42d73cbf 2906 showMessageOrError();
e673ee24
DO
2907
2908 // Render a form for the next.
2909 $typelist = getObjectTypeList();
4c330a14 2910 $typelist[0] = 'select type...';
7f791d1d 2911
f60bb422
DO
2912 startPortlet ('Distinct types, same tags');
2913 $max = getConfigVar ('MASSCOUNT');
42d73cbf 2914 printOpFormIntro ('addObjects');
e673ee24 2915 echo '<table border=0 align=center>';
f60bb422
DO
2916 echo "<tr><th>Object type</th><th>Common name</th><th>Visible label</th>";
2917 echo "<th>Asset tag</th><th>Barcode</th><th>Tags</th></tr>\n";
7f791d1d 2918 // If a user forgot to select object type on input, we keep his
e673ee24 2919 // previous input in the form.
9c0b0016 2920 for ($i = 0; $i < $max; $i++)
e673ee24 2921 {
7f791d1d 2922 echo '<tr><td>';
e7ade6bf
DO
2923 // Don't employ DEFAULT_OBJECT_TYPE to avoid creating ghost records for pre-selected empty rows.
2924 printSelect ($typelist, "${i}_object_type_id", 0);
e673ee24
DO
2925 echo '</td>';
2926 echo "<td><input type=text size=30 name=${i}_object_name";
ce4d1a79 2927 if ($keepvalues1 and isset ($name[$i]) and (!isset ($type_id[$i]) or $type_id[$i] == 0))
e673ee24
DO
2928 echo " value='${name[$i]}'";
2929 echo "></td>";
2930 echo "<td><input type=text size=30 name=${i}_object_label";
ce4d1a79 2931 if ($keepvalues1 and isset ($label[$i]) and (!isset ($type_id[$i]) or $type_id[$i] == 0))
e673ee24
DO
2932 echo " value='${label[$i]}'";
2933 echo "></td>";
2934 echo "<td><input type=text size=20 name=${i}_object_asset_no";
ce4d1a79 2935 if ($keepvalues1 and isset ($asset_no[$i]) and (!isset ($type_id[$i]) or $type_id[$i] == 0))
e673ee24
DO
2936 echo " value='${asset_no[$i]}'";
2937 echo "></td>";
2938 echo "<td><input type=text size=10 name=${i}_object_barcode";
ce4d1a79 2939 if ($keepvalues1 and isset ($barcode[$i]) and (!isset ($type_id[$i]) or $type_id[$i] == 0))
e673ee24
DO
2940 echo " value='${barcode[$i]}'";
2941 echo "></td>";
f60bb422
DO
2942 if ($i == 0)
2943 {
2944 echo "<td valign=top rowspan=${max}>";
2945 renderTagSelect();
2946 echo "</td>\n";
2947 }
e673ee24 2948 echo "</tr>\n";
e673ee24 2949 }
216c84bb 2950 echo "<tr><td class=submit colspan=5><input type=submit name=got_fast_data value='Go!'></td></tr>\n";
e673ee24
DO
2951 echo "</form></table>\n";
2952 finishPortlet();
7f791d1d 2953
f60bb422 2954 startPortlet ('Same type, same tags');
42d73cbf 2955 printOpFormIntro ('addLotOfObjects');
f60bb422
DO
2956 echo "<table border=0 align=center><tr><th>names</th><th>type</th></tr>";
2957 echo "<tr><td rowspan=3><textarea name=namelist cols=40 rows=25>\n";
ce4d1a79 2958 if ($keepvalues2 and $global_type_id == 0)
7f791d1d 2959 echo $_REQUEST['namelist'];
f60bb422
DO
2960 echo "</textarea></td><td valign=top>";
2961 printSelect ($typelist, "global_type_id", getConfigVar ('DEFAULT_OBJECT_TYPE'));
2962 echo "</td></tr>";
2963 echo "<tr><th>Tags</th></tr>";
2964 echo "<tr><td valign=top>";
2965 renderTagSelect();
2966 echo "</td></tr>";
2967 echo "<tr><td colspan=2><input type=submit name=got_very_fast_data value='Go!'></td></tr></table>\n";
2968 echo "</form>\n";
7f791d1d 2969 finishPortlet();
e673ee24
DO
2970}
2971
2972function printGreeting ()
2973{
d6d79c36
DO
2974 global $root, $remote_username, $remote_displayname;
2975 echo "Hello, <a href='${root}?page=myaccount&tab=default'>${remote_displayname}</a>. This is RackTables " .
2976 CODE_VERSION .
2977 ". Click <a href='${root}?logout'>here</a> to logout.";
e673ee24
DO
2978}
2979
2980function renderSearchResults ()
2981{
0b9c98d7 2982 global $root;
e673ee24
DO
2983 $terms = trim ($_REQUEST['q']);
2984 if (empty ($terms))
2985 {
591ff2c4 2986 showError ('Search string cannot be empty.', __FUNCTION__);
e673ee24
DO
2987 return;
2988 }
54522168 2989 if (!permitted ('objects', 'default'))
e673ee24 2990 {
591ff2c4 2991 showError ('You are not authorized for viewing information about objects.', __FUNCTION__);
e673ee24
DO
2992 return;
2993 }
ea5fc465 2994 $nhits = 0;
e673ee24
DO
2995 // If we search for L2 address, we can either find one or find none.
2996 if
2997 (
05771508
DO
2998 preg_match (RE_L2_IFCFG, $terms) or
2999 preg_match (RE_L2_SOLID, $terms) or
3000 preg_match (RE_L2_CISCO, $terms) or
1930dc7f 3001 preg_match (RE_L2_IPCFG, $terms) or
05771508
DO
3002 // Foundry STP bridge ID: bridge priotity + port MAC address. Cut off first 4 chars and look for MAC address.
3003 preg_match (RE_L2_FDRYSTP, $terms)
e673ee24
DO
3004 )
3005 // Search for L2 address.
3006 {
3ec29bf4
DO
3007 $terms = str_replace ('.', '', $terms);
3008 $terms = str_replace (':', '', $terms);
1930dc7f 3009 $terms = str_replace ('-', '', $terms);
ea5fc465 3010 $terms = substr ($terms, -12);
e673ee24
DO
3011 $result = searchByl2address ($terms);
3012 if ($result !== NULL)
3013 {
ea5fc465
DO
3014 $nhits++;
3015 $lasthit = 'port';
3016 $summary['port'][] = $result;
e673ee24 3017 }
e673ee24 3018 }
05771508 3019 elseif (preg_match (RE_IP4_ADDR, $terms))
64347dcf 3020 // Search for IPv4 address.
e673ee24 3021 {
bb0a44e9 3022 if (NULL !== getIPv4AddressNetworkId ($terms))
e673ee24 3023 {
ea5fc465 3024 $nhits++;
f3d0cb20
DO
3025 $lasthit = 'ipv4addressbydq';
3026 $summary['ipv4addressbydq'][] = $terms;
e673ee24 3027 }
e673ee24 3028 }
05771508 3029 elseif (preg_match (RE_IP4_NET, $terms))
64347dcf
DO
3030 // Search for IPv4 network
3031 {
3032 list ($base, $len) = explode ('/', $terms);
3033 if (NULL !== ($tmp = getIPv4AddressNetworkId ($base, $len + 1)))
3034 {
3035 $nhits++;
3036 $lasthit = 'ipv4network';
3037 $summary['ipv4network'][] = getIPv4NetworkInfo ($tmp);
3038 }
3039 }
e673ee24 3040 else
ea5fc465 3041 // Search for objects, addresses, networks, virtual services and RS pools by their description.
e673ee24 3042 {
ea5fc465
DO
3043 $tmp = getObjectSearchResults ($terms);
3044 if (count ($tmp))
e673ee24 3045 {
ea5fc465
DO
3046 $nhits += count ($tmp);
3047 $lasthit = 'object';
3048 $summary['object'] = $tmp;
e673ee24 3049 }
ea5fc465
DO
3050 $tmp = getIPv4AddressSearchResult ($terms);
3051 if (count ($tmp))
e673ee24 3052 {
ea5fc465 3053 $nhits += count ($tmp);
f3d0cb20
DO
3054 $lasthit = 'ipv4addressbydescr';
3055 $summary['ipv4addressbydescr'] = $tmp;
ea5fc465
DO
3056 }
3057 $tmp = getIPv4PrefixSearchResult ($terms);
3058 if (count ($tmp))
3059 {
3060 $nhits += count ($tmp);
3061 $lasthit = 'ipv4network';
3062 $summary['ipv4network'] = $tmp;
3063 }
05411ccd
DO
3064 $tmp = getIPv4RSPoolSearchResult ($terms);
3065 if (count ($tmp))
3066 {
3067 $nhits += count ($tmp);
3068 $lasthit = 'ipv4rspool';
3069 $summary['ipv4rspool'] = $tmp;
3070 }
3071 $tmp = getIPv4VServiceSearchResult ($terms);
3072 if (count ($tmp))
3073 {
3074 $nhits += count ($tmp);
3075 $lasthit = 'ipv4vs';
3076 $summary['ipv4vs'] = $tmp;
3077 }
6a88e734
DO
3078 $tmp = getAccountSearchResult ($terms);
3079 if (count ($tmp))
3080 {
3081 $nhits += count ($tmp);
3082 $lasthit = 'user';
3083 $summary['user'] = $tmp;
3084 }
e1ae3fb4
AD
3085 $tmp = getFileSearchResult ($terms);
3086 if (count ($tmp))
3087 {
3088 $nhits += count ($tmp);
3089 $lasthit = 'file';
3090 $summary['file'] = $tmp;
3091 }
ea5fc465
DO
3092 }
3093 if ($nhits == 0)
3094 echo "<center><h2>Nothing found for '${terms}'</h2></center>";
3095 elseif ($nhits == 1)
3096 {
3097 $record = current ($summary[$lasthit]);
3098 switch ($lasthit)
3099 {
3100 case 'port':
3101 echo "<script language='Javascript'>document.location='${root}?page=object";
3102 echo "&hl_port_id=" . $record['port_id'];
3103 echo "&object_id=" . $record['object_id'] . "';//</script>";
3104 break;
f3d0cb20
DO
3105 case 'ipv4addressbydq':
3106 $parentnet = getIPv4AddressNetworkId ($record);
3107 if ($parentnet !== NULL)
e1ae3fb4 3108 echo "<script language='Javascript'>document.location='${root}?page=ipv4net&tab=default&id=${parentnet}&hl_ipv4_addr=${record}';//</script>";
f3d0cb20
DO
3109 else
3110 echo "<script language='Javascript'>document.location='${root}?page=ipaddress&ip=${record}';//</script>";
ea5fc465 3111 break;
f3d0cb20
DO
3112 case 'ipv4addressbydescr':
3113 $parentnet = getIPv4AddressNetworkId ($record['ip']);
3114 if ($parentnet !== NULL)
e1ae3fb4 3115 echo "<script language='Javascript'>document.location='${root}?page=ipv4net&tab=default&id=${parentnet}&hl_ipv4_addr=${record['ip']}';//</script>";
f3d0cb20
DO
3116 else
3117 echo "<script language='Javascript'>document.location='${root}?page=ipaddress&ip=${record['ip']}';//</script>";
ea5fc465
DO
3118 break;
3119 case 'ipv4network':
e1ae3fb4 3120 echo "<script language='Javascript'>document.location='${root}?page=ipv4net";
ea5fc465
DO
3121 echo "&id=${record['id']}";
3122 echo "';//</script>";
3123 break;
3124 case 'object':
3125 echo "<script language='Javascript'>document.location='${root}?page=object&object_id=${record['id']}';//</script>";
3126 break;
05411ccd 3127 case 'ipv4rspool':
e1ae3fb4 3128 echo "<script language='Javascript'>document.location='${root}?page=ipv4rspool&pool_id=${record['pool_id']}';//</script>";
05411ccd
DO
3129 break;
3130 case 'ipv4vs':
49fb2686 3131 echo "<script language='Javascript'>document.location='${root}?page=ipv4vs&vs_id=${record['id']}';//</script>";
05411ccd 3132 break;
6a88e734
DO
3133 case 'user':
3134 echo "<script language='Javascript'>document.location='${root}?page=user&user_id=${record['user_id']}';//</script>";
3135 break;
e1ae3fb4
AD
3136 case 'file':
3137 echo "<script language='Javascript'>document.location='${root}?page=file&file_id=${record['id']}';//</script>";
3138 break;
ea5fc465
DO
3139 }
3140 return;
3141 }
3142 else
3143 {
3144 global $nextorder;
3145 $order = 'odd';
3146 echo "<center><h2>${nhits} result(s) found for '${terms}'</h2></center>";
3147 foreach ($summary as $where => $what)
3148 switch ($where)
e673ee24 3149 {
ea5fc465 3150 case 'object':
06adfe89 3151 startPortlet ("<a href='${root}?page=objects'>Objects</a>");
ea5fc465 3152 echo '<table border=0 cellpadding=5 cellspacing=0 align=center class=cooltable>';
e1ae3fb4 3153 echo '<tr><th>Common name</th><th>Visible label</th><th>Asset tag</th><th>Barcode</th></tr>';
ea5fc465
DO
3154 foreach ($what as $obj)
3155 {
2c21a10c 3156 $tags = loadEntityTags ('object', $obj['id']);
2b3d64c5
DO
3157 echo "<tr class=row_${order} valign=top><td class=tdleft><a href=\"${root}?page=object&object_id=${obj['id']}\">${obj['dname']}</a>";
3158 if (count ($tags))
3159 echo '<br><small>' . serializeTags ($tags) . '</small>';
3160 echo "</td><td>${obj['label']}</td>";
ea5fc465
DO
3161 echo "<td>${obj['asset_no']}</td>";
3162 echo "<td>${obj['barcode']}</td></tr>";
3163 $order = $nextorder[$order];
3164 }
3165 echo '</table>';
3166 finishPortlet();
3167 break;
3168 case 'ipv4network':
06adfe89 3169 startPortlet ("<a href='${root}?page=ipv4space'>IPv4 networks</a>");
ea5fc465 3170 echo '<table border=0 cellpadding=5 cellspacing=0 align=center class=cooltable>';
71287f1c 3171 foreach ($what as $netinfo)
ea5fc465 3172 {
0b9c98d7
DO
3173 echo "<tr class=row_${order} valign=top><td>";
3174 renderIPv4NetCell ($netinfo);
3175 echo "</td></tr>\n";
ea5fc465
DO
3176 $order = $nextorder[$order];
3177 }
3178 echo '</table>';
3179 finishPortlet();
3180 break;
f3d0cb20 3181 case 'ipv4addressbydescr':
ea5fc465
DO
3182 startPortlet ('IPv4 addresses');
3183 echo '<table border=0 cellpadding=5 cellspacing=0 align=center class=cooltable>';
f3d0cb20 3184 // FIXME: address, parent network, routers (if extended view is enabled)
e1ae3fb4 3185 echo '<tr><th>Address</th><th>Description</th></tr>';
ea5fc465
DO
3186 foreach ($what as $addr)
3187 {
f3d0cb20
DO
3188 echo "<tr class=row_${order}><td class=tdleft>";
3189 $parentnet = getIPv4AddressNetworkId ($addr['ip']);
3190 if ($parentnet !== NULL)
e1ae3fb4 3191 echo "<a href='${root}?page=ipv4net&tab=default&id=${parentnet}&hl_ipv4_addr=${addr['ip']}'>${addr['ip']}</a></td>";
f3d0cb20
DO
3192 else
3193 echo "<a href='${root}?page=ipaddress&ip=${addr['ip']}'>${addr['ip']}</a></td>";
ea5fc465
DO
3194 echo "<td class=tdleft>${addr['name']}</td></tr>";
3195 $order = $nextorder[$order];
3196 }
3197 echo '</table>';
3198 finishPortlet();
3199 break;
05411ccd 3200 case 'ipv4rspool':
ee437dab 3201 startPortlet ("<a href='${root}?page=ipv4rsplist'>RS pools</a>");
05411ccd
DO
3202 echo '<table border=0 cellpadding=5 cellspacing=0 align=center class=cooltable>';
3203 foreach ($what as $rspool)
3204 {
216136d2
DO
3205 echo "<tr class=row_${order}><td class=tdleft>";
3206 renderRSPoolCell ($rspool['pool_id'], $rspool['name']);
3207 echo "</td></tr>";
05411ccd
DO
3208 $order = $nextorder[$order];
3209 }
3210 echo '</table>';
3211 finishPortlet();
3212 break;
3213 case 'ipv4vs':
a239e016 3214 startPortlet ("<a href='${root}?page=ipv4vslist'>Virtual services</a>");
05411ccd 3215 echo '<table border=0 cellpadding=5 cellspacing=0 align=center class=cooltable>';
8128c257 3216 foreach ($what as $vsinfo)
05411ccd 3217 {
8128c257
DO
3218 echo "<tr class=row_${order}><td class=tdleft>";
3219 renderIPv4VSCell ($vsinfo);
3220 echo "</td></tr>";
6a88e734
DO
3221 $order = $nextorder[$order];
3222 }
3223 echo '</table>';
3224 finishPortlet();
3225 break;
3226 case 'user':
3227 startPortlet ("<a href='${root}?page=userlist'>Users</a>");
3228 echo '<table border=0 cellpadding=5 cellspacing=0 align=center class=cooltable>';
6a88e734
DO
3229 foreach ($what as $item)
3230 {
19dac9c3
DO
3231 echo "<tr class=row_${order}><td class=tdleft>";
3232 renderUserCell ($item);
3233 echo "</td></tr>";
05411ccd
DO
3234 $order = $nextorder[$order];
3235 }
3236 echo '</table>';
3237 finishPortlet();
3238 break;
e1ae3fb4
AD
3239 case 'file':
3240 startPortlet ("<