clipbucket/upload/includes/classes/sysinfo.class.php

272 lines
11 KiB
PHP
Raw Normal View History

2013-10-07 12:17:06 +00:00
<?php
/*******************************************************************************
* [ system information ] *
* *
* pedram@redhive.com *
* *
* set of functions that gather and parse system information/statistics. *
*******************************************************************************/
/*******************************************************************************
* function list *
*******************************************************************************
sys_current_users ()
return the number of users currently logged in
sys_net_devices ()
returns a 2-dimensional array containing device statistics obtained from
/proc/net/dev. array structure:
$array[x]["rx_bytes"] - amount of traffic device has received
$array[x]["rx_packets"] - number of packets device has received
$array[x]["tx_bytes"] - amount of traffic device has sent
$array[x]["tx_packets"] - number of packets device has sent
$array[x]["rx_per_total"] - % of total traffic device has received
$array[x]["tx_per_total"] - % of total traffic device has sent
$array[0]["total_bytes"] - total amount of traffic seen by all devices
'x' is the device number, 0 indexed starting from lo. So for example:
0 = lo, 1 = eth0, 2 = eth1 ... n = eth(n+1)
sys_memory ()
return an array containing memory statistics obtained from /proc/meminfo.
array indexes: (_p represents percent)
mem_total mem_used mem_free
mem_used_p mem_free_p
swap_total swap_used swap_used
swap_used_p swap_free_p
sys_uptime ()
returns system uptime (xx days, xx hours, xxmins)
sys_login_stats ()
returns a 2-dimensional array containing login statistics obtained from
system wtmp. array structure:
$array[x]["user"] - username
$array[x]["count"] - number of logins since wtmp started
$array[x]["days"] - total number of days logged on
$array[x]["hours"] - total number of hours logged on
$array[x]["mins"] - total number of minutes logged on
$array[x]["start"] - start date of wtmp (Month Year)
******************************************************************************/
/*******************************************************************************
* configuration *
*******************************************************************************/
global $num_devices; // number of devices on your system including loopback (lo)
$num_devices = 3;
/*******************************************************************************
* main functions *
*******************************************************************************/
///////////////////////////////////////////////////////////////////////////////
// sys_current_users
//
function sys_current_users () {
$command = `who | wc -l`;
return trim($command);
}
///////////////////////////////////////////////////////////////////////////////
// sys_net_devices
//
function sys_net_devices () {
global $num_devices;
$proc_net_dev = file("/proc/net/dev");
$device[$num_devices][17] = array();
// gather net device information
for ($i = 0, $index = 0; $proc_net_dev[$i] != NULL; $i++) {
if (ereg(":", $proc_net_dev[$i])) {
$clean = ereg_replace (' +', ' ', $proc_net_dev[$i]); // compact whitespace
$device[$index] = explode (" ", $clean);
$index++;
}
}
// remove device names
for ($i = 0; $i < $num_devices; $i++)
$device[$i][1] = substr($device[$i][1], strpos($device[$i][1], ':') + 1);
//
// setup the data structure
//
$rb = 1; // received bytes index
$rp = 2; // received packets index
$sb = 9; // sent bytes index
$sp = 10; // sent packets index
// store byte/packet count
for ($i = 0; $i < $num_devices; $i++) {
$net_devices[$i]["rx_bytes"] = convert_bytes($device[$i][$rb]);
$net_devices[$i]["rx_packets"] = $device[$i][$rp];
$net_devices[$i]["tx_bytes"] = convert_bytes($device[$i][$sb]);
$net_devices[$i]["tx_packets"] = $device[$i][$sp];
$total_bytes += $device[$i][$rb] + $device[$i][$sb];
}
// store interface rx/tx percentage of total
for ($i = 0; $i < $num_devices; $i++) {
if ($total_bytes == 0)
$total_bytes = 1;
$net_devices[$i]["rx_per_total"] = round($device[$i][$rb] / $total_bytes * 100, 2);
$net_devices[$i]["tx_per_total"] = round($device[$i][$sb] / $total_bytes * 100, 2);
}
// store total number of bytes (traffic) seen by all interfaces combined.
$net_devices[0]["total_bytes"] = convert_bytes($total_bytes);
// return the data structure
return $net_devices;
}
///////////////////////////////////////////////////////////////////////////////
// sys_memory
//
function sys_memory () {
$proc_meminfo = file("/proc/meminfo");
// gather system memory information
for ($i = 0; $proc_meminfo[$i] != NULL; $i++) {
if (ereg("Mem:", $proc_meminfo[$i])) {
$clean = ereg_replace (' +', ' ', $proc_meminfo[$i]); // compact whitespace
$mem = explode (" ", $clean);
}
if (ereg("Swap:", $proc_meminfo[$i])) {
$clean = ereg_replace (' +', ' ', $proc_meminfo[$i]); // compact whitespace
$swap = explode (" ", $clean);
}
}
// create the data structure
// 1 = total, 2 = used, 3 = free, 4 = shared, 5 = buffers, 6 = cached
$memory["mem_total"] = convert_bytes($mem[1]);
$memory["mem_used"] = convert_bytes($mem[2] - $mem[5] - $mem[6]);
$memory["mem_free"] = convert_bytes($mem[1] - ($mem[2] - $mem[5] - $mem[6]));
$memory["mem_used_p"] = round((($mem[2] - $mem[5] - $mem[6]) / $mem[1]) * 100, 2);
$memory["mem_free_p"] = round(($mem[1] - ($mem[2] - $mem[5] - $mem[6])) / $mem[1] * 100, 2);
$memory["swap_total"] = convert_bytes($swap[1]);
$memory["swap_used"] = convert_bytes($swap[2]);
$memory["swap_free"] = convert_bytes($swap[3]);
$memory["swap_used_p"] = round(($swap[2] / $swap[1]) * 100, 2);
$memory["swap_free_p"] = round(($swap[3] / $swap[1]) * 100, 2);
// return the data structure
return $memory;
}
///////////////////////////////////////////////////////////////////////////////
// sys_uptime
//
function sys_uptime () {
$dirty = file("/proc/uptime"); // grab the line
$ticks = trim(strtok($dirty[0], " ")); // sanitize it (pull out the ticks)
$mins = $ticks / 60; // total mins
$hours = $mins / 60; // total hours
$days = floor($hours / 24); // total days
$hours = floor($hours - ($days * 24)); // hours left
$mins = floor($mins - ($days * 60 * 24) - ($hours * 60)); // mins left
$uptime .= "$days days, "; // construct the string
$uptime .= "$hours hours, ";
$uptime .= "$mins mins";
return $uptime; // return the string
}
///////////////////////////////////////////////////////////////////////////////
// sys_login_stats
//
function sys_login_stats () {
// determine wtmp start date and store in RFC 822 format
$parts = split(' ', str_replace(" ", " ", `last | tail -n1`));
$wtmp_start = date("F Y", strtotime($parts[3] . " " . $parts[4] . " " . $parts[6]));
// gather login data from wtmp store in following format: <login count> <username>
$login_count = `last | grep / | cut -d' ' -f1 | sort | uniq -c`;
// compact whitespace, remove leading/trailing whitespace
$login_count = trim(ereg_replace("[[:space:]]+", ' ', $login_count));
// convert to array, format:
// odds = login name, evens = login count (2, pedram, 5, shawn, ...)
$login_count = explode(" ", $login_count);
// loop through our raw data and store the pertinant stats
for ($i = 0, $x = 0; $i < sizeof($login_count); $i += 2, $x++) {
$days = $hours = $mins = 0;
// strip out the login duration (not including those currently logged in)
// XXX - add support for users still logged in.
$login_time = `last | grep -e ^{$login_count[$i+1]} | grep -v still | cut -d'(' -f2`;
$login_time = ereg_replace("[[:space:]]+", "", str_replace("\n", "", $login_time));
$login_time = explode(")", $login_time);
// determine the login durations
for ($j = 0; $j < sizeof($login_time); $j++) {
$entry = explode(":", $login_time[$j]);
$days += substr($entry[0], 0, strpos($entry[0], "+"));
$hours += substr($entry[0], strpos($entry[0], "+"));
$mins += $entry[1];
}
// formatting
$hours += floor($mins / 60);
$days += floor($hours / 24);
$hours = $hours % 24;
$mins = $mins % 60;
$login_stats[$x]["user"] = $login_count[$i+1];
$login_stats[$x]["count"] = $login_count[$i];
$login_stats[$x]["days"] = $days;
$login_stats[$x]["hours"] = $hours;
$login_stats[$x]["mins"] = $mins;
$login_stats[$x]["start"] = $wtmp_start;
}
return $login_stats;
}
/*******************************************************************************
* helper functions *
*******************************************************************************/
///////////////////////////////////////////////////////////////////////////////
// convert_bytes
//
function convert_bytes ($bytes) {
$kbytes = $bytes / 1024;
if ($kbytes > 1048576)
$converted = sprintf("%.2f GB", $kbytes / 1048576);
else if ($kbytes > 1024)
$converted = sprintf("%.2f MB", $kbytes / 1024);
else
$converted = sprintf("%.2f KB", $kbytes);
return $converted;
}
?>