mirror of
				https://github.com/xcat2/xcat-core.git
				synced 2025-11-04 13:22:36 +00:00 
			
		
		
		
	git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@154 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
		
			
				
	
	
		
			352 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			352 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
/* session_start(); */
 | 
						|
$TOPDIR = '..';
 | 
						|
require_once "$TOPDIR/lib/functions.php";
 | 
						|
insertHeader('xCAT Frame Node List', NULL, NULL, array('machines','frames'));
 | 
						|
if (isAIX()) { $aixDisabled = 'disabled'; }
 | 
						|
?>
 | 
						|
 | 
						|
<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;
 | 
						|
}
 | 
						|
 | 
						|
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>
 | 
						|
<?php /* phpinfo(); */ ?>
 | 
						|
<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);
 | 
						|
# 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);
 | 
						|
}
 | 
						|
 | 
						|
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;
 | 
						|
}
 | 
						|
</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>
 |