mirror of
				https://github.com/xcat2/xcat-core.git
				synced 2025-11-04 05:12:30 +00:00 
			
		
		
		
	Web interface prototype ported to xcat 2. Now real development of it can start.
git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@2236 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
This commit is contained in:
		@@ -1,5 +1,7 @@
 | 
			
		||||
#!/usr/bin/perl
 | 
			
		||||
 | 
			
		||||
# NOTE: this cmd is not ported to xCAT 2.0 and is not used any more!!!!!!
 | 
			
		||||
 | 
			
		||||
# Display some aggregate information about each group, gathered from the db and its nodes
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								xCAT-web/images/top2.jpg
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								xCAT-web/images/top2.jpg
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 4.8 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								xCAT-web/images/topl2.jpg
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								xCAT-web/images/topl2.jpg
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 5.8 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								xCAT-web/images/topr2.jpg
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								xCAT-web/images/topr2.jpg
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 5.4 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								xCAT-web/images/toptop.gif
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								xCAT-web/images/toptop.gif
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 799 B  | 
@@ -84,8 +84,8 @@ function getNodeGroupSection($group, $nodes) {
 | 
			
		||||
	$right_arrow_gif = $imagedir . "/grey_arrow_r.gif";
 | 
			
		||||
	$left_arrow_gif = $imagedir . "/grey_arrow_l.gif";
 | 
			
		||||
 | 
			
		||||
	$html .= "<table id='$group' class=GroupNodeTable width='100%' cellpadding=0 cellspacing=1 border=0>\n";
 | 
			
		||||
	$html .= "<TR class=GroupNodeTableHeader><TD>Node Name</TD><TD>Arch</TD><TD>OS</TD><TD>Mode</TD><TD>Status</TD><TD>Power Method</TD><TD>Comment</TD></TR>\n";
 | 
			
		||||
	$html = "<table id='$group' class=GroupNodeTable width='100%' cellpadding=0 cellspacing=1 border=0>\n";
 | 
			
		||||
	$html .= "<TR class=GroupNodeTableHeader><TD>Node Name</TD><TD>Arch</TD><TD>OS</TD><TD>Profile</TD><TD>Status</TD><TD>Power Method</TD><TD>Comment</TD></TR>\n";
 | 
			
		||||
 | 
			
		||||
	foreach($nodes as $nodeName => $attrs) {
 | 
			
		||||
		$html .= GroupNodeTable::getNodeTableRow($nodeName, $attrs);
 | 
			
		||||
@@ -103,16 +103,19 @@ function getNodeGroupSection($group, $nodes) {
 | 
			
		||||
function getNodeTableRow($nodeName, $attrs) {
 | 
			
		||||
	$html = "<tr class=GroupNodeTableRow>\n" .
 | 
			
		||||
			"<td align=left><input type=checkbox name='node_$nodeName' >$nodeName</td>\n" .
 | 
			
		||||
			"<td>" . $attrs['arch'] . "</td>\n" .
 | 
			
		||||
			"<td>" . $attrs['osversion'] . "</td>\n" .
 | 
			
		||||
			"<td>" . $attrs['mode'] . "</td>\n";
 | 
			
		||||
			"<td>" . (array_key_exists('nodetype.arch',$attrs)?$attrs['nodetype.arch']:'') . "</td>\n" .
 | 
			
		||||
			"<td>" . (array_key_exists('nodetype.os',$attrs)?$attrs['nodetype.os']:'') . "</td>\n" .
 | 
			
		||||
			"<td>" . (array_key_exists('nodetype.profile',$attrs)?$attrs['nodetype.profile']:'') . "</td>\n";
 | 
			
		||||
 | 
			
		||||
	$stat = 'unknown';   //todo: implement
 | 
			
		||||
	$stat = 'unknown';   //todo: implement when nodels <nr> nodelist.status works
 | 
			
		||||
	$img_string = '<img src="' . getStatusImage($stat) . '">';
 | 
			
		||||
 | 
			
		||||
	$html .= "<td>" . $img_string . "</td>".
 | 
			
		||||
			"<td>" . $attrs['power'] . "</td>".
 | 
			
		||||
			"<td>" . $attrs['comment'] . "</td></tr>";
 | 
			
		||||
	$powerstr = array_key_exists('nodehm.power',$attrs) ? $attrs['nodehm.power'] : NULL;
 | 
			
		||||
	if (empty($powerstr)) { $powerstr = array_key_exists('nodehm.mgt',$attrs)?$attrs['nodehm.mgt']:''; }
 | 
			
		||||
 | 
			
		||||
	$html .= "<td align=center>" . $img_string . "</td>".
 | 
			
		||||
			"<td>" . $powerstr . "</td>".
 | 
			
		||||
			"<td>" . (array_key_exists('nodelist.comments',$attrs)?$attrs['nodelist.comments']:'') . "</td></tr>";
 | 
			
		||||
 | 
			
		||||
	return $html;
 | 
			
		||||
	}
 | 
			
		||||
@@ -123,7 +126,7 @@ function getNodeTableRow($nodeName, $attrs) {
 | 
			
		||||
 */
 | 
			
		||||
function determineStatus($statStr) {
 | 
			
		||||
	$status = NULL;
 | 
			
		||||
	if ($statStr == "ready" || $statStr == "pbs" || $statStr == "sshd") { $status = "good"; }
 | 
			
		||||
	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"; }
 | 
			
		||||
 
 | 
			
		||||
@@ -7,10 +7,12 @@ session_start();     // retain session variables across page requests
 | 
			
		||||
if (!isset($TOPDIR)) { $TOPDIR = '..'; }
 | 
			
		||||
 | 
			
		||||
// The settings below display error on the screen, instead of giving blank pages.
 | 
			
		||||
error_reporting(E_ALL ^ E_NOTICE);
 | 
			
		||||
//error_reporting(E_ALL ^ E_NOTICE);
 | 
			
		||||
error_reporting(E_ALL);
 | 
			
		||||
ini_set('display_errors', true);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
/**
 | 
			
		||||
 * Inserts the header part of the HTML and the top part of the page, including the menu.
 | 
			
		||||
 * Also includes some common css and js files and the css and js files specified.
 | 
			
		||||
@@ -53,7 +55,7 @@ echo "</head><body>\n";
 | 
			
		||||
echo <<<EOS
 | 
			
		||||
<table id=headingTable border=0 cellspacing=0 cellpadding=0>
 | 
			
		||||
<tr valign=top>
 | 
			
		||||
    <td><img src='$TOPDIR/images/topl.jpg'></td>
 | 
			
		||||
    <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 class=TopMiddle width='100%'>
 | 
			
		||||
 | 
			
		||||
@@ -62,7 +64,7 @@ EOS;
 | 
			
		||||
 | 
			
		||||
insertMenus($currents);
 | 
			
		||||
 | 
			
		||||
echo "</td><td><img src='$TOPDIR/images/topr.jpg'></td></tr></table>\n";
 | 
			
		||||
echo "</td><td><img src='$TOPDIR/images/topr2.jpg'></td></tr></table>\n";
 | 
			
		||||
//echo "</div></div>\n";     // end the top div
 | 
			
		||||
}  // end insertHeader
 | 
			
		||||
 | 
			
		||||
@@ -126,10 +128,10 @@ $MENU = array(
 | 
			
		||||
		'list' => array(
 | 
			
		||||
			'diagnose' => array('label' => 'Diagnose', 'url' => "$TOPDIR/support/diagnose.php"),
 | 
			
		||||
			'update' => array('label' => 'Update', 'url' => "$TOPDIR/support/update.php"),
 | 
			
		||||
			'howtos' => array('label' => 'HowTos', 'url' => "$TOPDIR/support/howtos.php"),
 | 
			
		||||
			'manpages' => array('label' => 'Man Pages', 'url' => "$TOPDIR/support/manpages.php"),
 | 
			
		||||
			'maillist' => array('label' => 'Mail List', 'url' => "http://xcat.org/mailman/listinfo/xcat-user"),
 | 
			
		||||
			'wiki' => array('label' => 'Wiki', 'url' => "http://xcat.wiki.sourceforge.net/"),
 | 
			
		||||
			'howtos' => array('label' => 'HowTos', 'url' => getDocURL('howto')),
 | 
			
		||||
			'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"),
 | 
			
		||||
			'about' => array('label' => 'About', 'url' => "$TOPDIR/support/about.php"),
 | 
			
		||||
			)
 | 
			
		||||
@@ -137,6 +139,7 @@ $MENU = array(
 | 
			
		||||
	);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
// Insert the menus at the top of the page
 | 
			
		||||
//   $currents is an array of the current menu choice tree
 | 
			
		||||
function insertMenus($currents) {
 | 
			
		||||
@@ -152,6 +155,7 @@ function insertMenus($currents) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
// Insert one set of choices under a main choice.
 | 
			
		||||
function insertMenuRow($current, $isTop, $items) {
 | 
			
		||||
	global $TOPDIR;
 | 
			
		||||
@@ -182,10 +186,82 @@ function insertMenuRow($current, $isTop, $items) {
 | 
			
		||||
 | 
			
		||||
	//echo "</TR></TABLE>\n";
 | 
			
		||||
	//echo "</ul></div>\n";
 | 
			
		||||
	echo "</td></tr></ul>\n";
 | 
			
		||||
	echo "\n</ul></td></tr>\n";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
// Inserts the html for each pages footer
 | 
			
		||||
function insertFooter() {
 | 
			
		||||
echo '<div class=PageFooter><p id=disclaimer>This interface is still under construction and not yet ready for use.</p></div></BODY></HTML>';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
// Run a cmd via the xcat client/server protocol
 | 
			
		||||
// args is an array of arguments to the cmd
 | 
			
		||||
// Returns a tree of SimpleXML objects.  See perl-xCAT/xCAT/Client.pm for the format.
 | 
			
		||||
function docmd($cmd, $nr, $args){
 | 
			
		||||
	$request = simplexml_load_string('<xcatrequest></xcatrequest>');
 | 
			
		||||
	$request->addChild('command',$cmd);
 | 
			
		||||
	foreach ($args as $a) {
 | 
			
		||||
		$request->addChild('arg',$a);
 | 
			
		||||
	}
 | 
			
		||||
	if(!empty($nr)){
 | 
			
		||||
		$request->addChild('noderange',$nr);
 | 
			
		||||
	}
 | 
			
		||||
	#echo $request->asXML();
 | 
			
		||||
	$xml = submit_request($request,0);
 | 
			
		||||
	return $xml;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
// Used by docmd()
 | 
			
		||||
// req is a tree of SimpleXML objects
 | 
			
		||||
// Returns a tree of SimpleXML objects.  See perl-xCAT/xCAT/Client.pm for the format.
 | 
			
		||||
function submit_request($req, $skipVerify){
 | 
			
		||||
	#global $cert,$port,$xcathost;
 | 
			
		||||
	$apachehome = '/var/www';		#todo:  for sles this should be /var/lib/wwwrun
 | 
			
		||||
	$cert = "$apachehome/.xcat/client-cred.pem";
 | 
			
		||||
	$xcathost = "localhost";
 | 
			
		||||
	$port = "3001";
 | 
			
		||||
	$rsp = 0;
 | 
			
		||||
	$response = '';
 | 
			
		||||
	$cleanexit=0;
 | 
			
		||||
 | 
			
		||||
	// Open a socket to xcatd
 | 
			
		||||
	$context = stream_context_create(array('ssl'=>array('local_cert' => $cert)));
 | 
			
		||||
	if($fp = stream_socket_client('ssl://'.$xcathost.':'.$port,$errno,$errstr,30,
 | 
			
		||||
                STREAM_CLIENT_CONNECT,$context)){
 | 
			
		||||
		fwrite($fp,$req->asXML());		// send the xml to xcatd
 | 
			
		||||
		while(!feof($fp)){				// and then read until there is no more
 | 
			
		||||
			$response .= preg_replace('/\n/','', stream_get_contents($fp));		// remove newlines and add it to the response
 | 
			
		||||
 | 
			
		||||
			// Look for the serverdone response
 | 
			
		||||
			$pattern = '/<xcatresponse>\s*<serverdone>\s*<\/serverdone>\s*<\/xcatresponse>\s*$/';
 | 
			
		||||
			if(preg_match($pattern,$response)) {		// transaction is done, pkg up the xml and return it
 | 
			
		||||
				#echo htmlentities($response);
 | 
			
		||||
				$response = '<xcat>' . preg_replace($pattern,'', $response) . '</xcat>';		// remove the serverdone response and put an xcat tag around the rest
 | 
			
		||||
				$rsp = simplexml_load_string($response,'SimpleXMLElement', LIBXML_NOCDATA);
 | 
			
		||||
				$cleanexit = 1;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		fclose($fp);
 | 
			
		||||
	}else{
 | 
			
		||||
		echo "<p>xCAT Submit request Error: $errno - $errstr</p>\n";
 | 
			
		||||
	}
 | 
			
		||||
	if(! $cleanexit){
 | 
			
		||||
		if(!$skipVerify){
 | 
			
		||||
			echo "<p>Error: xCAT response ended prematurely.</p>";
 | 
			
		||||
			$rsp = 0;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return $rsp;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/** ----------------------------------------------------------------------------------------------
 | 
			
		||||
 Function to run the commands on the remote nodes. Four arguments:
 | 
			
		||||
 		1. The command
 | 
			
		||||
@@ -238,8 +314,9 @@ function runcmd ($cmd, $mode, &$output, $options=NULL){
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
// Send the keys and values in the primary global arrays
 | 
			
		||||
function dumpGlobals() { //------------------------------------
 | 
			
		||||
function dumpGlobals() {
 | 
			
		||||
	trace('$_SERVER:');
 | 
			
		||||
	foreach ($_SERVER as $key => $val) { trace("$key = $val"); }
 | 
			
		||||
	trace('<br>$_ENV:');
 | 
			
		||||
@@ -253,8 +330,12 @@ function dumpGlobals() { //------------------------------------
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
function getXcatRoot() { return isset($_ENV['XCATROOT']) ? $_ENV['XCATROOT'] : '/opt/xcat'; }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
# Returns true if the given rpm file is already installed at this version or higher.
 | 
			
		||||
function isInstalled($rpmfile) {
 | 
			
		||||
	$aixrpmopt = isAIX() ? '--ignoreos' : '';
 | 
			
		||||
@@ -271,6 +352,7 @@ function isInstalled($rpmfile) {
 | 
			
		||||
 | 
			
		||||
$isSupportedHash = array();
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
# Returns true if the specified feature is supported.  This is normally determined by some fast
 | 
			
		||||
# method like checking for the existence of a file.  The answer is also cached for next time.
 | 
			
		||||
function isSupported($feature) {
 | 
			
		||||
@@ -297,9 +379,10 @@ define("TRACE", "1");
 | 
			
		||||
function trace($str) { if (TRACE) { echo "<p class=Trace>$str</p>\n"; } }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
// Take in a hostname or ip address and return the fully qualified primary hostname.  If resolution fails,
 | 
			
		||||
// it just returns what it was given.
 | 
			
		||||
function resolveHost($host) { //------------------------------------
 | 
			
		||||
function resolveHost($host) {
 | 
			
		||||
	if (isIPAddr($host)) {       // IP address
 | 
			
		||||
		$hostname = gethostbyaddr($host);
 | 
			
		||||
		return $hostname;
 | 
			
		||||
@@ -312,23 +395,41 @@ function resolveHost($host) { //------------------------------------
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//------------------------------------
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
function isIPAddr ($host) { return preg_match('/^(\d+)\.(\d+)\.(\d+)\.(\d+)$/', $host); }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// Returns the URL for the requested documentation.  This provides 1 level of indirection in case the location
 | 
			
		||||
// of some of the documentation changes.
 | 
			
		||||
function getDocURL($book, $section) { //------------------------------------
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
// Returns the URL for the requested documentation.  This provides 1 level of indirection in case
 | 
			
		||||
// the location of some of the documentation changes.
 | 
			
		||||
// book is the name (minus the dollar sign) of one of the arrays below.
 | 
			
		||||
// section is the book/website/table name, or in the case of manpage:  cmd.section#
 | 
			
		||||
function getDocURL($book, $section = NULL) {
 | 
			
		||||
	global $TOPDIR;
 | 
			
		||||
	$web = array (
 | 
			
		||||
		   'docs' => "http://xcat.org/doc",
 | 
			
		||||
		   'forum' => "http://xcat.org/mailman/listinfo/xcat-user",
 | 
			
		||||
		   'updates' => "http://www.alphaworks.ibm.com/tech/xCAT",
 | 
			
		||||
		   'opensrc' => "http://www-rcf.usc.edu/~garrick",
 | 
			
		||||
		   'wiki' => "http://www.asianlinux.org/xcat",
 | 
			
		||||
		   'docs' => "http://xcat.svn.sourceforge.net/svnroot/xcat/xcat-core/trunk/xCAT-client/share/doc",
 | 
			
		||||
		   'mailinglist' => "http://xcat.org/mailman/listinfo/xcat-user",
 | 
			
		||||
		   'updates' => "http://xcat.sourceforge.net/yum",
 | 
			
		||||
		   'opensrc' => "http://xcat.sourceforge.net/yum",
 | 
			
		||||
		   'wiki' => "http://xcat.wiki.sourceforge.net",
 | 
			
		||||
		   );
 | 
			
		||||
	$man = array ();
 | 
			
		||||
	$howto = array ();
 | 
			
		||||
	$rsctadmin = array (
 | 
			
		||||
	$manpage = array(
 | 
			
		||||
				0 => "$TOPDIR/../xcat-doc",
 | 
			
		||||
				1 => "$TOPDIR/../xcat-doc/man1/xcat.1.html",
 | 
			
		||||
				);
 | 
			
		||||
	$dbtable = array(
 | 
			
		||||
				0 => "$TOPDIR/../xcat-doc/man5",
 | 
			
		||||
				1 => "$TOPDIR/../xcat-doc/man5/xcatdb.5.html",
 | 
			
		||||
				);
 | 
			
		||||
	$howto = array(
 | 
			
		||||
				0 => "$TOPDIR/../xcat-doc",
 | 
			
		||||
				1 => "$TOPDIR/../xcat-doc/index.html",
 | 
			
		||||
				'linuxCookbook' => "$TOPDIR/../xcat-doc/xCAT2.pdf",
 | 
			
		||||
				'idataplexCookbook' => "$TOPDIR/../xcat-doc/xCAT-iDpx.pdf",
 | 
			
		||||
				'aixCookbook' => "$TOPDIR/../xcat-doc/xCAT2onAIX.pdf",
 | 
			
		||||
				);
 | 
			
		||||
	/*
 | 
			
		||||
	$rsctadmin = array (		//todo:  update this
 | 
			
		||||
				0 => "http://publib.boulder.ibm.com/infocenter/clresctr/vxrx/topic/com.ibm.cluster.rsct.doc/rsct_aix5l53",
 | 
			
		||||
				1 => "$rsctadmin[0]/bl5adm1002.html",
 | 
			
		||||
				 'sqlExpressions' => "$rsctadmin[0]/bl5adm1042.html#ussexp",
 | 
			
		||||
@@ -336,8 +437,7 @@ function getDocURL($book, $section) { //------------------------------------
 | 
			
		||||
				 'responses' => "$rsctadmin[0]/bl5adm1041.html#cmrresp",
 | 
			
		||||
				 'resourceClasses' => "$rsctadmin[0]/bl5adm1039.html#lavrc",
 | 
			
		||||
				);
 | 
			
		||||
 | 
			
		||||
	$rsctref = array (
 | 
			
		||||
	$rsctref = array (		//todo:  update this
 | 
			
		||||
				0 => "http://publib.boulder.ibm.com/infocenter/clresctr/vxrx/topic/com.ibm.cluster.rsct.doc/rsct_linux151",
 | 
			
		||||
				1 => "$rsctref[0]/bl5trl1002.html",
 | 
			
		||||
			   'errm' => "$rsctref[0]/bl5trl1067.html#errmcmd",
 | 
			
		||||
@@ -347,11 +447,23 @@ function getDocURL($book, $section) { //------------------------------------
 | 
			
		||||
			   'lscondresp' => "$rsctref[0]/bl5trl1071.html#lscondresp",
 | 
			
		||||
			   'startcondresp' => "$rsctref[0]/bl5trl1079.html#startcondresp",
 | 
			
		||||
			  );
 | 
			
		||||
	*/
 | 
			
		||||
 | 
			
		||||
	if ($book) {
 | 
			
		||||
		if (!$section) { $section = 1; }     // link to whole book if no section specified
 | 
			
		||||
		$url = &$$book;
 | 
			
		||||
		return $url[$section];
 | 
			
		||||
		//$url = &$$book;
 | 
			
		||||
		if ($book=='web') $url = & $web;
 | 
			
		||||
		elseif ($book=='manpage') $url = & $manpage;
 | 
			
		||||
		elseif ($book=='dbtable') $url = & $dbtable;
 | 
			
		||||
		elseif ($book=='howto') $url = & $howto;
 | 
			
		||||
		else return NULL;
 | 
			
		||||
 | 
			
		||||
		if (!$section) { return $url[1]; }     // link to whole book if no section specified
 | 
			
		||||
		if ($book=='manpage') {
 | 
			
		||||
			$m = explode('.',$section);		// 1st part is cmd name, 2nd part is man section
 | 
			
		||||
			return "$url[0]/man$m[1]/$m[0].$m[1].html";
 | 
			
		||||
		}
 | 
			
		||||
		elseif ($book=='dbtable') { return "$url[0]/$section.5.html"; }
 | 
			
		||||
		else return $url[$section];
 | 
			
		||||
	}
 | 
			
		||||
	else {          // produce html for a page that contains all the links above, for testing purposes
 | 
			
		||||
		return '';        //todo:
 | 
			
		||||
@@ -359,8 +471,9 @@ function getDocURL($book, $section) { //------------------------------------
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
// This returns important display info about each type of hardware, so we can easily add new hw types.
 | 
			
		||||
function getHWTypeInfo($hwtype, $attr) { //------------------------------------
 | 
			
		||||
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' ),
 | 
			
		||||
@@ -431,8 +544,9 @@ function getHWTypeInfo($hwtype, $attr) { //------------------------------------
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
// Returns the image that should be displayed for this type of hw.  Gets this from getHWTypeInfo()
 | 
			
		||||
function getHWTypeImage($hwtype, $powermethod) { //------------------------------------
 | 
			
		||||
function getHWTypeImage($hwtype, $powermethod) {
 | 
			
		||||
	# 1st try to match the hw type
 | 
			
		||||
	$info = getHWTypeInfo($hwtype, 'image');
 | 
			
		||||
	if ($info) { return $info['image']; }
 | 
			
		||||
@@ -451,6 +565,7 @@ function getHWTypeImage($hwtype, $powermethod) { //-----------------------------
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
// Return the image that represents the status string passed in
 | 
			
		||||
function getStatusImage($status) {
 | 
			
		||||
	global $TOPDIR;
 | 
			
		||||
@@ -461,6 +576,7 @@ function getStatusImage($status) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
// Returns the specified user preference value, or the default.  (The preferences are stored in cookies.)
 | 
			
		||||
// If no key is specified, it will return the list of preference names.
 | 
			
		||||
function getPref($key) {
 | 
			
		||||
@@ -474,69 +590,76 @@ function getPref($key) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
// Returns a list of some or all of the nodes in the cluster and some of their attributes.
 | 
			
		||||
// Pass in a node range (or NULL to get all nodes) and an array of attribute names (or NULL for none).
 | 
			
		||||
// Returns an array where each key is the node name and each value is an array of attr/value pairs.
 | 
			
		||||
// attrs is an array of attributes that should be returned.
 | 
			
		||||
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();
 | 
			
		||||
	foreach ($attrs as $a) {
 | 
			
		||||
		$output = array();
 | 
			
		||||
		//echo "<p>nodels $noderange $a</p>\n";
 | 
			
		||||
		runcmd("nodels $noderange $a", 2, $output);
 | 
			
		||||
		foreach ($output as $line) {
 | 
			
		||||
			$vals = preg_split('/: */', $line);   // vals[0] will be the node name
 | 
			
		||||
			if (!$nodes[$vals[0]]) { $nodes[$vals[0]] = array(); }
 | 
			
		||||
			$attributes = & $nodes[$vals[0]];
 | 
			
		||||
			if ($a == 'type') {
 | 
			
		||||
				$types = preg_split('/-/', $vals[1]);
 | 
			
		||||
				$attributes['osversion'] = $types[0];
 | 
			
		||||
				$attributes['arch'] = $types[1];
 | 
			
		||||
				$attributes['type'] = $types[2];
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	//$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) {
 | 
			
		||||
		$nodename = (string)$o->name;
 | 
			
		||||
		$data = $o->data;
 | 
			
		||||
		$attrval = (string)$data->contents;
 | 
			
		||||
		$attrname = (string)$data->desc;
 | 
			
		||||
		//echo "<p> $attrname = $attrval </p>\n";
 | 
			
		||||
		//echo "<p>"; print_r($nodename); echo "</p>\n";
 | 
			
		||||
		//echo "<p>"; print_r($o); echo "</p>\n";
 | 
			
		||||
		//$nodes[$nodename] = array('osversion' => $attr);
 | 
			
		||||
		if (!array_key_exists($nodename,$nodes)) { $nodes[$nodename] = array(); }
 | 
			
		||||
		$attributes = & $nodes[$nodename];
 | 
			
		||||
		$attributes[$attrname] = $attrval;
 | 
			
		||||
	}
 | 
			
		||||
	return $nodes;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//function awalk($value, $key) { echo "<p>$key=$value.</p>\n"; }
 | 
			
		||||
//function awalk2($a) { foreach ($a as $key => $value) { if (is_array($value)) {$v='<array>';} else {$v=$value;} echo "<p>$key=$v.</p>\n"; } }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
// Returns the node groups defined in the cluster.
 | 
			
		||||
function getGroups() {
 | 
			
		||||
	$groups = array();
 | 
			
		||||
	$output = array();
 | 
			
		||||
	runcmd("listattr", 2, $output);
 | 
			
		||||
	foreach ($output as $grp) { $groups[] = $grp; }
 | 
			
		||||
	return $groups;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// Returns the aggregate status of each node group in the cluster.  The return value is a
 | 
			
		||||
// hash in which the key is the group name and the value is the status as returned by nodestat.
 | 
			
		||||
function getGroupStatus() {
 | 
			
		||||
	$groups = array();
 | 
			
		||||
	$output = array();
 | 
			
		||||
	runcmd("grpattr", 2, $output);
 | 
			
		||||
	$xml = docmd('tabdump','',array('nodelist'));
 | 
			
		||||
	$output = $xml->xcatresponse->children();
 | 
			
		||||
	#$output = $xml->children();	// technically, we should iterate over the xcatresponses, because there can be more than one
 | 
			
		||||
	foreach ($output as $line) {
 | 
			
		||||
		//echo "<p>line=$line</p>";
 | 
			
		||||
		$vals = preg_split('/: */', $line);
 | 
			
		||||
		if (count($vals) == 2) { $groups[$vals[0]] = $vals[1]; }
 | 
			
		||||
		$vals = array();
 | 
			
		||||
		preg_match('/^"([^"]*)","([^"]*)"/', $line, $vals);	//todo: create function to parse tabdump output better
 | 
			
		||||
		if (count($vals) > 2) {
 | 
			
		||||
			//$node = $vals[1];
 | 
			
		||||
			$grplist = preg_split('/,/', $vals[2]);
 | 
			
		||||
			foreach ($grplist as $g) { $groups[$g] = 1; }
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return $groups;
 | 
			
		||||
	$grplist = array_keys($groups);
 | 
			
		||||
	sort($grplist);
 | 
			
		||||
	return $grplist;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Returns true if we are running on AIX ------------------------------------
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
// Returns true if we are running on AIX
 | 
			
		||||
function isAIX() { }     //todo: implement
 | 
			
		||||
 | 
			
		||||
// Returns true if we are running on Linux ------------------------------------
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
// Returns true if we are running on Linux
 | 
			
		||||
function isLinux() { }     //todo: implement
 | 
			
		||||
 | 
			
		||||
// Returns true if we are running on Windows ------------------------------------
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
// Returns true if we are running on Windows
 | 
			
		||||
function isWindows() { return array_key_exists('WINDIR', $_SERVER); }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
// Create file folder-like tabs.  Tablist is an array of label/url pairs.
 | 
			
		||||
function insertTabs ($tablist, $currentTabIndex) { //------------------------------------
 | 
			
		||||
function insertTabs ($tablist, $currentTabIndex) {
 | 
			
		||||
	echo "<TABLE cellpadding=4 cellspacing=0 width='100%' summary=Tabs><TBODY><TR>";
 | 
			
		||||
	foreach ($tablist as $key => $tab) {
 | 
			
		||||
		if ($key != 0) { echo "<TD width=2></TD>"; }
 | 
			
		||||
@@ -551,6 +674,7 @@ function insertTabs ($tablist, $currentTabIndex) { //---------------------------
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
// Create the Action buttons in a table.  Each argument passed in is a button, which is an array of attribute strings.
 | 
			
		||||
// If your onclick attribute contains javascript code that uses quotes, use double quotes instead of single quotes.
 | 
			
		||||
// Note:  if only 1 button is passed in, the button is not put in a table.
 | 
			
		||||
@@ -568,6 +692,7 @@ function insertButtons () {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
// Display messages in the html.  If severity is W or E, it will attempt to use the Error class
 | 
			
		||||
// from the style sheet.
 | 
			
		||||
function msg($severity, $msg)
 | 
			
		||||
@@ -580,6 +705,7 @@ function msg($severity, $msg)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
function insertNotDoneYet() { echo "<p class=NotDone>This page is not done yet.</p>\n"; }
 | 
			
		||||
 | 
			
		||||
?>
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,8 @@
 | 
			
		||||
	/* background-color: #002432; */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.TopMiddle { background: #FFF url(../images/top.jpg) repeat-x top; }
 | 
			
		||||
.TopTop { background: #FFF url(../images/toptop.jpg) repeat-x top; }
 | 
			
		||||
.TopMiddle { background: #FFF url(../images/top2.jpg) repeat-x top; padding-top: 1px; }
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
#top {
 | 
			
		||||
@@ -38,7 +39,7 @@
 | 
			
		||||
	border-right: 2px solid white;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#mainNav {   /* the UL the contains the LIs of one row of menu items */
 | 
			
		||||
#mainNav {   /* the UL that contains the LIs of one row of menu items */
 | 
			
		||||
	/* position: absolute;
 | 
			
		||||
	float: left; */
 | 
			
		||||
	list-style: none;
 | 
			
		||||
@@ -63,7 +64,7 @@
 | 
			
		||||
  display: block;
 | 
			
		||||
  padding: 0 2em;  /*2em;*/
 | 
			
		||||
  margin: 0px;
 | 
			
		||||
  background: #09334b;
 | 
			
		||||
  background: #0B4360;  /* #09334b; */
 | 
			
		||||
  color: #fafafa;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -95,7 +96,7 @@
 | 
			
		||||
} */
 | 
			
		||||
 | 
			
		||||
#mainNav a:hover {
 | 
			
		||||
  background: #09334b;
 | 
			
		||||
  background: #0B4360;   /* #09334b; */
 | 
			
		||||
  color: #fafafa;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -123,6 +124,21 @@ div#content {
 | 
			
		||||
 | 
			
		||||
.ContentForm { margin: 10px 2px 15px 2px; }
 | 
			
		||||
 | 
			
		||||
.PageFooter {
 | 
			
		||||
 background-color : #e8e8e8;
 | 
			
		||||
 margin: 10px;
 | 
			
		||||
 padding: 5px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#disclaimer {
 | 
			
		||||
 font-weight: bold;
 | 
			
		||||
 font-size: 8pt;
 | 
			
		||||
 font-style: italic;
 | 
			
		||||
 color: red;
 | 
			
		||||
 text-align: center;
 | 
			
		||||
 margin: 5px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
BODY {
 | 
			
		||||
	margin: 0;
 | 
			
		||||
	padding: 10px;
 | 
			
		||||
@@ -138,6 +154,7 @@ BODY {
 | 
			
		||||
	*/
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
IMG { vertical-align: middle; }
 | 
			
		||||
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;}
 | 
			
		||||
 
 | 
			
		||||
@@ -4,8 +4,11 @@ $TOPDIR = '..';
 | 
			
		||||
require_once "$TOPDIR/lib/functions.php";
 | 
			
		||||
insertHeader('xCAT Frame Node List', NULL, NULL, 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)
 | 
			
		||||
{
 | 
			
		||||
@@ -125,7 +128,6 @@ 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>
 | 
			
		||||
 | 
			
		||||
@@ -349,3 +351,4 @@ if ($AIXdisable) {
 | 
			
		||||
</div>
 | 
			
		||||
</body>
 | 
			
		||||
</HTML>
 | 
			
		||||
?>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,13 +1,7 @@
 | 
			
		||||
 | 
			
		||||
/* Styles specific to the groups.php page */
 | 
			
		||||
 | 
			
		||||
#disclaimer {
 | 
			
		||||
 font-weight: bold;
 | 
			
		||||
 font-size: 9pt;
 | 
			
		||||
 color: red;
 | 
			
		||||
 text-align: center;
 | 
			
		||||
 margin: 5px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.GroupNodeTable { margin-left: 10px; }
 | 
			
		||||
.GroupNodeTable TD { padding-left: 0.2em; padding-right: 0.2em; }
 | 
			
		||||
.GroupNodeTableHeader { color: black; background-color : #FFFF66; font-weight : bold; white-space: nowrap; }
 | 
			
		||||
.GroupNodeTableRow { color: black; background-color : #FFFF66; white-space: nowrap; }
 | 
			
		||||
 
 | 
			
		||||
@@ -68,17 +68,69 @@ foreach($groups as $group => $status) {
 | 
			
		||||
 | 
			
		||||
GroupNodeTable::insertGroupTableFooter();
 | 
			
		||||
 | 
			
		||||
echo <<<EOS
 | 
			
		||||
<!-- <SCRIPT language="JavaScript"> XCATEvent.doExpandNodes(); </SCRIPT> -->
 | 
			
		||||
</form>
 | 
			
		||||
<table>
 | 
			
		||||
<tr><td><img src="$TOPDIR/images/green-ball-m.gif"></td><td align=left>Node is good (Status is ready/pbs/sshd)</td></tr>
 | 
			
		||||
<tr><td><img src="$TOPDIR/images/red-ball-m.gif"></td><td align=left>Node is bad (Status is 'noping')</td></tr>
 | 
			
		||||
<tr><td><img src="$TOPDIR/images/yellow-ball-m.gif"></td><td align=left>Other status (unknown/node unavailable...)</td></tr>
 | 
			
		||||
</table>
 | 
			
		||||
<p id=disclaimer>This interface is still under construction and not yet ready for use.</p>
 | 
			
		||||
</div>
 | 
			
		||||
</BODY>
 | 
			
		||||
</HTML>
 | 
			
		||||
EOS;
 | 
			
		||||
echo '<!-- <SCRIPT language="JavaScript"> XCATEvent.doExpandNodes(); </SCRIPT> --></form><table><tr>';
 | 
			
		||||
 | 
			
		||||
echo '<td><img src="' . getStatusImage('good') . '"> Good</td><td width=20></td>';
 | 
			
		||||
echo '<td><img src="' . getStatusImage('warning') . '"> Possible problem</td><td width=20></td>';
 | 
			
		||||
echo '<td><img src="' . getStatusImage('bad') . '"> Problem</td><td width=20></td>';
 | 
			
		||||
echo '<td><img src="' . getStatusImage('unknown') . '"> Unknown</td>';
 | 
			
		||||
 | 
			
		||||
echo '</tr></table></div>';
 | 
			
		||||
insertFooter();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
// Returns the aggregate status of each node group in the cluster.  The return value is a
 | 
			
		||||
// hash in which the key is the group name and the value is nodelist.status.
 | 
			
		||||
function getGroupStatus() {
 | 
			
		||||
	$groups = array();
 | 
			
		||||
	$xml = docmd('tabdump','',array('nodelist'));
 | 
			
		||||
	$output = $xml->xcatresponse->children();
 | 
			
		||||
	#$output = $xml->children();	// technically, we should iterate over the xcatresponses, because there can be more than one
 | 
			
		||||
	foreach ($output as $line) {
 | 
			
		||||
		//echo "<p>line=$line</p>";
 | 
			
		||||
		$vals = array();
 | 
			
		||||
		preg_match('/^"([^"]*)","([^"]*)",(.*)$/', $line, $vals);	//todo: create function to parse tabdump output better
 | 
			
		||||
		if (count($vals) > 3) {
 | 
			
		||||
			//$node = $vals[1];
 | 
			
		||||
			$grplist = preg_split('/,/', $vals[2]);
 | 
			
		||||
			$rest = $vals[3];
 | 
			
		||||
			$status = array();
 | 
			
		||||
			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]); }
 | 
			
		||||
				else { $groups[$g] = $status[1]; }
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return $groups;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
// 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; }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
?>
 | 
			
		||||
@@ -1,11 +1,17 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
// Returns the nodes of a group expanded in the group/node table
 | 
			
		||||
 | 
			
		||||
$TOPDIR = '..';
 | 
			
		||||
require_once("$TOPDIR/lib/GroupNodeTable.class.php");
 | 
			
		||||
 | 
			
		||||
$nodeGroupName = @$_REQUEST["nodeGroupName"];
 | 
			
		||||
 | 
			
		||||
// Get all the nodes with node information of the group
 | 
			
		||||
$nodes = getNodes($nodeGroupName, array('type'));
 | 
			
		||||
// Get all the nodes (with node information) of the group
 | 
			
		||||
$nodes = getNodes($nodeGroupName, array('nodetype.os','nodetype.arch','nodetype.profile','nodehm.power','nodehm.mgt','nodelist.comments'));
 | 
			
		||||
//$nodes = getNodes($nodeGroupName, 'nodetype.os');
 | 
			
		||||
 | 
			
		||||
// Display the rows in the table for these nodes
 | 
			
		||||
echo GroupNodeTable::getNodeGroupSection($nodeGroupName, $nodes);
 | 
			
		||||
 | 
			
		||||
?>
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										21
									
								
								xCAT-web/machines/test.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								xCAT-web/machines/test.css
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,21 @@
 | 
			
		||||
 | 
			
		||||
#disclaimer {
 | 
			
		||||
 font-weight: bold;
 | 
			
		||||
 font-size: 9pt;
 | 
			
		||||
 color: red;
 | 
			
		||||
 text-align: center;
 | 
			
		||||
 margin: 5px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.GroupNodeTable { margin-left: 10px; }
 | 
			
		||||
 | 
			
		||||
.myTableHeader {
 | 
			
		||||
 color: black;
 | 
			
		||||
 background-color: #FFFF66;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.myTableRow {
 | 
			
		||||
 color: black;
 | 
			
		||||
 background-color: #FFFF66;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -71,7 +71,7 @@ if (!isset($_REQUEST['noderange'])) {
 | 
			
		||||
      	to /tmp on the nodes and executed from there.)</TD>
 | 
			
		||||
    </TR>
 | 
			
		||||
    <TR class=FormTable>
 | 
			
		||||
      <TD colspan="3" nowrap><INPUT type="checkbox" name="run_psh" id="pshChkBox" checked readonly>
 | 
			
		||||
      <TD colspan="3" nowrap><INPUT type="checkbox" name="run_psh" id="pshChkBox" disabled>
 | 
			
		||||
		Use parallel shell (psh) command instead of xdsh.  Currently this option must be used, and the options below (associated with xdsh) are disabled.</TD>
 | 
			
		||||
    </TR>
 | 
			
		||||
    <TR class=FormTable>
 | 
			
		||||
@@ -79,17 +79,17 @@ if (!isset($_REQUEST['noderange'])) {
 | 
			
		||||
    </TR>
 | 
			
		||||
    <TR class=FormTable>
 | 
			
		||||
      <TD width="37"></TD>
 | 
			
		||||
      <TD width="210" valign="top" nowrap><INPUT type="checkbox" name="serial" id="serialChkBox" disabled>Streaming mode</TD>
 | 
			
		||||
      <TD width="210" valign="top" nowrap><INPUT type="checkbox" name="serial" id="serialChkBox">Streaming mode</TD>
 | 
			
		||||
      <TD width="500">Specifies that output is returned as it becomes available from each target, instead of waiting for the command to be completed on a target before returning output from that target.</TD>
 | 
			
		||||
    </TR>
 | 
			
		||||
    <TR class=FormTable>
 | 
			
		||||
      <TD></TD>
 | 
			
		||||
      <TD valign="top" nowrap><INPUT type="checkbox" name="monitor" id="monitorChkBox" disabled>Monitor</TD>
 | 
			
		||||
      <TD valign="top" nowrap><INPUT type="checkbox" name="monitor" id="monitorChkBox">Monitor</TD>
 | 
			
		||||
      <TD>Prints starting and completion messages for each node.  Useful with Streaming mode.</TD>
 | 
			
		||||
    </TR>
 | 
			
		||||
    <TR class=FormTable>
 | 
			
		||||
      <TD></TD>
 | 
			
		||||
      <TD valign="top" nowrap><INPUT type="checkbox" name="verify" id="verifyChkBox" disabled>Verify</TD>
 | 
			
		||||
      <TD valign="top" nowrap><INPUT type="checkbox" name="verify" id="verifyChkBox">Verify</TD>
 | 
			
		||||
      <TD>Verifies that nodes are responding before sending the command to them.</TD>
 | 
			
		||||
    </TR>
 | 
			
		||||
    <TR class=FormTable>
 | 
			
		||||
@@ -99,12 +99,12 @@ if (!isset($_REQUEST['noderange'])) {
 | 
			
		||||
    </TR>
 | 
			
		||||
    <TR class=FormTable>
 | 
			
		||||
      <TD></TD>
 | 
			
		||||
      <TD valign="top" nowrap>Fanout: <INPUT type="text" name="fanout" id="fanoutTxtBox" disabled></TD>
 | 
			
		||||
      <TD valign="top" nowrap>Fanout: <INPUT type="text" name="fanout" id="fanoutTxtBox"></TD>
 | 
			
		||||
      <TD>The maximum number of nodes the command should be run on concurrently. When the command finishes on 1 of the nodes, it will be started on an additional node (the default is 64).</TD>
 | 
			
		||||
    </TR>
 | 
			
		||||
    <TR class=FormTable>
 | 
			
		||||
      <TD></TD>
 | 
			
		||||
      <TD valign="top" nowrap>UserID: <INPUT type="text" name="userID" id="userIDTxtBox" disabled></TD>
 | 
			
		||||
      <TD valign="top" nowrap>UserID: <INPUT type="text" name="userID" id="userIDTxtBox"></TD>
 | 
			
		||||
      <TD>The user id to use to run the command on the nodes.</TD>
 | 
			
		||||
    </TR>
 | 
			
		||||
    <TR class=FormTable>
 | 
			
		||||
@@ -119,13 +119,13 @@ if (!isset($_REQUEST['noderange'])) {
 | 
			
		||||
    </TR>
 | 
			
		||||
    <TR class=FormTable>
 | 
			
		||||
      <TD></TD>
 | 
			
		||||
      <TD valign="top" nowrap><INPUT type="checkbox" name="ret_code" id="ret_codeChkBox" disabled>Return Code</TD>
 | 
			
		||||
      <TD valign="top" nowrap><INPUT type="checkbox" name="ret_code" id="ret_codeChkBox">Return Code</TD>
 | 
			
		||||
      <TD>Prints the return code of the (last) command that was run remotely on each node. The return code is appended at the end of the output for each node.</TD>
 | 
			
		||||
    </TR>
 | 
			
		||||
    <TR><TD colspan="3">
 | 
			
		||||
		<font class="BlueBack">Tips:</font>
 | 
			
		||||
		<UL>
 | 
			
		||||
		  <LI>See the <A href="<?php echo $TOPDIR; ?>/support/doc.php?book=manpages&section=xdsh">xdsh man page</A> for more information about this command.</LI>
 | 
			
		||||
		  <LI>See the <A href="<?php echo getDocURL('manpage','xdsh.1'); ?>">xdsh man page</A> for more information about this command.</LI>
 | 
			
		||||
		</UL>
 | 
			
		||||
	</TD></TR>
 | 
			
		||||
  </TBODY>
 | 
			
		||||
 
 | 
			
		||||
@@ -46,81 +46,54 @@ if (isset($_COOKIE['history']) && array_search($_REQUEST['command'], $_COOKIE['h
 | 
			
		||||
	$ret_code = @$_REQUEST["ret_code"];
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		 //if ($group == "")	$nodegrps = "blade7";	// For now, use blade7 as test node
 | 
			
		||||
	if (!empty($group)) $noderange = $group;
 | 
			
		||||
	else $noderange = $node;
 | 
			
		||||
 | 
			
		||||
		 if ($psh == "off"){ //using dsh
 | 
			
		||||
			$command = "xdsh ";
 | 
			
		||||
			$copy_cmd = "xdcp ";
 | 
			
		||||
			if ($group == "") $node_group = /* "-n " . */ $node;
 | 
			
		||||
			else $node_group = /* "-N " . */ $group;
 | 
			
		||||
	if ($serial == "on") $args[] = "-s";	//streaming mode
 | 
			
		||||
	if (!empty($fanout)) { $args[] = "-f"; $args[] = $fanout; }
 | 
			
		||||
	if (!empty($userID)) { $args[] = "-l"; $args[] = $userID; }
 | 
			
		||||
	if ($verify == "on")  $args[] = "-v";
 | 
			
		||||
	if ($monitor == "on")  $args[] = "-m";
 | 
			
		||||
	if ($copy == "on")  $args[] = "-e";
 | 
			
		||||
	if ($ret_code == "on") $args[] = "-z";
 | 
			
		||||
 | 
			
		||||
		 }else{
 | 
			
		||||
		 	$command = "psh ";
 | 
			
		||||
			$copy_cmd = "pscp ";
 | 
			
		||||
			if ($group == "") $node_group = $node;
 | 
			
		||||
			else $node_group = $group;
 | 
			
		||||
		 }
 | 
			
		||||
	//$exp_cmd = "export DSH_CONTEXT=XCAT XCATROOT=/opt/xcat; ";
 | 
			
		||||
 | 
			
		||||
		if ($serial == "on")	$options = "-s ";	//serial mode/streaming mode
 | 
			
		||||
		if ($fanout == "")	$options .= "-f 64 "; else $options .= "-f " . $fanout;
 | 
			
		||||
		if ($userID != "")  $options .= "-l " . $userID;
 | 
			
		||||
		if ($verify == "on")  $options .= "-v ";
 | 
			
		||||
		if ($monitor == "on")  $options .= "-m ";
 | 
			
		||||
/*
 | 
			
		||||
	if ($copy == "on"){		//using dcp/prcp
 | 
			
		||||
 | 
			
		||||
		//echo "<p>Command: ". $cmd ."</p>";
 | 
			
		||||
 | 
			
		||||
		//$exp_cmd = "export DSH_CONTEXT=XCAT XCATROOT=/opt/xcat; ";
 | 
			
		||||
 | 
			
		||||
		if ($copy == "on"){		//using dcp/prcp
 | 
			
		||||
 | 
			
		||||
			//extract the script name from the command
 | 
			
		||||
			$script = strtok($cmd,' ');
 | 
			
		||||
 | 
			
		||||
			//copy the command to the remote node
 | 
			
		||||
			$source = "/opt/xcat/bin/" . $script; //copy from
 | 
			
		||||
			$target = "/tmp";	//copy to
 | 
			
		||||
			if ($psh == "off"){
 | 
			
		||||
				$copy_cmd = $exp_cmd . $copy_cmd . $node_group . " " . $source . " " . $target;
 | 
			
		||||
			}else{
 | 
			
		||||
				$copy_cmd = $copy_cmd . $source . " " . $node_group . ":" . $target;
 | 
			
		||||
			}
 | 
			
		||||
			runcmd($copy_cmd,1, $outp);
 | 
			
		||||
 | 
			
		||||
			if ($psh != "on"){
 | 
			
		||||
				$command_string = $exp_cmd . $command. $node_group . " /tmp/" . $cmd;
 | 
			
		||||
			}else{
 | 
			
		||||
				$command_string = $command . $node_group . " /tmp/" . $cmd;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
		}
 | 
			
		||||
		else{
 | 
			
		||||
			if ($psh != "on"){
 | 
			
		||||
				$command_string = $exp_cmd . $command. $node_group . " " . $cmd;
 | 
			
		||||
			}else{
 | 
			
		||||
				$command_string = $command . $node_group . " " . $cmd;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if ($collapse == "on")  $command_string .= " | dshbak -c";
 | 
			
		||||
 | 
			
		||||
		echo "<p><b>Command:  $command_string</b></p>";
 | 
			
		||||
		//echo "<p><b>Command Ouput:</b></br></p>"; //output will be returned from the runcmd function call
 | 
			
		||||
 | 
			
		||||
		//run the script
 | 
			
		||||
		$output = array();
 | 
			
		||||
		if ($ret_code == "on"){
 | 
			
		||||
			$rc = runcmd($command_string, 0, $output);	//mode 0
 | 
			
		||||
			if ($rc == 0){
 | 
			
		||||
				foreach ($output as $line){ echo "$line<br>"; }
 | 
			
		||||
			}
 | 
			
		||||
		//extract the script name from the command
 | 
			
		||||
		$script = strtok($cmd,' ');
 | 
			
		||||
 | 
			
		||||
		//copy the command to the remote node
 | 
			
		||||
		$source = $script;
 | 
			
		||||
		$target = "/tmp";
 | 
			
		||||
		if (empty($psh) || $psh!="on"){
 | 
			
		||||
			$xml = docmd('xdcp',$noderange,array($source, $target));
 | 
			
		||||
			//todo: check if copy succeeded
 | 
			
		||||
		}else{
 | 
			
		||||
			//$rc = runcmd($command_string,1, $outp);	//streaming mode - DOES NOT WORK YET
 | 
			
		||||
			$rc = runcmd($command_string, 0, $output);	//mode 0
 | 
			
		||||
			if ($rc == 0){
 | 
			
		||||
				foreach ($output as $line){ echo "$line<br>"; }
 | 
			
		||||
			}
 | 
			
		||||
			runcmd("pscp $source $noderange:$target",1,$outp);
 | 
			
		||||
		}
 | 
			
		||||
		$cmd = "/tmp/$cmd";
 | 
			
		||||
	}
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
	if (empty($psh) || $psh!="on") $command = "xdsh";
 | 
			
		||||
	else $command = "psh";
 | 
			
		||||
 | 
			
		||||
	//if ($collapse == "on")  $command_string .= " | dshbak -c";
 | 
			
		||||
 | 
			
		||||
	// Run the script
 | 
			
		||||
	$args[] = $cmd;
 | 
			
		||||
	echo "<p><b>Command:  $command $noderange " . implode(' ',$args) . "</b></p>";
 | 
			
		||||
	//echo "<p><b>Command Ouput:</b></br></p>"; //output will be returned from the runcmd function call
 | 
			
		||||
	//$rc = runcmd($command_string,1, $outp);	//streaming mode - DOES NOT WORK YET
 | 
			
		||||
	$xml = docmd($command, $noderange, $args);
 | 
			
		||||
	//echo "<p>count=" . count($xml) . ", children=" . $xml->children() . "</p>";
 | 
			
		||||
	//echo "<p>"; print_r($xml); echo "</p>";
 | 
			
		||||
	//$output = $xml->xcatresponse->children();
 | 
			
		||||
	//echo "<p>"; print_r($output); echo "</p>";
 | 
			
		||||
	foreach ($xml->children() as $response) foreach ($response->children() as $line) { echo "$line<br>"; }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -52,10 +52,10 @@ then
 | 
			
		||||
  	apachedaemon='httpd'
 | 
			
		||||
  	apacheuser='apache'
 | 
			
		||||
 | 
			
		||||
	# todo: change this when switch to xcat 2
 | 
			
		||||
	echo "Updating apache userid to allow logins..."
 | 
			
		||||
	cp /etc/passwd /etc/passwd.orig
 | 
			
		||||
	perl -e 'while (<>) { s,^apache:(.*):/sbin/nologin$,apache:$1:/bin/bash,; print $_; }' /etc/passwd.orig >/etc/passwd
 | 
			
		||||
	# Note: this was for sudo with xcat 1.3
 | 
			
		||||
	#echo "Updating apache userid to allow logins..."
 | 
			
		||||
	#cp /etc/passwd /etc/passwd.orig
 | 
			
		||||
	#perl -e 'while (<>) { s,^apache:(.*):/sbin/nologin$,apache:$1:/bin/bash,; print $_; }' /etc/passwd.orig >/etc/passwd
 | 
			
		||||
  else    # SuSE
 | 
			
		||||
  	apachedaemon='apache2'
 | 
			
		||||
  	apacheuser='wwwrun'
 | 
			
		||||
@@ -67,19 +67,20 @@ then
 | 
			
		||||
  /bin/ln -s %{prefix}/web/etc/apache2/conf.d/xcat-web.conf /etc/$apachedaemon/conf.d/xcat-web.conf
 | 
			
		||||
  /etc/init.d/$apachedaemon reload
 | 
			
		||||
 | 
			
		||||
  # Link to the grpattr cmd.  Todo: remove this when it is in base xcat
 | 
			
		||||
  /bin/rm -f %{prefix}/bin/grpattr
 | 
			
		||||
  mkdir -p %{prefix}/bin
 | 
			
		||||
  /bin/ln -s %{prefix}/web/cmds/grpattr %{prefix}/bin/grpattr
 | 
			
		||||
  # Link to the grpattr cmd.  Note: this was for xcat 1.3.  Do not use this anymore.
 | 
			
		||||
  #/bin/rm -f %{prefix}/bin/grpattr
 | 
			
		||||
  #mkdir -p %{prefix}/bin
 | 
			
		||||
  #/bin/ln -s %{prefix}/web/cmds/grpattr %{prefix}/bin/grpattr
 | 
			
		||||
 | 
			
		||||
  # Config sudo.  Note: this was for xcat 1.3.  Do not use this anymore.
 | 
			
		||||
  #if ! egrep -q "^$apacheuser ALL=\(ALL\) NOPASSWD:ALL" /etc/sudoers; then
 | 
			
		||||
  	#echo "Configuring sudo for $apacheuser..."
 | 
			
		||||
  	#echo "$apacheuser ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
 | 
			
		||||
  #fi
 | 
			
		||||
 | 
			
		||||
  # Config sudo.  Todo: change this when switch to xcat 2
 | 
			
		||||
  if ! egrep -q "^$apacheuser ALL=\(ALL\) NOPASSWD:ALL" /etc/sudoers; then
 | 
			
		||||
  	echo "Configuring sudo for $apacheuser..."
 | 
			
		||||
  	echo "$apacheuser ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
 | 
			
		||||
  fi
 | 
			
		||||
  # Authorize the apacheuser to xcatd
 | 
			
		||||
  # echo -e "y\ny\ny" | %{prefix}/share/xcat/scripts/setup-local-client.sh $apacheuser
 | 
			
		||||
  # XCATROOT=%{prefix} %{prefix}/sbin/chtab priority=5 policy.name=$apacheuser policy.rule=allow
 | 
			
		||||
  echo -e "y\ny\ny" | %{prefix}/share/xcat/scripts/setup-local-client.sh $apacheuser
 | 
			
		||||
  XCATROOT=%{prefix} %{prefix}/sbin/chtab priority=5 policy.name=$apacheuser policy.rule=allow
 | 
			
		||||
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
@@ -98,9 +99,9 @@ then
 | 
			
		||||
  	apacheuser='apache'
 | 
			
		||||
 | 
			
		||||
	# Undo change we made to passwd file.  Todo: change this when switch to xcat 2
 | 
			
		||||
	echo "Undoing apache userid login..."
 | 
			
		||||
	cp /etc/passwd /etc/passwd.tmp
 | 
			
		||||
	perl -e 'while (<>) { s,^apache:(.*):/bin/bash$,apache:$1:/sbin/nologin,; print $_; }' /etc/passwd.tmp >/etc/passwd
 | 
			
		||||
	#echo "Undoing apache userid login..."
 | 
			
		||||
	#cp /etc/passwd /etc/passwd.tmp
 | 
			
		||||
	#perl -e 'while (<>) { s,^apache:(.*):/bin/bash$,apache:$1:/sbin/nologin,; print $_; }' /etc/passwd.tmp >/etc/passwd
 | 
			
		||||
  else    # SuSE
 | 
			
		||||
  	apachedaemon='apache2'
 | 
			
		||||
  	apacheuser='wwwrun'
 | 
			
		||||
@@ -110,15 +111,15 @@ then
 | 
			
		||||
  echo "Undoing $apachedaemon configuration for xCAT..."
 | 
			
		||||
  /bin/rm -f /etc/$apachedaemon/conf.d/xcat-web.conf
 | 
			
		||||
  /etc/init.d/$apachedaemon reload
 | 
			
		||||
  /bin/rm -f %{prefix}/bin/grpattr
 | 
			
		||||
  #/bin/rm -f %{prefix}/bin/grpattr
 | 
			
		||||
 | 
			
		||||
  # Remove change we made to sudoers config.  Todo: remove this when switch to xcat 2
 | 
			
		||||
  if egrep -q "^$apacheuser ALL=\(ALL\) NOPASSWD:ALL" /etc/sudoers; then
 | 
			
		||||
  	echo "Undoing sudo configuration for $apacheuser..."
 | 
			
		||||
  	cp -f /etc/sudoers /etc/sudoers.tmp
 | 
			
		||||
  	egrep -v "^$apacheuser ALL=\(ALL\) NOPASSWD:ALL" /etc/sudoers.tmp > /etc/sudoers
 | 
			
		||||
  	rm -f /etc/sudoers.tmp
 | 
			
		||||
  fi
 | 
			
		||||
  #if egrep -q "^$apacheuser ALL=\(ALL\) NOPASSWD:ALL" /etc/sudoers; then
 | 
			
		||||
  	#echo "Undoing sudo configuration for $apacheuser..."
 | 
			
		||||
  	#cp -f /etc/sudoers /etc/sudoers.tmp
 | 
			
		||||
  	#egrep -v "^$apacheuser ALL=\(ALL\) NOPASSWD:ALL" /etc/sudoers.tmp > /etc/sudoers
 | 
			
		||||
  	#rm -f /etc/sudoers.tmp
 | 
			
		||||
  #fi
 | 
			
		||||
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user