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 .= '&nbsp;'. showDiskUsage();
+		$output .= '&nbsp;'.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 .= '&nbsp;'. show_disk();
-		$output .= '&nbsp;'.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