mirror of
				https://github.com/xcat2/xcat-core.git
				synced 2025-10-24 16:05:41 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			242 lines
		
	
	
		
			7.1 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			242 lines
		
	
	
		
			7.1 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| /* Required libraries */
 | |
| $TOPDIR = '..';
 | |
| require_once "$TOPDIR/lib/functions.php";
 | |
| require_once "$TOPDIR/lib/jsonwrapper.php";
 | |
| 
 | |
| /**
 | |
|  * Issue a xCAT command, e.g. rinv gpok123 all
 | |
|  * This will handle most commands.  If not, you can create your own .php.
 | |
|  * Look at zCmd.php for an example.
 | |
|  *
 | |
|  * @param    $cmd   The xCAT command
 | |
|  * @param    $tgt   The target node or group
 | |
|  * @param    $args  The xCAT command arguments, separated by semicolons
 | |
|  * @param    $opts    The xCAT command options, separated by semicolons
 | |
|  * @return   The xCAT response.  Replies are in the form of JSON
 | |
|  */
 | |
| if (isset($_GET["cmd"])) {
 | |
|     // HTTP GET requests
 | |
|     $cmd = $_GET["cmd"];
 | |
|     $tgt = $_GET["tgt"];
 | |
|     $args = $_GET["args"];
 | |
| 
 | |
|     // File contents in case of file write
 | |
|     if (isset($_GET["cont"])) {
 | |
|         $cont = $_GET["cont"];
 | |
|     }
 | |
| 
 | |
|     // Special messages put here
 | |
|     // This gets sent back to the AJAX request as is.
 | |
|     $msg = $_GET["msg"];
 | |
| 
 | |
|     // If no $tgt is given, set $tgt to NULL
 | |
|     if (!$tgt) {
 | |
|         $tgt = NULL;
 | |
|     }
 | |
| 
 | |
|     // If no $msg is given, set $msg to NULL
 | |
|     if (!$msg) {
 | |
|         $msg = NULL;
 | |
|     }
 | |
| 
 | |
|     // If no $args are given, set $args_array to NULL
 | |
|     // Separators used are: || or ;
 | |
|     $args_array = array();
 | |
|     if ($args) {
 | |
|         // If $args contains multiple arguments, split it into an array
 | |
|         if (strpos($args, "||")) {
 | |
|             // Split the arguments into an array
 | |
|             $args_array = array();
 | |
|             $args_array = explode("||", $args);
 | |
|         } else if (strpos($args, ";")) {
 | |
|             // Split the arguments into an array
 | |
|             $args_array = array();
 | |
|             $args_array = explode(";", $args);
 | |
|         } else {
 | |
|             $args_array = array($args);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     // If no $opts are given, set $opts_array to NULL
 | |
|     $opts_array = array();
 | |
|     if (isset($_GET["opts"])) {
 | |
|         $opts = $_GET["opts"];
 | |
| 
 | |
|         // If $args contains multiple arguments, split it into an array
 | |
|         if (strpos($opts, "|")) {
 | |
|             // Split the arguments into an array
 | |
|             $opts_array = array();
 | |
|             $opts_array = explode("|", $opts);
 | |
|         } if (strpos($opts, ";")) {
 | |
|             // Split the arguments into an array
 | |
|             $opts_array = array();
 | |
|             $opts_array = explode(";", $opts);
 | |
|         } else {
 | |
|             $opts_array = array($opts);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     // Time needed to update /etc/hosts
 | |
|     if (strncasecmp($cmd, "makehosts", 9) == 0) {
 | |
|         sleep(5);
 | |
|     }
 | |
| 
 | |
|     // Submit request and get response
 | |
|     $xml = docmd($cmd, $tgt, $args_array, $opts_array);
 | |
|     // If the output is flushed, do not return output in JSON
 | |
|     if (in_array("flush", $opts_array)) {
 | |
|         return;
 | |
|     }
 | |
| 
 | |
|     $rsp = array();
 | |
| 
 | |
|     // webrun pping and gangliastatus output needs special handling
 | |
|     if (strncasecmp($cmd, "webrun", 6) == 0 && (stristr($args, "pping") || stristr($args, "gangliastatus") || stristr($args, "chtab"))) {
 | |
|         $rsp = extractWebrun($xml);
 | |
|     }
 | |
|     // nodels output needs special handling
 | |
|     else if (strncasecmp($cmd, "nodels", 6) == 0) {
 | |
|         // Handle the output the same way as webrun
 | |
|         $rsp = extractNodels($xml);
 | |
|     }
 | |
|     // extnoderange output needs special handling
 | |
|     // This command gets the nodes and groups
 | |
|     else if (strncasecmp($cmd, "extnoderange", 12) == 0) {
 | |
|         $rsp = extractExtnoderange($xml);
 | |
|     }
 | |
|     // Write contents to file
 | |
|     else if (strncasecmp($cmd, "write", 4) == 0) {
 | |
|         // Directory should be /var/opt/xcat/profiles
 | |
|         // You can write anything to that directory
 | |
|         $file = "$tgt";
 | |
|         $handle = fopen($file, 'w') or die("Cannot open $file");
 | |
|         fwrite($handle, $cont);
 | |
|         fclose($handle);
 | |
| 
 | |
|         $rsp = "Directory entry written to $file";
 | |
|     }
 | |
|     // Handle the typical output
 | |
|     else {
 | |
|         foreach ($xml->children() as $child) {
 | |
|             foreach ($child->children() as $data) {
 | |
|                 if($data->name) {
 | |
|                     $node = $data->name;
 | |
| 
 | |
|                     if ($data->data->contents) {
 | |
|                         $cont = $data->data->contents;
 | |
|                     } else {
 | |
|                         $cont = $data->data;
 | |
|                     }
 | |
| 
 | |
|                     if ($data->data->desc) {
 | |
|                         $cont = $data->data->desc . ": " . $cont;
 | |
|                     }
 | |
| 
 | |
|                     $cont = str_replace(":|:", "\n", $cont);
 | |
|                     array_push($rsp, "$node: $cont");
 | |
|                 } else if (strlen("$data") > 2) {
 | |
|                     $data = str_replace(":|:", "\n", $data);
 | |
|                     array_push($rsp, "$data");
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
|     }
 | |
|     // Remove any HTML that could be used for XSS attacks
 | |
|     foreach ($rsp as $key => &$value) {
 | |
|         $whatami = gettype($value);
 | |
|         if ("string" != $whatami) {
 | |
|             //echo "found a non string in rsp array \n";
 | |
|             foreach ($value as $key2 => $value2){
 | |
|                 //echo "Key2:$key2  Value2 type:",gettype($value2)," value2 data: $value2 \n";
 | |
|                 $value[$key2] = htmlentities($value2, ENT_QUOTES | ENT_HTML5, 'UTF-8');
 | |
|             }
 | |
|         } else {
 | |
|             //echo "Key:$key  Value type:",gettype($value)," value data: $value \n";
 | |
|             $rsp[$key] = htmlentities($value, ENT_QUOTES | ENT_HTML5, 'UTF-8');
 | |
|             //echo "New value: $rsp[$key] \n";
 | |
|         }
 | |
|     }
 | |
|     $msg = htmlentities($msg, ENT_QUOTES | ENT_HTML5, 'UTF-8');
 | |
| 
 | |
|     // Reply in the form of JSON
 | |
|     $rtn = array("rsp" => $rsp, "msg" => $msg);
 | |
|     echo json_encode($rtn);
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Extract the output for a webrun command
 | |
|  *
 | |
|  * @param    $xml    The XML output from docmd()
 | |
|  * @return An array containing the output
 | |
|  */
 | |
| function extractWebrun($xml) {
 | |
|     $rsp = array();
 | |
|     $i = 0;
 | |
| 
 | |
|     // Extract data returned
 | |
|     foreach($xml->children() as $nodes){
 | |
|         foreach($nodes->children() as $node){
 | |
|             // Get the node name
 | |
|             $name = $node->name;
 | |
| 
 | |
|             // Get the content
 | |
|             $status = $node->data;
 | |
|             $status = str_replace(":|:", "\n", $status);
 | |
| 
 | |
|             // Add to return array
 | |
|             $rsp[$i] = array("$name", "$status");
 | |
|             $i++;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     return $rsp;
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Extract the output for a nodels command
 | |
|  *
 | |
|  * @param    $xml    The XML output from docmd()
 | |
|  * @return An array containing the output
 | |
|  */
 | |
| function extractNodels($xml) {
 | |
|     $rsp = array();
 | |
|     $i = 0;
 | |
| 
 | |
|     // Extract data returned
 | |
|     foreach($xml->children() as $nodes){
 | |
|         foreach($nodes->children() as $node){
 | |
|             // Get the node name
 | |
|             $name = $node->name;
 | |
|             // Get the content
 | |
|             $status = $node->data->contents;
 | |
|             $status = str_replace(":|:", "\n", $status);
 | |
| 
 | |
|             $description = $node->data->desc;
 | |
|             // Add to return array
 | |
|             $rsp[$i] = array("$name", "$status", "$description");
 | |
|             $i++;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     return $rsp;
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Extract the output for a extnoderange command
 | |
|  *
 | |
|  * @param    $xml    The XML output from docmd()
 | |
|  * @return The nodes and groups
 | |
|  */
 | |
| function extractExtnoderange($xml) {
 | |
|     $rsp = array();
 | |
| 
 | |
|     // Extract data returned
 | |
|     foreach ($xml->xcatresponse->intersectinggroups as $group) {
 | |
|         array_push($rsp, "$group");
 | |
|     }
 | |
| 
 | |
|     return $rsp;
 | |
| }
 | |
| ?>
 |