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