????JFIF??x?x????'
Server IP : 79.136.114.73 / Your IP : 18.117.121.244 Web Server : Apache/2.4.7 (Ubuntu) PHP/5.5.9-1ubuntu4.29 OpenSSL/1.0.1f System : Linux b8009 3.13.0-170-generic #220-Ubuntu SMP Thu May 9 12:40:49 UTC 2019 x86_64 User : www-data ( 33) PHP Version : 5.5.9-1ubuntu4.29 Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority, MySQL : ON | cURL : ON | WGET : ON | Perl : ON | Python : ON | Sudo : ON | Pkexec : ON Directory : /usr/share/phpsysinfo/plugins/SMART/ |
Upload File : |
<?php /** * SMART Plugin * * PHP version 5 * * @category PHP * @package PSI_Plugin_SMART * @author Antoine Bertin <diaoulael@users.sourceforge.net> * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version SVN: $Id: class.SMART.inc.php 552 2012-03-25 08:27:55Z namiltd $ * @link http://phpsysinfo.sourceforge.net */ /** * SMART plugin, which displays all SMART informations available * * @category PHP * @package PSI_Plugin_SMART * @author Antoine Bertin <diaoulael@users.sourceforge.net> * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version Release: 3.0 * @link http://phpsysinfo.sourceforge.net */ class SMART extends PSI_Plugin { /** * variable, which holds the content of the command * @var array */ private $_filecontent = array(); /** * variable, which holds the result before the xml is generated out of this array * @var array */ private $_result = array(); /** * variable, which holds PSI_PLUGIN_SMART_IDS well formated datas * @var array */ private $_ids = array(); /** * read the data into an internal array and also call the parent constructor * * @param String $enc target encoding */ public function __construct($enc) { parent::__construct(__CLASS__, $enc); switch (PSI_PLUGIN_SMART_ACCESS) { case 'command': $disks = preg_split('/([\s]+)?,([\s]+)?/', PSI_PLUGIN_SMART_DEVICES, -1, PREG_SPLIT_NO_EMPTY); foreach ($disks as $disk) { $buffer = ""; if (CommonFunctions::executeProgram('smartctl', '--all'.((PSI_PLUGIN_SMART_DEVICE) ? ' --device '.PSI_PLUGIN_SMART_DEVICE : '').' '.$disk, $buffer, PSI_DEBUG)) { $this->_filecontent[$disk] = $buffer; } } $fullIds = preg_split('/([\s]+)?,([\s]+)?/', PSI_PLUGIN_SMART_IDS, -1, PREG_SPLIT_NO_EMPTY); foreach ($fullIds as $fullId) { $arrFullId = preg_split('/-/', $fullId); $this->_ids[intval($arrFullId[0])] = strtolower($arrFullId[1]); } break; case 'data': $disks = preg_split('/([\s]+)?,([\s]+)?/', PSI_PLUGIN_SMART_DEVICES, -1, PREG_SPLIT_NO_EMPTY); $dn=0; foreach ($disks as $disk) { $buffer=""; if ((CommonFunctions::rfts(APP_ROOT."/data/SMART{$dn}.txt", $buffer))&&(!empty($buffer))){ $this->_filecontent[$disk] = $buffer; } $dn++; } $fullIds = preg_split('/([\s]+)?,([\s]+)?/', PSI_PLUGIN_SMART_IDS, -1, PREG_SPLIT_NO_EMPTY); foreach ($fullIds as $fullId) { $arrFullId = preg_split('/-/', $fullId); $this->_ids[intval($arrFullId[0])] = strtolower($arrFullId[1]); } break; default: $this->global_error->addError("switch(PSI_PLUGIN_SMART_ACCESS)", "Bad SMART configuration in SMART.config.php"); break; } } /** * doing all tasks to get the required informations that the plugin needs * result is stored in an internal array * * @return void */ public function execute() { if ( empty($this->_filecontent) || empty($this->_ids)) { return; } foreach ($this->_filecontent as $disk=>$result) { // set the start and end offset in the result string at the beginning and end respectively // just in case we don't find the two strings, so that it still works as expected. $startIndex = 0; $endIndex = 0; $vendorInfos = ""; // locate the beginning string offset for the attributes if ( preg_match('/(Vendor Specific SMART Attributes with Thresholds)/', $result, $matches, PREG_OFFSET_CAPTURE) ) $startIndex = $matches[0][1]; // locate the end string offset for the attributes, this is usually right before string "SMART Error Log Version" (hopefully every output has it!) if ( preg_match('/(SMART Error Log Version)/', $result, $matches, PREG_OFFSET_CAPTURE) ) $endIndex = $matches[0][1]; if (($startIndex)&&($endIndex)&&($endIndex>$startIndex)) $vendorInfos = preg_split("/\n/", substr ( $result, $startIndex, $endIndex - $startIndex )); if (!empty($vendorInfos)) { $labels = preg_split('/[\s]+/', $vendorInfos[1]); foreach ($labels as $k=>$v) { $labels[$k] = str_replace('#', '', strtolower($v)); } $i = 0; // Line number foreach ($vendorInfos as $line) { $line = preg_replace('/^[\s]+/', '', $line); $values = preg_split('/[\s]+/', $line); if (count($values) > count($labels)) { $values = array_slice($values, 0, count($labels), true); } $j = 0; $found = false; foreach ($values as $value) { if (((in_array($value, array_keys($this->_ids)) && $labels[$j] == 'id') || ($found && (in_array($labels[$j], array_values($this->_ids)))) || ($found && $labels[$j] == 'attribute_name'))) { $this->_result[$disk][$i][$labels[$j]] = $value; $found = true; } $j++; } $i++; } } else { //SCSI devices if ((!empty($this->_ids[1]))&&($this->_ids[1]=="raw_value")) { preg_match('/read\: (.*)\n/', $result, $lines); if ((!empty($lines))&&(!empty($lines[0]))) { $values=preg_split('/[\s,]+/',$lines[0]); if ((!empty($values))&&($values[7]!=null)){ $this->_result[$disk][0]['id'] = 1; $this->_result[$disk][0]['attribute_name'] = "Raw_Read_Error_Rate"; $this->_result[$disk][0]['raw_value'] = $values[7]; } } } if ((!empty($this->_ids[5]))&&($this->_ids[5]=="raw_value")) { preg_match('/Elements in grown defect list\: (.*)\n/', $result, $lines); if ((!empty($lines))&&(!empty($lines[0]))) { $values=preg_split('/[\s,]+/',$lines[0]); if ((!empty($values))&&($values[5]!=null)){ $this->_result[$disk][1]['id'] = 5; $this->_result[$disk][1]['attribute_name'] = "Reallocated_Sector_Ct"; $this->_result[$disk][1]['raw_value'] = $values[5]; } } } if ((!empty($this->_ids[9]))&&($this->_ids[9]=="raw_value")) { preg_match('/ number of hours powered up = (.*)\n/', $result, $lines); if ((!empty($lines))&&(!empty($lines[0]))) { $values=preg_split('/[\s,.]+/',$lines[0]); if ((!empty($values))&&($values[7]!=null)){ $this->_result[$disk][2]['id'] = 9; $this->_result[$disk][2]['attribute_name'] = "Power_On_Hours"; $this->_result[$disk][2]['raw_value'] = $values[7]; } } } if ((!empty($this->_ids[194]))&&($this->_ids[194]=="raw_value")) { preg_match('/Current Drive Temperature\: (.*)\n/', $result, $lines); if ((!empty($lines))&&(!empty($lines[0]))) { $values=preg_split('/[\s,]+/',$lines[0]); if ((!empty($values))&&($values[3]!=null)){ $this->_result[$disk][3]['id'] = 194; $this->_result[$disk][3]['attribute_name'] = "Temperature_Celsius"; $this->_result[$disk][3]['raw_value'] = $values[3]; } } } } } //Usage test $newIds = array(); foreach ($this->_ids as $id=>$column_name) { $found = 0; foreach ($this->_result as $diskName=>$diskInfos) { if ($found!=2) foreach ($diskInfos as $lineInfos) { if ($found!=2) { $found = 0; foreach ($lineInfos as $label=>$value) { if (($found==0)&&($label=="id")&&($value==$id)) $found = 1; if (($found==1)&&($label==$column_name)) $found = 2; } } } } if ($found==2) $newIds[$id] = $this->_ids[$id]; } $this->_ids = $newIds; } /** * generates the XML content for the plugin * * @return SimpleXMLObject entire XML content for the plugin */ public function xml() { if ( empty($this->_result) || empty($this->_ids)) { return $this->xml->getSimpleXmlElement(); } $columnsChild = $this->xml->addChild('columns'); // Fill the xml with preferences foreach ($this->_ids as $id=>$column_name) { $columnChild = $columnsChild->addChild('column'); $columnChild->addAttribute('id', $id); $columnChild->addAttribute('name', $column_name); } $disksChild = $this->xml->addChild('disks'); // Now fill the xml with S.M.A.R.T datas foreach ($this->_result as $diskName=>$diskInfos) { $diskChild = $disksChild->addChild('disk'); $diskChild->addAttribute('name', $diskName); foreach ($diskInfos as $lineInfos) { $lineChild = $diskChild->addChild('attribute'); foreach ($lineInfos as $label=>$value) { $lineChild->addAttribute($label, $value); } } } return $this->xml->getSimpleXmlElement(); } } ?>