From 7ae9f9d8abf342ac95290de38cd1f7a03994e6f3 Mon Sep 17 00:00:00 2001
From: tbrehm <t.brehm@ispconfig.org>
Date: Mon, 18 Jun 2007 21:26:32 +0000
Subject: [PATCH] Added monitoring module.

---
 interface/web/js/scrigo.js                  |  15 +
 interface/web/monitor/lib/admin.conf.php    |   2 +
 interface/web/monitor/lib/module.conf.php   |  76 ++++
 interface/web/monitor/logview.php           | 114 ++++++
 interface/web/monitor/system.php            | 398 ++++++++++++++++++++
 interface/web/monitor/templates/logview.htm |   5 +
 interface/web/monitor/templates/system.htm  |   3 +
 interface/web/themes/default/style.css      |   6 +
 8 files changed, 619 insertions(+)
 create mode 100644 interface/web/monitor/lib/admin.conf.php
 create mode 100644 interface/web/monitor/lib/module.conf.php
 create mode 100644 interface/web/monitor/logview.php
 create mode 100644 interface/web/monitor/system.php
 create mode 100644 interface/web/monitor/templates/logview.htm
 create mode 100644 interface/web/monitor/templates/system.htm

diff --git a/interface/web/js/scrigo.js b/interface/web/js/scrigo.js
index b0cba00b33..f72a0fd67f 100644
--- a/interface/web/js/scrigo.js
+++ b/interface/web/js/scrigo.js
@@ -1,5 +1,20 @@
 redirect = '';
 
+function loadContentRefresh(pagename) {
+	var pageContentCallbackRefresh = {
+		success: function(o) {
+			document.getElementById('pageContent').innerHTML = o.responseText;
+		},
+		failure: function(o) {
+			alert('Ajax Request was not successful.');
+		}
+	}
+	
+  if(document.getElementById('refreshinterval').value > 0) {
+  	var pageContentObject2 = YAHOO.util.Connect.asyncRequest('GET', pagename+"&refresh="+document.getElementById('refreshinterval').value, pageContentCallbackRefresh);
+  	setTimeout( "loadContentRefresh('"+pagename+"&refresh="+document.getElementById('refreshinterval').value+"')", document.getElementById('refreshinterval').value*1000 );
+  }
+}
 
 function capp(module) {
 	var cappCallback = {
diff --git a/interface/web/monitor/lib/admin.conf.php b/interface/web/monitor/lib/admin.conf.php
new file mode 100644
index 0000000000..a45d440345
--- /dev/null
+++ b/interface/web/monitor/lib/admin.conf.php
@@ -0,0 +1,2 @@
+<?php
+?>
\ No newline at end of file
diff --git a/interface/web/monitor/lib/module.conf.php b/interface/web/monitor/lib/module.conf.php
new file mode 100644
index 0000000000..23685bfc29
--- /dev/null
+++ b/interface/web/monitor/lib/module.conf.php
@@ -0,0 +1,76 @@
+<?php
+
+$module["name"] 		= "monitor";
+$module["title"] 		= "Monitor";
+$module["template"] 	= "module.tpl.htm";
+$module["startpage"] 	= "monitor/system.php?mod=index";
+$module["tab_width"]    = '';
+
+/*
+	Logmonitoring module
+*/
+
+$items[] = array( 'title' 	=> "Load",
+				  'target' 	=> 'content',
+				  'link'	=> 'monitor/system.php?mod=load');
+
+$items[] = array( 'title' 	=> "Harddisk",
+				  'target' 	=> 'content',
+				  'link'	=> 'monitor/system.php?mod=disk');
+
+$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');
+
+$items[] = array( 'title' 	=> "Services",
+				  'target' 	=> 'content',
+				  'link'	=> 'monitor/system.php?mod=services');
+
+
+$module["nav"][] = array(	'title'	=> 'System',
+							'open' 	=> 1,
+							'items'	=> $items);
+
+// aufräumen
+unset($items);
+
+/*
+	Logmonitoring module
+*/
+
+$items[] = array( 'title' 	=> "Mail log",
+				  'target' 	=> 'content',
+				  'link'	=> 'monitor/logview.php?log=mail_log');
+
+$items[] = array( 'title' 	=> "Mail warn",
+				  'target' 	=> 'content',
+				  'link'	=> 'monitor/logview.php?log=mail_warn');
+
+$items[] = array( 'title' 	=> "Mail err",
+				  'target' 	=> 'content',
+				  'link'	=> 'monitor/logview.php?log=mail_err');
+
+$items[] = array( 'title' 	=> "Messages",
+				  'target' 	=> 'content',
+				  'link'	=> 'monitor/logview.php?log=messages');
+
+$items[] = array( 'title' 	=> "Freshclam",
+				  'target' 	=> 'content',
+				  'link'	=> 'monitor/logview.php?log=freshclam');
+
+$items[] = array( 'title' 	=> "Clamav",
+				  'target' 	=> 'content',
+				  'link'	=> 'monitor/logview.php?log=clamav');
+
+
+$module["nav"][] = array(	'title'	=> 'Logfiles',
+							'open' 	=> 1,
+							'items'	=> $items);
+
+// aufräumen
+unset($items);
+?>
\ No newline at end of file
diff --git a/interface/web/monitor/logview.php b/interface/web/monitor/logview.php
new file mode 100644
index 0000000000..2630e11714
--- /dev/null
+++ b/interface/web/monitor/logview.php
@@ -0,0 +1,114 @@
+<?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');
+
+// Checke Berechtigungen für Modul
+if(!stristr($_SESSION["s"]["user"]["modules"],'monitor')) {
+	header("Location: ../index.php");
+	exit;
+}
+
+// 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;
+	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_defaults();
+$app->tpl->pparse();
+?>
\ No newline at end of file
diff --git a/interface/web/monitor/system.php b/interface/web/monitor/system.php
new file mode 100644
index 0000000000..43886a1bae
--- /dev/null
+++ b/interface/web/monitor/system.php
@@ -0,0 +1,398 @@
+<?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');
+
+// Checke Berechtigungen für Modul
+if(!stristr($_SESSION["s"]["user"]["modules"],'monitor')) {
+	header("Location: ../index.php");
+	exit;
+}
+
+$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 .= '<div align="left"><table width="400" border="0" cellspacing="1" cellpadding="4" bgcolor="#CCCCCC">';
+
+    $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 width="70%" bgcolor="#FFFFFF"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">'.$app->lng("Server Online seit").':</font></td>
+       <td width="30%" bgcolor="#FFFFFF"><center><font face="Verdana, Arial, Helvetica, sans-serif" size="2">'.$days.'d, '.$hours.':'.$minutes.'h</font></center></td>
+     </tr>';
+
+    $html_out .= '<tr>
+       <td width="70%" bgcolor="#FFFFFF"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">'.$app->lng("User Online").':</font></td>
+       <td width="30%" bgcolor="#FFFFFF"><center><font face="Verdana, Arial, Helvetica, sans-serif" size="2">'.strrev($uptime[3]).'</font></center></td>
+     </tr>';
+
+     $ausl = split(":",strrev($uptime[2]));
+     $ausl1 = $ausl[1];
+
+
+     $html_out .= '<tr>
+       <td width="70%" bgcolor="#FFFFFF"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">'.$app->lng("System Load 1 Minute").':</font></td>
+       <td width="30%" bgcolor="#FFFFFF"><center><font face="Verdana, Arial, Helvetica, sans-serif" size="2">'.$ausl1.'</font></center></td>
+     </tr>';
+
+     $html_out .= '<tr>
+       <td width="70%" bgcolor="#FFFFFF"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">'.$app->lng("System Load 5 Minuten").':</font></td>
+       <td width="30%" bgcolor="#FFFFFF"><center><font face="Verdana, Arial, Helvetica, sans-serif" size="2">'.strrev($uptime[1]).'</font></center></td>
+     </tr>';
+
+     $html_out .= '<tr>
+       <td width="70%" bgcolor="#FFFFFF"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">'.$app->lng("System Load 15 Minuten").':</font></td>
+       <td width="30%" bgcolor="#FFFFFF"><center><font face="Verdana, Arial, Helvetica, sans-serif" size="2">'.strrev($uptime[0]).'</font></center></td>
+     </tr>';
+
+    $html_out .= '</table></div>';
+
+
+    return $html_out;
+}
+
+function show_disk () {
+    global $app;
+
+
+    $html_out .= '<div align="left"><table width="400" border="0" cellspacing="1" cellpadding="4" bgcolor="#CCCCCC">';
+
+    $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;
+        $font_class = 'normal_bold';
+        if($mrow > 0) $font_class = 'normal';
+        foreach($values as $value) {
+        $align = 'left';
+        if($mln > 0 and $mln < 5) $align = 'right';
+        if($mln < 6 and $value != "") $html_out .= '<td bgcolor="#FFFFFF" class="frmText11" align="'.$align.'">'.$value.'</td>';
+        $mln++;
+        }
+        $mrow++;
+
+        $html_out .= '</tr>';
+        }
+
+
+    $html_out .= '</table></div>';
+
+
+    return $html_out;
+}
+
+
+function show_memusage ()
+    {
+    global $app;
+
+    $html_out .= '<div align="left"><table width="400" border="0" cellspacing="1" cellpadding="4" bgcolor="#CCCCCC">';
+
+    $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 width="70%" bgcolor="#FFFFFF"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">'.$mpart[0].':</font></td>
+       <td width="30%" bgcolor="#FFFFFF" align="right"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">'.$mpart[1].'</font></td>
+     </tr>';
+    }
+
+    $x++;
+    }
+    $html_out .= '</table></div>';
+    return $html_out;
+}
+
+function show_cpu ()
+    {
+    global $app;
+
+    $html_out .= '<div align="left"><table width="400" border="0" cellspacing="1" cellpadding="4" bgcolor="#CCCCCC">';
+
+        $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 width="70%" bgcolor="#FFFFFF"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">'.$mpart[0].':</font></td>
+       <td width="30%" bgcolor="#FFFFFF" align="center"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">'.$mpart[1].'</font></td>
+     </tr>';
+    }
+        }
+
+    $x++;
+    }
+    $html_out .= '</table></div>';
+
+
+    return $html_out;
+    }
+
+function show_services ()
+    {
+    global $app;
+
+    $html_out .= '<div align="left"><table width="400" border="0" cellspacing="1" cellpadding="4" bgcolor="#CCCCCC">';
+
+    // Checke Webserver
+    if(_check_tcp('localhost',80)) {
+    $status = '<font face="Verdana, Arial, Helvetica, sans-serif" size="2" color="#006600"><b>Online</b></font>';
+    } else {
+    $status = '<font face="Verdana, Arial, Helvetica, sans-serif" size="2" color="#FF0000"><b>Offline</b></font>';
+    }
+    $html_out .= '<tr>
+       <td width="70%" bgcolor="#FFFFFF"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">Web-Server:</font></td>
+       <td width="30%" bgcolor="#FFFFFF"><center>'.$status.'</center></td>
+     </tr>';
+
+
+    // Checke FTP-Server
+    if(_check_ftp('localhost',21)) {
+    $status = '<font face="Verdana, Arial, Helvetica, sans-serif" size="2" color="#006600"><b>Online</b></font>';
+    } else {
+    $status = '<font face="Verdana, Arial, Helvetica, sans-serif" size="2" color="#FF0000"><b>Offline</b></font>';
+    }
+    $html_out .= '<tr>
+       <td width="70%" bgcolor="#FFFFFF"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">FTP-Server:</font></td>
+       <td width="30%" bgcolor="#FFFFFF"><center>'.$status.'</center></td>
+     </tr>';
+
+     // Checke SMTP-Server
+    if(_check_tcp('localhost',25)) {
+    $status = '<font face="Verdana, Arial, Helvetica, sans-serif" size="2" color="#006600"><b>Online</b></font>';
+    } else {
+    $status = '<font face="Verdana, Arial, Helvetica, sans-serif" size="2" color="#FF0000"><b>Offline</b></font>';
+    }
+    $html_out .= '<tr>
+       <td width="70%" bgcolor="#FFFFFF"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">SMTP-Server:</font></td>
+       <td width="30%" bgcolor="#FFFFFF"><center>'.$status.'</center></td>
+     </tr>';
+
+     // Checke POP3-Server
+    if(_check_tcp('localhost',110)) {
+    $status = '<font face="Verdana, Arial, Helvetica, sans-serif" size="2" color="#006600"><b>Online</b></font>';
+    } else {
+    $status = '<font face="Verdana, Arial, Helvetica, sans-serif" size="2" color="#FF0000"><b>Offline</b></font>';
+    }
+    $html_out .= '<tr>
+       <td width="70%" bgcolor="#FFFFFF"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">POP3-Server:</font></td>
+       <td width="30%" bgcolor="#FFFFFF"><center>'.$status.'</center></td>
+     </tr>';
+
+     // Checke BIND-Server
+    if(_check_tcp('localhost',53)) {
+    $status = '<font face="Verdana, Arial, Helvetica, sans-serif" size="2" color="#006600"><b>Online</b></font>';
+    } else {
+    $status = '<font face="Verdana, Arial, Helvetica, sans-serif" size="2" color="#FF0000"><b>Offline</b></font>';
+    }
+    $html_out .= '<tr>
+       <td width="70%" bgcolor="#FFFFFF"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">BIND-Server:</font></td>
+       <td width="30%" bgcolor="#FFFFFF"><center>'.$status.'</center></td>
+     </tr>';
+
+      // Checke MYSQL-Server
+    //if($this->_check_tcp('localhost',3306)) {
+    $status = '<font face="Verdana, Arial, Helvetica, sans-serif" size="2" color="#006600"><b>Online</b></font>';
+    //} else {
+    //$status = '<font face="Verdana, Arial, Helvetica, sans-serif" size="2" color="#FF0000"><b>Offline</b></font>';
+    //}
+    $html_out .= '<tr>
+       <td width="70%" bgcolor="#FFFFFF"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">mySQL-Server:</font></td>
+       <td width="30%" bgcolor="#FFFFFF"><center>'.$status.'</center></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
new file mode 100644
index 0000000000..5e9fc46efc
--- /dev/null
+++ b/interface/web/monitor/templates/logview.htm
@@ -0,0 +1,5 @@
+<div style="margin-left:30px;margin-top:30px;"><b><tmpl_var name="logfile"></b><br /><br />
+<select name="refreshinterval" id="refreshinterval" onChange="loadContentRefresh('monitor/index.php?log=mail_log')">
+	{tmpl_var name="refresh"}
+</select><br /><br />
+<tmpl_var name="log"></div>
\ No newline at end of file
diff --git a/interface/web/monitor/templates/system.htm b/interface/web/monitor/templates/system.htm
new file mode 100644
index 0000000000..52428d98bf
--- /dev/null
+++ b/interface/web/monitor/templates/system.htm
@@ -0,0 +1,3 @@
+<div style="margin-left:30px;margin-top:30px;"><h2><tmpl_var name="title"></h2>
+<p><tmpl_var name="description"></p>
+<tmpl_var name="output"></div>
\ No newline at end of file
diff --git a/interface/web/themes/default/style.css b/interface/web/themes/default/style.css
index 7ba641a28f..d83383d12a 100644
--- a/interface/web/themes/default/style.css
+++ b/interface/web/themes/default/style.css
@@ -285,4 +285,10 @@ TEXTAREA {
     background: url("../../themes/default/images/button_end.gif") no-repeat;
 }
 
+h2 {
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+	font-size: 16px;
+	font-weight:bold;
+}
+
 
-- 
GitLab