From 36d307956bcb0c07ad819826831db21913ed8ad5 Mon Sep 17 00:00:00 2001
From: vogelor <vogelor@ispconfig3>
Date: Tue, 25 Nov 2008 19:12:01 +0000
Subject: [PATCH] monitor now monitors RAID changed the menu (hopefully now
 better to understand) fixed some small errors in update-state

---
 interface/web/monitor/lib/module.conf.php     |  30 ++-
 interface/web/monitor/show_data.php           |  12 +
 interface/web/monitor/show_sys_state.php      |  44 +++-
 interface/web/monitor/tools.inc.php           |  65 ++++-
 .../monitor_core_module.inc.php               | 232 ++++++++++++++++--
 5 files changed, 337 insertions(+), 46 deletions(-)

diff --git a/interface/web/monitor/lib/module.conf.php b/interface/web/monitor/lib/module.conf.php
index 93200466b2..b8366278b5 100644
--- a/interface/web/monitor/lib/module.conf.php
+++ b/interface/web/monitor/lib/module.conf.php
@@ -10,7 +10,7 @@ $module["tab_width"]    = '';
 $module["startpage"] 	= "monitor/show_sys_state.php?state=system";
 
 unset($items);
-$items[] = array( 'title' 	=> "Show System State",
+$items[] = array( 'title' 	=> "Show Overview",
                   'target' 	=> 'content',
                   'link'	=> 'monitor/show_sys_state.php?state=system');
 
@@ -59,7 +59,7 @@ $items[] = array( 'title' 	=> "Show CPU info",
         'target' 	=> 'content',
         'link'	=> 'monitor/show_data.php?type=cpu_info');
 
-$module["nav"][] = array(	'title'	=> 'System-Information',
+$module["nav"][] = array(	'title'	=> 'Hardware-Information',
         'open' 	=> 1,
         'items'	=> $items);
 
@@ -67,19 +67,19 @@ $module["nav"][] = array(	'title'	=> 'System-Information',
  * Clear and set the Navigation-Items
  */
 unset($items);
-$items[] = array( 'title' 	=> "Show Server State",
+$items[] = array( 'title' 	=> "Show Overview",
                   'target' 	=> 'content',
                   'link'	=> 'monitor/show_sys_state.php?state=server');
-/*
- * The next menu is only available at debian or Ubuntu
- */
-if(file_exists('/etc/debian_version')){
+
 $items[] = array( 'title' 	=> "Show Update State",
                   'target' 	=> 'content',
                   'link'	=> 'monitor/show_data.php?type=system_update');
-}
 
-$items[] = array( 'title' 	=> "Show Server Load",
+$items[] = array( 'title' 	=> "Show RAID state",
+                  'target' 	=> 'content',
+                  'link'	=> 'monitor/show_data.php?type=raid_state');
+
+$items[] = array( 'title' 	=> "Show Server load",
                   'target' 	=> 'content',
                   'link'	=> 'monitor/show_data.php?type=server_load');
 
@@ -95,11 +95,8 @@ $items[] = array( 'title' 	=> "Show Services",
                   'target' 	=> 'content',
                   'link'	=> 'monitor/show_data.php?type=services');
 
-$items[] = array( 'title' 	=> "Show Mailq",
-                  'target' 	=> 'content',
-                  'link'	=> 'monitor/show_data.php?type=mailq');
 
-$module["nav"][] = array(	'title'	=> 'Monitoring',
+$module["nav"][] = array(	'title'	=> 'Server State',
                             'open' 	=> 1,
                             'items'	=> $items);
 
@@ -108,6 +105,10 @@ $module["nav"][] = array(	'title'	=> 'Monitoring',
  */
 unset($items);
 
+$items[] = array( 'title' 	=> "Show Mail-Queue",
+                  'target' 	=> 'content',
+                  'link'	=> 'monitor/show_data.php?type=mailq');
+
 $items[] = array( 'title' 	=> "Show Mail-Log",
                   'target' 	=> 'content',
                   'link'	=> 'monitor/show_log.php?log=log_mail');
@@ -136,6 +137,9 @@ $items[] = array( 'title' 	=> "Show ISPConfig-Log",
                   'target' 	=> 'content',
                   'link'	=> 'monitor/show_log.php?log=log_ispconfig');
 
+//$items[] = array( 'title' 	=> "Show RKHunter-Log",
+//                  'target' 	=> 'content',
+//                  'link'	=> 'monitor/show_data.php?type=rkhunter');
 
 $module["nav"][] = array(	'title'	=> 'Logfiles',
                             'open' 	=> 1,
diff --git a/interface/web/monitor/show_data.php b/interface/web/monitor/show_data.php
index 043a20231c..888f7de35d 100644
--- a/interface/web/monitor/show_data.php
+++ b/interface/web/monitor/show_data.php
@@ -84,6 +84,18 @@ switch($dataType) {
         $title = "Mailq" . ' (Server: ' . $_SESSION['monitor']['server_name'] . ')';
         $description = '';
         break;
+    case 'raid_state':
+        $template = 'templates/show_data.htm';
+        $output .= showRaidState();
+        $title = "RAID-State" . ' (Server: ' . $_SESSION['monitor']['server_name'] . ')';
+        $description = '';
+        break;
+    case 'rkhunter':
+        $template = 'templates/show_data.htm';
+        $output .= showRKHunter();
+        $title = "RKHunter-Log" . ' (Server: ' . $_SESSION['monitor']['server_name'] . ')';
+        $description = '';
+        break;
     default:
         $template = '';
         break;
diff --git a/interface/web/monitor/show_sys_state.php b/interface/web/monitor/show_sys_state.php
index 83e6068fba..2f19fc4556 100644
--- a/interface/web/monitor/show_sys_state.php
+++ b/interface/web/monitor/show_sys_state.php
@@ -168,9 +168,9 @@ function _getServerState($serverId, $serverName, $showAll)
         /*
          * Show some state-info
          */
-        $res .= showServerLoad();
-        $res .= '&nbsp;'. showDiskUsage();
-        $res .= '&nbsp;'.showServices();
+        //$res .= showServerLoad();
+        //$res .= '&nbsp;'. showDiskUsage();
+        //$res .= '&nbsp;'.showServices();
     }
 
 
@@ -289,13 +289,49 @@ function _processDbState($type, $serverId, &$serverState, &$messages)
                 $messages['warning'][] = 'One or more Components needs a update ' .
                                     "<a href='#' onclick='loadContent(\"monitor/show_data.php?type=system_update\");'>[more...]</a>";
                 break;
+            case 'no_state':
+                /*
+                 *  not debian and not Ubuntu, so the state could not be monitored...
+                 */
+                break;
             default:
-                $messages['unknown'][] = 'System-Updatese:??? ' .
+                $messages['unknown'][] = 'System-Update:??? ' .
                                     "<a href='#' onclick='loadContent(\"monitor/show_data.php?type=system_update\");'>[more...]</a>";
                 break;
         }
     }
 
+    if ($type == 'raid_state'){
+        switch ($record['state']) {
+            case 'ok':
+                $messages['ok'][] = 'Your RAID is ok ' .
+                                    "<a href='#' onclick='loadContent(\"monitor/show_data.php?type=raid_state\");'>[more...]</a>";
+                break;
+            case 'info':
+                $messages['info'][] = 'Your RAID is in RESYNC mode ' .
+                                    "<a href='#' onclick='loadContent(\"monitor/show_data.php?type=raid_state\");'>[more...]</a>";
+                break;
+            case 'critical':
+                $messages['critical'][] = 'Your RAID has one FAULT disk. Replace as soon as possible! '.
+                                    "<a href='#' onclick='loadContent(\"monitor/show_data.php?type=raid_state\");'>[more...]</a>";
+                break;
+            case 'error':
+                $messages['error'][] = 'Your RAID is not working anymore ' .
+                                    "<a href='#' onclick='loadContent(\"monitor/show_data.php?type=raid_state\");'>[more...]</a>";
+                break;
+            case 'no_state':
+                /*
+                 *  mdadm is not installed or the RAID is not supported...
+                 */
+                break;
+            default:
+                $messages['unknown'][] = 'RAID state: ??? ' .
+                                    "<a href='#' onclick='loadContent(\"monitor/show_data.php?type=raid_state\");'>[more...]</a>";
+                break;
+        }
+    }
+
+
     if ($type == 'mailq'){
         switch ($record['state']) {
             case 'ok':
diff --git a/interface/web/monitor/tools.inc.php b/interface/web/monitor/tools.inc.php
index 6f56f5600b..5780a25b2a 100644
--- a/interface/web/monitor/tools.inc.php
+++ b/interface/web/monitor/tools.inc.php
@@ -1,4 +1,31 @@
 <?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.
+*/
 function showServerLoad(){
     global $app;
 
@@ -250,8 +277,17 @@ function showSystemUpdate()
     $record = $app->db->queryOneRecord("SELECT data, state FROM monitor_data WHERE type = 'system_update' and server_id = " . $_SESSION['monitor']['server_id'] . " order by created desc");
 
     if(isset($record['data'])) {
-        $data = unserialize($record['data']);
-        $html = nl2br($data['output']);
+        /*
+         * First, we have to detect, if there is any monitoring-data.
+         * If not (because the destribution is not supported) show this.
+         */
+        if ($record['state'] == 'no_state'){
+            $html = '<p>' . "Your distribution is not supported for this monitoring" . '</p>';
+        }
+        else {
+            $data = unserialize($record['data']);
+            $html = nl2br($data['output']);
+        }
     } else {
         $html = '<p>' . "No Update-Data available" . '</p>';
     }
@@ -259,6 +295,31 @@ function showSystemUpdate()
     return $html;
 }
 
+function showRaidState()
+{
+    global $app;
+
+    /* fetch the Data from the DB */
+    $record = $app->db->queryOneRecord("SELECT data, state FROM monitor_data WHERE type = 'raid_state' and server_id = " . $_SESSION['monitor']['server_id'] . " order by created desc");
+
+    if(isset($record['data'])) {
+        /*
+         * First, we have to detect, if there is any monitoring-data.
+         * If not (because the destribution is not supported) show this.
+         */
+        if ($record['state'] == 'no_state'){
+            $html = '<p>' . "mdadm ist not installed or your Server has no supported RAID" . '</p>';
+        }
+        else {
+            $data = unserialize($record['data']);
+            $html = nl2br($data['output']);
+        }
+    } else {
+        $html = '<p>' . "No RAID-Data available" . '</p>';
+    }
+
+    return $html;
+}
 
 function showMailq()
 {
diff --git a/server/mods-available/monitor_core_module.inc.php b/server/mods-available/monitor_core_module.inc.php
index aff1c38240..342d76af10 100644
--- a/server/mods-available/monitor_core_module.inc.php
+++ b/server/mods-available/monitor_core_module.inc.php
@@ -109,6 +109,8 @@ class monitor_core_module {
         $this->monitorIspConfigLog();
         $this->monitorSystemUpdate();
         $this->monitorMailQueue();
+        $this->monitorRaid();
+        $this->monitorRkHunter();
     }
 
     function monitorServer(){
@@ -452,14 +454,12 @@ class monitor_core_module {
 
 
     function monitorSystemUpdate(){
-        /* This monitoring is only available at debian or Ubuntu */
-        if(!file_exists('/etc/debian_version')) return;
-
         /*
-         *  This monitoring is expensive, so do it only once a hour!
+         *  This monitoring is expensive, so do it only once a day (at 5:00)
          */
+        $hour = date('G');
         $min = date('i');
-        if ($min != 0) return;
+        if (($min != 0) && ($hour != 5)) return;
 
         /*
          * OK - here we go...
@@ -476,32 +476,49 @@ class monitor_core_module {
         /* There is only ONE Update-Data, so delete the old one */
         $this->_delOldRecords($type, 0);
 
-        /*
-         * first update the "update-database"
-         */
-        shell_exec('apt-get update');
+        /* This monitoring is only available at debian or Ubuntu */
+        if(file_exists('/etc/debian_version')){
+
+            /*
+             * first update the "update-database"
+             */
+            shell_exec('apt-get update');
+
+            /*
+             * Then test the upgrade.
+             * if there is any output, then there is a needed update
+             */
+            $aptData = shell_exec('apt-get -s -qq dist-upgrade');
+            if ($aptData == '')
+            {
+                /* There is nothing to update! */
+                $state = 'ok';
+            }
+            else
+            {
+                /* There is something to update! */
+                $state = 'warning';
+            }
 
-        /*
-         * Then test the upgrade.
-         * if there is any output, then there is a needed update
-         */
-        $aptData = shell_exec('apt-get -s -qq dist-upgrade');
-        if ($aptData == '')
-        {
-            /* There is nothing to update! */
-            $state = 'ok';
+            /*
+             * Fetch the output
+             */
+            $data['output'] = shell_exec('apt-get -s -q dist-upgrade');
         }
-        else
-        {
-            /* There is something to update! */
-            $state = 'warning';
+        else {
+            /*
+             * It is not debian/Ubuntu, so there is no data and no state
+             *
+             * no_state, NOT unknown, because "unknown" is shown as state
+             * inside the GUI. no_state is hidden.
+             *
+             * We have to write NO DATA inside the DB, because the GUI
+             * could not know, if there is any dat, or not...
+             */
+            $state = 'no_state';
+            $data['output']= '';
         }
 
-        /*
-         * Fetch the output
-         */
-        $data['output'] = shell_exec('apt-get -s -q dist-upgrade');
-
         /*
          * Insert the data into the database
          */
@@ -563,6 +580,87 @@ class monitor_core_module {
     }
 
 
+    function monitorRaid(){
+        global $app;
+        global $conf;
+
+        /* the id of the server as int */
+        $server_id = intval($conf["server_id"]);
+
+        /** The type of the data */
+        $type = 'raid_state';
+
+        /* There is only ONE RAID-Data, so delete the old one */
+        $this->_delOldRecords($type, 0);
+
+        /* This monitoring is only available if mdadm is installed */
+        $location = shell_exec('which mdadm');
+        if($location != ''){
+            /*
+             * Fetch the output
+             */
+            $data['output'] = shell_exec('cat /proc/mdstat');
+
+            /*
+             * Then calc the state.
+             */
+            $tmp = explode("\n", $data['output']);
+            $state = 'ok';
+            foreach($tmp as $line) {
+                if (strpos($line, '[U_]' !== false))
+                {
+                    /* One Disk is not working */
+                    $state = $this->_setState($state, 'critical');
+                }
+                if (strpos($line, '[_U]' !== false))
+                {
+                    /* One Disk is not working */
+                    $state = $this->_setState($state, 'critical');
+                }
+                if (strpos($line, '[__]' !== false))
+                {
+                    /* both Disk are not working */
+                    $state = $this->_setState($state, 'error');
+                }
+                if (strpos($line, '[=' !== false))
+                {
+                    /* the raid is in resync */
+                    $state = $this->_setState($state, 'information');
+                }
+            }
+
+        }
+        else {
+            /*
+             * mdadm is not installed, so there is no data and no state
+             *
+             * no_state, NOT unknown, because "unknown" is shown as state
+             * inside the GUI. no_state is hidden.
+             *
+             * We have to write NO DATA inside the DB, because the GUI
+             * could not know, if there is any dat, or not...
+             */
+            $state = 'no_state';
+            $data['output']= '';
+        }
+
+        /*
+         * Insert the data into the database
+         */
+        $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " .
+            "VALUES (".
+        $server_id . ", " .
+            "'" . $app->db->quote($type) . "', " .
+        time() . ", " .
+            "'" . $app->db->quote(serialize($data)) . "', " .
+            "'" . $state . "'" .
+            ")";
+        $app->db->query($sql);
+    }
+
+    function monitorRkHunter(){
+    }
+
     function monitorMailLog()
     {
         global $app;
@@ -781,6 +879,86 @@ class monitor_core_module {
             "'" . $state . "'" .
             ")";
         $app->db->query($sql);
+
+/* for later (to detect that the version is outdated)
+--------------------------------------
+Received signal: wake up
+ClamAV update process started at Sun Nov 23 12:03:49 2008
+main.cvd is up to date (version: 49, sigs: 437972, f-level: 35, builder: sven)
+Trying host db.local.clamav.net (85.214.20.182)...
+Downloading daily-8675.cdiff [100%]
+Downloading daily-8676.cdiff [100%]
+daily.cld updated (version: 8676, sigs: 26800, f-level: 35, builder: ccordes)
+Database updated (464772 signatures) from db.local.clamav.net (IP: 85.214.20.182)
+Clamd successfully notified about the update.
+--------------------------------------
+--------------------------------------
+freshclam daemon 0.90.1 (OS: linux-gnu, ARCH: i386, CPU: i486)
+ClamAV update process started at Sun Nov 23 12:37:49 2008
+WARNING: Your ClamAV installation is OUTDATED!
+WARNING: Local version: 0.90.1 Recommended version: 0.94.1
+DON'T PANIC! Read http://www.clamav.net/support/faq
+Downloading main-43.cdiff [0%]
+Downloading main-44.cdiff [0%]
+Downloading main-45.cdiff [0%]
+Downloading main-46.cdiff [0%]
+Downloading main-47.cdiff [0%]
+Downloading main-48.cdiff [0%]
+Downloading main-49.cdiff [0%]
+main.cvd updated (version: 49, sigs: 437972, f-level: 35, builder: sven)
+WARNING: Your ClamAV installation is OUTDATED!
+WARNING: Current functionality level = 14, recommended = 35
+DON'T PANIC! Read http://www.clamav.net/support/faq
+ERROR: getfile: daily-2692.cdiff not found on remote server (IP: 62.75.166.141)
+ERROR: getpatch: Can't download daily-2692.cdiff from db.local.clamav.net
+ERROR: getfile: daily-2692.cdiff not found on remote server (IP: 62.26.160.3)
+ERROR: getpatch: Can't download daily-2692.cdiff from db.local.clamav.net
+ERROR: getfile: daily-2692.cdiff not found on remote server (IP: 213.174.32.130)
+ERROR: getpatch: Can't download daily-2692.cdiff from db.local.clamav.net
+ERROR: getfile: daily-2692.cdiff not found on remote server (IP: 212.1.60.18)
+ERROR: getpatch: Can't download daily-2692.cdiff from db.local.clamav.net
+ERROR: getfile: daily-2692.cdiff not found on remote server (IP: 193.27.50.222)
+ERROR: getpatch: Can't download daily-2692.cdiff from db.local.clamav.net
+WARNING: Incremental update failed, trying to download daily.cvd
+Downloading daily.cvd [0%]
+daily.cvd updated (version: 8676, sigs: 26800, f-level: 35, builder: ccordes)
+WARNING: Your ClamAV installation is OUTDATED!
+WARNING: Current functionality level = 14, recommended = 35
+DON'T PANIC! Read http://www.clamav.net/support/faq
+Database updated (464772 signatures) from db.local.clamav.net (IP: 91.198.238.33)
+--------------------------------------
+--------------------------------------
+freshclam daemon 0.94.1 (OS: linux-gnu, ARCH: i386, CPU: i486)
+ClamAV update process started at Sun Nov 23 13:01:17 2008
+Trying host db.local.clamav.net (193.27.50.222)...
+Downloading main.cvd [100%]
+main.cvd updated (version: 49, sigs: 437972, f-level: 35, builder: sven)
+daily.cvd is up to date (version: 8676, sigs: 26800, f-level: 35, builder: ccordes)
+Database updated (464772 signatures) from db.local.clamav.net (IP: 193.27.50.222)
+--------------------------------------
+--------------------------------------
+freshclam daemon 0.94.1 (OS: linux-gnu, ARCH: i386, CPU: i486)
+ClamAV update process started at Tue Nov 25 19:11:42 2008
+main.cvd is up to date (version: 49, sigs: 437972, f-level: 35, builder: sven)
+Trying host db.local.clamav.net (85.214.44.186)...
+Downloading daily-8677.cdiff [100%]
+Downloading daily-8678.cdiff [100%]
+Downloading daily-8679.cdiff [100%]
+daily.cld updated (version: 8679, sigs: 26975, f-level: 35, builder: ccordes)
+Database updated (464947 signatures) from db.local.clamav.net (IP: 85.214.44.186)
+--------------------------------------
+--------------------------------------
+freshclam daemon 0.94.1 (OS: linux-gnu, ARCH: i386, CPU: i486)
+ClamAV update process started at Tue Nov 25 19:16:18 2008
+main.cvd is up to date (version: 49, sigs: 437972, f-level: 35, builder: sven)
+daily.cld is up to date (version: 8679, sigs: 26975, f-level: 35, builder: ccordes)
+--------------------------------------
+Received signal: wake up
+ClamAV update process started at Tue Nov 25 20:16:25 2008
+main.cvd is up to date (version: 49, sigs: 437972, f-level: 35, builder: sven)
+daily.cld is up to date (version: 8679, sigs: 26975, f-level: 35, builder: ccordes)
+--------------------------------------
+ */
     }
 
     function monitorIspConfigLog()
-- 
GitLab