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