' . '' . ''; } else if ($percent < 90) { return '' . '' . ''; } else { return '' . '' . ''; } } // Execute a system function. Do path checking // return a trim()'d result. function execute_program ($program, $args) { $path = array( '/bin/', '/sbin/', '/usr/bin', '/usr/sbin', '/usr/local/bin', '/usr/local/sbin'); $buffer = ''; while ($this_path = current($path)) { if (is_executable("$this_path/$program")) { if ($fp = popen("$this_path/$program $args", 'r')) { while (!feof($fp)) { $buffer .= fgets($fp, 4096); } return trim($buffer); } } next($path); } } // function that emulate the compat_array_keys function of PHP4 // for PHP3 compatability function compat_array_keys ($arr) { $result = array(); while (list($key, $val) = each($arr)) { $result[] = $key; } return $result; } // function that emulates the compat_in_array function of PHP4 // for PHP3 compatability function compat_in_array ($value, $arr) { while (list($key,$val) = each($arr)) { if ($value == $val) { return true; } } return false; } // A helper function, when passed a number representing KB, // and optionally the number of decimal places required, // it returns a formated number string, with unit identifier. function format_bytesize ($kbytes, $dec_places = 2) { global $text; if ($kbytes > 1048576) { $result = sprintf('%.' . $dec_places . 'f', $kbytes / 1048576); $result .= ' '.$text['gb']; } elseif ($kbytes > 1024) { $result = sprintf('%.' . $dec_places . 'f', $kbytes / 1024); $result .= ' '.$text['mb']; } else { $result = sprintf('%.' . $dec_places . 'f', $kbytes); $result .= ' '.$text['kb']; } return $result; } // Returns the virtual hostname accessed. function sys_vhostname () { if (!($result = getenv('SERVER_NAME'))) { $result = 'N.A.'; } return $result; } // Returns the Cannonical machine hostname. function sys_chostname () { if ($fp = fopen('/proc/sys/kernel/hostname','r')) { $result = trim(fgets($fp, 4096)); fclose($fp); $result = gethostbyaddr(gethostbyname($result)); } else { $result = 'N.A.'; } return $result; } // Returns the IP address that the request was made on. function sys_ip_addr () { if (!($result = getenv('SERVER_ADDR'))) { $result = gethostbyname(sys_chostname()); } return $result; } // Returns an array of all meaningful devices // on the PCI bus. function sys_pcibus () { $results = array(); if ($fd = fopen('/proc/pci', 'r')) { while ($buf = fgets($fd, 4096)) { if (preg_match('/Bus/', $buf)) { $device = 1; continue; } if ($device) { list($key, $value) = split(': ', $buf, 2); if (!preg_match('/bridge/i', $key) && !preg_match('/USB/i', $key)) { $results[] = preg_replace('/\([^\)]+\)\.$/', '', trim($value)); } $device = 0; } } } return $results; } // Returns an array of all ide devices attached // to the system, as determined by the aliased // shortcuts in /proc/ide function sys_idebus () { $results = array(); $handle = opendir('/proc/ide'); while ($file = readdir($handle)) { if (preg_match('/^hd/', $file)) { $results[$file] = array(); // Check if device is CD-ROM (CD-ROM capacity shows as 1024 GB) if ($fd = fopen("/proc/ide/$file/media", 'r')) { $results[$file]['media'] = trim(fgets($fd, 4096)); if ($results[$file]['media'] == 'disk') { $results[$file]['media'] = 'Hard Disk'; } if ($results[$file]['media'] == 'cdrom') { $results[$file]['media'] = 'CD-ROM'; } fclose($fd); } if ($fd = fopen("/proc/ide/$file/model", 'r')) { $results[$file]['model'] = trim(fgets($fd, 4096)); if (preg_match('/WDC/', $results[$file]['model'])){ $results[$file]['manufacture'] = 'Western Digital'; } elseif (preg_match('/IBM/', $results[$file]['model'])){ $results[$file]['manufacture'] = 'IBM'; } elseif (preg_match('/FUJITSU/', $results[$file]['model'])){ $results[$file]['manufacture'] = 'Fujitsu'; } else { $results[$file]['manufacture'] = 'Unknown'; } fclose($fd); } if ($fd = fopen("/proc/ide/$file/capacity", 'r')) { $results[$file]['capacity'] = trim(fgets($fd, 4096)); if ($results[$file]['media'] == 'CD-ROM') { unset($results[$file]['capacity']); } fclose($fd); } } } closedir($handle); return $results; } // Returns an array of all meaningful devices // on the SCSI bus. function sys_scsibus () { $results = array(); $dev_vendor = ''; $dev_model = ''; $dev_rev = ''; $dev_type = ''; if ($fd = fopen('/proc/scsi/scsi', 'r')) { while ($buf = fgets($fd, 4096)) { if (preg_match('/Vendor/', $buf)) { preg_match('/Vendor: (.*) Model: (.*) Rev: (.*)/i', $buf, $dev); list($key, $value) = split(': ', $buf, 2); $dev_str = $value; $get_type = 1; continue; } if ($get_type) { preg_match('/Type:\s+(\S+)/i', $buf, $dev_type); $results[] = "$dev[1] $dev[2] ( $dev_type[1] )"; $get_type = 0; } } } return $results; } // Returns an associative array of two associative // arrays, containg the memory statistics for RAM and swap function sys_meminfo () { if ($fd = fopen('/proc/meminfo', 'r')) { while ($buf = fgets($fd, 4096)) { if (preg_match('/Mem:\s+(.*)$/', $buf, $ar_buf)) { $ar_buf = preg_split('/\s+/', $ar_buf[1], 6); $results['ram'] = array(); $results['ram']['total'] = $ar_buf[0] / 1024; $results['ram']['used'] = $ar_buf[1] / 1024; $results['ram']['free'] = $ar_buf[2] / 1024; $results['ram']['shared'] = $ar_buf[3] / 1024; $results['ram']['buffers'] = $ar_buf[4] / 1024; $results['ram']['cached'] = $ar_buf[5] / 1024; $results['ram']['t_used'] = $results['ram']['used'] - $results['ram']['cached'] - $results['ram']['buffers']; $results['ram']['t_free'] = $results['ram']['total'] - $results['ram']['t_used']; $results['ram']['percent'] = round(($results['ram']['t_used'] * 100) / $results['ram']['total']); } if (preg_match('/Swap:\s+(.*)$/', $buf, $ar_buf)) { $ar_buf = preg_split('/\s+/', $ar_buf[1], 3); $results['swap'] = array(); $results['swap']['total'] = $ar_buf[0] / 1024; $results['swap']['used'] = $ar_buf[1] / 1024; $results['swap']['free'] = $ar_buf[2] / 1024; $results['swap']['percent'] = round(($ar_buf[1] * 100) / $ar_buf[0]); // Get info on individual swap files $swaps = file ('/proc/swaps'); $swapdevs = split("\n", $swaps); for ($i = 1; $i < (sizeof($swapdevs) - 1); $i++) { $ar_buf = preg_split('/\s+/', $swapdevs[$i], 6); $results['devswap'][$i - 1] = array(); $results['devswap'][$i - 1]['dev'] = $ar_buf[0]; $results['devswap'][$i - 1]['total'] = $ar_buf[2]; $results['devswap'][$i - 1]['used'] = $ar_buf[3]; $results['devswap'][$i - 1]['free'] = ($results['devswap'][$i - 1]['total'] - $results['devswap'][$i - 1]['used']); $results['devswap'][$i - 1]['percent'] = round(($ar_buf[3] * 100) / $ar_buf[2]); } break; } } fclose($fd); } else { $results['ram'] = array(); $results['swap'] = array(); $results['devswap'] = array(); } return $results; } // Returns an array of all network devices // and their tx/rx stats. function sys_netdevs () { $results = array(); if ($fd = fopen('/proc/net/dev', 'r')) { while ($buf = fgets($fd, 4096)) { if (preg_match('/:/', $buf)) { list($dev_name, $stats_list) = preg_split('/:/', $buf, 2); $stats = preg_split('/\s+/', trim($stats_list)); $results[$dev_name] = array(); $results[$dev_name]['rx_bytes'] = $stats[0]; $results[$dev_name]['rx_packets'] = $stats[1]; $results[$dev_name]['rx_errs'] = $stats[2]; $results[$dev_name]['rx_drop'] = $stats[3]; $results[$dev_name]['tx_bytes'] = $stats[8]; $results[$dev_name]['tx_packets'] = $stats[9]; $results[$dev_name]['tx_errs'] = $stats[10]; $results[$dev_name]['tx_drop'] = $stats[11]; $results[$dev_name]['errs'] = $stats[2] + $stats[10]; $results[$dev_name]['drop'] = $stats[3] + $stats[11]; } } } return $results; } // Returns a string equivilant to `uname --release`) function sys_kernel () { if ($fd = fopen('/proc/version', 'r')) { $buf = fgets($fd, 4096); fclose($fd); if (preg_match('/version (.*?) /', $buf, $ar_buf)) { $result = $ar_buf[1]; if (preg_match('/SMP/', $buf)) { $result .= ' (SMP)'; } } else { $result = 'N.A.'; } } else { $result = 'N.A.'; } return $result; } // Returns a 1x3 array of load avg's in // standard order and format. function sys_loadavg () { if ($fd = fopen('/proc/loadavg', 'r')) { $results = split(' ', fgets($fd, 4096)); fclose($fd); } else { $results = array('N.A.','N.A.','N.A.'); } return $results; } // Returns a formatted english string, // enumerating the uptime verbosely. function sys_uptime () { global $text; $fd = fopen('/proc/uptime', 'r'); $ar_buf = split(' ', fgets($fd, 4096)); fclose($fd); $sys_ticks = trim($ar_buf[0]); $min = $sys_ticks / 60; $hours = $min / 60; $days = floor($hours / 24); $hours = floor($hours - ($days * 24)); $min = floor($min - ($days * 60 * 24) - ($hours * 60)); if ($days != 0) { $result = "$days ".$text['days']." "; } if ($hours != 0) { $result .= "$hours ".$text['hours']." "; } $result .= "$min ".$text['minutes']; return $result; } // Returns the number of users currently logged in. function sys_users () { $who = split('=', execute_program('who', '-q')); $result = $who[1]; return $result; } // Returns an associative array containing all // relevant info about the processors in the system. function sys_cpu () { $results = array(); $ar_buf = array(); if ($fd = fopen('/proc/cpuinfo', 'r')) { while ($buf = fgets($fd, 4096)) { list($key, $value) = preg_split('/\s+:\s+/', trim($buf), 2); // All of the tags here are highly architecture dependant. // the only way I could reconstruct them for machines I don't // have is to browse the kernel source. So if your arch isn't // supported, tell me you want it written in. switch ($key) { case 'model name': $results['model'] = $value; break; case 'cpu MHz': $results['mhz'] = sprintf('%.2f', $value); break; case 'clock': // For PPC arch (damn borked POS) $results['mhz'] = sprintf('%.2f', $value); break; case 'cpu': // For PPC arch (damn borked POS) $results['model'] = $value; break; case 'revision': // For PPC arch (damn borked POS) $results['model'] .= ' ( rev: ' . $value . ')'; break; case 'cache size': $results['cache'] = $value; break; case 'bogomips': $results['bogomips'] += $value; break; case 'processor': $results['cpus'] += 1; break; } } fclose($fd); } $keys = compat_array_keys($results); $keys2be = array('model', 'mhz', 'cache', 'bogomips', 'cpus'); while ($ar_buf = each($keys2be)) { if (! compat_in_array($ar_buf[1], $keys)) $results[$ar_buf[1]] = 'N.A.'; } return $results; } // Returns an array of associative arrays // containing information on every mounted partition. function sys_fsinfo () { $df = execute_program('df', '-kP'); $mounts = split("\n", $df); $fstype = array(); if ($fd = fopen('/proc/mounts', 'r')) { while ($buf = fgets($fd, 4096)) { list($dev, $mpoint, $type) = preg_split('/\s+/', trim($buf), 4); $fstype[$mpoint] = $type; $fsdev[$dev] = $type; } fclose($fd); } for ($i = 1; $i < sizeof($mounts); $i++) { $ar_buf = preg_split('/\s+/', $mounts[$i], 6); $results[$i - 1] = array(); $results[$i - 1]['disk'] = $ar_buf[0]; $results[$i - 1]['size'] = $ar_buf[1]; $results[$i - 1]['used'] = $ar_buf[2]; $results[$i - 1]['free'] = $ar_buf[3]; $results[$i - 1]['percent'] = round(($results[$i - 1]['used'] * 100) / $results[$i - 1]['size']) . '%'; $results[$i - 1]['mount'] = $ar_buf[5]; ($fstype[$ar_buf[5]]) ? $results[$i - 1]['fstype'] = $fstype[$ar_buf[5]] : $results[$i - 1]['fstype'] = $fsdev[$ar_buf[0]]; } return $results; } /// FOR LM_SENSORS // URL: http://fudd.thegoop.com/~dragon/phpSysInfo-1.1_sensors.diff // A helper function that returns the first matching // program executable found from a list of supplied filenames // Example: if ($program = findprogram( array("/foo", "/bin/foo"))) {... } function findprogram( $candidates ) { $result = false; while (list($idx, $candidate) = each($candidates)) { if (is_executable($candidate)) { $result = $candidate; break; } } return( $result ); } // Returns F if arg2 is "F" or C if arg2 is "C". If arg2 is niether C or F, C is returned. function temp_conv( $temp, $type, $dec_places = 1 ) { if ( $type == "F" ) { $result = sprintf("%." . $dec_places . "f", ( ( $temp * 9 )/ 5 ) + 32 ); } else if ( $type == "C" ) { $result = sprintf("%." . $dec_places . "f", ( ( $temp - 32) * 5 ) / 9 ); } else { $result = sprintf("%." . $dec_places . "f", ( ( $temp - 32) * 5 ) / 9 ); } return $result; } function sys_checksensors() { exec("/bin/cat /proc/sys/dev/sensors/chips", $tmparray, $results); return $results; } function sys_cleanarray($dirty = array()) { $clean = array(); $j = 0; for ($i=0;$i eregi_replace("[-+]","",$tmparray[$i][2])) { $results['volt'.$i]['status'] = "[RED ALERT]"; } else { $results['volt'.$i]['status'] = "[Normal]"; } } // fans $results['fancount'] = sizeof($fans); for ( $i = 1; $i < sizeof($fans) + 1; $i++ ) { //$tmp = cho "$fans[$i]" |sed -e "s/).*//;s/=//g;s/min//g; s/div//g; s/(//; s/,//g; s/ RPM //g"; $tmparray[$i] = split( ":", $fans[$i - 1]); $tmparray[$i][1] = ereg_replace("/|[)].*|[=(,]|min |div|RPM|/i", "", $tmparray[$i][1]); $results['fan'.$i]['label'] = $tmparray[$i][0].":"; $tmparray[$i] = preg_split( "/[\s+-]+/", trim($tmparray[$i][1]),3); $results['fan'.$i]['current'] = $tmparray[$i][0]." RPM"; $results['fan'.$i]['min'] = $tmparray[$i][1]." RPM"; $results['fan'.$i]['div'] = $tmparray[$i][2]; if ( $tmparray[$i][0] < $tmparray[$i][1] ) { $results['fan'.$i]['status'] = "[RED ALERT]"; } else { $results['fan'.$i]['status'] = "[Normal]"; } } // temparatures $results['tempcount'] = sizeof($temps); for ( $i = 1; $i < sizeof($temps) + 1; $i++ ) { //$tmp = cho "$lines[$i]" |sed -e "s/ C).*//;s/=//g;s/limit//g; s/hysteresis//g; s/(//; s/,//g; s/ C //g"; $tmparray[$i] = split( ":", $temps[$i - 1]); $tmparray[$i][1] = ereg_replace("/|[)].*|[=(,]|limit|hysteresis | C|/i", "", $tmparray[$i][1]); $results['temp'.$i]['label'] = $tmparray[$i][0].":"; $tmparray[$i] = preg_split( "/\s+/", eregi_replace("[+]","",trim($tmparray[$i][1])),3); $results['temp'.$i]['current'] = $tmparray[$i][0]."C".'
'."(".temp_conv($tmparray[$i][0],"F")." F)"; $results['temp'.$i]['min'] = $tmparray[$i][2]."C".'
'."(".temp_conv($tmparray[$i][2],"F")." F)"; $results['temp'.$i]['max'] = $tmparray[$i][1]."C".'
'."(".temp_conv($tmparray[$i][1],"F")." F)"; if ( $tmparray[$i][0] > $tmparray[$i][1] ) { $results['temp'.$i]['status'] = "[RED ALERT]"; } else if ( $tmparray[$i][0] >= $tmparray[$i][2] ) { $results['temp'.$i]['status'] = "[YELLOW ALERT]"; } else { $results['temp'.$i]['status'] = "[Normal]"; } } return $results; } ?>