Fix menu in IE and started frame view page.
git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@2279 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
Before Width: | Height: | Size: 974 B After Width: | Height: | Size: 2.5 KiB |
Before Width: | Height: | Size: 986 B After Width: | Height: | Size: 2.6 KiB |
Before Width: | Height: | Size: 980 B After Width: | Height: | Size: 2.6 KiB |
Before Width: | Height: | Size: 984 B After Width: | Height: | Size: 2.6 KiB |
@ -57,7 +57,7 @@ EOS;
|
||||
* @param String nodeGroup The group.
|
||||
*/
|
||||
function insertGroupTableRow($nodeGroupName, $status) {
|
||||
$img_string = getStatusImage(GroupNodeTable::determineStatus($status));
|
||||
$img_string = getStatusImage(mapStatus($status));
|
||||
|
||||
//echo '<tr bgcolor="#FFCC00"><td align=left>';
|
||||
echo '<tr class=TableRow><td align=left width=140>';
|
||||
@ -120,18 +120,5 @@ function getNodeTableRow($nodeName, $attrs) {
|
||||
return $html;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param String nodestatStr The status of the node as output by the nodestat command
|
||||
* @return "good", "bad", "warning", or "unknown"
|
||||
*/
|
||||
function determineStatus($statStr) {
|
||||
$status = NULL;
|
||||
if ($statStr == "alive" || $statStr == "ready" || $statStr == "pbs" || $statStr == "sshd") { $status = "good"; }
|
||||
else if ($statStr == "noping") { $status = "bad"; }
|
||||
else if ($statStr == "ping") { $status = "warning"; }
|
||||
else { $status = "unknown"; }
|
||||
return $status;
|
||||
}
|
||||
|
||||
} // end the class
|
||||
?>
|
||||
|
@ -55,8 +55,8 @@ echo "</head><body>\n";
|
||||
echo <<<EOS
|
||||
<table id=headingTable border=0 cellspacing=0 cellpadding=0>
|
||||
<tr valign=top>
|
||||
<td><img src='$TOPDIR/images/topl2.jpg'></td>
|
||||
<td class=TopMiddle><img id=xcatImage src='$TOPDIR/images/xCAT_icon-l.gif' height=40px></td>
|
||||
<td><img class=ImgTop src='$TOPDIR/images/topl2.jpg'></td>
|
||||
<td class=TopMiddle><img id=xcatImage src='$TOPDIR/images/xCAT_icon-l.gif'></td>
|
||||
<td class=TopMiddle width='100%'>
|
||||
|
||||
EOS;
|
||||
@ -64,7 +64,7 @@ EOS;
|
||||
|
||||
insertMenus($currents);
|
||||
|
||||
echo "</td><td><img src='$TOPDIR/images/topr2.jpg'></td></tr></table>\n";
|
||||
echo "</td><td><img class=ImgTop src='$TOPDIR/images/topr2.jpg'></td></tr></table>\n";
|
||||
//echo "</div></div>\n"; // end the top div
|
||||
} // end insertHeader
|
||||
|
||||
@ -132,7 +132,7 @@ $MENU = array(
|
||||
'manpages' => array('label' => 'Man Pages', 'url' => getDocURL('manpage')),
|
||||
'maillist' => array('label' => 'Mail List', 'url' => getDocURL('web','mailinglist')),
|
||||
'wiki' => array('label' => 'Wiki', 'url' => getDocURL('web','wiki')),
|
||||
'suggest' => array('label' => 'Suggestions', 'url' => "$TOPDIR/support/suggest.php"),
|
||||
'suggest' => array('label' => 'Suggest', 'url' => "$TOPDIR/support/suggest.php"),
|
||||
'about' => array('label' => 'About', 'url' => "$TOPDIR/support/about.php"),
|
||||
)
|
||||
),
|
||||
@ -145,7 +145,7 @@ $MENU = array(
|
||||
function insertMenus($currents) {
|
||||
global $TOPDIR;
|
||||
global $MENU;
|
||||
echo "<table border=0 cellspacing=0 cellpadding=0>\n";
|
||||
echo "<table class=MenuTable border=0 cellspacing=0 cellpadding=0>\n";
|
||||
|
||||
insertMenuRow($currents[0], 1, $MENU);
|
||||
|
||||
@ -160,13 +160,15 @@ function insertMenus($currents) {
|
||||
function insertMenuRow($current, $isTop, $items) {
|
||||
global $TOPDIR;
|
||||
//$img = "$TOPDIR/images/h3bg_new.gif";
|
||||
$menuRowClass = $isTop ? '' : 'class=MenuRowBottom';
|
||||
$menuItemClass = $isTop ? 'class=MenuItemTop' : '';
|
||||
$currentClass = $isTop ? 'class=CurrentMenuItemTop' : '';
|
||||
//$menuRowClass = $isTop ? '' : 'class=MenuRowBottom';
|
||||
$menuItemClass = $isTop ? '' : 'class=MenuItemBottom';
|
||||
//$currentClass = $isTop ? 'class=CurrentMenuItemTop' : '';
|
||||
|
||||
//echo "<TABLE class=MenuTable id=mainNav cellpadding=0 cellspacing=0 border=0><tr>\n";
|
||||
//echo "<div class=$menuRowClass><ul id=mainNav>\n";
|
||||
echo "<tr><td $menuRowClass><ul id=mainNav>\n";
|
||||
//echo "<tr><td $menuRowClass><ul id=mainNav>\n";
|
||||
//echo "<tr><td><ul id=mainNav>\n";
|
||||
echo "<tr><td>\n";
|
||||
|
||||
foreach ($items as $key => $value) {
|
||||
$label = $value['label'];
|
||||
@ -177,16 +179,21 @@ function insertMenuRow($current, $isTop, $items) {
|
||||
}
|
||||
if ($key == $current){
|
||||
//echo "<TD><a id=$key href='$link[1]'>$link[0]</a></TD>\n";
|
||||
echo "<li><p $currentClass>$label</p></li>";
|
||||
//echo "<li><p $currentClass>$label</p></li>";
|
||||
//echo "<li><p>$label</p></li>";
|
||||
//echo "<p class=CurrentMenuItem>$label</p>";
|
||||
echo "<span class=CurrentMenuItem>$label</span>";
|
||||
} else {
|
||||
//echo "<TD><a class=NavItem id=$key href='$link[1]'>$link[0]</a></TD>\n";
|
||||
echo "<li><a $menuItemClass id=$key href='$url'>$label</a></li>";
|
||||
//echo "<li><a $menuItemClass id=$key href='$url'>$label</a></li>";
|
||||
echo "<a $menuItemClass id=$key href='$url'>$label</a>";
|
||||
}
|
||||
}
|
||||
|
||||
//echo "</TR></TABLE>\n";
|
||||
//echo "</ul></div>\n";
|
||||
echo "\n</ul></td></tr>\n";
|
||||
//echo "\n</ul></td></tr>\n";
|
||||
echo "\n</td></tr>\n";
|
||||
}
|
||||
|
||||
|
||||
@ -471,76 +478,125 @@ function getDocURL($book, $section = NULL) {
|
||||
}
|
||||
|
||||
|
||||
$HWTypeInfo = array (
|
||||
'x335' => array ( 'image'=>'330.gif', 'rackimage'=>'x335-front', 'u'=>1, 'aliases'=>'8676' ),
|
||||
'x336' => array ( 'image'=>'330.gif', 'rackimage'=>'x335-front', 'u'=>1, 'aliases'=>'8837' ),
|
||||
'x306' => array ( 'image'=>'330.gif', 'rackimage'=>'x335-front', 'u'=>1, 'aliases'=>'8836' ),
|
||||
'x306m' => array ( 'image'=>'330.gif', 'rackimage'=>'x335-front', 'u'=>1, 'aliases'=>'8849,8491' ),
|
||||
'x3550' => array ( 'image'=>'330.gif', 'rackimage'=>'x335-front', 'u'=>1, 'aliases'=>'7978' ),
|
||||
'e325' => array ( 'image'=>'330.gif', 'rackimage'=>'x335-front', 'u'=>1, 'aliases'=>'8835' ),
|
||||
'e326' => array ( 'image'=>'330.gif', 'rackimage'=>'x335-front', 'u'=>1, 'aliases'=>'8848' ),
|
||||
'e326m' => array ( 'image'=>'330.gif', 'rackimage'=>'x335-front', 'u'=>1, 'aliases'=>'7969' ),
|
||||
'e327' => array ( 'image'=>'330.gif', 'rackimage'=>'x335-front', 'u'=>1, 'aliases'=>'' ),
|
||||
'x3250' => array ( 'image'=>'330.gif', 'rackimage'=>'x335-front', 'u'=>1, 'aliases'=>'4190,4194' ),
|
||||
'x3350' => array ( 'image'=>'330.gif', 'rackimage'=>'x335-front', 'u'=>1, 'aliases'=>'4192,4193,hmc' ), # just guessed about hmc
|
||||
'x3450' => array ( 'image'=>'330.gif', 'rackimage'=>'x335-front', 'u'=>1, 'aliases'=>'7948' ),
|
||||
'x3455' => array ( 'image'=>'330.gif', 'rackimage'=>'x335-front', 'u'=>1, 'aliases'=>'7940,ipmi,xseries,default' ),
|
||||
'x3550' => array ( 'image'=>'330.gif', 'rackimage'=>'x335-front', 'u'=>1, 'aliases'=>'7978' ),
|
||||
|
||||
'x340' => array ( 'image'=>'342.gif', 'rackimage'=>'x345-front', 'u'=>2, 'aliases'=>'8656' ),
|
||||
'x342' => array ( 'image'=>'342.gif', 'rackimage'=>'x345-front', 'u'=>2, 'aliases'=>'8669' ),
|
||||
'x345' => array ( 'image'=>'342.gif', 'rackimage'=>'x345-front', 'u'=>2, 'aliases'=>'8670' ),
|
||||
'x346' => array ( 'image'=>'342.gif', 'rackimage'=>'x345-front', 'u'=>2, 'aliases'=>'8840' ),
|
||||
'x3650' => array ( 'image'=>'342.gif', 'rackimage'=>'x345-front', 'u'=>2, 'aliases'=>'7979' ),
|
||||
'x3655' => array ( 'image'=>'342.gif', 'rackimage'=>'x345-front', 'u'=>2, 'aliases'=>'7943' ),
|
||||
|
||||
'x360' => array ( 'image'=>'342.gif', 'rackimage'=>'x366-front', 'u'=>3, 'aliases'=>'8686' ),
|
||||
'x365' => array ( 'image'=>'342.gif', 'rackimage'=>'x366-front', 'u'=>3, 'aliases'=>'8862' ),
|
||||
'x366' => array ( 'image'=>'342.gif', 'rackimage'=>'x366-front', 'u'=>3, 'aliases'=>'8863' ),
|
||||
'x445' => array ( 'image'=>'342.gif', 'rackimage'=>'x366-front', 'u'=>3, 'aliases'=>'' ),
|
||||
'x450' => array ( 'image'=>'342.gif', 'rackimage'=>'x366-front', 'u'=>3, 'aliases'=>'' ),
|
||||
'x455' => array ( 'image'=>'342.gif', 'rackimage'=>'x366-front', 'u'=>3, 'aliases'=>'' ),
|
||||
'x460' => array ( 'image'=>'342.gif', 'rackimage'=>'x366-front', 'u'=>3, 'aliases'=>'' ),
|
||||
|
||||
'x3755' => array ( 'image'=>'342.gif', 'rackimage'=>'x366-front', 'u'=>4, 'aliases'=>'7163,8877' ),
|
||||
'x3850' => array ( 'image'=>'342.gif', 'rackimage'=>'x366-front', 'u'=>4, 'aliases'=>'7141,7233' ),
|
||||
'x3950' => array ( 'image'=>'342.gif', 'rackimage'=>'x366-front', 'u'=>4, 'aliases'=>'' ), # 7141,7233
|
||||
|
||||
'hs20' => array ( 'image'=>'blade.gif', 'rackimage'=>'blade-front', 'u'=>7, 'aliases'=>'8678,8843,7981,blade' ), # removed 8832 because it is older and it made this entry to wide in the drop down boxes
|
||||
'hs12' => array ( 'image'=>'blade.gif', 'rackimage'=>'blade-front', 'u'=>7, 'aliases'=>'8014,8028' ),
|
||||
'hs21' => array ( 'image'=>'blade.gif', 'rackimage'=>'blade-front', 'u'=>7, 'aliases'=>'7995,8853' ),
|
||||
'js20' => array ( 'image'=>'blade.gif', 'rackimage'=>'blade-front', 'u'=>7, 'aliases'=>'8842' ),
|
||||
'js12' => array ( 'image'=>'blade.gif', 'rackimage'=>'blade-front', 'u'=>7, 'aliases'=>'799860X' ),
|
||||
'js21' => array ( 'image'=>'blade.gif', 'rackimage'=>'blade-front', 'u'=>7, 'aliases'=>'8844,7998J21' ),
|
||||
'js22' => array ( 'image'=>'blade.gif', 'rackimage'=>'blade-front', 'u'=>7, 'aliases'=>'799861X' ),
|
||||
'qs21' => array ( 'image'=>'blade.gif', 'rackimage'=>'blade-front', 'u'=>7, 'aliases'=>'0792' ),
|
||||
'qs22' => array ( 'image'=>'blade.gif', 'rackimage'=>'blade-front', 'u'=>7, 'aliases'=>'0793' ),
|
||||
'ls20' => array ( 'image'=>'blade.gif', 'rackimage'=>'blade-front', 'u'=>7, 'aliases'=>'8850' ),
|
||||
'ls21' => array ( 'image'=>'blade.gif', 'rackimage'=>'blade-front', 'u'=>7, 'aliases'=>'7971' ),
|
||||
'ls22' => array ( 'image'=>'blade.gif', 'rackimage'=>'blade-front', 'u'=>7, 'aliases'=>'7901' ),
|
||||
'hs40' => array ( 'image'=>'blade2.gif', 'rackimage'=>'blade2-front', 'u'=>7, 'aliases'=>'8839' ),
|
||||
'ls41' => array ( 'image'=>'blade2.gif', 'rackimage'=>'blade2-front', 'u'=>7, 'aliases'=>'7972' ),
|
||||
'ls42' => array ( 'image'=>'blade2.gif', 'rackimage'=>'blade2-front', 'u'=>7, 'aliases'=>'7902' ),
|
||||
|
||||
# POWER 4 servers
|
||||
'p610' => array ( 'image'=>'520.gif', 'rackimage'=>'x335-front', 'u'=>5, 'aliases'=>'7028' ),
|
||||
'p615' => array ( 'image'=>'520.gif', 'rackimage'=>'x335-front', 'u'=>4, 'aliases'=>'7029' ),
|
||||
'p630' => array ( 'image'=>'520.gif', 'rackimage'=>'x335-front', 'u'=>4, 'aliases'=>'' ), # 7026
|
||||
'p640' => array ( 'image'=>'520.gif', 'rackimage'=>'x335-front', 'u'=>5, 'aliases'=>'7026' ),
|
||||
'p650' => array ( 'image'=>'520.gif', 'rackimage'=>'x335-front', 'u'=>8, 'aliases'=>'7038' ),
|
||||
'p655' => array ( 'image'=>'590.gif', 'rackimage'=>'x335-front', 'u'=>42, 'aliases'=>'7039' ),
|
||||
'p670' => array ( 'image'=>'590.gif', 'rackimage'=>'x335-front', 'u'=>42, 'aliases'=>'' ), # 7040
|
||||
'p690' => array ( 'image'=>'590.gif', 'rackimage'=>'x335-front', 'u'=>42, 'aliases'=>'7040' ),
|
||||
|
||||
# OpenPOWER servers
|
||||
'p710' => array ( 'image'=>'342.gif', 'rackimage'=>'x335-front', 'u'=>2, 'aliases'=>'9123' ),
|
||||
'p720' => array ( 'image'=>'520.gif', 'rackimage'=>'x345-front', 'u'=>4, 'aliases'=>'9124' ),
|
||||
|
||||
# POWER 5 servers
|
||||
'p5-505' => array ( 'image'=>'330.gif', 'rackimage'=>'x335-front', 'u'=>1, 'aliases'=>'' ), # 9115
|
||||
'p5-505Q' => array ( 'image'=>'330.gif', 'rackimage'=>'x335-front', 'u'=>1, 'aliases'=>'9115' ),
|
||||
|
||||
'p5-510' => array ( 'image'=>'342.gif', 'rackimage'=>'x345-front', 'u'=>2, 'aliases'=>'9110' ),
|
||||
'p5-510Q' => array ( 'image'=>'342.gif', 'rackimage'=>'x345-front', 'u'=>2, 'aliases'=>'' ), # 9110
|
||||
'p5-575' => array ( 'image'=>'342.gif', 'rackimage'=>'x345-front', 'u'=>2, 'aliases'=>'9118' ),
|
||||
|
||||
'p5-520' => array ( 'image'=>'520.gif', 'rackimage'=>'p5-520-front', 'u'=>4, 'aliases'=>'9111' ),
|
||||
'p5-520Q' => array ( 'image'=>'520.gif', 'rackimage'=>'p5-520-front', 'u'=>4, 'aliases'=>'9131' ),
|
||||
'p5-550' => array ( 'image'=>'520.gif', 'rackimage'=>'p5-520-front', 'u'=>4, 'aliases'=>'9113' ),
|
||||
'p5-550Q' => array ( 'image'=>'520.gif', 'rackimage'=>'p5-520-front', 'u'=>4, 'aliases'=>'9133' ),
|
||||
'p5-560' => array ( 'image'=>'520.gif', 'rackimage'=>'p5-520-front', 'u'=>4, 'aliases'=>'9116' ),
|
||||
'p5-560Q' => array ( 'image'=>'520.gif', 'rackimage'=>'p5-520-front', 'u'=>4, 'aliases'=>'' ), # 9116
|
||||
'p5-570' => array ( 'image'=>'520.gif', 'rackimage'=>'p5-520-front', 'u'=>4, 'aliases'=>'' ), # 9117
|
||||
|
||||
'p5-590' => array ( 'image'=>'590.gif', 'rackimage'=>'p5-590-front', 'u'=>42, 'aliases'=>'' ), # 9119
|
||||
'p5-595' => array ( 'image'=>'590.gif', 'rackimage'=>'p5-590-front', 'u'=>42, 'aliases'=>'' ), # 9119
|
||||
|
||||
# POWER 6 servers
|
||||
'520' => array ( 'image'=>'520.gif', 'rackimage'=>'p5-520-front', 'u'=>4, 'aliases'=>'8203' ),
|
||||
'550' => array ( 'image'=>'520.gif', 'rackimage'=>'p5-520-front', 'u'=>4, 'aliases'=>'8204' ),
|
||||
'570' => array ( 'image'=>'520.gif', 'rackimage'=>'p5-520-front', 'u'=>4, 'aliases'=>'9117' ),
|
||||
'575' => array ( 'image'=>'342.gif', 'rackimage'=>'x345-front', 'u'=>2, 'aliases'=>'9125' ),
|
||||
'595' => array ( 'image'=>'590.gif', 'rackimage'=>'p5-590-front', 'u'=>42, 'aliases'=>'9119' ),
|
||||
);
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// This returns important display info about each type of hardware, so we can easily add new hw types.
|
||||
function getHWTypeInfo($hwtype, $attr) {
|
||||
//todo: get the aliases to be keys in this hash too
|
||||
$hwhash = array (
|
||||
'x335' => array ( 'image'=>'330.gif', 'rackimage'=>'x335-front', 'u'=>1, 'aliases'=>'8676' ),
|
||||
'x336' => array ( 'image'=>'330.gif', 'rackimage'=>'x335-front', 'u'=>1, 'aliases'=>'8837' ),
|
||||
'x306' => array ( 'image'=>'330.gif', 'rackimage'=>'x335-front', 'u'=>1, 'aliases'=>'8836' ),
|
||||
'x306m' => array ( 'image'=>'330.gif', 'rackimage'=>'x335-front', 'u'=>1, 'aliases'=>'8849,8491' ),
|
||||
'x3550' => array ( 'image'=>'330.gif', 'rackimage'=>'x335-front', 'u'=>1, 'aliases'=>'7978' ),
|
||||
'e325' => array ( 'image'=>'330.gif', 'rackimage'=>'x335-front', 'u'=>1, 'aliases'=>'8835' ),
|
||||
'e326' => array ( 'image'=>'330.gif', 'rackimage'=>'x335-front', 'u'=>1, 'aliases'=>'8848' ),
|
||||
'e326m' => array ( 'image'=>'330.gif', 'rackimage'=>'x335-front', 'u'=>1, 'aliases'=>'7969' ),
|
||||
'e327' => array ( 'image'=>'330.gif', 'rackimage'=>'x335-front', 'u'=>1, 'aliases'=>'' ),
|
||||
function getHWTypeInfo($hwtype, $attr=NULL) {
|
||||
global $HWTypeInfo;
|
||||
|
||||
'x340' => array ( 'image'=>'342.gif', 'rackimage'=>'x345-front', 'u'=>2, 'aliases'=>'8656' ),
|
||||
'x342' => array ( 'image'=>'342.gif', 'rackimage'=>'x345-front', 'u'=>2, 'aliases'=>'8669' ),
|
||||
'x345' => array ( 'image'=>'342.gif', 'rackimage'=>'x345-front', 'u'=>2, 'aliases'=>'8670' ),
|
||||
'x346' => array ( 'image'=>'342.gif', 'rackimage'=>'x345-front', 'u'=>2, 'aliases'=>'8840' ),
|
||||
'x3650' => array ( 'image'=>'342.gif', 'rackimage'=>'x345-front', 'u'=>2, 'aliases'=>'7979' ),
|
||||
// Get the aliases defined as keys, if we have not done that yet
|
||||
if (!array_key_exists('9119',$HWTypeInfo)) {
|
||||
$keys = array_keys($HWTypeInfo); // make a copy of the keys, because we will be adding some in the loop below
|
||||
foreach ($keys as $key) {
|
||||
$value = $HWTypeInfo[$key];
|
||||
if (array_key_exists('aliases',$value) && !empty($value['aliases'])) {
|
||||
$aliases = explode(',', $value['aliases']);
|
||||
foreach ($aliases as $a) {
|
||||
if (array_key_exists($a,$HWTypeInfo)) { msg('W', "Internal warning: Duplicate alias in HWTypeInfo array: $a"); }
|
||||
else { $HWTypeInfo[$a] = $value; }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
'x360' => array ( 'image'=>'342.gif', 'rackimage'=>'x366-front', 'u'=>3, 'aliases'=>'8686' ),
|
||||
'x365' => array ( 'image'=>'342.gif', 'rackimage'=>'x366-front', 'u'=>3, 'aliases'=>'8862' ),
|
||||
'x366' => array ( 'image'=>'342.gif', 'rackimage'=>'x366-front', 'u'=>3, 'aliases'=>'8863' ),
|
||||
'x3850' => array ( 'image'=>'342.gif', 'rackimage'=>'x366-front', 'u'=>3, 'aliases'=>'8863' ),
|
||||
'x445' => array ( 'image'=>'342.gif', 'rackimage'=>'x366-front', 'u'=>3, 'aliases'=>'' ),
|
||||
'x450' => array ( 'image'=>'342.gif', 'rackimage'=>'x366-front', 'u'=>3, 'aliases'=>'' ),
|
||||
'x455' => array ( 'image'=>'342.gif', 'rackimage'=>'x366-front', 'u'=>3, 'aliases'=>'' ),
|
||||
'x460' => array ( 'image'=>'342.gif', 'rackimage'=>'x366-front', 'u'=>3, 'aliases'=>'' ),
|
||||
'x3950' => array ( 'image'=>'342.gif', 'rackimage'=>'x366-front', 'u'=>3, 'aliases'=>'' ),
|
||||
|
||||
'hs20' => array ( 'image'=>'blade.gif', 'rackimage'=>'blade-front', 'u'=>7, 'aliases'=>'8678,8843,7981' ), # removed 8832 because it is older and it made this entry to wide in the drop down boxes
|
||||
'js20' => array ( 'image'=>'blade.gif', 'rackimage'=>'blade-front', 'u'=>7, 'aliases'=>'8842' ),
|
||||
'js21' => array ( 'image'=>'blade.gif', 'rackimage'=>'blade-front', 'u'=>7, 'aliases'=>'8844' ),
|
||||
'ls20' => array ( 'image'=>'blade.gif', 'rackimage'=>'blade-front', 'u'=>7, 'aliases'=>'8850' ),
|
||||
'hs40' => array ( 'image'=>'blade2.gif', 'rackimage'=>'blade2-front', 'u'=>7, 'aliases'=>'8839' ),
|
||||
|
||||
'p5-505' => array ( 'image'=>'330.gif', 'rackimage'=>'x335-front', 'u'=>1, 'aliases'=>'9115' ),
|
||||
'p5-505Q' => array ( 'image'=>'330.gif', 'rackimage'=>'x335-front', 'u'=>1, 'aliases'=>'9115' ),
|
||||
|
||||
'p5-510' => array ( 'image'=>'342.gif', 'rackimage'=>'x345-front', 'u'=>2, 'aliases'=>'9110' ),
|
||||
'p5-510Q' => array ( 'image'=>'342.gif', 'rackimage'=>'x345-front', 'u'=>2, 'aliases'=>'9110' ),
|
||||
'p5-575' => array ( 'image'=>'342.gif', 'rackimage'=>'x345-front', 'u'=>2, 'aliases'=>'9118' ),
|
||||
|
||||
'p5-520' => array ( 'image'=>'520.gif', 'rackimage'=>'p5-520-front', 'u'=>4, 'aliases'=>'9111' ),
|
||||
'p5-520Q' => array ( 'image'=>'520.gif', 'rackimage'=>'p5-520-front', 'u'=>4, 'aliases'=>'9131' ),
|
||||
'p5-550' => array ( 'image'=>'520.gif', 'rackimage'=>'p5-520-front', 'u'=>4, 'aliases'=>'9113' ),
|
||||
'p5-550Q' => array ( 'image'=>'520.gif', 'rackimage'=>'p5-520-front', 'u'=>4, 'aliases'=>'9133' ),
|
||||
'p5-560' => array ( 'image'=>'520.gif', 'rackimage'=>'p5-520-front', 'u'=>4, 'aliases'=>'9116' ),
|
||||
'p5-560Q' => array ( 'image'=>'520.gif', 'rackimage'=>'p5-520-front', 'u'=>4, 'aliases'=>'9116' ),
|
||||
'p5-570' => array ( 'image'=>'520.gif', 'rackimage'=>'p5-520-front', 'u'=>4, 'aliases'=>'9117' ),
|
||||
|
||||
'p5-590' => array ( 'image'=>'590.gif', 'rackimage'=>'p5-590-front', 'u'=>42, 'aliases'=>'9119' ),
|
||||
'p5-595' => array ( 'image'=>'590.gif', 'rackimage'=>'p5-590-front', 'u'=>42, 'aliases'=>'9119' ),
|
||||
|
||||
'p710' => array ( 'image'=>'342.gif', 'rackimage'=>'x335-front', 'u'=>2, 'aliases'=>'9123' ),
|
||||
'p720' => array ( 'image'=>'520.gif', 'rackimage'=>'x345-front', 'u'=>4, 'aliases'=>'9124' ),
|
||||
|
||||
'p610' => array ( 'image'=>'520.gif', 'rackimage'=>'x335-front', 'u'=>5, 'aliases'=>'7028' ),
|
||||
'p615' => array ( 'image'=>'520.gif', 'rackimage'=>'x335-front', 'u'=>4, 'aliases'=>'7029' ),
|
||||
'p630' => array ( 'image'=>'520.gif', 'rackimage'=>'x335-front', 'u'=>4, 'aliases'=>'7026' ),
|
||||
'p640' => array ( 'image'=>'520.gif', 'rackimage'=>'x335-front', 'u'=>5, 'aliases'=>'7026' ),
|
||||
'p650' => array ( 'image'=>'520.gif', 'rackimage'=>'x335-front', 'u'=>8, 'aliases'=>'7038' ),
|
||||
'p655' => array ( 'image'=>'590.gif', 'rackimage'=>'x335-front', 'u'=>42, 'aliases'=>'7039' ),
|
||||
'p670' => array ( 'image'=>'590.gif', 'rackimage'=>'x335-front', 'u'=>42, 'aliases'=>'7040' ),
|
||||
'p690' => array ( 'image'=>'590.gif', 'rackimage'=>'x335-front', 'u'=>42, 'aliases'=>'7040' ),
|
||||
);
|
||||
$info = $hwhash[strtolower($hwtype)];
|
||||
if (isset($attr)) { return $info[$attr]; }
|
||||
else { return $info; }
|
||||
// Now return the info requested
|
||||
$k = strtolower($hwtype);
|
||||
if (!array_key_exists($k,$HWTypeInfo)) { return NULL; }
|
||||
$info = $HWTypeInfo[$k];
|
||||
if (isset($attr)) { return $info[$attr]; }
|
||||
else { return $info; }
|
||||
}
|
||||
|
||||
|
||||
@ -549,19 +605,57 @@ function getHWTypeInfo($hwtype, $attr) {
|
||||
function getHWTypeImage($hwtype, $powermethod) {
|
||||
# 1st try to match the hw type
|
||||
$info = getHWTypeInfo($hwtype, 'image');
|
||||
if ($info) { return $info['image']; }
|
||||
if (!empty($info)) { return $info; }
|
||||
|
||||
# No matches yet. Use the power method to get a generic type.
|
||||
if (isset($powermethod)) {
|
||||
$powermethod = strtolower($powermethod);
|
||||
if ($powermethod == 'blade') { return getHWTypeInfo('hs20', 'image'); }
|
||||
elseif ($powermethod == 'hmc') { return getHWTypeInfo('p5-520', 'image'); }
|
||||
elseif ($powermethod == 'bmc') { return getHWTypeInfo('x335','image'); }
|
||||
elseif ($powermethod == 'xseries') { return getHWTypeInfo('x335', 'image'); }
|
||||
$info = getHWTypeInfo($powermethod, 'image');
|
||||
if (!empty($info)) { return $info; }
|
||||
}
|
||||
|
||||
# As a last resort, return the most common node image
|
||||
return getHWTypeInfo('x335', 'image');
|
||||
return getHWTypeInfo('default', 'image');
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Map the many possible values of nodelist.status into one of four: good, bad, warning, unknown
|
||||
//todo: update this list from Lings new status work
|
||||
function mapStatus($statStr) {
|
||||
$status = NULL;
|
||||
if ($statStr == "alive" || $statStr == "ready" || $statStr == "pbs" || $statStr == "sshd") { $status = "good"; }
|
||||
else if ($statStr == "noping" || $statStr=='unreachable') { $status = "bad"; }
|
||||
else if ($statStr == "ping") { $status = "warning"; }
|
||||
else { $status = "unknown"; }
|
||||
return $status;
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// For 2 status strings from nodestat or nodelist.status, return the "lowest" (worst).
|
||||
// Use this function when trying to aggregate multiple status values into one.
|
||||
//todo: update this list from Lings new status work
|
||||
function minStatus($s1, $s2) {
|
||||
$statnum = array( 'unknown' => 0,
|
||||
'unreachable' => 1,
|
||||
'noping' => 1,
|
||||
'ping' => 2,
|
||||
'snmp' => 3,
|
||||
'sshd' => 4,
|
||||
'pbs' => 5,
|
||||
'ready' => 6,
|
||||
'alive' => 6,
|
||||
);
|
||||
|
||||
// if either value is empty, just return the other one
|
||||
if (!isset($s1)) { return $s2; }
|
||||
if (!isset($s2)) { return $s1; }
|
||||
|
||||
// if either value does not map into the hash, then return unknown
|
||||
if (!isset($statnum[$s1]) || !isset($statnum[$s2])) { return 'unknown'; }
|
||||
|
||||
if ($statnum[$s1] < $statnum[$s2]) { return $s1; }
|
||||
else { return $s2; }
|
||||
}
|
||||
|
||||
|
||||
@ -599,13 +693,16 @@ function getNodes($noderange, $attrs) {
|
||||
//my ($hostname, $type, $osname, $distro, $version, $mode, $status, $conport, $hcp, $nodeid, $pmethod, $location, $comment) = split(/:\|:/, $na);
|
||||
//$nodes[] = array('hostname'=>"node$i.cluster.com", 'type'=>'x3655', 'osname'=>'Linux', 'distro'=>'RedHat', 'version'=>'4.5', 'status'=>1, 'conport'=>$i, 'hcp'=>"node$i-bmc.cluster.com", 'nodeid'=>'', 'pmethod'=>'bmc', 'location'=>"frame=1 u=$", 'comment'=>'');
|
||||
$nodes = array();
|
||||
if (empty($noderange)) { $nodrange = '/.*'; }
|
||||
//$xml = docmd('nodels',$noderange,implode(' ',$attrs));
|
||||
$xml = docmd('nodels',$noderange,$attrs);
|
||||
$output = $xml->xcatresponse->children(); // technically, we should iterate over the xcatresponses, because there can be more than one
|
||||
foreach ($output as $o) {
|
||||
//$output = $xml->xcatresponse->children(); // technically, we should iterate over the xcatresponses, because there can be more than one
|
||||
//foreach ($output as $o) {
|
||||
foreach ($xml->children() as $response) foreach ($response->children() as $o) {
|
||||
$nodename = (string)$o->name;
|
||||
$data = $o->data;
|
||||
$attrval = (string)$data->contents;
|
||||
if (empty($attrval)) { continue; }
|
||||
$attrname = (string)$data->desc;
|
||||
//echo "<p> $attrname = $attrval </p>\n";
|
||||
//echo "<p>"; print_r($nodename); echo "</p>\n";
|
||||
|
@ -3,10 +3,11 @@
|
||||
/* background-color: #002432; */
|
||||
}
|
||||
|
||||
.TopTop { background: #FFF url(../images/toptop.jpg) repeat-x top; }
|
||||
.TopMiddle { background: #FFF url(../images/top2.jpg) repeat-x top; padding-top: 1px; }
|
||||
.TopMiddle { background: #FFF url(../images/top2.jpg) repeat-x top; }
|
||||
|
||||
/*
|
||||
.TopTop { background: #FFF url(../images/toptop.jpg) repeat-x top; }
|
||||
|
||||
#top {
|
||||
margin: 0 auto 10px auto;
|
||||
padding: 0;
|
||||
@ -29,91 +30,102 @@
|
||||
*/
|
||||
|
||||
#xcatImage {
|
||||
/* float: left; */
|
||||
margin: 10px 8px 5px 0px;
|
||||
/* height: 30px; todo: create a smaller icon instead of scaling this on the fly */
|
||||
margin: 3px 8px 5px 0px;
|
||||
}
|
||||
|
||||
.MenuRowBottom { /* this is to help with the white border around the current menu items */
|
||||
border-left: 2px solid white;
|
||||
border-right: 2px solid white;
|
||||
|
||||
/* The next 7 (or so) classes are for the menu at the top of each window.
|
||||
See lib/functions.php insertMenus() for the code that uses these. */
|
||||
|
||||
.MenuTable { /* the table that holds all the menu items */
|
||||
padding-top: 2px;
|
||||
font-family: Sans-Serif;
|
||||
font-size: 8pt;
|
||||
font-weight: bold;
|
||||
margin: 0px;
|
||||
}
|
||||
.MenuTable TR { padding-top: 0px; } /* avoid the inheritance */
|
||||
|
||||
.CurrentMenuItem { /* the <span> menu items that are currently selected */
|
||||
display: inline-block; /* display: block; */
|
||||
padding: 0 1em; /*2em;*/
|
||||
background: #0F5B7F; /*#116893;*/ /* #0B4360; #09334b; */
|
||||
color: white; /* #fafafa; */
|
||||
border-left: 1px solid #273942;
|
||||
line-height: 2.15em; /*2.5em;*/
|
||||
}
|
||||
|
||||
#mainNav { /* the UL that contains the LIs of one row of menu items */
|
||||
/* position: absolute;
|
||||
float: left; */
|
||||
.MenuTable a { /* the non-current menu items */
|
||||
display: inline-block; /* display: block; */
|
||||
/* float: left; IE/Mac 5.2 Fix */
|
||||
padding: 0 1em; /*2em;*/
|
||||
text-decoration: none;
|
||||
color: #a1a1a1;
|
||||
border-left: 1px solid #273942;
|
||||
cursor: pointer;
|
||||
line-height: 2.15em; /*2.5em;*/
|
||||
}
|
||||
|
||||
.MenuTable a:hover { /* when the mouse is over a non-current menu item */
|
||||
background: #0F5B7F; /*#116893;*/ /* #0B4360; #09334b; */
|
||||
color: white; /* #fafafa; */
|
||||
}
|
||||
|
||||
.MenuItemBottom { /* the non-current LIs in the bottom row */
|
||||
/* border-bottom: 2px solid white; */
|
||||
background-color: #0F5B7F; /*#116893;*/
|
||||
}
|
||||
|
||||
/* The rest of these menu-related styles are not used...
|
||||
|
||||
#mainNav { the UL that contains the LIs of one row of menu items
|
||||
list-style: none;
|
||||
margin: 0px;
|
||||
padding: 0px;
|
||||
}
|
||||
|
||||
#mainNav li { /* each menu item */
|
||||
/* float: left; */
|
||||
/* Start: cross-browser inline-block */
|
||||
display: -moz-inline-stack; /* firefox specific */
|
||||
display: inline-block; /* the right way (standards compliant browsers) */
|
||||
zoom: 1; /* internet explorer specific */
|
||||
*display: inline; /* internet explorer specific */
|
||||
/* End: cross-browser inline-block */
|
||||
line-height: 2.15em; /*2.5em;*/
|
||||
#mainNav li { each menu item
|
||||
Start cross-browser inline-block
|
||||
display: -moz-inline-stack; firefox specific
|
||||
display: inline-block; the right way (standards compliant browsers)
|
||||
zoom: 1; internet explorer specific
|
||||
*display: inline; internet explorer specific
|
||||
End cross-browser inline-block
|
||||
line-height: 2.15em;
|
||||
font-weight: bold;
|
||||
/* border: 1px solid white; */
|
||||
}
|
||||
|
||||
#mainNav p { /* the LIs that are currently selected */
|
||||
display: block;
|
||||
padding: 0 2em; /*2em;*/
|
||||
margin: 0px;
|
||||
background: #0B4360; /* #09334b; */
|
||||
color: #fafafa;
|
||||
IE/Win 5.x Fix
|
||||
* html #mainNav a {
|
||||
width: 1px;
|
||||
}
|
||||
|
||||
.CurrentMenuItemTop { /* additional style for the current LI in the top menu row */
|
||||
#mainNav li a.active { not sure if this is needed
|
||||
color: white;
|
||||
}
|
||||
|
||||
.MenuRowBottom { this is to help with the white border around the current menu items
|
||||
border-left: 2px solid white;
|
||||
border-right: 2px solid white;
|
||||
}
|
||||
|
||||
.CurrentMenuItemTop { additional style for the current LI in the top menu row
|
||||
border-left: 2px solid white;
|
||||
border-top: 2px solid white;
|
||||
border-right: 2px solid white;
|
||||
/* border-bottom: 2px solid #09334b; */
|
||||
background-color: #0F5B7F;
|
||||
}
|
||||
|
||||
.MenuItemTop { /* the non-current LIs in the top row */
|
||||
/* border-top: 2px solid black; */
|
||||
.MenuItemTop { the non-current LIs in the top row
|
||||
border-bottom: 2px solid white;
|
||||
}
|
||||
|
||||
#mainNav a { /* the non-current menu items */
|
||||
display: block;
|
||||
/* float: left; IE/Mac 5.2 Fix */
|
||||
padding: 0 2em; /*2em;*/
|
||||
text-decoration: none;
|
||||
color: #a1a1a1;
|
||||
border-left: 1px solid #273942;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
/* IE/Win 5.x Fix
|
||||
* html #mainNav a {
|
||||
width: 1px;
|
||||
} */
|
||||
|
||||
#mainNav a:hover {
|
||||
background: #0B4360; /* #09334b; */
|
||||
color: #fafafa;
|
||||
}
|
||||
|
||||
/*
|
||||
body.home #mainNav a#home, body.tutorials #mainNav a#tutorials {
|
||||
background: #09334b;
|
||||
color: #fafafa;
|
||||
cursor: default;
|
||||
}
|
||||
*/
|
||||
|
||||
#mainNav li a.active {
|
||||
color: #fafafa;
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
div#content {
|
||||
background-color : #fcfaeb;
|
||||
position: absolute;
|
||||
@ -155,6 +167,8 @@ BODY {
|
||||
}
|
||||
|
||||
IMG { vertical-align: middle; }
|
||||
.ImgBaseline { vertical-align: baseline; }
|
||||
.ImgTop { vertical-align: top; }
|
||||
INPUT {vertical-align : middle; font-size : 8pt; font-family : sans-serif; font-weight : bold;}
|
||||
SELECT {vertical-align : middle; font-size : 8pt; font-family : sans-serif; font-weight : bold;}
|
||||
TEXTAREA {vertical-align : middle; font-size : 8pt; font-family : sans-serif; font-weight : bold;}
|
||||
|
19
xCAT-web/machines/frames.css
Normal file
@ -0,0 +1,19 @@
|
||||
|
||||
/* Styles specific to the frames.php page */
|
||||
|
||||
.AllRacksTable { padding-top: 10px; }
|
||||
|
||||
.RackTable {
|
||||
background-color: #303030;
|
||||
border: 2px solid #303030;
|
||||
}
|
||||
|
||||
.RackTable TD {
|
||||
white-space: nowrap;
|
||||
font-size: 1px;
|
||||
}
|
||||
|
||||
.RackTable IMG { vertical-align: baseline; }
|
||||
|
||||
.RackEmptyCell { background-color: #999999; }
|
||||
|
109
xCAT-web/machines/frames.js
Normal file
@ -0,0 +1,109 @@
|
||||
// Javascript functions needed by the frames (racks) page, mostly
|
||||
// to handle the check boxes that are actually images.
|
||||
|
||||
function imageCBClick(image, mode)
|
||||
{
|
||||
if (mode==1 || (mode==2 && (image.checked === undefined || !image.checked))) {
|
||||
image.src = '../images/checked-box.gif';
|
||||
image.checked = true;
|
||||
} else {
|
||||
image.src = '../images/unchecked-box.gif';
|
||||
image.checked = false;
|
||||
var s=image.alt.split(/-/);
|
||||
var rackCB = document.frameForm['selAll'+s[0]+'Checkbox'];
|
||||
rackCB.checked = false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function selectAll(element, rack) // element is the select all checkbox, rack is the rack #
|
||||
{
|
||||
var sel = element.checked;
|
||||
for (var i=0; i < document.images.length; i++) {
|
||||
var image = document.images[i];
|
||||
if (image.src.search(/checked-box\.gif$/)>-1 && image.alt.search('^'+rack+'-')>-1) { imageCBClick(image,sel); }
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
function isNodeSelected(form)
|
||||
{
|
||||
if (document.paramForm.rack.checked) { return (form.Nodes.value.length>0 || form.rackNodes.value.length>0); }
|
||||
// we only continue here if it is the non-rack display
|
||||
for(var i = 0; i < form.length; i++)
|
||||
{
|
||||
var e = form.elements[i];
|
||||
if (e.type == "checkbox" && e.name.search(/^node\d/) > -1 && e.checked) { return true; }
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
function numNodesSelected(form)
|
||||
{
|
||||
if (document.paramForm.rack.checked) {
|
||||
if (form.Nodes.value.length>0) { return 2; } // just have to guess that the group or range has more than 1
|
||||
var val = form.rackNodes.value;
|
||||
var matches = val.match(/,/g);
|
||||
if (!matches) { return (val.length>0 ? 1 : 0); }
|
||||
else { return matches.length + 1; }
|
||||
}
|
||||
// we only continue here if it is the non-rack display
|
||||
var j = 0;
|
||||
for(var i = 0; i < form.length; i++)
|
||||
{
|
||||
var e = form.elements[i];
|
||||
if (e.type == "checkbox" && e.name.search(/^node\d/) > -1 && e.checked)
|
||||
{
|
||||
if (++j == 2) { return j; }
|
||||
}
|
||||
}
|
||||
return j;
|
||||
}
|
||||
|
||||
function gatherRackNodes(form)
|
||||
{
|
||||
if (allSelected(form)) {
|
||||
if (document.paramForm.nodeRange.value.length > 0) { form.Nodes.value = document.paramForm.nodeRange.value; }
|
||||
else { form.Nodes.value = '+' + document.paramForm.nodegrps.value; }
|
||||
form.rackNodes.value='';
|
||||
return;
|
||||
}
|
||||
else { form.Nodes.value=''; }
|
||||
if (!document.paramForm.rack.checked) { form.rackNodes.value=''; return; }
|
||||
|
||||
var nodes='';
|
||||
for (var i=0; i < document.images.length; i++) {
|
||||
var image = document.images[i];
|
||||
if (image.checked) { var s=image.alt.split(/-/); nodes += s[1] + ','; }
|
||||
}
|
||||
form.rackNodes.value = nodes.replace(/,$/, '');
|
||||
}
|
||||
|
||||
function allSelected(form)
|
||||
{
|
||||
if (document.paramForm.rack.checked) {
|
||||
for(var i = 0; i < form.length; i++)
|
||||
{
|
||||
var e = form.elements[i];
|
||||
if (e.type=="checkbox" && e.name.search(/^selAll\d+Checkbox/)>-1 && !e.checked) { return false; }
|
||||
}
|
||||
return true;
|
||||
}
|
||||
else { return form.selAllCheckbox.checked; } // non-rack display
|
||||
}
|
||||
|
||||
function frameFormSubmit(form) {
|
||||
gatherRackNodes(form);
|
||||
if (form.nodesNeeded === undefined || form.nodesNeeded == 2) { // need 1 or more nodes
|
||||
if (isNodeSelected(form)) { return true; }
|
||||
else { alert('Select one or more nodes before pressing an action button.'); return false; }
|
||||
}
|
||||
else if (form.nodesNeeded == 1) { // need exactly 1 node
|
||||
if (numNodesSelected(form) == 1) { return true; }
|
||||
else { alert('Exactly one node must be selected for this action.'); form.nodesNeeded=undefined; return false; }
|
||||
}
|
||||
else if (form.nodesNeeded == 0) { return true; } // 0 or more nodes is ok
|
||||
else { return true; }
|
||||
}
|
||||
*/
|
||||
|
@ -2,353 +2,168 @@
|
||||
/* session_start(); */
|
||||
$TOPDIR = '..';
|
||||
require_once "$TOPDIR/lib/functions.php";
|
||||
insertHeader('xCAT Frame Node List', NULL, NULL, array('machines','frames'));
|
||||
insertHeader('xCAT Frames and Nodes', array('frames.css'), array('frames.js'), array('machines','frames'));
|
||||
if (isAIX()) { $aixDisabled = 'disabled'; }
|
||||
insertNotDoneYet();
|
||||
echo '</body></html>';
|
||||
|
||||
/* This was copied from the csm web interface and can be used as the beginning code
|
||||
for the frame view.
|
||||
<SCRIPT language="JavaScript">
|
||||
function _reloadMe(form)
|
||||
{
|
||||
var url = 'nodes.cgi?';
|
||||
url += 'rack=' + (form.rack.checked?1:0);
|
||||
url += '&group=' + form.nodegrps.value;
|
||||
url += '&nodeRange=' + form.nodeRange.value;
|
||||
window.location = url;
|
||||
echo "<div id=content align=center><form name=frameForm class=ContentForm>\n";
|
||||
|
||||
insertButtons(
|
||||
array('label' => 'Attributes', 'onclick' => ''),
|
||||
array('label' => 'Create Group', 'onclick' => ''),
|
||||
array('label' => 'Ping', 'onclick' => ''),
|
||||
//'Updatenode',
|
||||
array('label' => 'Run Cmd', 'onclick' => ''),
|
||||
array('label' => 'Copy Files', 'onclick' => ''),
|
||||
array('label' => 'Sync Files', 'onclick' => '')
|
||||
);
|
||||
insertButtons(
|
||||
//'Soft Maint',
|
||||
array('label' => 'HW Ctrl', 'onclick' => ''),
|
||||
array('label' => 'RSA/MM/FSP', 'onclick' => ''),
|
||||
array('label' => 'Deploy', 'onclick' => ''),
|
||||
array('label' => 'Diagnose', 'onclick' => ''),
|
||||
array('label' => 'Remove', 'onclick' => '')
|
||||
);
|
||||
|
||||
// Get the attributes for all nodes
|
||||
$attrlist = array('nodepos.rack','nodepos.u','nodepos.chassis','nodepos.slot','nodepos.room','vpd.mtm','nodetype.arch','nodehm.power','nodehm.mgt','mp.mpa','mp.id');
|
||||
$nodes = getNodes('/.*', $attrlist);
|
||||
$frames = array();
|
||||
|
||||
// Process the node list & attrs to build the arrays we need for display: an array of frames.
|
||||
// Each frame is an array where each index is a u # that has a machine it in. If the machine
|
||||
// is really a BC chassis, then the chassis array has the list of blades.
|
||||
foreach ($nodes as $nodename => $attrs) {
|
||||
$isBlade=0;
|
||||
|
||||
// Get the display info for this node (image, size, etc.)
|
||||
$info = getHWInfo(array_key_exists('vpd.mtm',$attrs)?$attrs['vpd.mtm']:'',
|
||||
array_key_exists('nodehm.power',$attrs)?$attrs['nodehm.power']:'',
|
||||
array_key_exists('nodehm.mgt',$attrs)?$attrs['nodehm.mgt']:'');
|
||||
if (empty($info)) { continue; }
|
||||
$image = $info['rackimage'];
|
||||
$size = $info['u'];
|
||||
|
||||
// Try to detect if this node is a MM
|
||||
if (array_key_exists('mp.mpa',$attrs) && $attrs['mp.mpa']==$nodename) { $isMM = 1; }
|
||||
else { $isMM = 0; }
|
||||
|
||||
// If this is a blade, have to get the position from its MM
|
||||
if ($size == 7 && !$isMM) { # blade
|
||||
$isBlade = 1;
|
||||
if (!array_key_exists('mp.mpa',$attrs) || !array_key_exists('mp.id',$attrs)) { continue; }
|
||||
if (!array_key_exists($attrs['mp.mpa'],$nodes)) { continue; }
|
||||
$mmattrs = & $nodes[$attrs['mp.mpa']];
|
||||
if (!array_key_exists('nodepos.rack',$mmattrs)) continue;
|
||||
$f = $mmattrs['nodepos.rack'];
|
||||
if (!array_key_exists('nodepos.u',$mmattrs)) continue;
|
||||
$u = $mmattrs['nodepos.u'];
|
||||
$slot = $attrs['mp.id'];
|
||||
}
|
||||
else { # non-blade
|
||||
if (!array_key_exists('nodepos.rack',$attrs)) continue;
|
||||
$f = $attrs['nodepos.rack'];
|
||||
if (!array_key_exists('nodepos.u',$attrs)) continue;
|
||||
$u = $attrs['nodepos.u'];
|
||||
//echo "<p>nodename=$nodename, f=$f, u=$u</p>\n";
|
||||
}
|
||||
|
||||
$alt = "$nodename: U=$u";
|
||||
if ($isBlade) { $alt .= " Slot=$slot"; }
|
||||
|
||||
// Choose the image for the node, based on the status
|
||||
if (array_key_exists('nodelist.status',$attrs)) $status = $attrs['nodelist.status'];
|
||||
else $status = 'unknown';
|
||||
$status = mapStatus($status);
|
||||
if ($status == 'good') { $image .= '-green.jpg'; }
|
||||
elseif ($status == 'bad') { $image .= '-red.jpg'; }
|
||||
elseif ($status == 'warning') { $image .= '-yellow.jpg'; }
|
||||
else { $image .= '-blue.jpg'; }
|
||||
|
||||
// Create an array for each frame, using the u # as the index for the node
|
||||
if (!array_key_exists($f,$frames)) { $frames[$f] = array(); } # start an array for this frame
|
||||
$frame = & $frames[$f];
|
||||
$findex = 43 - $u - ($size-1);
|
||||
if ($findex < 1) { $findex = 1; }
|
||||
if ($isBlade) {
|
||||
if (!array_key_exists($findex,$frame) || !array_key_exists('chassis',$frame[$findex])) { $frame[$findex] = array('nodename'=>$attrs['mp.mpa'], 'chassis'=>array(), 'size'=>$size); }
|
||||
$chassis = & $frame[$findex]['chassis'];
|
||||
$chassis[$slot] = array('nodename'=>$nodename, 'image'=>$image, 'alt'=>$alt);
|
||||
}
|
||||
else { // this is either a regular svr or a BC chassis
|
||||
if ($isMM) {
|
||||
if (!array_key_exists($findex,$frame)) { $frame[$findex] = array('nodename'=>$nodename, 'chassis'=>array(), 'size'=>$size); }
|
||||
}
|
||||
else { $frame[$findex] = array('nodename'=>$nodename, 'image'=>$image, 'alt'=>$alt, 'size'=>$size); }
|
||||
}
|
||||
}
|
||||
|
||||
function setCookies(form)
|
||||
{
|
||||
var value = (form.rack.checked?1:0) + '&' + form.nodegrps.value + '&' + form.nodeRange.value;
|
||||
setCookie('mainpage', value);
|
||||
}
|
||||
|
||||
function selectAll(element, rack)
|
||||
{
|
||||
var sel = element.checked;
|
||||
if (rack) {
|
||||
for (var i=0; i < document.images.length; i++) {
|
||||
var image = document.images[i];
|
||||
if (image.src.search(/checked-box\\.gif\$/)>-1 && image.alt.search('^'+rack+'-')>-1) { imageCBClick(image,sel); }
|
||||
}
|
||||
}
|
||||
else { // the form checkboxes
|
||||
var form = element.form;
|
||||
for(var i = 0; i < form.length; i++)
|
||||
{
|
||||
var e = form.elements[i];
|
||||
if (e.type == "checkbox" && e.name.search(/^node\\d/) > -1) { e.checked = sel; }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function isNodeSelected(form)
|
||||
{
|
||||
if (document.paramForm.rack.checked) { return (form.Nodes.value.length>0 || form.rackNodes.value.length>0); }
|
||||
// we only continue here if it is the non-rack display
|
||||
for(var i = 0; i < form.length; i++)
|
||||
{
|
||||
var e = form.elements[i];
|
||||
if (e.type == "checkbox" && e.name.search(/^node\\d/) > -1 && e.checked) { return true; }
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
function numNodesSelected(form)
|
||||
{
|
||||
if (document.paramForm.rack.checked) {
|
||||
if (form.Nodes.value.length>0) { return 2; } // just have to guess that the group or range has more than 1
|
||||
var val = form.rackNodes.value;
|
||||
var matches = val.match(/,/g);
|
||||
if (!matches) { return (val.length>0 ? 1 : 0); }
|
||||
else { return matches.length + 1; }
|
||||
}
|
||||
// we only continue here if it is the non-rack display
|
||||
var j = 0;
|
||||
for(var i = 0; i < form.length; i++)
|
||||
{
|
||||
var e = form.elements[i];
|
||||
if (e.type == "checkbox" && e.name.search(/^node\\d/) > -1 && e.checked)
|
||||
{
|
||||
if (++j == 2) { return j; }
|
||||
}
|
||||
}
|
||||
return j;
|
||||
}
|
||||
|
||||
function CBClick(cb) { if (!cb.checked) { cb.form.selAllCheckbox.checked=false; } }
|
||||
|
||||
function imageCBClick(image, mode)
|
||||
{
|
||||
if (mode==1 || (mode==2 && (image.checked === undefined || !image.checked))) {
|
||||
image.src = 'images/checked-box.gif';
|
||||
image.checked = true;
|
||||
} else {
|
||||
image.src = 'images/unchecked-box.gif';
|
||||
image.checked = false;
|
||||
var s=image.alt.split(/-/);
|
||||
var rackCB = document.nodesForm['selAll'+s[0]+'Checkbox'];
|
||||
rackCB.checked = false;
|
||||
}
|
||||
}
|
||||
|
||||
function gatherRackNodes(form)
|
||||
{
|
||||
if (allSelected(form)) {
|
||||
if (document.paramForm.nodeRange.value.length > 0) { form.Nodes.value = document.paramForm.nodeRange.value; }
|
||||
else { form.Nodes.value = '+' + document.paramForm.nodegrps.value; }
|
||||
form.rackNodes.value='';
|
||||
return;
|
||||
}
|
||||
else { form.Nodes.value=''; }
|
||||
if (!document.paramForm.rack.checked) { form.rackNodes.value=''; return; }
|
||||
|
||||
var nodes='';
|
||||
for (var i=0; i < document.images.length; i++) {
|
||||
var image = document.images[i];
|
||||
if (image.checked) { var s=image.alt.split(/-/); nodes += s[1] + ','; }
|
||||
}
|
||||
form.rackNodes.value = nodes.replace(/,\$/, '');
|
||||
}
|
||||
|
||||
function allSelected(form)
|
||||
{
|
||||
if (document.paramForm.rack.checked) {
|
||||
for(var i = 0; i < form.length; i++)
|
||||
{
|
||||
var e = form.elements[i];
|
||||
if (e.type=="checkbox" && e.name.search(/^selAll\\d+Checkbox/)>-1 && !e.checked) { return false; }
|
||||
}
|
||||
return true;
|
||||
}
|
||||
else { return form.selAllCheckbox.checked; } // non-rack display
|
||||
}
|
||||
</SCRIPT>
|
||||
|
||||
<div id=content>
|
||||
<P align="center"><IMG src="images/csmlogo.gif" border="0"></P>
|
||||
<H2>Node List on Management Server <?= $_SERVER["SERVER_NAME"] ?></H2>
|
||||
|
||||
<FORM name="paramForm" action="nodes.cgi" onsubmit="setCookies(this);">
|
||||
<TABLE>
|
||||
<TBODY>
|
||||
<TR valign="middle">
|
||||
<TD>
|
||||
<P class="BlueBack"><B>Which Nodes:</B></P>
|
||||
</TD>
|
||||
<TD><B> Group: <SELECT name="nodegrps" size="1" onchange="setCookies(this.form);_reloadMe(this.form);" class="Middle">
|
||||
|
||||
<!--CSM
|
||||
my $currentGroup = $::in{group};
|
||||
if (!$currentGroup) { $currentGroup = 'AllNodes'; }
|
||||
|
||||
foreach my $group (@$nodegrp){
|
||||
my $selected = '';
|
||||
if($group eq "$currentGroup") { $selected = 'selected'; }
|
||||
print qq(<OPTION value='$group' $selected>$group</OPTION>\n);
|
||||
}
|
||||
CSM-->
|
||||
|
||||
</SELECT> </B>or<B> Node Range: </B><INPUT size="20" type="text" name="nodeRange" value="$::in{nodeRange}" onchange="setCookies(this.form);_reloadMe(this.form);" class="Middle"></TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD></TD>
|
||||
<TD>
|
||||
<INPUT type="checkbox" name="rack" onclick="setCookies(this.form);_reloadMe(this.form);"> Show Nodes in Racks (have to first <A href="hwctrl/rack.cgi">set the physical location</A>)</TD>
|
||||
</TR>
|
||||
</TBODY>
|
||||
</TABLE>
|
||||
</FORM>
|
||||
<!--
|
||||
<SCRIPT language="JavaScript"> document.paramForm.rack.checked = ($rackChecked==1 ? true : false); </SCRIPT>
|
||||
-->
|
||||
|
||||
<FORM name="nodesForm" action="nodes.cgi"
|
||||
onsubmit="
|
||||
gatherRackNodes(this);
|
||||
if (this.nodesNeeded === undefined || this.nodesNeeded == 2) { // need 1 or more nodes
|
||||
if (isNodeSelected(this)) { return true; }
|
||||
else { alert('Select one or more nodes before pressing an action button.'); return false; }
|
||||
}
|
||||
else if (this.nodesNeeded == 1) { // need exactly 1 node
|
||||
if (numNodesSelected(this) == 1) { return true; }
|
||||
else { alert('Exactly one node must be selected for this action.'); this.nodesNeeded=undefined; return false; }
|
||||
}
|
||||
else if (this.nodesNeeded == 0) { return true; } // 0 or more nodes is ok
|
||||
else { return true; }
|
||||
">
|
||||
<TABLE>
|
||||
<TBODY>
|
||||
<TR>
|
||||
<TD><P class="BlueBack"><B>Node<BR>Actions:</B></P></TD>
|
||||
<TD>
|
||||
<TABLE cellpadding=0 cellspacing=2>
|
||||
<TBODY>
|
||||
<TR><TD nowrap>
|
||||
<INPUT type=submit name=propButton value="Attributes" class=but>
|
||||
<INPUT type=submit name=defineButton value="Define Like" class=but>
|
||||
<INPUT type=submit name=createGroupButton value="Create Group" class=but>
|
||||
<INPUT type=submit name=pingNodesButton value="Ping" class=but>
|
||||
<INPUT type=submit name=updateButton value="Updatenode" class=but>
|
||||
<INPUT type=submit name=runcmdButton value="Run Cmd" class=but>
|
||||
<INPUT type=submit name=copyFilesButton value="Copy Files" class=but>
|
||||
</TD></TR>
|
||||
</TBODY>
|
||||
</TABLE>
|
||||
<TABLE cellpadding=0 cellspacing=2>
|
||||
<TBODY>
|
||||
<TR><TD nowrap>
|
||||
<INPUT type=submit name=softMaintButton value="Soft Maint" class=but onclick="this.form.nodesNeeded=1;">
|
||||
<INPUT type=submit name=hwctrlButton value="HW Ctrl" class=but>
|
||||
<INPUT type=submit name=rsaButton value="RSA/MM/FSP" class=but onclick="this.form.nodesNeeded=1;">
|
||||
<INPUT type=submit name=installButton value="Install" class=but>
|
||||
<INPUT type=submit name=perfmonButton value="Perf Mon" class=but>
|
||||
<INPUT type=submit name=webminButton value="Webmin" class=but onclick="this.form.nodesNeeded=1;">
|
||||
<INPUT type=submit name=diagButton value="Diagnose" class=but onclick="this.form.nodesNeeded=1;">
|
||||
<INPUT type=submit name=removeButton value="Remove" class=but>
|
||||
</TD></TR>
|
||||
</TBODY>
|
||||
</TABLE>
|
||||
</TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD colspan="2" height="5"></TD>
|
||||
</TR>
|
||||
<TR valign="top">
|
||||
<TD colspan="2" align="center">
|
||||
<!--CSM if (!($rackChecked==1)) { -->
|
||||
<?php
|
||||
echo "<TABLE cellpadding=0><TBODY align=center valign=middle><TR valign=bottom class=BlueBack>\n";
|
||||
echo "<TD align=left><INPUT type=checkbox name=selAllCheckbox onclick='selectAll(this,0)'><FONT size='-2'>Select All</FONT> <B>Name</B></TD>\n";
|
||||
echo "<TD><B>HW Type</B></TD><TD><B>OS</B></TD><TD><B>Mode</B></TD><TD><B>Status</B></TD><TD><B>HW Ctrl Pt</B></TD><TD><B>Comment</B></TD></TR>\n";
|
||||
$index =0;
|
||||
?>
|
||||
<!--CSM
|
||||
foreach my $na (@$nodeAttrs)
|
||||
{
|
||||
$index++;
|
||||
|
||||
if ($index > $::config{MaxNodesDisplayed})
|
||||
{
|
||||
print qq(<TR><TD colspan=7 align=center><I>Note: Number of nodes to be displayed exceeds the maximum of $::config{MaxNodesDisplayed} specified on the <A href="/config.cgi?csm" target=_parent>Module Config page</A>. To see the rest of the nodes, specify a node range or node group at the top of this page, or change the maximum value.</I></TD></TR>\n);
|
||||
last;
|
||||
}
|
||||
|
||||
my ($hostname, $type, $osname, $distro, $version, $mode, $status, $conport, $hcp, $nodeid, $pmethod, $location, $comment) = split(/:\|:/, $na);
|
||||
print "<TR bgcolor='#d8dff1'><TD align=left nowrap><INPUT type='checkbox' name='node$index' value='$hostname' onclick='CBClick(this)'><A href='properties.cgi?nodes=$hostname'>$hostname</A></TD>\n";
|
||||
|
||||
|
||||
my $image = GuiUtils->getHWTypeImage($type, $pmethod);
|
||||
my $alt = $type;
|
||||
print qq(<TD><IMG src="images/$image" alt="$alt" title="$alt" border=0></TD>\n);
|
||||
|
||||
|
||||
if ($osname=~/aix/i) { $image = 'aix-s.gif'; $alt = 'AIX'; }
|
||||
elsif ($distro=~/redhat/i) { $image = 'redhat-s.gif'; $alt = 'RedHat'; }
|
||||
elsif ($distro=~/suse|sles/i) { $image = 'suse-s.gif'; $alt = 'SuSE/SLES'; }
|
||||
else { $image = ''; $alt = 'Unknown';}
|
||||
if (length($image)) { print qq(<TD nowrap><IMG src="images/$image" alt="$alt" title="$alt" border=0 align=top> $version</TD>\n); }
|
||||
else { print "<TD>$osname $distro $version</TD>\n"; }
|
||||
|
||||
print "<TD>$mode</TD>\n";
|
||||
|
||||
if ($status == 1) { $image = 'green-ball-m.gif'; $alt = 'On'; }
|
||||
elsif ($status == 127 && $mode eq 'PreManaged') { $image = 'blue-ball-m.gif'; $alt = 'Unconfigured'; }
|
||||
elsif ($status == 127) { $image = 'yellow-ball-m.gif'; $alt = 'Unknown'; }
|
||||
else { $image = 'red-ball-m.gif'; $alt = 'Off'; }
|
||||
print qq(<TD><IMG src="images/$image" alt="$alt" title="$alt" border=0></TD>\n);
|
||||
|
||||
print "<TD>$hcp</TD>\n";
|
||||
|
||||
print "<TD>$comment</TD></TR>\n";
|
||||
} -->
|
||||
<?= "</TBODY></TABLE>\n" ?>
|
||||
<!--CSM
|
||||
} # not rack
|
||||
|
||||
else { # show nodes in racks
|
||||
|
||||
print qq(<TABLE><TBODY valign=bottom><TR>\n);
|
||||
echo "<TABLE class=AllRacksTable><TBODY valign=bottom><TR>\n";
|
||||
# xSeries frames are 78.7in H x 23.6in W (3.3 ratio). The server enclosure area is approx 71.4 x 19 (3.75 ratio). Each U is approx 1.725
|
||||
|
||||
my $bord=0;
|
||||
my $index=0;
|
||||
for (my $fnum=1; $fnum<scalar(@frames); $fnum++) {
|
||||
my $frame = $frames[$fnum];
|
||||
if (!defined($frame)) { next; } # no nodes in this frame
|
||||
print qq(<TD><INPUT type=checkbox name=selAll${fnum}Checkbox onclick='selectAll(this,$fnum)'><B> Rack $fnum</B>\n);
|
||||
print qq(<TABLE bgcolor="#303030" cellpadding=0 cellspacing=2><TBODY><TR><TD width=1 height=$bord></TD><TD></TD><TD width=1 height=$bord></TD></TR>\n);
|
||||
for (my $i=1; $i<=42;)
|
||||
{
|
||||
my $u = $$frame[$i];
|
||||
if (defined($u))
|
||||
{
|
||||
my ($hostname, $image, $alt, $size) = @$u;
|
||||
if (ref($image)) { # this a bladecenter chassis
|
||||
my $chassis = $image; # this is really a ref to an array of blades
|
||||
print qq(<TR><TD></TD><TD><TABLE bgcolor="#303030" cellpadding=0 cellspacing=1><TBODY><TR>\n);
|
||||
for (my $j=1; $j<=14; $j++) {
|
||||
my $b = $$chassis[$j];
|
||||
if (defined($b)) {
|
||||
my ($h, $im, $a) = @$b;
|
||||
$index++;
|
||||
print qq(<TD><IMG src='images/unchecked-box.gif' alt='$fnum-$h' title='$fnum-$h' border=0 onclick='imageCBClick(this,2);'><BR>);
|
||||
print qq(<IMG src="images/$im" alt="$a" title="$a" border=0></TD>\n);
|
||||
}
|
||||
else { print qq(<TD bgcolor="#999999" height=25 width=12></TD>\n); } # empty blade slot
|
||||
}
|
||||
print qq(</TR></TBODY></TABLE></TD></TR>\n);
|
||||
}
|
||||
else { # this is regular rack mounted node
|
||||
$index++;
|
||||
print qq(<TR><TD></TD><TD><IMG src='images/unchecked-box.gif' alt='$fnum-$hostname' title='$fnum-$hostname' border=0 align=middle onclick='imageCBClick(this,2);'>);
|
||||
print qq(<IMG src="images/$image" alt="$alt" title="$alt" border=0 align=middle></TD></TR>\n);
|
||||
}
|
||||
$i += $size;
|
||||
}
|
||||
else { print qq(<TR><TD></TD><TD bgcolor="#999999" height=5 width=50></TD></TR>\n); $i++; } # empty slot
|
||||
}
|
||||
print qq(<TR><TD height=$bord></TD></TR></TBODY></TABLE></TD>\n);
|
||||
ksort($frames, SORT_NUMERIC);
|
||||
foreach ($frames as $fnum => $frame) {
|
||||
echo "<TD><INPUT type=checkbox name=selAll${fnum}Checkbox onclick='selectAll(this,$fnum)'><B> Rack $fnum</B>\n";
|
||||
echo "<TABLE class=RackTable cellpadding=0 cellspacing=2><TBODY>\n";
|
||||
|
||||
// Go thru each u position and either draw the svr or fill in an empty slot
|
||||
for ($i=1; $i<=42;) {
|
||||
if (array_key_exists($i,$frame)) { # this slot has a server in it
|
||||
$u = & $frame[$i]; // $u is the machine info at that u #
|
||||
// $u has keys of (nodename, image, alt, size) for rack mounted and (nodename, chassis, size) for blades
|
||||
if (array_key_exists('chassis',$u)) { # this a bladecenter chassis
|
||||
$chassis = & $u['chassis']; # this is really a ref to an array of blades
|
||||
echo "<TR><TD><TABLE class=RackTable cellpadding=0 cellspacing=1><TBODY><TR>\n";
|
||||
for ($j=1; $j<=14; $j++) {
|
||||
if (array_key_exists($j,$chassis)) { // there is a blade in this slot
|
||||
$b = & $chassis[$j]; // keys in $b are: nodename, image, alt
|
||||
$h = $b['nodename'];
|
||||
$im = $b['image'];
|
||||
$a = $b['alt'];
|
||||
echo "<TD><IMG src='$TOPDIR/images/unchecked-box.gif' alt='$fnum-$h' title='$fnum-$h' border=0 onclick='imageCBClick(this,2);'><BR>";
|
||||
echo "<IMG src='$TOPDIR/images/$im' alt='$a' title='$a' border=0></TD>\n";
|
||||
}
|
||||
else { echo "<TD class=RackEmptyCell height=25 width=12> </TD>\n"; } # empty blade slot
|
||||
}
|
||||
echo "</TR></TBODY></TABLE></TD></TR>\n";
|
||||
}
|
||||
else { # this is regular rack mounted node
|
||||
$nodename = $u['nodename'];
|
||||
$image = $u['image'];
|
||||
$alt = $u['alt'];
|
||||
echo "<TR><TD><IMG src='$TOPDIR/images/unchecked-box.gif' alt='$fnum-$nodename' title='$fnum-$nodename' border=0 onclick='imageCBClick(this,2);'>";
|
||||
echo "<IMG src='$TOPDIR/images/$image' alt='$alt' title='$alt' border=0></TD></TR>\n";
|
||||
}
|
||||
$i += $u['size']; // move up the height of this svr
|
||||
}
|
||||
else { # empty slot
|
||||
echo "<TR><TD class=RackEmptyCell height=5 width=50></TD></TR>\n"; $i++;
|
||||
}
|
||||
} // end of the for $i loop
|
||||
echo "</TBODY></TABLE></TD>\n";
|
||||
}
|
||||
|
||||
print qq(</TR></TBODY></TABLE>\n);
|
||||
} # rack
|
||||
CSM-->
|
||||
</TD>
|
||||
</TR>
|
||||
</TBODY>
|
||||
</TABLE>
|
||||
<INPUT type=hidden name=rackNodes value=''>
|
||||
<INPUT type=hidden name=Nodes value=''>
|
||||
</FORM>
|
||||
<!--
|
||||
<SCRIPT language="JavaScript">
|
||||
if ($AIXdisable) {
|
||||
document.nodesForm.softMaintButton.disabled = true;
|
||||
document.nodesForm.rsaButton.disabled = true;
|
||||
document.nodesForm.installButton.disabled = true;
|
||||
echo "</TR></TBODY></TABLE>\n";
|
||||
echo '</form></div>';
|
||||
insertFooter();
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Use a variety of the attributes to try to figure out what kind of hw this is and return
|
||||
// the info that should be displayed for this type of hw. Gets this from functions::getHWTypeInfo()
|
||||
function getHWInfo($mtm, $powermethod, $mgt) {
|
||||
# 1st try to match the Model-MachineType
|
||||
if (!empty($mtm)) {
|
||||
$model = explode('-', $mtm);
|
||||
$info = getHWTypeInfo($model[0]);
|
||||
if (isset($info)) { return $info; }
|
||||
}
|
||||
|
||||
# No matches yet. Use the power method to get a generic type.
|
||||
if (!empty($powermethod)) { $powermethod = $powermethod; }
|
||||
elseif (!empty($mgt)) { $powermethod = $mgt; }
|
||||
if (!empty($powermethod)) { return getHWTypeInfo($powermethod); }
|
||||
else { return NULL; }
|
||||
}
|
||||
</SCRIPT>
|
||||
-->
|
||||
<H4 class="BlueBack">Tips:</H4>
|
||||
<UL>
|
||||
<LI>Select 1 or more nodes & click on an action button. Or choose
|
||||
1 of the main tasks on the left. The <A href="/help.cgi/csm/intro" target="_blank">Help link</A> at the top left really does help. It describes what all these buttons do.
|
||||
<LI>The Status colors: <FONT color="#00cc00">green</FONT>=reachable, <FONT color="#ff0000">red</FONT>=not reachable, <FONT color="#cccc00">yellow</FONT>=unknown/error, <FONT color="#0000ff">blue</FONT>=node not managed.
|
||||
<LI>If too many nodes are displayed, use the Group or Node Range selections
|
||||
to focus what is displayed.
|
||||
<LI>The <A href="/config.cgi?csm" target="_parent">Console/Settings link</A> at the top left is the way to set preferences. There is a verbose
|
||||
option there to have this interface display the commands it is running.
|
||||
<LI>If you are running this over a phone line, we recommend using the <A href="../webmin/change_theme.cgi?theme=">Old Webmin theme</A> (which is now the default) for faster loading. Of course, the <A href="../webmin/change_theme.cgi?theme=mscstyle3">MSC Linux theme</A> looks nicer. (If you change the theme, you will have to navigate
|
||||
back to this page in the Cluster category.)
|
||||
<LI>Did you know you can run as many browser windows with this interface as
|
||||
you want? This can be handy to view information from multiple pages of this interface
|
||||
at the same time.
|
||||
</UL>
|
||||
<P align="center"><FONT size="-1"><B>CSM Version:</B> $rpmVersions{'csm.server'} <B>CSM Web Interface Version:</B> $rpmVersions{'xcsm.web'}</FONT></P>
|
||||
</div>
|
||||
</body>
|
||||
</HTML>
|
||||
|
||||
?>
|
||||
|
@ -8,7 +8,7 @@ if (isAIX()) { $aixDisabled = 'disabled'; }
|
||||
|
||||
require_once("$TOPDIR/lib/GroupNodeTable.class.php");
|
||||
|
||||
insertHeader('Groups', array('groups.css'),
|
||||
insertHeader('xCAT Groups and Nodes', array('groups.css'),
|
||||
array("$TOPDIR/lib/GroupNodeTableUpdater.js","$TOPDIR/js/prototype.js","$TOPDIR/js/scriptaculous.js?load=effects"),
|
||||
array('machines','groups'));
|
||||
|
||||
@ -100,7 +100,7 @@ function getGroupStatus() {
|
||||
preg_match('/^"([^"]*)"/', $rest, $status);
|
||||
if (count($status) < 2) { $status[1] = 'unknown'; }
|
||||
foreach ($grplist as $g) {
|
||||
if (array_key_exists($g,$groups)) { $groups[$g] = minstat($groups[$g], $status[1]); }
|
||||
if (array_key_exists($g,$groups)) { $groups[$g] = minStatus($groups[$g], $status[1]); }
|
||||
else { $groups[$g] = $status[1]; }
|
||||
}
|
||||
}
|
||||
@ -109,28 +109,4 @@ function getGroupStatus() {
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// For 2 status strings from nodestat or nodelist.status, return the "lowest".
|
||||
function minstat($s1, $s2) {
|
||||
$statnum = array( 'unknown' => 0,
|
||||
'noping' => 1,
|
||||
'ping' => 2,
|
||||
'snmp' => 3,
|
||||
'sshd' => 4,
|
||||
'pbs' => 5,
|
||||
'ready' => 6,
|
||||
);
|
||||
|
||||
// if either value is empty, just return the other one
|
||||
if (!isset($s1)) { return $s2; }
|
||||
if (!isset($s2)) { return $s1; }
|
||||
|
||||
// if either value does not map into the hash, then return unknown
|
||||
if (!isset($statnum[$s1]) || !isset($statnum[$s2])) { return 'unknown'; }
|
||||
|
||||
if ($statnum[$s1] < $statnum[$s2]) { return $s1; }
|
||||
else { return $s2; }
|
||||
}
|
||||
|
||||
|
||||
?>
|