With the S8 generation of Fujtitus RX300/200 servers, which use the iRMC S4 ,Fujitsu implementent the ability to poll SNMP-data from the BMC (iRMC). To enable the ability to poll data the BMC has to be flashed with an up to date Firmware version and SNMP-polling has to be enableed in the iRMC-web-GUI. I’ve tested it with 7.69F from Dec. 2014 .
The first shippings of the rx300/200 servers came with an older firmeware version which did not implment the needed Fujitsuu MIBs to query HW-status (see http://manuals.ts.fujitsu.com/file/11470/irmc-s4-ug-en.pdf Page: 18 for details about the supported MIBs).
The problem is, that there is no possibility to query the status of the Raid controller and its disks via SNMP (or I haven’t found it till now) but it’s displayed on the iRMC web-GUI. So I wrote a script which extracts the useful informations (controller status, disk status + details and logical drive status) from the web-interface.
Atm. it’s just an alpha release but I’ll modify the script to be used by Zabbix for an auto discovery and push all the data into Zabbix:
Source:
[pastacode lang=”php” message=”web-iRMCS RAID-query” highlight=”” provider=”manual”]
#!/usr/bin/php
<?php
/****************************************
################################################################
# DESCRIPTION: Script to query RAID-Informations from the Fujitsu iRMC S4 webinterface.
# COPYRIGHT ©: 2015 by fawcs, GPL freeware
# AUTHOR: fawcs, weixeflo@fawcs.info
# LICENSE: GPL freeware
# CREATION DATE: 2015-Mar-19
################################################################
*****************************************/
$username="admin";
$password="admin";
$host="127.0.0.1";
$siteIDs=array('controller'=>87,'disks'=>88,'logicalVolumes'=>89);
//get Raid-Controller-Data
//$returnController=getWebsiteContent($host."/".$siteIDs['controller'],$username,$password,true);
$returnDisks=getWebsiteContent($host."/".$siteIDs['disks'],$username,$password,true);
//$returnVolumes=getWebsiteContent($host."/".$siteIDs['logicalVolumes'],$username,$password,true);
//$id['controller']=parseWebSiteToIDs($returnController);
$id['disks']=parseWebSiteToIDs($returnDisks);
//$id['logicalVolumes']=parseWebSiteToIDs($returnVolumes);
//print_r($id);
$ctrl=$id['disks'][0]['id'][1];
foreach($id['disks'][0]['data'] AS $disk)
{
//print_r($disk);
$diskWebContent=getWebsiteContent($host."/pdrive?ctrl=".$ctrl."&pd=".$disk['detailID'][1],$username,$password,true);
//print_r($diskWebContent);
$diskTableArray=parseWebSiteToIDs($diskWebContent);
print_r($diskTableArray);
}
/**/
/**
retrieves an html-site
@return: String -> whole HTML site
**/
function getWebsiteContent($url,$username,$password,$measuretime=false)
{
if($measuretime===true)
{
$timer=microtime(true);
}
$process = curl_init($url);
curl_setopt($process, CURLOPT_USERPWD, $username . ":" . $password);
curl_setopt($process, CURLOPT_HTTPHEADER, array('Content-Type: application/xml'));
curl_setopt($process, CURLOPT_HEADER, 1);
curl_setopt($process, CURLOPT_USERPWD, $username . ":" . $password);
curl_setopt($process, CURLOPT_TIMEOUT, 30);
curl_setopt($process, CURLOPT_POST, 1);
//curl_setopt($process, CURLOPT_POSTFIELDS, $payloadName);
curl_setopt($process, CURLOPT_RETURNTRANSFER, TRUE);
$return = curl_exec($process);
curl_close($process);
if($measuretime===true)
{
echo "Content for ".$url." retrieved in ".round(microtime(true)-$timer,3)."s".chr(10);
}
return $return;
}
/**
retrieves the table-content of an IRMC Site / parses the listed sites for interesting data
possible sites are:
http://$host/87 -> Controller Infos
http://$host/88 -> Physical Disks
http://$host/89 -> Logical Drives
@return -> array which contains the ID of the controller, disks, LVs
the table headings
the table data
**/
function parseWebSiteToIDs($return)
{
$ret=array();
$cutFrom=strpos($return,"<!-- Menu end-->");
$cutTo=strpos($return,'<div id="bottom">');
$return=str_replace('</td>','</td>'.chr(10),substr($return,$cutFrom,$cutTo-$cutFrom));
$return=str_replace('</th>','</th>'.chr(10),$return);
$Loop=$return;
//echo $table;
$count=0;
//go through all tatles which are found in the passed web-content-string & extract the tables
while(strpos($Loop,'<table')!==false)
{
//$table[]=substr($return, strpos($return,"<table"),strpos($return,"</table>")-strpos($return,"<table>"));
$Loop=substr($Loop, strpos($Loop,'<table'),strlen($Loop)-strpos($Loop,'<table'));
//get the table id
$id=substr($Loop,strpos($Loop,"summary=\"")+9,strpos($Loop,"\">")-(strpos($Loop,"summary=\"")+9));
$ret[$count]['id']=explode("_",$id);
$Loop=substr($Loop, strpos($Loop,'<tr'),strlen($Loop)-strpos($Loop,'<tr'));
//save just the html-table to the var & add ***###*** as a delimitter after every tablerow
$currentTable=str_replace("</tr>","</tr>***###***",substr($Loop,0,strpos($Loop,"</table>")));
$currentTable=substr($currentTable,0,strlen($currentTable)-9);
//explode all table rows by the added delimiter
$rows=explode("***###***",$currentTable);
$count2=0;
//iterate through the table rows and extract useful information
foreach($rows AS $row)
{
unset($detailID);
//check if submit button for details is listed in the table - if yes - get the submit-value for correct id -> is appended to the URL when querying the details page
if(strpos($row,'<input class="submit" type="submit" value="Details"')!==false)
{
$detailID=trim(substr($row,strpos($row,'<input class="submit" type="submit" value="Details"')+strlen('<input class="submit" type="submit" value="Details"'),strpos(strtolower($row),'onclick=')-(strpos($row,'<input class="submit" type="submit" value="Details"')+strlen('<input class="submit" type="submit" value="Details"'))));
//eg: extracted name="pd_10" from row
$detailID=str_replace("\"","",$detailID);
$detailID=explode("=",$detailID);
$detailID=$detailID[1];
}
$row=trim(strip_tags($row));
//if $count==0 -> first table row which stores only the headings/descriptions -> are saved in a seperate node in the array
if($count2==0)
{
$ret[$count]["description"]=explode(chr(10),$row);
} else {
//all the other rows contain data -> also store the in the array
$rowArray=explode(chr(10),$row);
$ret[$count]["data"][]=$rowArray;
if(isset($detailID))
{
$ret[$count]["data"][$rowArray[0]]["detailID"]=explode("_",$detailID);
}
}
$count2++;
}
$count++;
}
return $ret;
}
?>
[/pastacode]