vogelor
2008-11-24 8793b32c8e8745e04571a30735b210f68b23ef92
server/mods-available/monitor_core_module.inc.php
@@ -27,9 +27,7 @@
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
class monitor_core_module {
   /* TODO: this should be a config - var instead of a "constant" */
   var $interval = 5; // do the monitoring every 5 minutes
   
@@ -41,7 +39,6 @@
   /*
       This function is called when the module is loaded
   */
   function onLoad() {
      global $app;
      
@@ -145,8 +142,12 @@
      $data['load_5'] = floatval(trim($load[1]));
      $data['load_15'] = floatval(trim($load[2]));
      
      // Todo: the state should be calculated. For example if the load is to heavy, the state is warning...
        /** The state of the server-load. */
      $state = 'ok';
        if ($data['load_1'] > 20 ) $state = 'info';
        if ($data['load_1'] > 50 ) $state = 'warning';
        if ($data['load_1'] > 100 ) $state = 'critical';
        if ($data['load_1'] > 150 ) $state = 'error';
      
      /*
      Insert the data into the database
@@ -175,17 +176,24 @@
      /* Delete Data older than 10 minutes */
      $this->_delOldRecords($type, 10);
      
      /*
      Fetch the data into a array
      */
        /** The state of the disk-usage */
        $state = 'ok';
        /** Fetch the data into a array */
      $dfData = shell_exec("df");
      
      // split into array
      $df = explode("\n", $dfData);
      // ignore the first line make a array of the rest
        /*
         * ignore the first line, process the rest
         */
      for($i=1; $i <= sizeof($df); $i++){
         if ($df[$i] != '')
         {
                /*
                 * Make a array of the data
                 */
            $s = preg_split ("/[\s]+/", $df[$i]);
            $data[$i]['fs'] = $s[0];
            $data[$i]['size'] = $s[1];
@@ -193,11 +201,17 @@
            $data[$i]['available'] = $s[3];
            $data[$i]['percent'] = $s[4];
            $data[$i]['mounted'] = $s[5];
                /*
                 * calculate the state
                 */
                $usePercent = floatval($data[$i]['percent']);
                if ($usePercent > 75) $state = $this->_setState($state, 'info');
                if ($usePercent > 80) $state = $this->_setState($state, 'warning');
                if ($usePercent > 90) $state = $this->_setState($state, 'critical');
                if ($usePercent > 95) $state = $this->_setState($state, 'error');
         }
      }
      
      // 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
@@ -244,8 +258,11 @@
         $data[$key] = $value;
      }
      
      // Todo: the state should be calculated. For example if the load is to heavy, the state is warning...
      $state = 'ok';
        /*
         * actually this info has no state.
         * maybe someone knows better...???...
         */
        $state = 'no_state';
      
      /*
      Insert the data into the database
@@ -289,8 +306,8 @@
         $data[$key] = $value;
      }
      
      // Todo: the state should be calculated. For example if the load is to heavy, the state is warning...
      $state = 'ok';
        /* the cpu has no state. It is, what it is */
        $state = 'no_state';
      
      /*
      Insert the data into the database
@@ -312,59 +329,109 @@
      global $app;
      global $conf;
      
      /* the id of the server as int */
        /** the id of the server as int */
      $server_id = intval($conf["server_id"]);
      
      /** The type of the data */
        /** get the "active" Services of the server from the DB */
        $services = $app->db->queryOneRecord("SELECT * FROM server WHERE server_id = " . $server_id);
        /* The type of the Monitor-data */
      $type = 'services';   
      
      /* There is only ONE Service-Data, so delete the old one */
      $this->_delOldRecords($type, 0);
      
        /** the State of the monitoring */
        /* ok, if ALL aktive services are running,
         * error, if not
         * There is no other state!
         */
        $state = 'ok';
      /* Monitor Webserver */
        $data['webserver'] = -1; // unknown - not needed
        if ($services['web_server'] == 1)
        {
      if($this->_checkTcp('localhost',80)) {
         $data['webserver'] = true;
                $data['webserver'] = 1;
      } else {
         $data['webserver'] = false;
                $data['webserver'] = 0;
                $state = 'error'; // because service is down
            }
      }
      
      /* Monitor FTP-Server */
        $data['ftpserver'] = -1; // unknown - not needed
        if ($services['file_server'] == 1)
        {
      if($this->_checkFtp('localhost',21)) {
         $data['ftpserver'] = true;
                $data['ftpserver'] = 1;
      } else {
         $data['ftpserver'] = false;
                $data['ftpserver'] = 0;
                $state = 'error'; // because service is down
            }
      }
      
      /* Monitor SMTP-Server */
        $data['smtpserver'] = -1; // unknown - not needed
        if ($services['mail_server'] == 1)
        {
      if($this->_checkTcp('localhost',25)) {
         $data['smtpserver'] = true;
                $data['smtpserver'] = 1;
      } else {
         $data['smtpserver'] = false;
                $data['smtpserver'] = 0;
                $state = 'error'; // because service is down
            }
      }
      
      /* Monitor POP3-Server */
        $data['pop3server'] = -1; // unknown - not needed
        if ($services['mail_server'] == 1)
        {
      if($this->_checkTcp('localhost',110)) {
         $data['pop3server'] = true;
                $data['pop3server'] = 1;
      } else {
         $data['pop3server'] = false;
                $data['pop3server'] = 0;
                $state = 'error'; // because service is down
            }
        }
        /* Monitor IMAP-Server */
        $data['imapserver'] = -1; // unknown - not needed
        if ($services['mail_server'] == 1)
        {
            if($this->_checkTcp('localhost', 143)) {
                $data['imapserver'] = 1;
            } else {
                $data['imapserver'] = 0;
                $state = 'error'; // because service is down
            }
      }
      
      /* Monitor BIND-Server */
        $data['bindserver'] = -1; // unknown - not needed
        if ($services['dns_server'] == 1)
        {
      if($this->_checkTcp('localhost',53)) {
         $data['bindserver'] = true;
                $data['bindserver'] = 1;
      } else {
         $data['bindserver'] = false;
                $data['bindserver'] = 0;
                $state = 'error'; // because service is down
            }
      }
      
      /* Monitor MYSQL-Server */
        $data['mysqlserver'] = -1; // unknown - not needed
        if ($services['db_server'] == 1)
        {
      if($this->_checkTcp('localhost',3306)) {
         $data['mysqlserver'] = true;
                $data['mysqlserver'] = 1;
      } else {
         $data['mysqlserver'] = false;
                $data['mysqlserver'] = 0;
                $state = 'error'; // because service is down
            }
      }
      
      // 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
@@ -395,12 +462,14 @@
      /* 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';
        /*
         * actually this info has no state.
         * maybe someone knows better...???...
         */
        $state = 'no_state';
      
      /*
      Insert the data into the database
@@ -434,8 +503,11 @@
      /* 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';
        /*
         * actually this info has no state.
         * maybe someone knows better...???...
         */
        $state = 'no_state';
      
      /*
      Insert the data into the database
@@ -469,8 +541,11 @@
      /* 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';
        /*
         * actually this info has no state.
         * maybe someone knows better...???...
         */
        $state = 'no_state';
      
      /*
      Insert the data into the database
@@ -501,12 +576,14 @@
      /* 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';
        /*
         * actually this info has no state.
         * maybe someone knows better...???...
         */
        $state = 'no_state';
      
      /*
      Insert the data into the database
@@ -540,7 +617,7 @@
      /* 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...
        // Todo: the state should be calculated.
      $state = 'ok';
      
      /*
@@ -571,11 +648,10 @@
      /* 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...
        // Todo: the state should be calculated.
      $state = 'ok';
      
      /*
@@ -610,7 +686,7 @@
      /* 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...
        // Todo: the state should be calculated.
      $state = 'ok';
      
      /*
@@ -659,11 +735,14 @@
      // Getting the logfile content
      if($logfile != '') {
         $logfile = escapeshellcmd($logfile);
         if(stristr($logfile,';')) die('Logfile path error.');
            if(stristr($logfile, ';')) {
                $log = 'Logfile path error.';
            }
            else
            {
         $log = '';
         if(is_readable($logfile)) {
            if($fd = popen("tail -n 30 $logfile", 'r')) {
                    if($fd = popen("tail -n 100 $logfile", 'r')) {
               while (!feof($fd)) {
                  $log .= fgets($fd, 4096);
                  $n++;
@@ -675,6 +754,7 @@
            $log = 'Unable to read '.$logfile;
         }
      }
        }
      
      return $log;
   }
@@ -684,11 +764,10 @@
         $fp = @fsockopen ($host, $port, &$errno, &$errstr, 2);
         
         if ($fp) {
            return true;
            fclose($fp);
            return true;
         } else {
            return false;
            fclose($fp);
         }
      }
      
@@ -697,11 +776,10 @@
         $fp = @fsockopen ('udp://'.$host, $port, &$errno, &$errstr, 2);
         
         if ($fp) {
            return true;
            fclose($fp);
            return true;
         } else {
            return false;
            fclose($fp);
         }
      }
      
@@ -713,7 +791,6 @@
            @ftp_close($conn_id);
            return true;
         } else {
            @ftp_close($conn_id);
            return false;
         }
      }
@@ -734,6 +811,67 @@
      $app->db->query($sql);
   }
   
    /*
     * Set the state to the given level (or higher, but not lesser).
     * * If the actual state is critical and you call the method with ok,
     *   then the state is critical.
     *
     * * If the actual state is critical and you call the method with error,
     *   then the state is error.
     */
    function _setState($oldState, $newState)
    {
        /*
         * Calculate the weight of the old state
         */
        switch ($oldState) {
            case 'no_state': $oldInt = 0;
                break;
            case 'ok': $oldInt = 1;
                break;
            case 'unknown': $oldInt = 2;
                break;
            case 'info': $oldInt = 3;
                break;
            case 'warning': $oldInt = 4;
                break;
            case 'critical': $oldInt = 5;
                break;
            case 'error': $oldInt = 6;
                break;
        }
        /*
         * Calculate the weight of the new state
         */
        switch ($newState) {
            case 'no_state': $newInt = 0 ;
                break;
            case 'unknown': $newInt = 1 ;
                break;
            case 'ok': $newInt = 2 ;
                break;
            case 'info': $newInt = 3 ;
                break;
            case 'warning': $newInt = 4 ;
                break;
            case 'critical': $newInt = 5 ;
                break;
            case 'error': $newInt = 6 ;
                break;
        }
        /*
         * Set to the higher level
         */
        if ($newInt > $oldInt){
            return $newState;
        }
        else
        {
            return $oldState;
        }
    }
   
} // end class