tbrehm
2009-05-27 44d2a76d4611e27d348e1c8ed89ff0675f2d262f
server/mods-available/monitor_core_module.inc.php
@@ -121,6 +121,7 @@
        $this->monitorMailQueue();
        $this->monitorRaid();
        $this->monitorRkHunter();
      $this->monitorFail2ban();
        $this->monitorSysLog();
    }
@@ -191,8 +192,8 @@
        /** The state of the disk-usage */
        $state = 'ok';
        /** Fetch the data into a array */
        $dfData = shell_exec("df");
        /** Fetch the data of ALL devices into a array (needed for monitoring!)*/
        $dfData = shell_exec("df -hT");
        // split into array
        $df = explode("\n", $dfData);
@@ -208,19 +209,24 @@
                 */
                $s = preg_split ("/[\s]+/", $df[$i]);
                $data[$i]['fs'] = $s[0];
                $data[$i]['size'] = $s[1];
                $data[$i]['used'] = $s[2];
                $data[$i]['available'] = $s[3];
                $data[$i]['percent'] = $s[4];
                $data[$i]['mounted'] = $s[5];
                $data[$i]['type'] = $s[1];
                $data[$i]['size'] = $s[2];
                $data[$i]['used'] = $s[3];
                $data[$i]['available'] = $s[4];
                $data[$i]['percent'] = $s[5];
                $data[$i]['mounted'] = $s[6];
                /*
                 * 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');
            //* We dont want to check the cdrom drive as a cd / dvd is always 100% full
            if($data[$i]['type'] != 'iso9660' && $data[$i]['type'] != 'cramfs' && $data[$i]['type'] != 'udf') {
                   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');
            }
            }
        }
@@ -310,12 +316,15 @@
        */
        $cpuData = shell_exec("cat /proc/cpuinfo");
        $cpuInfo = explode("\n", $cpuData);
      $processor = 0;
        foreach($cpuInfo as $line){
            $part = preg_split("/:/", $line);
         $part = preg_split("/:/", $line);
            $key = trim($part[0]);
            $value = trim($part[1]);
            $data[$key] = $value;
         if($key == 'processor') $processor = intval($value);
            if($key != '') $data[$key.' '.$processor] = $value;
        }
        /* the cpu has no state. It is, what it is */
@@ -600,8 +609,8 @@
        $type = 'raid_state';
        /* This monitoring is only available if mdadm is installed */
        $location = shell_exec('which mdadm');
        if($location != ''){
        $location = system('which mdadm', $retval);
        if($retval === 0){
            /*
             * Fetch the output
             */
@@ -692,7 +701,8 @@
         *  This monitoring is expensive, so do it only once a hour
         */
        $min = date('i');
        if ($min != 0) return;
        $hour = date('H');
        if ($min != 0 && $hour != 23) return;
        global $app;
        global $conf;
@@ -704,8 +714,8 @@
        $type = 'rkhunter';
        /* This monitoring is only available if rkhunter is installed */
        $location = shell_exec('which rkhunter');
        if($location != ''){
        $location = system('which rkhunter', $retval);
        if($retval === 0){
            /*
             * Fetch the output
             */
@@ -747,6 +757,59 @@
        $this->_delOldRecords($type, 0, 2);
    }
    function monitorFail2ban(){
        global $app;
        global $conf;
        /* the id of the server as int */
        $server_id = intval($conf["server_id"]);
        /** The type of the data */
        $type = 'log_fail2ban';
        /* This monitoring is only available if fail2ban is installed */
        $location = system('which fail2ban-client', $retval); // Debian, Ubuntu, Fedora
      if($retval !== 0) $location = system('which fail2ban', $retval); // CentOS
        if($retval === 0){
         /*  Get the data of the log */
         $data = $this->_getLogData($type);
            /*
             * At this moment, there is no state (maybe later)
             */
            $state = 'no_state';
        }
        else {
            /*
             * fail2ban 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 = '';
        }
        /*
         * Insert the data into the database
         */
        $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " .
            "VALUES (".
        $server_id . ", " .
            "'" . $app->dbmaster->quote($type) . "', " .
        time() . ", " .
            "'" . $app->dbmaster->quote(serialize($data)) . "', " .
            "'" . $state . "'" .
            ")";
        $app->dbmaster->query($sql);
        /* The new data is written, now we can delete the old one */
        $this->_delOldRecords($type, 10);
    }
    function monitorSysLog(){
        global $app;
        global $conf;
@@ -757,19 +820,19 @@
        /** The type of the data */
        $type = 'sys_log';
   /*
    * is there any warning or error for this server?
    */
   $state = 'ok';
      /*
       * is there any warning or error for this server?
       */
      $state = 'ok';
        $dbData = $app->dbmaster->queryAllRecords("SELECT loglevel FROM sys_log WHERE server_id = " . $server_id . " AND loglevel > 0");
   if (is_array($dbData)) {
       foreach($dbData as $item){
      if ($item['loglevel'] == 1) $state = $this->_setState($state, 'warning');
      if ($item['loglevel'] == 2) $state = $this->_setState($state, 'error');
       }
   }
      if (is_array($dbData)) {
          foreach($dbData as $item){
         if ($item['loglevel'] == 1) $state = $this->_setState($state, 'warning');
         if ($item['loglevel'] == 2) $state = $this->_setState($state, 'error');
          }
      }
   /** There is no monitor-data because the data is in the sys_log table */
      /** There is no monitor-data because the data is in the sys_log table */
        $data['output']= '';
        /*
@@ -789,7 +852,7 @@
        $this->_delOldRecords($type, 10);
    }
function monitorMailLog()
   function monitorMailLog()
    {
        global $app;
        global $conf;
@@ -1117,30 +1180,59 @@
    function _getLogData($log){
        switch($log) {
      $dist = '';
      $logfile = '';
      if(@is_file('/etc/debian_version')) $dist = 'debian';
      if(@is_file('/etc/redhat-release')) $dist = 'redhat';
      if(@is_file('/etc/SuSE-release')) $dist = 'suse';
      switch($log) {
            case 'log_mail':
                $logfile = '/var/log/mail.log';
                if($dist == 'debian') $logfile = '/var/log/mail.log';
            if($dist == 'redhat') $logfile = '/var/log/maillog';
            if($dist == 'suse') $logfile = '/var/log/mail.info';
                break;
            case 'log_mail_warn':
                $logfile = '/var/log/mail.warn';
                if($dist == 'debian') $logfile = '/var/log/mail.warn';
            if($dist == 'redhat') $logfile = '/var/log/maillog';
            if($dist == 'suse') $logfile = '/var/log/mail.warn';
                break;
            case 'log_mail_err':
                $logfile = '/var/log/mail.err';
                if($dist == 'debian') $logfile = '/var/log/mail.err';
            if($dist == 'redhat') $logfile = '/var/log/maillog';
            if($dist == 'suse') $logfile = '/var/log/mail.err';
                break;
            case 'log_messages':
                $logfile = '/var/log/messages';
                if($dist == 'debian') $logfile = '/var/log/messages';
            if($dist == 'redhat') $logfile = '/var/log/messages';
            if($dist == 'suse') $logfile = '/var/log/messages';
                break;
            case 'log_ispc_cron':
                $logfile = '/var/log/ispconfig/cron.log';
                if($dist == 'debian') $logfile = '/var/log/ispconfig/cron.log';
            if($dist == 'redhat') $logfile = '/var/log/ispconfig/cron.log';
            if($dist == 'suse') $logfile = '/var/log/ispconfig/cron.log';
                break;
            case 'log_freshclam':
                $logfile = '/var/log/clamav/freshclam.log';
                break;
                if($dist == 'debian') $logfile = '/var/log/clamav/freshclam.log';
            if($dist == 'redhat') $logfile = (is_file('/var/log/clamav/freshclam.log') ? '/var/log/clamav/freshclam.log' : '/var/log/freshclam.log');
                if($dist == 'suse') $logfile = '';
            break;
            case 'log_clamav':
                $logfile = '/var/log/clamav/clamav.log';
                if($dist == 'debian') $logfile = '/var/log/clamav/clamav.log';
            if($dist == 'redhat') $logfile = (is_file('/var/log/clamav/clamd.log') ? '/var/log/clamav/clamd.log' : '/var/log/maillog');
            if($dist == 'suse') $logfile = '';
                break;
            case 'log_fail2ban':
                if($dist == 'debian') $logfile = '/var/log/fail2ban.log';
            if($dist == 'redhat') $logfile = '/var/log/fail2ban.log';
            if($dist == 'suse') $logfile = '/var/log/fail2ban.log';
                break;
            case 'log_ispconfig':
                $logfile = '/var/log/ispconfig/ispconfig.log';
                if($dist == 'debian') $logfile = '/var/log/ispconfig/ispconfig.log';
            if($dist == 'redhat') $logfile = '/var/log/ispconfig/ispconfig.log';
            if($dist == 'suse') $logfile = '/var/log/ispconfig/ispconfig.log';
                break;
            default:
                $logfile = '';
@@ -1150,7 +1242,7 @@
        // Getting the logfile content
        if($logfile != '') {
            $logfile = escapeshellcmd($logfile);
            if(stristr($logfile, ';')) {
            if(stristr($logfile, ';') or substr($logfile,0,9) != '/var/log/' or stristr($logfile, '..')) {
                $log = 'Logfile path error.';
            }
            else
@@ -1176,7 +1268,7 @@
    function _checkTcp ($host,$port) {
        $fp = @fsockopen ($host, $port, &$errno, &$errstr, 2);
        $fp = @fsockopen ($host, $port, $errno, $errstr, 2);
        if ($fp) {
            fclose($fp);
@@ -1188,7 +1280,7 @@
    function _checkUdp ($host,$port) {
        $fp = @fsockopen ('udp://'.$host, $port, &$errno, &$errstr, 2);
        $fp = @fsockopen ('udp://'.$host, $port, $errno, $errstr, 2);
        if ($fp) {
            fclose($fp);
@@ -1304,4 +1396,4 @@
} // end class
?>
?>