Marius Burkard
2016-02-11 a7796bec1be01b51f400e9a3a698535b12b636aa
server/mods-available/monitor_core_module.inc.php
@@ -1,7 +1,6 @@
<?php
/*
Copyright (c) 2008, Till Brehm, projektfarm Gmbh and Oliver Vogel www.muv.com
Copyright (c) 2007-2010, Till Brehm, projektfarm Gmbh, Oliver Vogel www.muv.com
All rights reserved.
Redistribution and use in source and binary forms, with or without modification,
@@ -29,393 +28,19 @@
*/
class monitor_core_module {
   /* TODO: this should be a config - var instead of a "constant" */
   var $interval = 5; // do the monitoring every 5 minutes
   var $module_name = 'monitor_core_module';
   var $class_name = 'monitor_core_module';
   /* No actions at this time. maybe later... */
   var $module_name = 'remoteaction_core_module';
   var $class_name = 'remoteaction_core_module';
   var $actions_available = array();
   /*
       This function is called when the module is loaded
   */
   function onInstall() {
      return false;
   }
   function onLoad() {
      global $app;
      /*
      Annonce the actions that where provided by this module, so plugins
      can register on them.
      */
      /* none at them moment */
      //$app->plugins->announceEvents($this->module_name,$this->actions_available);
      /*
      As we want to get notified of any changes on several database tables,
      we register for them.
      The following function registers the function "functionname"
         to be executed when a record for the table "dbtable" is
         processed in the sys_datalog. "classname" is the name of the
         class that contains the function functionname.
      */
      /* none at them moment */
      //$app->modules->registerTableHook('mail_access','mail_module','process');
      /*
      Do the monitor every n minutes and write the result in the db
      */
      $min = date('i');
      if (($min % $this->interval) == 0)
      {
         $this->doMonitor();
      }
   }
   /*
    This function is called when a change in one of the registered tables is detected.
    The function then raises the events for the plugins.
   */
   function process($tablename, $action, $data) {
      //      global $app;
      //
      //      switch ($tablename) {
      //         case 'mail_access':
      //            if($action == 'i') $app->plugins->raiseEvent('mail_access_insert',$data);
      //            if($action == 'u') $app->plugins->raiseEvent('mail_access_update',$data);
      //            if($action == 'd') $app->plugins->raiseEvent('mail_access_delete',$data);
      //            break;
      //      } // end switch
   } // end function
   /*
   This method is called every n minutes, when the module ist loaded.
   The method then does a system-monitoring
   */
   // TODO: what monitoring is done should be a config-var
   function doMonitor()
   {
      /* Calls the single Monitoring steps */
      $this->monitorServer();
      $this->monitorDiskUsage();
   }
   function monitorServer(){
      global $app;
      global $conf;
      /* the id of the server as int */
      $server_id = intval($conf["server_id"]);
      /** The type of the data */
      $type = 'server_load';
      /* Delete Data older than 1 day */
      $this->_delOldRecords($type, 0, 0, 1);
      /*
      Fetch the data into a array
      */
      $procUptime = shell_exec("cat /proc/uptime | cut -f1 -d' '");
      $data['up_days'] = floor($procUptime/86400);
      $data['up_hours'] = floor(($procUptime-$data['up_days']*86400)/3600);
      $data['up_minutes'] = floor(($procUptime-$data['up_days']*86400-$data['up_hours']*3600)/60);
      $data['uptime'] = shell_exec("uptime");
      $tmp = explode(",", $data['uptime'], 3);
      $tmpUser = explode(" ", trim($tmp[1]));
      $data['user_online'] = intval($tmpUser[0]);
      $loadTmp = explode(":" , trim($tmp[2]));
      $load = explode(",",  $loadTmp[1]);
      $data['load_1'] = floatval(trim($load[0]));
      $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...
      $state = 'ok';
      /*
      Insert the data into the database
      */
      $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " .
         "VALUES (".
         $conf["server_id"] . ", " .
         "'" . $app->db->quote(serialize($type)) . "', " .
         time() . ", " .
         "'" . $app->db->quote(serialize($data)) . "', " .
         "'" . $state . "'" .
         ")";
      $app->db->query($sql);
   function process() {
   }
   function monitorDiskUsage() {
      global $app;
      global $conf;
      /* the id of the server as int */
      $server_id = intval($conf["server_id"]);
      /** The type of the data */
      $type = 'disk_usage';
      /* Delete Data older than 10 minutes */
      $this->_delOldRecords($type, 10);
      /*
      Fetch the data into a array
      */
      $fd = popen ("df", "r");
      $buffer = '';
      while (!feof($fd)) {
         $buffer .= fgets($fd, 4096);
      }
      // split into array
      $df = split("\n", $buffer);
      // ignore the first line make a array of the rest
      for($i=1; $i <= sizeof($df); $i++){
         if ($df[$i] != '')
         {
            $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];
         }
      }
      // 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 (".
         $conf["server_id"] . ", " .
         "'" . $app->db->quote(serialize($type)) . "', " .
         time() . ", " .
         "'" . $app->db->quote(serialize($data)) . "', " .
         "'" . $state . "'" .
         ")";
      $app->db->query($sql);
   }
   //
   //
   //   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;
   //      }
   //   }
   /*
    Deletes Records older than n.
   */
   function _delOldRecords($type, $min, $hour=0, $days=0) {
      global $app;
      $now = time();
      $old = $now - ($min * 60) - ($hour * 60 * 60) - ($days * 24 * 60 * 60);
      $sql = "DELETE FROM monitor_data " .
         "WHERE " .
         "type =" . "'" . $app->db->quote(serialize($type)) . "' " .
         "AND " .
         "created < " . $old;
      $app->db->query($sql);
   }
} // end class
}
?>
?>