Commit fb4c27e3 authored by vogelor's avatar vogelor
Browse files

The monitor now shows the date of the data (to determine how old they are)

Fixed some bugs and improved the RAID - monitor
Fixed the user count in the monitor
The monitor now monitors the rkhunter - log too
The monitor now deletes the old data AFTER writing the new one, so there are always data in the db
parent 91bc8ea6
......@@ -133,14 +133,14 @@ $items[] = array( 'title' => "Show Clamav-Log",
'target' => 'content',
'link' => 'monitor/show_log.php?log=log_clamav');
$items[] = array( 'title' => "Show RKHunter-Log",
'target' => 'content',
'link' => 'monitor/show_data.php?type=rkhunter');
$items[] = array( 'title' => "Show ISPConfig-Log",
'target' => 'content',
'link' => 'monitor/show_log.php?log=log_ispconfig');
//$items[] = array( 'title' => "Show RKHunter-Log",
// 'target' => 'content',
// 'link' => 'monitor/show_data.php?type=rkhunter');
$module["nav"][] = array( 'title' => 'Logfiles',
'open' => 1,
'items' => $items);
......
......@@ -45,54 +45,63 @@ switch($dataType) {
case 'server_load':
$template = 'templates/show_data.htm';
$output .= showServerLoad();
$time = getDataTime('server_load');
$title = $app->lng("Server Load").' (Server: ' . $_SESSION['monitor']['server_name'] . ')';
$description = '';
break;
case 'disk_usage':
$template = 'templates/show_data.htm';
$output .= showDiskUsage();
$time = getDataTime('disk_usage');
$title = $app->lng("Disk usage").' (Server: ' . $_SESSION['monitor']['server_name'] . ')';
$description = '';
break;
case 'mem_usage':
$template = 'templates/show_data.htm';
$output .= showMemUsage();
$time = getDataTime('mem_usage');
$title = $app->lng("Memory usage").' (Server: ' . $_SESSION['monitor']['server_name'] . ')';
$description = '';
break;
case 'cpu_info':
$template = 'templates/show_data.htm';
$output .= showCpuInfo();
$time = getDataTime('cpu_info');
$title = $app->lng("CPU info").' (Server: ' . $_SESSION['monitor']['server_name'] . ')';
$description = '';
break;
case 'services':
$template = 'templates/show_data.htm';
$output .= showServices();
$time = getDataTime('services');
$title = $app->lng("Status of services").' (Server: ' . $_SESSION['monitor']['server_name'] . ')';
$description = '';
break;
case 'system_update':
$template = 'templates/show_data.htm';
$output .= showSystemUpdate();
$time = getDataTime('system_update');
$title = "Update State" . ' (Server: ' . $_SESSION['monitor']['server_name'] . ')';
$description = '';
break;
case 'mailq':
$template = 'templates/show_data.htm';
$output .= showMailq();
$time = getDataTime('mailq');
$title = "Mailq" . ' (Server: ' . $_SESSION['monitor']['server_name'] . ')';
$description = '';
break;
case 'raid_state':
$template = 'templates/show_data.htm';
$output .= showRaidState();
$time = getDataTime('raid_state');
$title = "RAID-State" . ' (Server: ' . $_SESSION['monitor']['server_name'] . ')';
$description = '';
break;
case 'rkhunter':
$template = 'templates/show_data.htm';
$output .= showRKHunter();
$time = getDataTime('rkhunter');
$title = "RKHunter-Log" . ' (Server: ' . $_SESSION['monitor']['server_name'] . ')';
$description = '';
break;
......@@ -105,12 +114,12 @@ switch($dataType) {
// Loading the template
$app->uses('tpl');
$app->tpl->newTemplate("form.tpl.htm");
$app->tpl->setInclude('content_tpl',$template);
$app->tpl->setVar("output",$output);
$app->tpl->setVar("title",$title);
$app->tpl->setVar("description",$description);
$app->tpl->setInclude('content_tpl', $template);
$app->tpl->setVar("output", $output);
$app->tpl->setVar("title", $title);
$app->tpl->setVar("description", $description);
$app->tpl->setVar("time", $time);
$app->tpl_defaults();
$app->tpl->pparse();
......
......@@ -30,6 +30,7 @@ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
require_once('../../lib/config.inc.php');
require_once('../../lib/app.inc.php');
require_once('tools.inc.php');
//* Check permissions for module
$app->auth->check_module_permissions('monitor');
......@@ -114,7 +115,7 @@ if(isset($record['data'])) {
$app->tpl->setVar("title", $title);
$app->tpl->setVar("log_id",$logId);
$app->tpl->setVar("time", getDataTime($logId));
$app->tpl_defaults();
$app->tpl->pparse();
......
......@@ -385,7 +385,20 @@ function _processDbState($type, $serverId, &$serverState, &$messages)
/* this type has no state */
}
if ($type == 'log_freshclam'){
/* this type has no state */
switch ($record['state']) {
case 'ok':
$messages['ok'][] = 'Your Virus-protection is ok ' .
"<a href='#' onclick='loadContent(\"monitor/show_log.php?log=log_freshclam\");'>[more...]</a>";
break;
case 'warning':
$messages['warning'][] = 'Your Virus-protection is OUTDATED! ' .
"<a href='#' onclick='loadContent(\"monitor/show_log.php?log=log_freshclam\");'>[more...]</a>";
break;
default:
$messages['unknown'][] = 'Freshclam: ???! ' .
"<a href='#' onclick='loadContent(\"monitor/show_log.php?log=log_freshclam\");'>[more...]</a>";
break;
}
}
if ($type == 'log_ispconfig'){
/* this type has no state */
......@@ -402,6 +415,9 @@ function _processDbState($type, $serverId, &$serverState, &$messages)
if ($type == 'log_messages'){
/* this type has no state */
}
if ($type == 'rkhunter'){
/* this type has no state */
}
}
/*
......
......@@ -3,7 +3,7 @@
<div class="panel panel_system">
<div class="pnl_formarea">
<fieldset><legend></legend>
<fieldset><legend>Data from: <tmpl_var name="time"></legend>
<div class="systemmonitor"><tmpl_var name="output"></div>
</fieldset>
</div>
......
......@@ -11,7 +11,7 @@
</div>
<div class="pnl_formarea">
<fieldset><legend></legend>
<fieldset><legend>Data from: <tmpl_var name="time"></legend>
<div class="codeview"><tmpl_var name="log_data"></div>
</fieldset>
</div>
......
......@@ -11,7 +11,7 @@
</div>
<div class="pnl_formarea">
<fieldset><!-- legend>Sys-State</legend -->
<fieldset><legend></legend>
<div class="stateview"><tmpl_var name="state_data"></div>
</fieldset>
</div>
......
......@@ -359,6 +359,38 @@ function showRaidState()
return $html;
}
function showRKHunter()
{
global $app;
/* fetch the Data from the DB */
$record = $app->db->queryOneRecord("SELECT data, state FROM monitor_data WHERE type = 'rkhunter' and server_id = " . $_SESSION['monitor']['server_id'] . " order by created desc");
if(isset($record['data'])) {
$html =
'<div class="systemmonitor-state systemmonitor-state-' . $record['state'] . '">
<div class="systemmonitor-state-' . $record['state'] . '-icon">';
/*
* First, we have to detect, if there is any monitoring-data.
* If not (because the destribution is not supported) show this.
*/
$data = unserialize($record['data']);
if ($data['output'] == ''){
$html .= '<p>' . "rkhunter ist not installed, so there is no log data" . '</p>';
}
else {
$html .= nl2br($data['output']);
}
$html .= '</div></div>';
} else {
$html = '<p>' . "No RKHunter-Data available" . '</p>';
}
return $html;
}
function showMailq()
{
global $app;
......@@ -375,4 +407,18 @@ function showMailq()
return $html;
}
function getDataTime($type) {
global $app;
/* fetch the Data from the DB */
$record = $app->db->queryOneRecord("SELECT created FROM monitor_data WHERE type = '" . $type . "' and server_id = " . $_SESSION['monitor']['server_id'] . " order by created desc");
if(isset($record['created'])) {
$res = date('Y-m-d H:i', $record['created']);
} else {
$res = '????-??-?? ??:??';
}
return $res;
}
?>
<?php
/*
Copyright (c) 2007, Till Brehm, projektfarm Gmbh
Copyright (c) 2007-2008, Till Brehm, projektfarm Gmbh and Oliver Vogel www.muv.com
All rights reserved.
Redistribution and use in source and binary forms, with or without modification,
......@@ -124,9 +123,6 @@ class monitor_core_module {
/** 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
*/
......@@ -137,11 +133,11 @@ class monitor_core_module {
$data['uptime'] = shell_exec("uptime");
$tmp = explode(",", $data['uptime'], 3);
$tmpUser = explode(" ", trim($tmp[1]));
$tmp = explode(",", $data['uptime'], 4);
$tmpUser = explode(" ", trim($tmp[2]));
$data['user_online'] = intval($tmpUser[0]);
$loadTmp = explode(":" , trim($tmp[2]));
$loadTmp = explode(":" , trim($tmp[3]));
$load = explode(",", $loadTmp[1]);
$data['load_1'] = floatval(trim($load[0]));
$data['load_5'] = floatval(trim($load[1]));
......@@ -166,6 +162,9 @@ class monitor_core_module {
"'" . $state . "'" .
")";
$app->db->query($sql);
/* The new data is written, now we can delete the old one */
$this->_delOldRecords($type, 10);
}
function monitorDiskUsage() {
......@@ -178,9 +177,6 @@ class monitor_core_module {
/** The type of the data */
$type = 'disk_usage';
/* Delete Data older than 10 minutes */
$this->_delOldRecords($type, 10);
/** The state of the disk-usage */
$state = 'ok';
......@@ -230,6 +226,9 @@ class monitor_core_module {
"'" . $state . "'" .
")";
$app->db->query($sql);
/* The new data is written, now we can delete the old one */
$this->_delOldRecords($type, 10);
}
......@@ -244,9 +243,6 @@ class monitor_core_module {
/** The type of the data */
$type = 'mem_usage';
/* Delete Data older than 10 minutes */
$this->_delOldRecords($type, 10);
/*
Fetch the data into a array
*/
......@@ -281,6 +277,9 @@ class monitor_core_module {
"'" . $state . "'" .
")";
$app->db->query($sql);
/* The new data is written, now we can delete the old one */
$this->_delOldRecords($type, 10);
}
......@@ -295,9 +294,6 @@ class monitor_core_module {
/** The type of the data */
$type = 'cpu_info';
/* There is only ONE CPU-Data, so delete the old one */
$this->_delOldRecords($type, 0);
/*
Fetch the data into a array
*/
......@@ -326,6 +322,9 @@ class monitor_core_module {
"'" . $state . "'" .
")";
$app->db->query($sql);
/* The new data is written, now we can delete the old one */
$this->_delOldRecords($type, 10);
}
......@@ -343,9 +342,6 @@ class monitor_core_module {
/* The type of the Monitor-data */
$type = 'services';
/* There is only ONE Service-Data, so delete the old one */
$this->_delOldRecords($type, 0);
/** the State of the monitoring */
/* ok, if ALL aktive services are running,
* error, if not
......@@ -451,16 +447,17 @@ class monitor_core_module {
")";
$app->db->query($sql);
/* The new data is written, now we can delete the old one */
$this->_delOldRecords($type, 10);
}
function monitorSystemUpdate(){
/*
* This monitoring is expensive, so do it only once a day (at 5:00)
* This monitoring is expensive, so do it only once a hour
*/
$hour = date('G');
$min = date('i');
if (($min != 0) && ($hour != 5)) return;
if ($min != 0) return;
/*
* OK - here we go...
......@@ -474,9 +471,6 @@ class monitor_core_module {
/** The type of the data */
$type = 'system_update';
/* There is only ONE Update-Data, so delete the old one */
$this->_delOldRecords($type, 0);
/* This monitoring is only available at debian or Ubuntu */
if(file_exists('/etc/debian_version')){
......@@ -532,6 +526,9 @@ class monitor_core_module {
"'" . $state . "'" .
")";
$app->db->query($sql);
/* The new data is written, now we can delete the old one */
$this->_delOldRecords($type, 0, 2);
}
function monitorMailQueue(){
......@@ -544,9 +541,6 @@ class monitor_core_module {
/** The type of the data */
$type = 'mailq';
/* There is only ONE Update-Data, so delete the old one */
$this->_delOldRecords($type, 0);
/* Get the data from the mailq */
$data['output'] = shell_exec('mailq');
......@@ -578,6 +572,9 @@ class monitor_core_module {
"'" . $state . "'" .
")";
$app->db->query($sql);
/* The new data is written, now we can delete the old one */
$this->_delOldRecords($type, 10);
}
......@@ -591,9 +588,6 @@ class monitor_core_module {
/** The type of the data */
$type = 'raid_state';
/* There is only ONE RAID-Data, so delete the old one */
$this->_delOldRecords($type, 0);
/* This monitoring is only available if mdadm is installed */
$location = shell_exec('which mdadm');
if($location != ''){
......@@ -607,27 +601,31 @@ class monitor_core_module {
*/
$tmp = explode("\n", $data['output']);
$state = 'ok';
foreach($tmp as $line) {
if (strpos($line, '[U_]' !== false))
{
/* One Disk is not working */
$state = $this->_setState($state, 'critical');
}
if (strpos($line, '[_U]' !== false))
for ($i = 0; $i < sizeof($tmp); $i++){
/* fetch the next line */
$line = $tmp[$i];
if ((strpos($line, '[U_]') !== false) || (strpos($line, '[_U]') !== false))
{
/* One Disk is not working */
$state = $this->_setState($state, 'critical');
/* One Disk is not working.
* if the next line starts with "[>" or "[=" then
* recovery (resync) is in state and the state is
* information instead of critical
*/
$nextLine = $tmp[$i+1];
if ((strpos($nextLine, '[>') === false) && (strpos($nextLine, '[=') === false)) {
$state = $this->_setState($state, 'critical');
}
else
{
$state = $this->_setState($state, 'info');
}
}
if (strpos($line, '[__]' !== false))
if (strpos($line, '[__]') !== false)
{
/* both Disk are not working */
$state = $this->_setState($state, 'error');
}
if (strpos($line, '[=' !== false))
{
/* the raid is in resync */
$state = $this->_setState($state, 'information');
}
}
}
......@@ -657,9 +655,69 @@ class monitor_core_module {
"'" . $state . "'" .
")";
$app->db->query($sql);
/* The new data is written, now we can delete the old one */
$this->_delOldRecords($type, 10);
}
function monitorRkHunter(){
/*
* This monitoring is expensive, so do it only once a hour
*/
$min = date('i');
if ($min != 0) return;
global $app;
global $conf;
/* the id of the server as int */
$server_id = intval($conf["server_id"]);
/** The type of the data */
$type = 'rkhunter';
/* This monitoring is only available if rkhunter is installed */
$location = shell_exec('which rkhunter');
if($location != ''){
/*
* Fetch the output
*/
$data['output'] = shell_exec('rkhunter --update --check --nocolors --skip-keypress');
/*
* At this moment, there is no state (maybe later)
*/
$state = 'no_state';
}
else {
/*
* rkhunter is not installed, so there is no data and no state
*
* no_state, NOT unknown, because "unknown" is shown as state
* inside the GUI. no_state is hidden.
*
* We have to write NO DATA inside the DB, because the GUI
* could not know, if there is any dat, or not...
*/
$state = 'no_state';
$data['output']= '';
}
/*
* Insert the data into the database
*/
$sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " .
"VALUES (".
$server_id . ", " .
"'" . $app->db->quote($type) . "', " .
time() . ", " .
"'" . $app->db->quote(serialize($data)) . "', " .
"'" . $state . "'" .
")";
$app->db->query($sql);
/* The new data is written, now we can delete the old one */
$this->_delOldRecords($type, 0, 2);
}
function monitorMailLog()
......@@ -673,9 +731,6 @@ class monitor_core_module {
/** The type of the data */
$type = 'log_mail';
/* There is only ONE Log-Data, so delete the old one */
$this->_delOldRecords($type, 0);
/* Get the data of the log */
$data = $this->_getLogData($type);
......@@ -697,6 +752,9 @@ class monitor_core_module {
"'" . $state . "'" .
")";
$app->db->query($sql);
/* The new data is written, now we can delete the old one */
$this->_delOldRecords($type, 10);
}
function monitorMailWarnLog()
......@@ -710,10 +768,6 @@ class monitor_core_module {
/** The type of the data */
$type = 'log_mail_warn';
/* There is only ONE Log-Data, so delete the old one */
$this->_delOldRecords($type, 0);
/* Get the data of the log */
$data = $this->_getLogData($type);
......@@ -735,6 +789,9 @@ class monitor_core_module {
"'" . $state . "'" .
")";
$app->db->query($sql);
/* The new data is written, now we can delete the old one */
$this->_delOldRecords($type, 10);
}
function monitorMailErrLog()
......@@ -748,10 +805,6 @@ class monitor_core_module {
/** The type of the data */
$type = 'log_mail_err';
/* There is only ONE Log-Data, so delete the old one */
$this->_delOldRecords($type, 0);
/* Get the data of the log */
$data = $this->_getLogData($type);
......@@ -773,6 +826,9 @@ class monitor_core_module {
"'" . $state . "'" .
")";
$app->db->query($sql);
/* The new data is written, now we can delete the old one */
$this->_delOldRecords($type, 10);
}
......@@ -787,9 +843,6 @@ class monitor_core_module {
/** The type of the data */
$type = 'log_messages';
/* There is only ONE Log-Data, so delete the old one */
$this->_delOldRecords($type, 0);
/* Get the data of the log */
$data = $this->_getLogData($type);
......@@ -811,6 +864,9 @@ class monitor_core_module {
"'" . $state . "'" .
")";
$app->db->query($sql);
/* The new data is written, now we can delete the old one */
$this->_delOldRecords($type, 10);
}
function monitorFreshClamLog()
......@@ -824,16 +880,50 @@ class monitor_core_module {
/** The type of the data */
$type = 'log_freshclam';
/* There is only ONE Log-Data, so delete the old one */
$this->_delOldRecords($type, 0);