From b7489f78bfe6d641ba597ee65e87700084d39854 Mon Sep 17 00:00:00 2001 From: vogelor <vogelor@ispconfig3> Date: Sun, 02 Nov 2008 15:45:25 -0500 Subject: [PATCH] First version of the new monitor - module (works for more than one server) It is now possible to add "navigation-text" without links (actions) to the left navigations-side of the template (needed by the monitor module to add the server-dropdown) --- /dev/null | 19 - interface/web/monitor/templates/show_log.htm | 19 + install/sql/ispconfig3.sql | 2 interface/web/monitor/templates/show_data.htm | 0 server/mods-available/monitor_core_module.inc.php | 317 ++++++++++++++++++++ interface/web/themes/default/templates/sidenav.tpl.htm | 20 + interface/web/monitor/lib/module.conf.php | 82 ++++- interface/web/monitor/show_data.php | 302 ++++++++++++++++++++ interface/web/monitor/show_log.php | 116 +++++++ 9 files changed, 829 insertions(+), 48 deletions(-) diff --git a/install/sql/ispconfig3.sql b/install/sql/ispconfig3.sql index efa2462..a6136d5 100644 --- a/install/sql/ispconfig3.sql +++ b/install/sql/ispconfig3.sql @@ -1074,7 +1074,7 @@ `type` varchar(255) NOT NULL, `created` int(11) NOT NULL, `data` mediumtext NOT NULL, - `state` enum('unknown','ok','warning','error') NOT NULL default 'unknown', + `state` enum('unknown','ok','warning','critical', 'error') NOT NULL default 'unknown', PRIMARY KEY (`server_id`,`type`,`created`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; diff --git a/interface/web/monitor/lib/module.conf.php b/interface/web/monitor/lib/module.conf.php index f49ee79..259e349 100644 --- a/interface/web/monitor/lib/module.conf.php +++ b/interface/web/monitor/lib/module.conf.php @@ -1,42 +1,84 @@ <?php +/* + Config of the Module + */ $module["name"] = "monitor"; $module["title"] = "Monitor"; $module["template"] = "module.tpl.htm"; -$module["startpage"] = "monitor/system.php?mod=index"; $module["tab_width"] = ''; +$module["startpage"] = "monitor/system.php?type=overview"; + +/* + We need all the available servers on the left navigation. + So fetch them from the database and add then to the navigation as dropdown-list +*/ +$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);\">"; +foreach ($servers as $server) +{ + $dropDown .= "<option value='" . $server['server_id'] . "|" . $server['server_name'] . "'>" . $server['server_name'] . "</option>"; +} +$dropDown .= "</select>"; + +/* + Now add them as dropdown to the navigation + */ +$items[] = array( 'title' => $dropDown, + 'target' => '', // no action! + 'link' => ''); // no action! + +$module["nav"][] = array( 'title' => 'Server to Monitor', + 'open' => 1, + 'items' => $items); + +/* + The first Server at the list is the server first selected + */ +$_SESSION['monitor']['server_id'] = $servers[0]['server_id']; +$_SESSION['monitor']['server_name'] = $servers[0]['server_name']; /* Logmonitoring module */ - -$items[] = array( 'title' => "Load", +// aufr�umen +unset($items); +$items[] = array( 'title' => "Server Load", 'target' => 'content', - 'link' => 'monitor/system.php?mod=load'); + 'link' => 'monitor/show_data.php?type=server_load'); -$items[] = array( 'title' => "Harddisk", +$items[] = array( 'title' => "Disk usage", 'target' => 'content', - 'link' => 'monitor/system.php?mod=disk'); + 'link' => 'monitor/show_data.php?type=disk_usage'); $items[] = array( 'title' => "Memory usage", 'target' => 'content', - 'link' => 'monitor/system.php?mod=memusage'); - -$items[] = array( 'title' => "CPU", - 'target' => 'content', - 'link' => 'monitor/system.php?mod=cpu'); + 'link' => 'monitor/show_data.php?type=mem_usage'); $items[] = array( 'title' => "Services", 'target' => 'content', - 'link' => 'monitor/system.php?mod=services'); + 'link' => 'monitor/show_data.php?type=services'); -$module["nav"][] = array( 'title' => 'System', +$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); + /* Logmonitoring module @@ -44,31 +86,31 @@ $items[] = array( 'title' => "Mail log", 'target' => 'content', - 'link' => 'monitor/logview.php?log=mail_log'); + 'link' => 'monitor/show_log.php?log=log_mail'); $items[] = array( 'title' => "Mail warn", 'target' => 'content', - 'link' => 'monitor/logview.php?log=mail_warn'); + 'link' => 'monitor/show_log.php?log=log_mail_warn'); $items[] = array( 'title' => "Mail err", 'target' => 'content', - 'link' => 'monitor/logview.php?log=mail_err'); + 'link' => 'monitor/show_log.php?log=log_mail_err'); $items[] = array( 'title' => "Messages", 'target' => 'content', - 'link' => 'monitor/logview.php?log=messages'); + 'link' => 'monitor/show_log.php?log=log_messages'); $items[] = array( 'title' => "Freshclam", 'target' => 'content', - 'link' => 'monitor/logview.php?log=freshclam'); + 'link' => 'monitor/show_log.php?log=log_freshclam'); $items[] = array( 'title' => "Clamav", 'target' => 'content', - 'link' => 'monitor/logview.php?log=clamav'); + 'link' => 'monitor/show_log.php?log=log_clamav'); $items[] = array( 'title' => "ISPConfig", 'target' => 'content', - 'link' => 'monitor/logview.php?log=ispconfig'); + 'link' => 'monitor/show_log.php?log=log_ispconfig'); $module["nav"][] = array( 'title' => 'Logfiles', diff --git a/interface/web/monitor/logview.php b/interface/web/monitor/logview.php deleted file mode 100644 index a6e2a29..0000000 --- a/interface/web/monitor/logview.php +++ /dev/null @@ -1,115 +0,0 @@ -<?php - -/* -Copyright (c) 2007, Till Brehm, projektfarm Gmbh -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'); - -//* Check permissions for module -$app->auth->check_module_permissions('monitor'); - -// Loading the template -$app->uses('tpl'); -$app->tpl->newTemplate("form.tpl.htm"); -$app->tpl->setInclude('content_tpl','templates/logview.htm'); - -// Importing the GET values -$refresh = intval($_GET["refresh"]); -$logfile_id = $_GET["log"]; - -// Creating the array with the refresh intervals -$refresh_values = array('0' => '- No Refresh -','2' => '2','5' => '5','10' => '10','15' => '15','30' => '30','60' => '60'); -$tmp = ''; -foreach($refresh_values as $key => $val) { - if($key == $refresh) { - $tmp .= "<option value='$key' SELECTED>$val</option>"; - } else { - $tmp .= "<option value='$key'>$val</option>"; - } -} -$app->tpl->setVar("refresh",$tmp); - -// Selecting the logfile -switch($logfile_id) { - case 'mail_log': - $logfile = '/var/log/mail.log'; - break; - case 'mail_warn': - $logfile = '/var/log/mail.warn'; - break; - case 'mail_err': - $logfile = '/var/log/mail.err'; - break; - case 'messages': - $logfile = '/var/log/messages'; - break; - case 'freshclam': - $logfile = '/var/log/clamav/freshclam.log'; - break; - case 'clamav': - $logfile = '/var/log/clamav/clamav.log'; - break; - case '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; - } -} - -$log = nl2br($log); - -$app->tpl->setVar("log",$log); -$app->tpl->setVar("logfile",$logfile); -$app->tpl->setVar("logfile_id",$logfile_id); - - -$app->tpl_defaults(); -$app->tpl->pparse(); -?> \ No newline at end of file diff --git a/interface/web/monitor/show_data.php b/interface/web/monitor/show_data.php new file mode 100644 index 0000000..a280bc1 --- /dev/null +++ b/interface/web/monitor/show_data.php @@ -0,0 +1,302 @@ +<?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'); + +//* Check permissions for module +$app->auth->check_module_permissions('monitor'); + + +/* 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 = 'Server Load (Server: ' . $_SESSION['monitor']['server_name'] . ')'; + $description = ''; + break; + case 'disk_usage': + $template = 'templates/show_data.htm'; + $output .= showDiskUsage(); + $title = 'Disk usage (Server: ' . $_SESSION['monitor']['server_name'] . ')'; + $description = ''; + break; + case 'mem_usage': + $template = 'templates/show_data.htm'; + $output .= showMemUsage(); + $title = 'Memory usage (Server: ' . $_SESSION['monitor']['server_name'] . ')'; + $description = ''; + break; + case 'cpu_info': + $template = 'templates/show_data.htm'; + $output .= showCpuInfo(); + $title = 'CPU info (Server: ' . $_SESSION['monitor']['server_name'] . ')'; + $description = ''; + break; + case 'services': + $template = 'templates/show_data.htm'; + $output .= showServices(); + $title = 'Status of services (Server: ' . $_SESSION['monitor']['server_name'] . ')'; + $description = ''; + break; + case 'overview': + $template = 'templates/show_data.htm'; + $output .= showServerLoad(); + $output .= ' '. showDiskUsage(); + $output .= ' '.showServices(); + $title = 'System Monitor (Server: ' . $_SESSION['monitor']['server_name'] . ')'; + $description = ''; + break; + default: + $template = ''; + break; +} + + +// 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_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"); + $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>'; + 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"); + $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>'; + + 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"); + $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>'; + 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"); + $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>'; + + 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"); + $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>'; + + + return $html; +} +?> \ No newline at end of file diff --git a/interface/web/monitor/show_log.php b/interface/web/monitor/show_log.php new file mode 100644 index 0000000..a64c786 --- /dev/null +++ b/interface/web/monitor/show_log.php @@ -0,0 +1,116 @@ +<?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'); + +//* Check permissions for module +$app->auth->check_module_permissions('monitor'); + +// Loading the template +$app->uses('tpl'); +$app->tpl->newTemplate("form.tpl.htm"); +$app->tpl->setInclude('content_tpl','templates/show_log.htm'); + +// Importing the GET values +$refresh = intval($_GET["refresh"]); +$logParam = $_GET["log"]; + + +/* + Setting the db-type and the caption + */ +switch($logParam) { + case 'log_mail': + $logId = 'log_mail'; + $title = 'Mail - Log (Server: ' . $_SESSION['monitor']['server_name'] . ')'; + break; + case 'log_mail_warn': + $logId = 'log_mail_warn'; + $title = 'Mail-Warn - Log (Server: ' . $_SESSION['monitor']['server_name'] . ')'; + break; + case 'log_mail_err': + $logId = 'log_mail_err'; + $title = 'Mail-Error - Log (Server: ' . $_SESSION['monitor']['server_name'] . ')'; + break; + case 'log_messages': + $logId = 'log_messages'; + $title = 'Messages (Server: ' . $_SESSION['monitor']['server_name'] . ')'; + break; + case 'log_freshclam': + $logId = 'log_freshclam'; + $title = 'Freshclam - Log (Server: ' . $_SESSION['monitor']['server_name'] . ')'; + break; + case 'log_clamav': + $logId = 'log_clamav'; + $title = 'Clamav - Log (Server: ' . $_SESSION['monitor']['server_name'] . ')'; + break; + case 'log_ispconfig': + $logId = 'log_ispconfig'; + $title = 'ISP Config - Log (Server: ' . $_SESSION['monitor']['server_name'] . ')'; + break; + default: + $logId = '???'; + $title = '???'; + break; +} + + +/* + Creating the array with the refresh intervals + Attention: the core-moule ist triggered every 5 minutes, + so reload every 2 minutes is impossible! +*/ +$refresh_values = array('0' => '- No Refresh -','5' => '5','10' => '10','15' => '15','30' => '30','60' => '60'); +$tmp = ''; +foreach($refresh_values as $key => $val) { + if($key == $refresh) { + $tmp .= "<option value='$key' SELECTED>$val</option>"; + } else { + $tmp .= "<option value='$key'>$val</option>"; + } +} +$app->tpl->setVar("refresh",$tmp); + + +/* fetch the Data from the DB */ +$record = $app->db->queryOneRecord("SELECT data, state FROM monitor_data WHERE type = '" . $app->db->quote($logId) . "' and server_id = " . $_SESSION['monitor']['server_id'] . " order by created desc"); +$data = unserialize($record['data']); + +$logData = nl2br($data); + +$app->tpl->setVar("log_data", $logData); +$app->tpl->setVar("title", $title); +$app->tpl->setVar("log_id",$logId); + + +$app->tpl_defaults(); +$app->tpl->pparse(); +?> \ No newline at end of file diff --git a/interface/web/monitor/system.php b/interface/web/monitor/system.php deleted file mode 100644 index 1d5c70a..0000000 --- a/interface/web/monitor/system.php +++ /dev/null @@ -1,392 +0,0 @@ -<?php - -/* -Copyright (c) 2007, Till Brehm, projektfarm Gmbh -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'); - -//* Check permissions for module -$app->auth->check_module_permissions('monitor'); - -$mod = $_GET["mod"]; -$output = ''; - -switch($mod) { - case 'load': - $template = 'templates/system.htm'; - $output .= show_load(); - $title = 'System Load'; - $description = ''; - break; - case 'disk': - $template = 'templates/system.htm'; - $output .= show_disk(); - $title = 'Disk usage'; - $description = ''; - break; - case 'memusage': - $template = 'templates/system.htm'; - $output .= show_memusage(); - $title = 'Memory usage'; - $description = ''; - break; - case 'cpu': - $template = 'templates/system.htm'; - $output .= show_cpu(); - $title = 'CPU Info'; - $description = ''; - break; - case 'services': - $template = 'templates/system.htm'; - $output .= show_services(); - $title = 'Status of services'; - $description = ''; - break; - case 'index': - $template = 'templates/system.htm'; - $output .= show_load(); - $output .= ' '. show_disk(); - $output .= ' '.show_services(); - $title = 'System Monitor'; - $description = ''; - break; - default: - $template = ''; - break; -} - - -// 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_defaults(); -$app->tpl->pparse(); - - - - -function show_load(){ - global $app; - - $html_out .= '<table id="system_load">'; - - $fd = popen ("uptime", "r"); - while (!feof($fd)) { - $buffer .= fgets($fd, 4096); - } - - $uptime = split(",",strrev($buffer)); - - $online = split(" ",strrev($uptime[4])); - - $proc_uptime = shell_exec("cat /proc/uptime | cut -f1 -d' '"); - $days = floor($proc_uptime/86400); - $hours = floor(($proc_uptime-$days*86400)/3600); - $minutes = str_pad(floor(($proc_uptime-$days*86400-$hours*3600)/60), 2, "0", STR_PAD_LEFT); - - $html_out .= '<tr> - <td>'.$app->lng("Server online since").':</td> - <td>'.$days.'d, '.$hours.':'.$minutes.'h</center></td> - </tr>'; - - $html_out .= '<tr> - <td>'.$app->lng("Users online").':</td> - <td>'.strrev($uptime[3]).'</td> - </tr>'; - - $ausl = split(":",strrev($uptime[2])); - $ausl1 = $ausl[1]; - - - $html_out .= '<tr> - <td>'.$app->lng("System load 1 minute").':</td> - <td>'.$ausl1.'</td> - </tr>'; - - $html_out .= '<tr> - <td>'.$app->lng("System load 5 minutes").':</td> - <td>'.strrev($uptime[1]).'</td> - </tr>'; - - $html_out .= '<tr> - <td>'.$app->lng("System load 15 minutes").':</td> - <td>'.strrev($uptime[0]).'</td> - </tr>'; - - $html_out .= '</table>'; - - - return $html_out; -} - -function show_disk () { - global $app; - - - $html_out .= '<table id="system_disk">'; - - $fd = popen ("df -h", "r"); - while (!feof($fd)) { - $buffer .= fgets($fd, 4096); - } - - $df_out = split("\n",$buffer); - $df_num = sizeof($df_out); - for($i=0;$i<$df_num;$i++){ - if(ltrim($df_out[$i]) != $df_out[$i]){ - if(isset($df_out[($i-1)])){ - $df_out[($i-1)] .= $df_out[$i]; - unset($df_out[$i]); - } - } - } - - $html_out .= '<tr>'; - $mrow = 0; - foreach($df_out as $df_line) { - $values = preg_split ("/[\s]+/", $df_line); - $mln = 0; - foreach($values as $value) { - $align = 'left'; - if($mln < 6 and $value != "") $html_out .= '<td>'.$value.'</td>'; - $mln++; - } - $mrow++; - - $html_out .= '</tr>'; - } - - - $html_out .= '</table>'; - - - return $html_out; -} - - -function show_memusage () - { - global $app; - - $html_out .= '<table id="system_memusage">'; - - $fd = fopen ("/proc/meminfo", "r"); - while (!feof($fd)) { - $buffer .= fgets($fd, 4096); - } - fclose($fd); - - $meminfo = split("\n",$buffer); - - foreach($meminfo as $mline){ - if($x > 2 and trim($mline) != "") { - - $mpart = split(":",$mline); - - $html_out .= '<tr> - <td>'.$mpart[0].':</td> - <td>'.$mpart[1].'</td> - </tr>'; - } - - $x++; - } - $html_out .= '</table>'; - return $html_out; -} - -function show_cpu () - { - global $app; - - $html_out .= '<table id="system_cpu">'; - - $n = 0; - if(is_readable("/proc/cpuinfo")) { - if($fd = fopen ("/proc/cpuinfo", "r")) { - while (!feof($fd)) { - $buffer .= fgets($fd, 4096); - $n++; - if($n > 100) break; - } - fclose($fd); - } - } - - $meminfo = split("\n",$buffer); - - if(is_array($meminfo)) { - foreach($meminfo as $mline){ - if(trim($mline) != "") { - - $mpart = split(":",$mline); - - $html_out .= '<tr> - <td>'.$mpart[0].':</td> - <td>'.$mpart[1].'</td> - </tr>'; - } - } - - $x++; - } - $html_out .= '</table></div>'; - - - return $html_out; - } - -function show_services () - { - global $app; - - $html_out .= '<table id="system_services">'; - - // Checke Webserver - if(_check_tcp('localhost',80)) { - $status = '<span class="online">Online</span>'; - } else { - $status = '<span class="offline">Offline</span>'; - } - $html_out .= '<tr> - <td>Web-Server:</td> - <td>'.$status.'</td> - </tr>'; - - - // Checke FTP-Server - if(_check_ftp('localhost',21)) { - $status = '<span class="online">Online</span>'; - } else { - $status = '<span class="offline">Offline</span>'; - } - $html_out .= '<tr> - <td>FTP-Server:</td> - <td>'.$status.'</td> - </tr>'; - - // Checke SMTP-Server - if(_check_tcp('localhost',25)) { - $status = '<span class="online">Online</span>'; - } else { - $status = '<span class="offline">Offline</span>'; - } - $html_out .= '<tr> - <td>SMTP-Server:</td> - <td>'.$status.'</td> - </tr>'; - - // Checke POP3-Server - if(_check_tcp('localhost',110)) { - $status = '<span class="online">Online</span>'; - } else { - $status = '<span class="offline">Offline</span>'; - } - $html_out .= '<tr> - <td>POP3-Server:</td> - <td>'.$status.'</td> - </tr>'; - - // Checke BIND-Server - if(_check_tcp('localhost',53)) { - $status = '<span class="online">Online</span>'; - } else { - $status = '<span class="offline">Offline</span>'; - } - $html_out .= '<tr> - <td>DNS-Server:</td> - <td>'.$status.'</td> - </tr>'; - - // Checke MYSQL-Server - //if($this->_check_tcp('localhost',3306)) { - $status = '<span class="online">Online</span>'; - //} else { - //$status = '<span class="offline">Offline</span>'; - //} - $html_out .= '<tr> - <td>mySQL-Server:</td> - <td>'.$status.'</td> - </tr>'; - - - $html_out .= '</table></div>'; - - - return $html_out; -} - -function _check_tcp ($host,$port) { - - $fp = @fsockopen ($host, $port, &$errno, &$errstr, 2); - - if ($fp) { - return true; - fclose($fp); - } else { - return false; - fclose($fp); - } -} - -function _check_udp ($host,$port) { - - $fp = @fsockopen ('udp://'.$host, $port, &$errno, &$errstr, 2); - - if ($fp) { - return true; - fclose($fp); - } else { - return false; - fclose($fp); - } -} - -function _check_ftp ($host,$port){ - - $conn_id = @ftp_connect($host, $port); - - if($conn_id){ - @ftp_close($conn_id); - return true; - } else { - @ftp_close($conn_id); - return false; - } -} - - -?> \ No newline at end of file diff --git a/interface/web/monitor/templates/logview.htm b/interface/web/monitor/templates/logview.htm deleted file mode 100644 index 2700709..0000000 --- a/interface/web/monitor/templates/logview.htm +++ /dev/null @@ -1,19 +0,0 @@ -<h2><tmpl_var name="title"></h2> - -<div class="panel panel_logview"> - - <div class="pnl_toolsarea"> - <fieldset><legend>Tools</legend> - <div class="buttons"> - <select name="refreshinterval" id="refreshinterval" onChange="loadContentRefresh('monitor/logview.php?log={tmpl_var name="logfile_id"}')">{tmpl_var name="refresh"}</select> - </div> - </fieldset> - </div> - - <div class="pnl_formarea"> - <fieldset><legend><tmpl_var name="logfile"></legend> - <div class="codeview"><tmpl_var name="log"></div> - </fieldset> - </div> - -</div> diff --git a/interface/web/monitor/templates/system.htm b/interface/web/monitor/templates/show_data.htm similarity index 100% rename from interface/web/monitor/templates/system.htm rename to interface/web/monitor/templates/show_data.htm diff --git a/interface/web/monitor/templates/show_log.htm b/interface/web/monitor/templates/show_log.htm new file mode 100644 index 0000000..7453310 --- /dev/null +++ b/interface/web/monitor/templates/show_log.htm @@ -0,0 +1,19 @@ +<h2><tmpl_var name="title"></h2> + +<div class="panel panel_logview"> + + <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></legend> + <div class="codeview"><tmpl_var name="log_data"></div> + </fieldset> + </div> + +</div> diff --git a/interface/web/themes/default/templates/sidenav.tpl.htm b/interface/web/themes/default/templates/sidenav.tpl.htm index 5795055..4626d36 100644 --- a/interface/web/themes/default/templates/sidenav.tpl.htm +++ b/interface/web/themes/default/templates/sidenav.tpl.htm @@ -1,8 +1,24 @@ <ul id="submenu"> <tmpl_loop name="nav_left"> - <li id="title"><a href="#" onClick="loadContent('<tmpl_var name='startpage'>')"><tmpl_var name="title"></a></li> + <li id="title"> + <tmpl_if name="startpage"> + <a href="#" onClick="loadContent('<tmpl_var name='startpage'>')"> + </tmpl_if> + <tmpl_var name="title"> + <tmpl_if name="startpage"> + </a> + </tmpl_if> + </li> <tmpl_loop name="items"> - <li><a href="#" onClick="loadContent('<tmpl_var name='link'>')"><tmpl_var name="title"></a></li> + <li> + <tmpl_if name="link"> + <a href="#" onClick="loadContent('<tmpl_var name='link'>')"> + </tmpl_if> + <tmpl_var name="title"> + <tmpl_if name="link"> + </a> + </tmpl_if> + </li> </tmpl_loop> </tmpl_loop> </ul> diff --git a/server/mods-available/monitor_core_module.inc.php b/server/mods-available/monitor_core_module.inc.php index ceed3ce..dd5443b 100644 --- a/server/mods-available/monitor_core_module.inc.php +++ b/server/mods-available/monitor_core_module.inc.php @@ -103,6 +103,13 @@ $this->monitorMemUsage(); $this->monitorCpu(); $this->monitorServices(); + $this->monitorMailLog(); + $this->monitorMailWarnLog(); + $this->monitorMailErrLog(); + $this->monitorMessagesLog(); + $this->monitorFreshClamLog(); + $this->monitorClamAvLog(); + $this->monitorIspConfigLog(); } function monitorServer(){ @@ -314,41 +321,42 @@ /* There is only ONE Service-Data, so delete the old one */ $this->_delOldRecords($type, 0); - // Checke Webserver + /* Monitor Webserver */ if($this->_checkTcp('localhost',80)) { $data['webserver'] = true; } else { $data['webserver'] = false; } - // Checke FTP-Server + /* Monitor FTP-Server */ if($this->_checkFtp('localhost',21)) { $data['ftpserver'] = true; } else { $data['ftpserver'] = false; } - // Checke SMTP-Server + /* Monitor SMTP-Server */ if($this->_checkTcp('localhost',25)) { $data['smtpserver'] = true; } else { $data['smtpserver'] = false; } - // Checke POP3-Server + + /* Monitor POP3-Server */ if($this->_checkTcp('localhost',110)) { $data['pop3server'] = true; } else { $data['pop3server'] = false; } - // Checke BIND-Server + /* Monitor BIND-Server */ if($this->_checkTcp('localhost',53)) { $data['bindserver'] = true; } else { $data['bindserver'] = false; } - // Checke MYSQL-Server + /* Monitor MYSQL-Server */ if($this->_checkTcp('localhost',3306)) { $data['mysqlserver'] = true; } else { @@ -372,7 +380,304 @@ $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); + + // 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); + } + + 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) { -- Gitblit v1.9.1