From 8793b32c8e8745e04571a30735b210f68b23ef92 Mon Sep 17 00:00:00 2001 From: vogelor <vogelor@ispconfig3> Date: Mon, 24 Nov 2008 12:51:48 -0500 Subject: [PATCH] Monitor Module now only shows the state of the "active" services Monitor Module now has system state --- interface/web/monitor/tools.inc.php | 244 +++++ interface/web/themes/default/icons/x32/state_error.png | 0 interface/web/monitor/show_sys_state.php | 365 +++++++ server/mods-available/monitor_core_module.inc.php | 1540 ++++++++++++++++++--------------- interface/web/themes/default/icons/x32/state_unknown.png | 0 interface/web/monitor/lib/module.conf.php | 154 +- interface/web/themes/default/icons/x32/state_ok.png | 0 interface/web/themes/default/icons/x32/state_info.png | 0 interface/web/themes/default/icons/x64/network.png | 0 interface/web/themes/default/icons/x32/state_warning.png | 0 install/sql/ispconfig3.sql | 7 interface/web/monitor/templates/show_sys_state.htm | 19 interface/web/themes/default/icons/x64/server.png | 0 interface/web/themes/default/css/screen/content_ispc.css | 73 + interface/web/monitor/show_data.php | 305 ----- interface/web/themes/default/icons/x32/state_critical.png | 0 interface/web/monitor/show_log.php | 1 17 files changed, 1,659 insertions(+), 1,049 deletions(-) diff --git a/install/sql/ispconfig3.sql b/install/sql/ispconfig3.sql index 774b4a0..e7ccf33 100644 --- a/install/sql/ispconfig3.sql +++ b/install/sql/ispconfig3.sql @@ -1102,13 +1102,9 @@ `type` varchar(255) NOT NULL, `created` int(11) NOT NULL, `data` mediumtext NOT NULL, - `state` enum('unknown','ok','warning','critical', 'error') NOT NULL default 'unknown', + `state` enum('no_state', 'unknown', 'ok', 'info', 'warning', 'critical', 'error') NOT NULL default 'unknown', PRIMARY KEY (`server_id`,`type`,`created`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; - - -SET FOREIGN_KEY_CHECKS = 1; - @@ -1373,6 +1369,7 @@ INSERT INTO country VALUES ('ZW','ZIMBABWE','Zimbabwe','ZWE','716'); +SET FOREIGN_KEY_CHECKS = 1; diff --git a/interface/web/monitor/lib/module.conf.php b/interface/web/monitor/lib/module.conf.php index d9a78a7..2a443e3 100644 --- a/interface/web/monitor/lib/module.conf.php +++ b/interface/web/monitor/lib/module.conf.php @@ -7,7 +7,17 @@ $module["title"] = "Monitor"; $module["template"] = "module.tpl.htm"; $module["tab_width"] = ''; -$module["startpage"] = "monitor/show_data.php?type=overview"; +$module["startpage"] = "monitor/show_sys_state.php?state=system"; + +unset($items); +$items[] = array( 'title' => "Show System State", + 'target' => 'content', + 'link' => 'monitor/show_sys_state.php?state=system'); + +$module["nav"][] = array( 'title' => 'System State', + 'open' => 1, + 'items' => $items); + /* We need all the available servers on the left navigation. @@ -15,24 +25,25 @@ */ $servers = $app->db->queryAllRecords("SELECT server_id, server_name FROM server order by server_name"); -$dropDown = "<select id='server_id' onchange=\"loadContent('monitor/show_data.php?type=overview&server=' + document.getElementById('server_id').value);\">"; +$dropDown = "<select id='server_id' onchange=\"loadContent('monitor/show_sys_state.php?state=server&server=' + document.getElementById('server_id').value);\">"; foreach ($servers as $server) { - $dropDown .= "<option value='" . $server['server_id'] . "|" . $server['server_name'] . "'>" . $server['server_name'] . "</option>"; + $dropDown .= "<option value='" . $server['server_id'] . "|" . $server['server_name'] . "'>" . $server['server_name'] . "</option>"; } $dropDown .= "</select>"; /* Now add them as dropdown to the navigation */ +unset($items); $items[] = array( 'title' => $dropDown, - 'target' => '', // no action! - 'link' => ''); // no action! + 'target' => '', // no action! + 'link' => ''); // no action! $module["nav"][] = array( 'title' => 'Server to Monitor', - 'open' => 1, - 'items' => $items); - + 'open' => 1, + 'items' => $items); + /* The first Server at the list is the server first selected */ @@ -40,83 +51,90 @@ $_SESSION['monitor']['server_name'] = $servers[0]['server_name']; /* - Logmonitoring module -*/ -// aufr�umen + * Logmonitoring module + */ + +/* + * Clear and set the Navigation-Items + */ unset($items); -$items[] = array( 'title' => "Server Load", - 'target' => 'content', - 'link' => 'monitor/show_data.php?type=server_load'); +$items[] = array( 'title' => "Show Server State", + 'target' => 'content', + 'link' => 'monitor/show_sys_state.php?state=server'); -$items[] = array( 'title' => "Disk usage", - 'target' => 'content', - 'link' => 'monitor/show_data.php?type=disk_usage'); +$items[] = array( 'title' => "Show Server Load", + 'target' => 'content', + 'link' => 'monitor/show_data.php?type=server_load'); -$items[] = array( 'title' => "Memory usage", - 'target' => 'content', - 'link' => 'monitor/show_data.php?type=mem_usage'); +$items[] = array( 'title' => "Show Disk usage", + 'target' => 'content', + 'link' => 'monitor/show_data.php?type=disk_usage'); -$items[] = array( 'title' => "Services", - 'target' => 'content', - 'link' => 'monitor/show_data.php?type=services'); +$items[] = array( 'title' => "Show Memory usage", + 'target' => 'content', + 'link' => 'monitor/show_data.php?type=mem_usage'); + +$items[] = array( 'title' => "Show Services", + 'target' => 'content', + 'link' => 'monitor/show_data.php?type=services'); $module["nav"][] = array( 'title' => 'Monitoring', - 'open' => 1, - 'items' => $items); - -// aufr�umen -unset($items); - -$items[] = array( 'title' => "CPU", - 'target' => 'content', - 'link' => 'monitor/show_data.php?type=cpu_info'); - -$module["nav"][] = array( 'title' => 'System-Information', - 'open' => 1, - 'items' => $items); - -// aufr�umen -unset($items); - + 'open' => 1, + 'items' => $items); /* - Logmonitoring module -*/ + * Clear and set the Navigation-Items + */ +unset($items); -$items[] = array( 'title' => "Mail log", - 'target' => 'content', - 'link' => 'monitor/show_log.php?log=log_mail'); +$items[] = array( 'title' => "Show CPU info", + 'target' => 'content', + 'link' => 'monitor/show_data.php?type=cpu_info'); -$items[] = array( 'title' => "Mail warn", - 'target' => 'content', - 'link' => 'monitor/show_log.php?log=log_mail_warn'); +$module["nav"][] = array( 'title' => 'System-Information', + 'open' => 1, + 'items' => $items); -$items[] = array( 'title' => "Mail err", - 'target' => 'content', - 'link' => 'monitor/show_log.php?log=log_mail_err'); +/* + * Logmonitoring module + */ -$items[] = array( 'title' => "Messages", - 'target' => 'content', - 'link' => 'monitor/show_log.php?log=log_messages'); +/* + * Clear and set the Navigation-Items + */ +unset($items); -$items[] = array( 'title' => "Freshclam", - 'target' => 'content', - 'link' => 'monitor/show_log.php?log=log_freshclam'); +$items[] = array( 'title' => "Show Mail-Log", + 'target' => 'content', + 'link' => 'monitor/show_log.php?log=log_mail'); -$items[] = array( 'title' => "Clamav", - 'target' => 'content', - 'link' => 'monitor/show_log.php?log=log_clamav'); +$items[] = array( 'title' => "Show Mail warn-Log", + 'target' => 'content', + 'link' => 'monitor/show_log.php?log=log_mail_warn'); -$items[] = array( 'title' => "ISPConfig", - 'target' => 'content', - 'link' => 'monitor/show_log.php?log=log_ispconfig'); +$items[] = array( 'title' => "Show Mail err-Log", + 'target' => 'content', + 'link' => 'monitor/show_log.php?log=log_mail_err'); + +$items[] = array( 'title' => "Show Messages-Log", + 'target' => 'content', + 'link' => 'monitor/show_log.php?log=log_messages'); + +$items[] = array( 'title' => "Show Freshclam-Log", + 'target' => 'content', + 'link' => 'monitor/show_log.php?log=log_freshclam'); + +$items[] = array( 'title' => "Show Clamav-Log", + 'target' => 'content', + 'link' => 'monitor/show_log.php?log=log_clamav'); + +$items[] = array( 'title' => "Show ISPConfig-Log", + 'target' => 'content', + 'link' => 'monitor/show_log.php?log=log_ispconfig'); $module["nav"][] = array( 'title' => 'Logfiles', - 'open' => 1, - 'items' => $items); - -// aufr�umen -unset($items); + 'open' => 1, + 'items' => $items); ?> \ No newline at end of file diff --git a/interface/web/monitor/show_data.php b/interface/web/monitor/show_data.php index bee721b..37c77dc 100644 --- a/interface/web/monitor/show_data.php +++ b/interface/web/monitor/show_data.php @@ -30,6 +30,7 @@ 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'); @@ -38,58 +39,42 @@ /* Get the dataType to show */ $dataType = $_GET["type"]; -/* Change the Server if needed */ -if (isset($_GET['server'])){ - $server = explode('|', $_GET['server'], 2); - $_SESSION['monitor']['server_id'] = $server[0]; - $_SESSION['monitor']['server_name'] = $server[1]; -} - - $output = ''; switch($dataType) { - case 'server_load': - $template = 'templates/show_data.htm'; - $output .= showServerLoad(); - $title = $app->lng("Server Load").' (Server: ' . $_SESSION['monitor']['server_name'] . ')'; - $description = ''; - break; - case 'disk_usage': - $template = 'templates/show_data.htm'; - $output .= showDiskUsage(); - $title = $app->lng("Disk usage").' (Server: ' . $_SESSION['monitor']['server_name'] . ')'; - $description = ''; - break; - case 'mem_usage': - $template = 'templates/show_data.htm'; - $output .= showMemUsage(); - $title = $app->lng("Memory usage").' (Server: ' . $_SESSION['monitor']['server_name'] . ')'; - $description = ''; - break; - case 'cpu_info': - $template = 'templates/show_data.htm'; - $output .= showCpuInfo(); - $title = $app->lng("CPU info").' (Server: ' . $_SESSION['monitor']['server_name'] . ')'; - $description = ''; - break; - case 'services': - $template = 'templates/show_data.htm'; - $output .= showServices(); - $title = $app->lng("Status of services").' (Server: ' . $_SESSION['monitor']['server_name'] . ')'; - $description = ''; - break; - case 'overview': - $template = 'templates/show_data.htm'; - $output .= showServerLoad(); - $output .= ' '. showDiskUsage(); - $output .= ' '.showServices(); - $title = $app->lng("System Monitor").' (Server: ' . $_SESSION['monitor']['server_name'] . ')'; - $description = ''; - break; - default: - $template = ''; - break; + case 'server_load': + $template = 'templates/show_data.htm'; + $output .= showServerLoad(); + $title = $app->lng("Server Load").' (Server: ' . $_SESSION['monitor']['server_name'] . ')'; + $description = ''; + break; + case 'disk_usage': + $template = 'templates/show_data.htm'; + $output .= showDiskUsage(); + $title = $app->lng("Disk usage").' (Server: ' . $_SESSION['monitor']['server_name'] . ')'; + $description = ''; + break; + case 'mem_usage': + $template = 'templates/show_data.htm'; + $output .= showMemUsage(); + $title = $app->lng("Memory usage").' (Server: ' . $_SESSION['monitor']['server_name'] . ')'; + $description = ''; + break; + case 'cpu_info': + $template = 'templates/show_data.htm'; + $output .= showCpuInfo(); + $title = $app->lng("CPU info").' (Server: ' . $_SESSION['monitor']['server_name'] . ')'; + $description = ''; + break; + case 'services': + $template = 'templates/show_data.htm'; + $output .= showServices(); + $title = $app->lng("Status of services").' (Server: ' . $_SESSION['monitor']['server_name'] . ')'; + $description = ''; + break; + default: + $template = ''; + break; } @@ -105,226 +90,4 @@ $app->tpl_defaults(); $app->tpl->pparse(); - - - - -function showServerLoad(){ - global $app; - - /* fetch the Data from the DB */ - $record = $app->db->queryOneRecord("SELECT data, state FROM monitor_data WHERE type = 'server_load' and server_id = " . $_SESSION['monitor']['server_id'] . " order by created desc"); - - if(isset($record['data'])) { - $data = unserialize($record['data']); - - /* - Format the data - */ - $html .= - '<table id="system_load"> - <tr> - <td>' . $app->lng("Server online since").':</td> - <td>' . $data['up_days'] . ' days, ' . $data['up_hours'] . ':' . $data['up_minutes'] . ' hours</center></td> - </tr> - <tr> - <td>' . $app->lng("Users online").':</td> - <td>' . $data['user_online'] . '</td> - </tr>' . - '<tr> - <td>' . $app->lng("System load 1 minute") . ':</td> - <td>' . $data['load_1'] . '</td> - </tr> - <tr> - <td>' . $app->lng("System load 5 minutes") . ':</td> - <td>' . $data['load_5'] . '</td> - </tr> - <tr> - <td>'.$app->lng("System load 15 minutes").':</td> - <td>' . $data['load_15'] . '</td> - </tr> - </table>'; - } else { - $html = '<p>'.$app->lng("no_data_serverload_txt").'</p>'; - } - - return $html; -} - -function showDiskUsage () { - global $app; - - /* fetch the Data from the DB */ - $record = $app->db->queryOneRecord("SELECT data, state FROM monitor_data WHERE type = 'disk_usage' and server_id = " . $_SESSION['monitor']['server_id'] . " order by created desc"); - - if(isset($record['data'])) { - $data = unserialize($record['data']); - - /* - Format the data - */ - $html .= '<table id="system_disk">'; - foreach($data as $line) { - $html .= '<tr>'; - foreach ($line as $item) { - $html .= '<td>' . $item . '</td>'; - } - $html .= '</tr>'; - } - $html .= '</table>'; - } else { - $html = '<p>'.$app->lng("no_data_diskusage_txt").'</p>'; - } - - - return $html; -} - - -function showMemUsage () -{ - global $app; - - /* fetch the Data from the DB */ - $record = $app->db->queryOneRecord("SELECT data, state FROM monitor_data WHERE type = 'mem_usage' and server_id = " . $_SESSION['monitor']['server_id'] . " order by created desc"); - - if(isset($record['data'])) { - $data = unserialize($record['data']); - - /* - Format the data - */ - $html .= '<table id="system_memusage">'; - - foreach($data as $key => $value){ - if ($key != '') { - $html .= '<tr> - <td>' . $key . ':</td> - <td>' . $value . '</td> - </tr>'; - } - } - $html .= '</table>'; - } else { - $html = '<p>'.$app->lng("no_data_memusage_txt").'</p>'; - } - - return $html; -} - -function showCpuInfo () -{ - global $app; - - /* fetch the Data from the DB */ - $record = $app->db->queryOneRecord("SELECT data, state FROM monitor_data WHERE type = 'cpu_info' and server_id = " . $_SESSION['monitor']['server_id'] . " order by created desc"); - - if(isset($record['data'])) { - $data = unserialize($record['data']); - - /* - Format the data - */ - $html .= '<table id="system_cpu">'; - foreach($data as $key => $value){ - if ($key != '') { - $html .= '<tr> - <td>' . $key . ':</td> - <td>' . $value . '</td> - </tr>'; - } - } - $html .= '</table>'; - } else { - $html = '<p>'.$app->lng("no_data_cpuinfo_txt").'</p>'; - } - - return $html; -} - -function showServices () -{ - global $app; - - /* fetch the Data from the DB */ - $record = $app->db->queryOneRecord("SELECT data, state FROM monitor_data WHERE type = 'services' and server_id = " . $_SESSION['monitor']['server_id'] . " order by created desc"); - - if(isset($record['data'])) { - $data = unserialize($record['data']); - - /* - Format the data - */ - $html .= '<table id="system_services">'; - - if($data['webserver'] == true) { - $status = '<span class="online">Online</span>'; - } else { - $status = '<span class="offline">Offline</span>'; - } - $html .= '<tr> - <td>Web-Server:</td> - <td>'.$status.'</td> - </tr>'; - - - if($data['ftpserver'] == true) { - $status = '<span class="online">Online</span>'; - } else { - $status = '<span class="offline">Offline</span>'; - } - $html .= '<tr> - <td>FTP-Server:</td> - <td>'.$status.'</td> - </tr>'; - - if($data['smtpserver'] == true) { - $status = '<span class="online">Online</span>'; - } else { - $status = '<span class="offline">Offline</span>'; - } - $html .= '<tr> - <td>SMTP-Server:</td> - <td>'.$status.'</td> - </tr>'; - - if($data['pop3server'] == true) { - $status = '<span class="online">Online</span>'; - } else { - $status = '<span class="offline">Offline</span>'; - } - $html .= '<tr> - <td>POP3-Server:</td> - <td>'.$status.'</td> - </tr>'; - - if($data['bindserver'] == true) { - $status = '<span class="online">Online</span>'; - } else { - $status = '<span class="offline">Offline</span>'; - } - $html .= '<tr> - <td>DNS-Server:</td> - <td>'.$status.'</td> - </tr>'; - - if($data['mysqlserver'] == true) { - $status = '<span class="online">Online</span>'; - } else { - $status = '<span class="offline">Offline</span>'; - } - $html .= '<tr> - <td>mySQL-Server:</td> - <td>'.$status.'</td> - </tr>'; - - - $html .= '</table></div>'; - } else { - $html = '<p>'.$app->lng("no_data_services_txt").'</p>'; - } - - - return $html; -} ?> \ No newline at end of file diff --git a/interface/web/monitor/show_log.php b/interface/web/monitor/show_log.php index 706134b..3f2cabd 100644 --- a/interface/web/monitor/show_log.php +++ b/interface/web/monitor/show_log.php @@ -43,7 +43,6 @@ $refresh = (isset($_GET["refresh"]))?intval($_GET["refresh"]):0; $logParam = $_GET["log"]; - /* Setting the db-type and the caption */ diff --git a/interface/web/monitor/show_sys_state.php b/interface/web/monitor/show_sys_state.php new file mode 100644 index 0000000..20db251 --- /dev/null +++ b/interface/web/monitor/show_sys_state.php @@ -0,0 +1,365 @@ +<?php +/* +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, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of ISPConfig nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +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'); + +/* Change the Server if needed */ +if (isset($_GET['server'])){ + $server = explode('|', $_GET['server'], 2); + $_SESSION['monitor']['server_id'] = $server[0]; + $_SESSION['monitor']['server_name'] = $server[1]; +} + +/* + * Loading the template + */ +$app->uses('tpl'); +$app->tpl->newTemplate("form.tpl.htm"); +$app->tpl->setInclude('content_tpl','templates/show_sys_state.htm'); + +/* + * setting the content + */ +if ($_GET['state'] == 'server') +{ + $output = _getServerState($_SESSION['monitor']['server_id'], $_SESSION['monitor']['server_name'], true); + $title = "Server State"; +} +else +{ + $output = _getSysState(); + $title = "System State"; +} + +$app->tpl->setVar("state_data",$output); +$app->tpl->setVar("title",$title); +$app->tpl->setVar("description",$description); + +/* + * doing the output + */ +$app->tpl_defaults(); +$app->tpl->pparse(); + + +function _getSysState(){ + global $app; + + /* + * Get all Servers and calculate the state of them + */ + $html = ''; + + $servers = $app->db->queryAllRecords("SELECT server_id, server_name FROM server order by server_name"); + foreach ($servers as $server) + { + $html .= _getServerState($server['server_id'], $server['server_name'], false); + } + + return $html; +} + +/* + * Calculates the State of ONE Server + */ +function _getServerState($serverId, $serverName, $showAll) +{ + global $app; + + /* The State of the server */ + $serverState = 'unknown'; + + /** The Number of several infos, warnings, errors, ... */ + $count = array('unknown' => 0, 'info' => 0, 'warning' => 0, 'critical' => 0, 'error' => 0); + + /** The messages */ + $messages = array(); + + /** The Result of the function */ + $res = ''; + + /* + * get all monitoring-data from the server als process then + * (count them and set the server-state) + */ + $records = $app->db->queryAllRecords("SELECT DISTINCT type FROM monitor_data WHERE server_id = " . $serverId); + foreach($records as $record){ + _processDbState($record['type'], $serverId, &$serverState, &$messages); + } + + $res .= '<div class="systemmonitor-state systemmonitor-state-' . $serverState . '">'; + $res .= '<div class="systemmonitor-serverstate">'; + $res .= '<div class="systemmonitor-state-' . $serverState . '-icon">'; + $res .= 'Server: ' . $serverName . '<br />'; + $res .= 'State: ' . $serverState . '<br />'; + // $res .= sizeof($messages['ok']) . ' ok | '; + $res .= sizeof($messages['unknown']) . ' unknown | '; + $res .= sizeof($messages['info']) . ' info | '; + $res .= sizeof($messages['warning']) . ' warning | '; + $res .= sizeof($messages['critical']) . ' critical | '; + $res .= sizeof($messages['error']) . ' error <br />'; + $res .= '<br />'; + if ($showAll){ + /* + * if we have to show all, then we do it... + */ + + /* + * Show all messages + */ + foreach($messages as $key => $state){ + /* + * There is no need, to show the "ok" - messages + */ + if ($key != 'ok') + { + $res .= $key . ':<br />'; + foreach ($state as $msg) + { + $res .= $msg . '<br />'; + } + $res .= '<br />'; + } + } + } + else + { + /* + * if not, we only show a link to the server... + */ + $res .= "<a href='#' onclick='loadContent(\"monitor/show_sys_state.php?state=server&server=" . $serverId . '|' . $serverName . "\");'> More information...</a>"; + } + $res .= '</div>'; + $res .= '</div>'; + $res .= '</div>'; + + if ($showAll){ + /* + * Show some state-info + */ + $res .= showServerLoad(); + $res .= ' '. showDiskUsage(); + $res .= ' '.showServices(); + } + + + return $res; +} + +/* + * gets the state from the db and process it + */ +function _processDbState($type, $serverId, &$serverState, &$messages) +{ + global $app; + + /* + * Always the NEWEST record of each monitoring is responsible for the + * state + */ + // get the State from the DB + $record = $app->db->queryOneRecord("SELECT state FROM monitor_data WHERE type = '" . $type . "' and server_id = " . $serverId . " order by created desc"); + // change the new state to the highest state + $serverState = _setState($serverState, $record['state']); + // count the states + $count[$record['state']]+= 1; + + /* + * The message depands on the type and the state + */ + if ($type == 'cpu_info'){ + /* this type has no state */ + } + if ($type == 'disk_usage'){ + switch ($record['state']) { + case 'ok': + $messages['ok'][] = 'The state of your Hard-Disk space is ok ' . + "<a href='#' onclick='loadContent(\"monitor/show_data.php?type=disk_usage\");'>[more...]</a>"; + break; + case 'info': + $messages['info'][] = 'Your Hard-Disk space is going full ' . + "<a href='#' onclick='loadContent(\"monitor/show_data.php?type=disk_usage\");'>[more...]</a>"; + break; + case 'warning': + $messages['warning'][] = 'Your Hard-Disk is nearly full ' . + "<a href='#' onclick='loadContent(\"monitor/show_data.php?type=disk_usage\");'>[more...]</a>"; + break; + case 'critical': + $messages['critical'][] = 'Your Hard-Disk is very full '. + "<a href='#' onclick='loadContent(\"monitor/show_data.php?type=disk_usage\");'>[more...]</a>"; + break; + case 'error': + $messages['error'][] = 'Your Hard-Disk has no more space left ' . + "<a href='#' onclick='loadContent(\"monitor/show_data.php?type=disk_usage\");'>[more...]</a>"; + break; + + default: + $messages['unknown'][] = 'Hard-Disk: ??? ' . + "<a href='#' onclick='loadContent(\"monitor/show_data.php?type=disk_usage\");'>[more...]</a>"; + break; + } + } + if ($type == 'mem_usage'){ + /* this type has no state */ + } + if ($type == 'server_load'){ + switch ($record['state']) { + case 'ok': + $messages['ok'][] = 'Your Server load is ok ' . + "<a href='#' onclick='loadContent(\"monitor/show_data.php?type=server_load\");'>[more...]</a>"; + break; + case 'info': + $messages['info'][] = 'Your Server in under heavy load ' . + "<a href='#' onclick='loadContent(\"monitor/show_data.php?type=server_load\");'>[more...]</a>"; + break; + case 'warning': + $messages['warning'][] = 'Your Server in under high load ' . + "<a href='#' onclick='loadContent(\"monitor/show_data.php?type=server_load\");'>[more...]</a>"; + break; + case 'critical': + $messages['critical'][] = 'Your Server in under higher load ' . + "<a href='#' onclick='loadContent(\"monitor/show_data.php?type=server_load\");'>[more...]</a>"; + break; + case 'error': + $messages['error'][] = 'Your Server in under highest load ' . + "<a href='#' onclick='loadContent(\"monitor/show_data.php?type=server_load\");'>[more...]</a>"; + break; + default: + $messages['unknown'][] = 'Server Load: ??? ' . + "<a href='#' onclick='loadContent(\"monitor/show_data.php?type=server_load\");'>[more...]</a>"; + break; + } + } + if ($type == 'services'){ + switch ($record['state']) { + case 'ok': + $messages['error'][] = 'All needed Services are online ' . + "<a href='#' onclick='loadContent(\"monitor/show_data.php?type=services\");'>[more...]</a>"; + + break; + case 'error': + $messages['error'][] = 'One or more needed Services are offline ' . + "<a href='#' onclick='loadContent(\"monitor/show_data.php?type=services\");'>[more...]</a>"; + break; + default: + $messages['unknown'][] = 'services:??? ' . + "<a href='#' onclick='loadContent(\"monitor/show_data.php?type=services\");'>[more...]</a>"; + break; + } + } + if ($type == 'log_clamav'){ + /* this type has no state */ + } + if ($type == 'log_freshclam'){ + /* this type has no state */ + } + if ($type == 'log_ispconfig'){ + /* this type has no state */ + } + if ($type == 'log_mail'){ + /* this type has no state */ + } + if ($type == 'log_mail_err'){ + /* this type has no state */ + } + if ($type == 'log_mail_warn'){ + /* this type has no state */ + } + if ($type == 'log_messages'){ + /* this type has no state */ + } +} + + /* + * Set the state to the given level (or higher, but not lesser). + * * If the actual state is critical and you call the method with ok, + * then the state is critical. + * + * * If the actual state is critical and you call the method with error, + * then the state is error. + */ +function _setState($oldState, $newState) +{ + /* + * Calculate the weight of the old state + */ + switch ($oldState) { + case 'no_state': $oldInt = 0; + break; + case 'unknown': $oldInt = 1; + break; + case 'ok': $oldInt = 2; + break; + case 'info': $oldInt = 3; + break; + case 'warning': $oldInt = 4; + break; + case 'critical': $oldInt = 5; + break; + case 'error': $oldInt = 6; + break; + } + /* + * Calculate the weight of the new state + */ + switch ($newState) { + case 'no_state': $newInt = 0 ; + break; + case 'ok': $newInt = 1 ; + break; + case 'unknown': $newInt = 2 ; + break; + case 'info': $newInt = 3 ; + break; + case 'warning': $newInt = 4 ; + break; + case 'critical': $newInt = 5 ; + break; + case 'error': $newInt = 6 ; + break; + } + + /* + * Set to the higher level + */ + if ($newInt > $oldInt){ + return $newState; + } + else + { + return $oldState; + } +} + +?> \ No newline at end of file diff --git a/interface/web/monitor/templates/show_sys_state.htm b/interface/web/monitor/templates/show_sys_state.htm new file mode 100644 index 0000000..8281f0b --- /dev/null +++ b/interface/web/monitor/templates/show_sys_state.htm @@ -0,0 +1,19 @@ +<h2><tmpl_var name="title"></h2> + +<div class="panel"> + + <!--div class="pnl_toolsarea"> + <fieldset><legend>Tools</legend> + <div class="buttons"> + <select name="refreshinterval" id="refreshinterval" onChange="loadContentRefresh('monitor/show_log.php?log={tmpl_var name="log_id"}')">{tmpl_var name="refresh"}</select> + </div> + </fieldset> + </div--> + + <div class="pnl_formarea"> + <fieldset><!-- legend>Sys-State</legend --> + <div class="stateview"><tmpl_var name="state_data"></div> + </fieldset> + </div> + +</div> diff --git a/interface/web/monitor/tools.inc.php b/interface/web/monitor/tools.inc.php new file mode 100644 index 0000000..a238671 --- /dev/null +++ b/interface/web/monitor/tools.inc.php @@ -0,0 +1,244 @@ +<?php +function showServerLoad(){ + global $app; + + /* fetch the Data from the DB */ + $record = $app->db->queryOneRecord("SELECT data, state FROM monitor_data WHERE type = 'server_load' and server_id = " . $_SESSION['monitor']['server_id'] . " order by created desc"); + + if(isset($record['data'])) { + $data = unserialize($record['data']); + + /* + Format the data + */ + $html .= + '<table id="system_load"> + <tr> + <td>' . $app->lng("Server online since").':</td> + <td>' . $data['up_days'] . ' days, ' . $data['up_hours'] . ':' . $data['up_minutes'] . ' hours</center></td> + </tr> + <tr> + <td>' . $app->lng("Users online").':</td> + <td>' . $data['user_online'] . '</td> + </tr>' . + '<tr> + <td>' . $app->lng("System load 1 minute") . ':</td> + <td>' . $data['load_1'] . '</td> + </tr> + <tr> + <td>' . $app->lng("System load 5 minutes") . ':</td> + <td>' . $data['load_5'] . '</td> + </tr> + <tr> + <td>'.$app->lng("System load 15 minutes").':</td> + <td>' . $data['load_15'] . '</td> + </tr> + </table>'; + } else { + $html = '<p>'.$app->lng("no_data_serverload_txt").'</p>'; + } + + return $html; +} + +function showDiskUsage () { + global $app; + + /* fetch the Data from the DB */ + $record = $app->db->queryOneRecord("SELECT data, state FROM monitor_data WHERE type = 'disk_usage' and server_id = " . $_SESSION['monitor']['server_id'] . " order by created desc"); + + if(isset($record['data'])) { + $data = unserialize($record['data']); + + /* + Format the data + */ + $html .= '<table id="system_disk">'; + foreach($data as $line) { + $html .= '<tr>'; + foreach ($line as $item) { + $html .= '<td>' . $item . '</td>'; + } + $html .= '</tr>'; + } + $html .= '</table>'; + } else { + $html = '<p>'.$app->lng("no_data_diskusage_txt").'</p>'; + } + + + return $html; +} + + +function showMemUsage () +{ + global $app; + + /* fetch the Data from the DB */ + $record = $app->db->queryOneRecord("SELECT data, state FROM monitor_data WHERE type = 'mem_usage' and server_id = " . $_SESSION['monitor']['server_id'] . " order by created desc"); + + if(isset($record['data'])) { + $data = unserialize($record['data']); + + /* + Format the data + */ + $html .= '<table id="system_memusage">'; + + foreach($data as $key => $value){ + if ($key != '') { + $html .= '<tr> + <td>' . $key . ':</td> + <td>' . $value . '</td> + </tr>'; + } + } + $html .= '</table>'; + } else { + $html = '<p>'.$app->lng("no_data_memusage_txt").'</p>'; + } + + return $html; +} + +function showCpuInfo () +{ + global $app; + + /* fetch the Data from the DB */ + $record = $app->db->queryOneRecord("SELECT data, state FROM monitor_data WHERE type = 'cpu_info' and server_id = " . $_SESSION['monitor']['server_id'] . " order by created desc"); + + if(isset($record['data'])) { + $data = unserialize($record['data']); + + /* + Format the data + */ + $html .= '<table id="system_cpu">'; + foreach($data as $key => $value){ + if ($key != '') { + $html .= '<tr> + <td>' . $key . ':</td> + <td>' . $value . '</td> + </tr>'; + } + } + $html .= '</table>'; + } else { + $html = '<p>'.$app->lng("no_data_cpuinfo_txt").'</p>'; + } + + return $html; +} + +function showServices () +{ + global $app; + + /* fetch the Data from the DB */ + $record = $app->db->queryOneRecord("SELECT data, state FROM monitor_data WHERE type = 'services' and server_id = " . $_SESSION['monitor']['server_id'] . " order by created desc"); + + if(isset($record['data'])) { + $data = unserialize($record['data']); + + /* + Format the data + */ + $html .= '<table id="system_services">'; + + if($data['webserver'] != -1) { + if($data['webserver'] == 1) { + $status = '<span class="online">Online</span>'; + } else { + $status = '<span class="offline">Offline</span>'; + } + $html .= '<tr> + <td>Web-Server:</td> + <td>'.$status.'</td> + </tr>'; + } + + + if($data['ftpserver'] != -1) { + if($data['ftpserver'] == 1) { + $status = '<span class="online">Online</span>'; + } else { + $status = '<span class="offline">Offline</span>'; + } + $html .= '<tr> + <td>FTP-Server:</td> + <td>'.$status.'</td> + </tr>'; + } + + if($data['smtpserver'] != -1) { + if($data['smtpserver'] == 1) { + $status = '<span class="online">Online</span>'; + } else { + $status = '<span class="offline">Offline</span>'; + } + $html .= '<tr> + <td>SMTP-Server:</td> + <td>'.$status.'</td> + </tr>'; + } + + if($data['pop3server'] != -1) { + if($data['pop3server'] == 1) { + $status = '<span class="online">Online</span>'; + } else { + $status = '<span class="offline">Offline</span>'; + } + $html .= '<tr> + <td>POP3-Server:</td> + <td>'.$status.'</td> + </tr>'; + } + + if($data['imapserver'] != -1) { + if($data['imapserver'] == 1) { + $status = '<span class="online">Online</span>'; + } else { + $status = '<span class="offline">Offline</span>'; + } + $html .= '<tr> + <td>IMAP-Server:</td> + <td>'.$status.'</td> + </tr>'; + } + + if($data['bindserver'] != -1) { + if($data['bindserver'] == 1) { + $status = '<span class="online">Online</span>'; + } else { + $status = '<span class="offline">Offline</span>'; + } + $html .= '<tr> + <td>DNS-Server:</td> + <td>'.$status.'</td> + </tr>'; + } + + if($data['mysqlserver'] != -1) { + if($data['mysqlserver'] == 1) { + $status = '<span class="online">Online</span>'; + } else { + $status = '<span class="offline">Offline</span>'; + } + $html .= '<tr> + <td>mySQL-Server:</td> + <td>'.$status.'</td> + </tr>'; + } + + + $html .= '</table></div>'; + } else { + $html = '<p>'.$app->lng("no_data_services_txt").'</p>'; + } + + + return $html; +} +?> diff --git a/interface/web/themes/default/css/screen/content_ispc.css b/interface/web/themes/default/css/screen/content_ispc.css index 28fd643..c97a364 100644 --- a/interface/web/themes/default/css/screen/content_ispc.css +++ b/interface/web/themes/default/css/screen/content_ispc.css @@ -3,7 +3,7 @@ * "Yet Another Multicolumn Layout" - (X)HTML/CSS Framework * * (en) Uniform design of ISPConfig elements - ISPConfig 3: default theme - * (de) Einheitliche Standardformatierungen f�r ISPConfig-Elemente - ISPConfig 3: default theme + * (de) Einheitliche Standardformatierungen f�r ISPConfig-Elemente - ISPConfig 3: default theme * * @copyright Copyright 2005-2008, Dirk Jesse * @license CC-A 2.0 (http://creativecommons.org/licenses/by/2.0/), @@ -94,8 +94,75 @@ table.list .tbl_row_uneven { background: #f0f8ff; } table.list tr:hover { background: #fffacd; } - - .systemmonitor table { + .systemmonitor-state { + margin:20px 0; + font-family: Consolas, "Lucida Console", "Courier New", monospace; + font-size: 0.9em; + } + .systemmonitor-state-unknown { + border: 1px solid #30302e; + background-color: #cecfc5; + } + .systemmonitor-state-ok { + border: 1px solid #23fb00; + background-color: #adffa2; + } + .systemmonitor-state-info { + border: 1px solid #fdff00; + background-color: #fdffa2; + } + .systemmonitor-state-warning { + border: 1px solid #ffa800; + background-color: #ffda93; + } + .systemmonitor-state-critical { + border: 1px solid #ff0000; + background-color: #ffb9b9; + } + .systemmonitor-state-error { + border: 1px solid #ff0000; + background-color: #ff7f7f; + } + .systemmonitor-systemstate { + background-image:url("../../icons/x64/network.png"); + background-repeat: no-repeat; + } + .systemmonitor-serverstate { + background-image:url("../../icons/x64/server.png"); + background-repeat: no-repeat; + } + .systemmonitor-state-unknown-icon { + padding:2px 10px 2px 80px; + background-image:url("../../icons/x32/state_unknown.png"); + background-repeat: no-repeat; + } + .systemmonitor-state-ok-icon { + padding:2px 10px 2px 80px; + background-image:url("../../icons/x32/state_ok.png"); + background-repeat: no-repeat; + } + .systemmonitor-state-info-icon { + padding:2px 10px 2px 80px; + background-image:url("../../icons/x32/state_info.png"); + background-repeat: no-repeat; + } + .systemmonitor-state-warning-icon { + padding:2px 10px 2px 80px; + background-image:url("../../icons/x32/state_warning.png"); + background-repeat: no-repeat; + } + .systemmonitor-state-critical-icon { + padding:2px 10px 2px 80px; + background-image:url("../../icons/x32/state_critical.png"); + background-repeat: no-repeat; + } + .systemmonitor-state-error-icon { + padding:2px 10px 2px 80px; + background-image:url("../../icons/x32/state_error.png"); + background-repeat: no-repeat; + } + + .systemmonitor table { border: 1px solid #d3d3d3; width: 80%; margin-top: 10px; diff --git a/interface/web/themes/default/icons/x32/state_critical.png b/interface/web/themes/default/icons/x32/state_critical.png new file mode 100644 index 0000000..501424b --- /dev/null +++ b/interface/web/themes/default/icons/x32/state_critical.png Binary files differ diff --git a/interface/web/themes/default/icons/x32/state_error.png b/interface/web/themes/default/icons/x32/state_error.png new file mode 100644 index 0000000..b9a2911 --- /dev/null +++ b/interface/web/themes/default/icons/x32/state_error.png Binary files differ diff --git a/interface/web/themes/default/icons/x32/state_info.png b/interface/web/themes/default/icons/x32/state_info.png new file mode 100644 index 0000000..f59130d --- /dev/null +++ b/interface/web/themes/default/icons/x32/state_info.png Binary files differ diff --git a/interface/web/themes/default/icons/x32/state_ok.png b/interface/web/themes/default/icons/x32/state_ok.png new file mode 100644 index 0000000..ab86df2 --- /dev/null +++ b/interface/web/themes/default/icons/x32/state_ok.png Binary files differ diff --git a/interface/web/themes/default/icons/x32/state_unknown.png b/interface/web/themes/default/icons/x32/state_unknown.png new file mode 100644 index 0000000..4769446 --- /dev/null +++ b/interface/web/themes/default/icons/x32/state_unknown.png Binary files differ diff --git a/interface/web/themes/default/icons/x32/state_warning.png b/interface/web/themes/default/icons/x32/state_warning.png new file mode 100644 index 0000000..704cf4b --- /dev/null +++ b/interface/web/themes/default/icons/x32/state_warning.png Binary files differ diff --git a/interface/web/themes/default/icons/x64/network.png b/interface/web/themes/default/icons/x64/network.png new file mode 100644 index 0000000..f4c2074 --- /dev/null +++ b/interface/web/themes/default/icons/x64/network.png Binary files differ diff --git a/interface/web/themes/default/icons/x64/server.png b/interface/web/themes/default/icons/x64/server.png new file mode 100644 index 0000000..22a95e9 --- /dev/null +++ b/interface/web/themes/default/icons/x64/server.png Binary files differ diff --git a/server/mods-available/monitor_core_module.inc.php b/server/mods-available/monitor_core_module.inc.php index dd5443b..452d0c5 100644 --- a/server/mods-available/monitor_core_module.inc.php +++ b/server/mods-available/monitor_core_module.inc.php @@ -27,714 +27,852 @@ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - class monitor_core_module { - - /* TODO: this should be a config - var instead of a "constant" */ - var $interval = 5; // do the monitoring every 5 minutes - - var $module_name = 'monitor_core_module'; - var $class_name = 'monitor_core_module'; - /* No actions at this time. maybe later... */ - var $actions_available = array(); - - /* - This function is called when the module is loaded - */ - - function onLoad() { - global $app; - - /* - Annonce the actions that where provided by this module, so plugins - can register on them. - */ - /* none at them moment */ - //$app->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(); - $this->monitorMemUsage(); - $this->monitorCpu(); - $this->monitorServices(); - $this->monitorMailLog(); - $this->monitorMailWarnLog(); - $this->monitorMailErrLog(); - $this->monitorMessagesLog(); - $this->monitorFreshClamLog(); - $this->monitorClamAvLog(); - $this->monitorIspConfigLog(); - } - - 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); + /* TODO: this should be a config - var instead of a "constant" */ + var $interval = 5; // do the monitoring every 5 minutes - $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 (". - $server_id . ", " . - "'" . $app->db->quote($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 - */ - $dfData = shell_exec("df"); - - // split into array - $df = explode("\n", $dfData); - // 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 (". - $server_id . ", " . - "'" . $app->db->quote($type) . "', " . - time() . ", " . - "'" . $app->db->quote(serialize($data)) . "', " . - "'" . $state . "'" . - ")"; - $app->db->query($sql); - } - - - function monitorMemUsage() - { - global $app; - global $conf; - - /* the id of the server as int */ - $server_id = intval($conf["server_id"]); - - /** The type of the data */ - $type = 'mem_usage'; - - /* Delete Data older than 10 minutes */ - $this->_delOldRecords($type, 10); - - /* - Fetch the data into a array - */ - $miData = shell_exec("cat /proc/meminfo"); - - $memInfo = explode("\n", $miData); - - foreach($memInfo as $line){ - $part = split(":", $line); - $key = trim($part[0]); - $tmp = explode(" ", trim($part[1])); - $value = 0; - if ($tmp[1] == 'kB') $value = $tmp[0] * 1024; - $data[$key] = $value; - } - - // 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 (". - $server_id . ", " . - "'" . $app->db->quote($type) . "', " . - time() . ", " . - "'" . $app->db->quote(serialize($data)) . "', " . - "'" . $state . "'" . - ")"; - $app->db->query($sql); - } + var $module_name = 'monitor_core_module'; + var $class_name = 'monitor_core_module'; + /* No actions at this time. maybe later... */ + var $actions_available = array(); - - function monitorCpu() - { - global $app; - global $conf; - - /* the id of the server as int */ - $server_id = intval($conf["server_id"]); - - /** 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 - */ - $cpuData = shell_exec("cat /proc/cpuinfo"); - $cpuInfo = explode("\n", $cpuData); - - foreach($cpuInfo as $line){ - $part = split(":", $line); - $key = trim($part[0]); - $value = trim($part[1]); - $data[$key] = $value; - } - - // 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 (". - $server_id . ", " . - "'" . $app->db->quote($type) . "', " . - time() . ", " . - "'" . $app->db->quote(serialize($data)) . "', " . - "'" . $state . "'" . - ")"; - $app->db->query($sql); - } + /* + This function is called when the module is loaded + */ + function onLoad() { + global $app; - - function monitorServices() - { - global $app; - global $conf; - - /* the id of the server as int */ - $server_id = intval($conf["server_id"]); - - /** The type of the data */ - $type = 'services'; - - /* There is only ONE Service-Data, so delete the old one */ - $this->_delOldRecords($type, 0); - - /* Monitor Webserver */ - if($this->_checkTcp('localhost',80)) { - $data['webserver'] = true; - } else { - $data['webserver'] = false; - } - - /* Monitor FTP-Server */ - if($this->_checkFtp('localhost',21)) { - $data['ftpserver'] = true; - } else { - $data['ftpserver'] = false; - } - - /* Monitor SMTP-Server */ - if($this->_checkTcp('localhost',25)) { - $data['smtpserver'] = true; - } else { - $data['smtpserver'] = false; - } - - /* Monitor POP3-Server */ - if($this->_checkTcp('localhost',110)) { - $data['pop3server'] = true; - } else { - $data['pop3server'] = false; - } - - /* Monitor BIND-Server */ - if($this->_checkTcp('localhost',53)) { - $data['bindserver'] = true; - } else { - $data['bindserver'] = false; - } - - /* Monitor MYSQL-Server */ - if($this->_checkTcp('localhost',3306)) { - $data['mysqlserver'] = true; - } else { - $data['mysqlserver'] = false; - } - - // 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 (". - $server_id . ", " . - "'" . $app->db->quote($type) . "', " . - time() . ", " . - "'" . $app->db->quote(serialize($data)) . "', " . - "'" . $state . "'" . - ")"; - $app->db->query($sql); - - } - - function monitorMailLog() - { - global $app; - global $conf; - - /* the id of the server as int */ - $server_id = intval($conf["server_id"]); - - /** The type of the data */ - $type = 'log_mail'; - - /* There is only ONE Log-Data, so delete the old one */ - $this->_delOldRecords($type, 0); - + /* + Annonce the actions that where provided by this module, so plugins + can register on them. + */ + /* none at them moment */ + //$app->plugins->announceEvents($this->module_name,$this->actions_available); - /* Get the data of the log */ - $data = $this->_getLogData($type); + /* + As we want to get notified of any changes on several database tables, + we register for them. - // 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 (". - $server_id . ", " . - "'" . $app->db->quote($type) . "', " . - time() . ", " . - "'" . $app->db->quote(serialize($data)) . "', " . - "'" . $state . "'" . - ")"; - $app->db->query($sql); - } - - function monitorMailWarnLog() - { - global $app; - global $conf; - - /* the id of the server as int */ - $server_id = intval($conf["server_id"]); - - /** 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); - - // 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 (". - $server_id . ", " . - "'" . $app->db->quote($type) . "', " . - time() . ", " . - "'" . $app->db->quote(serialize($data)) . "', " . - "'" . $state . "'" . - ")"; - $app->db->query($sql); - } - - function monitorMailErrLog() - { - global $app; - global $conf; - - /* the id of the server as int */ - $server_id = intval($conf["server_id"]); - - /** 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); - - // 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 (". - $server_id . ", " . - "'" . $app->db->quote($type) . "', " . - time() . ", " . - "'" . $app->db->quote(serialize($data)) . "', " . - "'" . $state . "'" . - ")"; - $app->db->query($sql); - } - - - function monitorMessagesLog() - { - global $app; - global $conf; - - /* the id of the server as int */ - $server_id = intval($conf["server_id"]); - - /** 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); - - // 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 (". - $server_id . ", " . - "'" . $app->db->quote($type) . "', " . - time() . ", " . - "'" . $app->db->quote(serialize($data)) . "', " . - "'" . $state . "'" . - ")"; - $app->db->query($sql); - } - - function monitorFreshClamLog() - { - global $app; - global $conf; - - /* the id of the server as int */ - $server_id = intval($conf["server_id"]); - - /** The type of the data */ - $type = 'log_freshclam'; - - /* 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); - - // 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 (". - $server_id . ", " . - "'" . $app->db->quote($type) . "', " . - time() . ", " . - "'" . $app->db->quote(serialize($data)) . "', " . - "'" . $state . "'" . - ")"; - $app->db->query($sql); - } - - function monitorClamAvLog() - { - global $app; - global $conf; - - /* the id of the server as int */ - $server_id = intval($conf["server_id"]); - - /** The type of the data */ - $type = 'log_clamav'; - - /* 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); - - // 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 (". - $server_id . ", " . - "'" . $app->db->quote($type) . "', " . - time() . ", " . - "'" . $app->db->quote(serialize($data)) . "', " . - "'" . $state . "'" . - ")"; - $app->db->query($sql); - } + 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'); - function monitorIspConfigLog() - { - global $app; - global $conf; - - /* the id of the server as int */ - $server_id = intval($conf["server_id"]); - - /** The type of the data */ - $type = 'log_ispconfig'; - - /* 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); - - // 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 (". - $server_id . ", " . - "'" . $app->db->quote($type) . "', " . - time() . ", " . - "'" . $app->db->quote(serialize($data)) . "', " . - "'" . $state . "'" . - ")"; - $app->db->query($sql); - } - - - function _getLogData($log){ - switch($log) { - case 'log_mail': - $logfile = '/var/log/mail.log'; - break; - case 'log_mail_warn': - $logfile = '/var/log/mail.warn'; - break; - case 'log_mail_err': - $logfile = '/var/log/mail.err'; - break; - case 'log_messages': - $logfile = '/var/log/messages'; - break; - case 'log_freshclam': - $logfile = '/var/log/clamav/freshclam.log'; - break; - case 'log_clamav': - $logfile = '/var/log/clamav/clamav.log'; - break; - case 'log_ispconfig': - $logfile = '/var/log/ispconfig/ispconfig.log'; - break; - default: - $logfile = ''; - break; - } - - // Getting the logfile content - if($logfile != '') { - $logfile = escapeshellcmd($logfile); - if(stristr($logfile,';')) die('Logfile path error.'); - - $log = ''; - if(is_readable($logfile)) { - if($fd = popen("tail -n 30 $logfile", 'r')) { - while (!feof($fd)) { - $log .= fgets($fd, 4096); - $n++; - if($n > 1000) break; - } - fclose($fd); - } - } else { - $log = 'Unable to read '.$logfile; - } - } - - return $log; - } - - function _checkTcp ($host,$port) { - - $fp = @fsockopen ($host, $port, &$errno, &$errstr, 2); - - if ($fp) { - return true; - fclose($fp); - } else { - return false; - fclose($fp); - } - } - - function _checkUdp ($host,$port) { - - $fp = @fsockopen ('udp://'.$host, $port, &$errno, &$errstr, 2); - - if ($fp) { - return true; - fclose($fp); - } else { - return false; - fclose($fp); - } - } - - function _checkFtp ($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($type) . "' " . - "AND " . - "created < " . $old; - $app->db->query($sql); - } - - + /* + 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(); + $this->monitorMemUsage(); + $this->monitorCpu(); + $this->monitorServices(); + $this->monitorMailLog(); + $this->monitorMailWarnLog(); + $this->monitorMailErrLog(); + $this->monitorMessagesLog(); + $this->monitorFreshClamLog(); + $this->monitorClamAvLog(); + $this->monitorIspConfigLog(); + } + + 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])); + + /** The state of the server-load. */ + $state = 'ok'; + if ($data['load_1'] > 20 ) $state = 'info'; + if ($data['load_1'] > 50 ) $state = 'warning'; + if ($data['load_1'] > 100 ) $state = 'critical'; + if ($data['load_1'] > 150 ) $state = 'error'; + + /* + 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); + } + + 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); + + /** The state of the disk-usage */ + $state = 'ok'; + + /** Fetch the data into a array */ + $dfData = shell_exec("df"); + + // split into array + $df = explode("\n", $dfData); + + /* + * ignore the first line, process the rest + */ + for($i=1; $i <= sizeof($df); $i++){ + if ($df[$i] != '') + { + /* + * Make a array of the data + */ + $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]; + /* + * calculate the state + */ + $usePercent = floatval($data[$i]['percent']); + if ($usePercent > 75) $state = $this->_setState($state, 'info'); + if ($usePercent > 80) $state = $this->_setState($state, 'warning'); + if ($usePercent > 90) $state = $this->_setState($state, 'critical'); + if ($usePercent > 95) $state = $this->_setState($state, 'error'); + } + } + + + /* + 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); + } + + + function monitorMemUsage() + { + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'mem_usage'; + + /* Delete Data older than 10 minutes */ + $this->_delOldRecords($type, 10); + + /* + Fetch the data into a array + */ + $miData = shell_exec("cat /proc/meminfo"); + + $memInfo = explode("\n", $miData); + + foreach($memInfo as $line){ + $part = split(":", $line); + $key = trim($part[0]); + $tmp = explode(" ", trim($part[1])); + $value = 0; + if ($tmp[1] == 'kB') $value = $tmp[0] * 1024; + $data[$key] = $value; + } + + /* + * actually this info has no state. + * maybe someone knows better...???... + */ + $state = 'no_state'; + + /* + 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); + } + + + function monitorCpu() + { + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** 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 + */ + $cpuData = shell_exec("cat /proc/cpuinfo"); + $cpuInfo = explode("\n", $cpuData); + + foreach($cpuInfo as $line){ + $part = split(":", $line); + $key = trim($part[0]); + $value = trim($part[1]); + $data[$key] = $value; + } + + /* the cpu has no state. It is, what it is */ + $state = 'no_state'; + + /* + 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); + } + + + function monitorServices() + { + global $app; + global $conf; + + /** the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** get the "active" Services of the server from the DB */ + $services = $app->db->queryOneRecord("SELECT * FROM server WHERE server_id = " . $server_id); + + /* 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 + * There is no other state! + */ + $state = 'ok'; + + /* Monitor Webserver */ + $data['webserver'] = -1; // unknown - not needed + if ($services['web_server'] == 1) + { + if($this->_checkTcp('localhost', 80)) { + $data['webserver'] = 1; + } else { + $data['webserver'] = 0; + $state = 'error'; // because service is down + } + } + + /* Monitor FTP-Server */ + $data['ftpserver'] = -1; // unknown - not needed + if ($services['file_server'] == 1) + { + if($this->_checkFtp('localhost', 21)) { + $data['ftpserver'] = 1; + } else { + $data['ftpserver'] = 0; + $state = 'error'; // because service is down + } + } + + /* Monitor SMTP-Server */ + $data['smtpserver'] = -1; // unknown - not needed + if ($services['mail_server'] == 1) + { + if($this->_checkTcp('localhost', 25)) { + $data['smtpserver'] = 1; + } else { + $data['smtpserver'] = 0; + $state = 'error'; // because service is down + } + } + + /* Monitor POP3-Server */ + $data['pop3server'] = -1; // unknown - not needed + if ($services['mail_server'] == 1) + { + if($this->_checkTcp('localhost', 110)) { + $data['pop3server'] = 1; + } else { + $data['pop3server'] = 0; + $state = 'error'; // because service is down + } + } + + /* Monitor IMAP-Server */ + $data['imapserver'] = -1; // unknown - not needed + if ($services['mail_server'] == 1) + { + if($this->_checkTcp('localhost', 143)) { + $data['imapserver'] = 1; + } else { + $data['imapserver'] = 0; + $state = 'error'; // because service is down + } + } + + /* Monitor BIND-Server */ + $data['bindserver'] = -1; // unknown - not needed + if ($services['dns_server'] == 1) + { + if($this->_checkTcp('localhost', 53)) { + $data['bindserver'] = 1; + } else { + $data['bindserver'] = 0; + $state = 'error'; // because service is down + } + } + + /* Monitor MYSQL-Server */ + $data['mysqlserver'] = -1; // unknown - not needed + if ($services['db_server'] == 1) + { + if($this->_checkTcp('localhost', 3306)) { + $data['mysqlserver'] = 1; + } else { + $data['mysqlserver'] = 0; + $state = 'error'; // because service is down + } + } + + + /* + 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); + + } + + function monitorMailLog() + { + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** 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); + + /* + * actually this info has no state. + * maybe someone knows better...???... + */ + $state = 'no_state'; + + /* + 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); + } + + function monitorMailWarnLog() + { + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** 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); + + /* + * actually this info has no state. + * maybe someone knows better...???... + */ + $state = 'no_state'; + + /* + 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); + } + + function monitorMailErrLog() + { + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** 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); + + /* + * actually this info has no state. + * maybe someone knows better...???... + */ + $state = 'no_state'; + + /* + 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); + } + + + function monitorMessagesLog() + { + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** 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); + + /* + * actually this info has no state. + * maybe someone knows better...???... + */ + $state = 'no_state'; + + /* + 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); + } + + function monitorFreshClamLog() + { + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'log_freshclam'; + + /* 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); + + // Todo: the state should be calculated. + $state = 'ok'; + + /* + 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); + } + + function monitorClamAvLog() + { + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'log_clamav'; + + /* 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); + + // Todo: the state should be calculated. + $state = 'ok'; + + /* + 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); + } + + function monitorIspConfigLog() + { + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'log_ispconfig'; + + /* 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); + + // Todo: the state should be calculated. + $state = 'ok'; + + /* + 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); + } + + + function _getLogData($log){ + switch($log) { + case 'log_mail': + $logfile = '/var/log/mail.log'; + break; + case 'log_mail_warn': + $logfile = '/var/log/mail.warn'; + break; + case 'log_mail_err': + $logfile = '/var/log/mail.err'; + break; + case 'log_messages': + $logfile = '/var/log/messages'; + break; + case 'log_freshclam': + $logfile = '/var/log/clamav/freshclam.log'; + break; + case 'log_clamav': + $logfile = '/var/log/clamav/clamav.log'; + break; + case 'log_ispconfig': + $logfile = '/var/log/ispconfig/ispconfig.log'; + break; + default: + $logfile = ''; + break; + } + + // Getting the logfile content + if($logfile != '') { + $logfile = escapeshellcmd($logfile); + if(stristr($logfile, ';')) { + $log = 'Logfile path error.'; + } + else + { + $log = ''; + if(is_readable($logfile)) { + if($fd = popen("tail -n 100 $logfile", 'r')) { + while (!feof($fd)) { + $log .= fgets($fd, 4096); + $n++; + if($n > 1000) break; + } + fclose($fd); + } + } else { + $log = 'Unable to read '.$logfile; + } + } + } + + return $log; + } + + function _checkTcp ($host,$port) { + + $fp = @fsockopen ($host, $port, &$errno, &$errstr, 2); + + if ($fp) { + fclose($fp); + return true; + } else { + return false; + } + } + + function _checkUdp ($host,$port) { + + $fp = @fsockopen ('udp://'.$host, $port, &$errno, &$errstr, 2); + + if ($fp) { + fclose($fp); + return true; + } else { + return false; + } + } + + function _checkFtp ($host,$port){ + + $conn_id = @ftp_connect($host, $port); + + if($conn_id){ + @ftp_close($conn_id); + return true; + } else { + 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($type) . "' " . + "AND " . + "created < " . $old; + $app->db->query($sql); + } + + /* + * Set the state to the given level (or higher, but not lesser). + * * If the actual state is critical and you call the method with ok, + * then the state is critical. + * + * * If the actual state is critical and you call the method with error, + * then the state is error. + */ + function _setState($oldState, $newState) + { + /* + * Calculate the weight of the old state + */ + switch ($oldState) { + case 'no_state': $oldInt = 0; + break; + case 'ok': $oldInt = 1; + break; + case 'unknown': $oldInt = 2; + break; + case 'info': $oldInt = 3; + break; + case 'warning': $oldInt = 4; + break; + case 'critical': $oldInt = 5; + break; + case 'error': $oldInt = 6; + break; + } + /* + * Calculate the weight of the new state + */ + switch ($newState) { + case 'no_state': $newInt = 0 ; + break; + case 'unknown': $newInt = 1 ; + break; + case 'ok': $newInt = 2 ; + break; + case 'info': $newInt = 3 ; + break; + case 'warning': $newInt = 4 ; + break; + case 'critical': $newInt = 5 ; + break; + case 'error': $newInt = 6 ; + break; + } + + /* + * Set to the higher level + */ + if ($newInt > $oldInt){ + return $newState; + } + else + { + return $oldState; + } + } + + } // end class ?> \ No newline at end of file -- Gitblit v1.9.1