plugins->announceEvents($this->module_name,$this->actions_available);
/*
As we want to get notified of any changes on several database tables,
we register for them.
The following function registers the function "functionname"
to be executed when a record for the table "dbtable" is
processed in the sys_datalog. "classname" is the name of the
class that contains the function functionname.
*/
/* none at them moment */
//$app->modules->registerTableHook('mail_access','mail_module','process');
/*
Do the monitor every n minutes and write the result in the db
*/
$min = date('i');
if (($min % $this->interval) == 0)
{
$this->doMonitor();
}
}
/*
This function is called when a change in one of the registered tables is detected.
The function then raises the events for the plugins.
*/
function process($tablename, $action, $data) {
// global $app;
//
// switch ($tablename) {
// case 'mail_access':
// if($action == 'i') $app->plugins->raiseEvent('mail_access_insert',$data);
// if($action == 'u') $app->plugins->raiseEvent('mail_access_update',$data);
// if($action == 'd') $app->plugins->raiseEvent('mail_access_delete',$data);
// break;
// } // end switch
} // end function
/*
This method is called every n minutes, when the module ist loaded.
The method then does a system-monitoring
*/
// TODO: what monitoring is done should be a config-var
function doMonitor()
{
/* Calls the single Monitoring steps */
$this->monitorServer();
$this->monitorDiskUsage();
}
function monitorServer(){
global $app;
global $conf;
/* the id of the server as int */
$server_id = intval($conf["server_id"]);
/** The type of the data */
$type = 'server_load';
/* Delete Data older than 1 day */
$this->_delOldRecords($type, 0, 0, 1);
/*
Fetch the data into a array
*/
$procUptime = shell_exec("cat /proc/uptime | cut -f1 -d' '");
$data['up_days'] = floor($procUptime/86400);
$data['up_hours'] = floor(($procUptime-$data['up_days']*86400)/3600);
$data['up_minutes'] = floor(($procUptime-$data['up_days']*86400-$data['up_hours']*3600)/60);
$data['uptime'] = shell_exec("uptime");
$tmp = explode(",", $data['uptime'], 3);
$tmpUser = explode(" ", trim($tmp[1]));
$data['user_online'] = intval($tmpUser[0]);
$loadTmp = explode(":" , trim($tmp[2]));
$load = explode(",", $loadTmp[1]);
$data['load_1'] = floatval(trim($load[0]));
$data['load_5'] = floatval(trim($load[1]));
$data['load_15'] = floatval(trim($load[2]));
// Todo: the state should be calculated. For example if the load is to heavy, the state is warning...
$state = 'ok';
/*
Insert the data into the database
*/
$sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " .
"VALUES (".
$conf["server_id"] . ", " .
"'" . $app->db->quote(serialize($type)) . "', " .
time() . ", " .
"'" . $app->db->quote(serialize($data)) . "', " .
"'" . $state . "'" .
")";
$app->db->query($sql);
}
function monitorDiskUsage() {
global $app;
global $conf;
/* the id of the server as int */
$server_id = intval($conf["server_id"]);
/** The type of the data */
$type = 'disk_usage';
/* Delete Data older than 10 minutes */
$this->_delOldRecords($type, 10);
/*
Fetch the data into a array
*/
$fd = popen ("df", "r");
$buffer = '';
while (!feof($fd)) {
$buffer .= fgets($fd, 4096);
}
// split into array
$df = split("\n", $buffer);
// ignore the first line make a array of the rest
for($i=1; $i <= sizeof($df); $i++){
if ($df[$i] != '')
{
$s = preg_split ("/[\s]+/", $df[$i]);
$data[$i]['fs'] = $s[0];
$data[$i]['size'] = $s[1];
$data[$i]['used'] = $s[2];
$data[$i]['available'] = $s[3];
$data[$i]['percent'] = $s[4];
$data[$i]['mounted'] = $s[5];
}
}
// Todo: the state should be calculated. For example if the load is to heavy, the state is warning...
$state = 'ok';
/*
Insert the data into the database
*/
$sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " .
"VALUES (".
$conf["server_id"] . ", " .
"'" . $app->db->quote(serialize($type)) . "', " .
time() . ", " .
"'" . $app->db->quote(serialize($data)) . "', " .
"'" . $state . "'" .
")";
$app->db->query($sql);
}
//
//
// function show_memusage ()
// {
// global $app;
//
// $html_out .= '
';
//
// $fd = fopen ("/proc/meminfo", "r");
// while (!feof($fd)) {
// $buffer .= fgets($fd, 4096);
// }
// fclose($fd);
//
// $meminfo = split("\n",$buffer);
//
// foreach($meminfo as $mline){
// if($x > 2 and trim($mline) != "") {
//
// $mpart = split(":",$mline);
//
// $html_out .= '
// '.$mpart[0].': |
// '.$mpart[1].' |
//
';
// }
//
// $x++;
// }
// $html_out .= '
';
// return $html_out;
// }
//
// function show_cpu ()
// {
// global $app;
//
// $html_out .= '';
//
// $n = 0;
// if(is_readable("/proc/cpuinfo")) {
// if($fd = fopen ("/proc/cpuinfo", "r")) {
// while (!feof($fd)) {
// $buffer .= fgets($fd, 4096);
// $n++;
// if($n > 100) break;
// }
// fclose($fd);
// }
// }
//
// $meminfo = split("\n",$buffer);
//
// if(is_array($meminfo)) {
// foreach($meminfo as $mline){
// if(trim($mline) != "") {
//
// $mpart = split(":",$mline);
//
// $html_out .= '
// '.$mpart[0].': |
// '.$mpart[1].' |
//
';
// }
// }
//
// $x++;
// }
// $html_out .= '
';
//
//
// return $html_out;
// }
//
// function show_services ()
// {
// global $app;
//
// $html_out .= '';
//
// // Checke Webserver
// if(_check_tcp('localhost',80)) {
// $status = 'Online';
// } else {
// $status = 'Offline';
// }
// $html_out .= '
// Web-Server: |
// '.$status.' |
//
';
//
//
// // Checke FTP-Server
// if(_check_ftp('localhost',21)) {
// $status = 'Online';
// } else {
// $status = 'Offline';
// }
// $html_out .= '
// FTP-Server: |
// '.$status.' |
//
';
//
// // Checke SMTP-Server
// if(_check_tcp('localhost',25)) {
// $status = 'Online';
// } else {
// $status = 'Offline';
// }
// $html_out .= '
// SMTP-Server: |
// '.$status.' |
//
';
//
// // Checke POP3-Server
// if(_check_tcp('localhost',110)) {
// $status = 'Online';
// } else {
// $status = 'Offline';
// }
// $html_out .= '
// POP3-Server: |
// '.$status.' |
//
';
//
// // Checke BIND-Server
// if(_check_tcp('localhost',53)) {
// $status = 'Online';
// } else {
// $status = 'Offline';
// }
// $html_out .= '
// DNS-Server: |
// '.$status.' |
//
';
//
// // Checke MYSQL-Server
// //if($this->_check_tcp('localhost',3306)) {
// $status = 'Online';
// //} else {
// //$status = 'Offline';
// //}
// $html_out .= '
// mySQL-Server: |
// '.$status.' |
//
';
//
//
// $html_out .= '
';
//
//
// return $html_out;
// }
//
// function _check_tcp ($host,$port) {
//
// $fp = @fsockopen ($host, $port, &$errno, &$errstr, 2);
//
// if ($fp) {
// return true;
// fclose($fp);
// } else {
// return false;
// fclose($fp);
// }
// }
//
// function _check_udp ($host,$port) {
//
// $fp = @fsockopen ('udp://'.$host, $port, &$errno, &$errstr, 2);
//
// if ($fp) {
// return true;
// fclose($fp);
// } else {
// return false;
// fclose($fp);
// }
// }
//
// function _check_ftp ($host,$port){
//
// $conn_id = @ftp_connect($host, $port);
//
// if($conn_id){
// @ftp_close($conn_id);
// return true;
// } else {
// @ftp_close($conn_id);
// return false;
// }
// }
/*
Deletes Records older than n.
*/
function _delOldRecords($type, $min, $hour=0, $days=0) {
global $app;
$now = time();
$old = $now - ($min * 60) - ($hour * 60 * 60) - ($days * 24 * 60 * 60);
$sql = "DELETE FROM monitor_data " .
"WHERE " .
"type =" . "'" . $app->db->quote(serialize($type)) . "' " .
"AND " .
"created < " . $old;
$app->db->query($sql);
}
} // end class
?>