Added new table to the database: log_adv_daemon_email.
[gnucomo.git] / src / gcm_daemon / gcm_daemon.php
index 8d56920..1ed9bc9 100755 (executable)
@@ -1,3 +1,4 @@
+#!/usr/bin/php
 <?PHP
 /**********************************************************************************
 **  (c) Copyright 2002, Brenno J.S.A.A.F. de Winter, De Winter Information Solutions
    
    * DATES * 
    First       : November 8th 2002
+   Gnucomo-0.0.3: December 6th 2002
+
+ $Log: gcm_daemon.php,v $
+ Revision 1.9  2003-02-21 08:37:59  arjen
+ Added new table to the database: log_adv_daemon_email.
+
 
 */
 
+// $Id: gcm_daemon.php,v 1.9 2003-02-21 08:37:59 arjen Exp $
+
+ini_set('include_path', '.:./classes:../phpclasses');
+
 //Tell the log that we're up.
 define_syslog_variables();
 openlog("gnucomo", LOG_PID, LOG_DAEMON);
 syslog(LOG_INFO, "gcm_daemon started");
 
-require_once "classes/gnucomo_config.class.php";
-require_once "classes/db.class.php";
-require_once "classes/gnucomo.process_log.php";
+require_once "gnucomo_config.php";
+require_once "db.class.php";
+require_once "gnucomo.process_log.php";
 
 // Set the standard variables //
 $project_name  = "gnucomo";    //name of the entire project
 $app_name      = "gcm_daemon"; //name of the application running
-$db_version    = 13;           //The db_version indicates what the level of 
+$developrelease = "TRUE";      //Indicates if special debug settings are needed
+$db_version    = 32;           //The db_version indicates what the level of 
                                //the database should be. If the database is 
                                //old an update will be generated.
-$gcmd_version   = 2;           //This value indicates the active version of the gcm_daemon,
+$gcmd_version   = 3;           //This value indicates the active version of the gcm_daemon,
                                //which is saved in the database. Log records that were not
                                //recognized before will now be recognized. The version doesn't
                                //mean anything in the overall gnucomo project.
 
+//Avoid time-limit issues
+set_time_limit(0);
+
+
 // Read the database settings //
 $class_settings = new gnucomo_config();
 $class_settings->read($project_name);
@@ -60,11 +76,13 @@ $dbms->db_connect();
 
 if ($dbms->have_db_connection() == "FALSE") {
   exit ("Database connection failed.");
+} else {
+  //The database connection has been made.
+  $dbms_working = copy_db_class($dbms);
 }
-//The database connection has been made.
 
 //Verify if the database is up-to-date by checking the versionnumber
-$local_sql = "SELECT setting_value FROM db_value WHERE setting = 'db_version'";
+$local_sql = "SELECT setting_value FROM db_value WHERE setting = 'db_version' ";
 $dbms->query($local_sql);
 
 if ($dbms->fetch_row() == "TRUE") {
@@ -72,7 +90,7 @@ if ($dbms->fetch_row() == "TRUE") {
  
   //Update the database to the most recent version.
   if ($active_version < $db_version) { 
-     include ("classes/gnucomo_db_version.php");
+     include ("gnucomo_db_version.php");
   }
 } else {
   syslog (LOG_INFO, "Couldn't initialize database version. Is this a gnucomo database?");
@@ -82,13 +100,13 @@ if ($dbms->fetch_row() == "TRUE") {
 //If there is a new gcm_daemon_version the logrecords that couldn't be understood can be
 //reprocessed. For this reason processed is now changed to false again for not recognized
 //records.
-$local_sql = " SELECT setting_value FROM db_value WHERE setting = 'gcm_daemon_version'";
+$local_sql = "SELECT setting_value FROM db_value WHERE setting = 'gcm_daemon_version'";
 $dbms->query($local_sql);
 
 if ($dbms->fetch_row() == "TRUE") {
    if ($dbms->db_result_row[0] < $gcmd_version) {
       //Reactive log-records that weren't understood earlier.
-      $local_sql = "UPDATE log SET processed = false WHERE recognized = false";
+      $local_sql = "UPDATE log SET processed = false WHERE logid NOT IN (SELECT DISTINCT logid FROM log_adv)";
       $dbms->query($local_sql);
 
       //Update de gcm_daemon version in the database
@@ -100,10 +118,18 @@ if ($dbms->fetch_row() == "TRUE") {
       
 }
 
+//Now we loop the tasks that we have to do.
 
-  
-//At this place we start processing new log-lines 
-process_log ();
+
+do {
+
+  //At this place we start processing new log-lines 
+  process_log ();
+  notificationstats();
+
+  $keep_running = 'FALSE';
+
+} while ($keep_running == 'TRUE');
 
 //Tell the log that we're ending our efforts in a nice way
 syslog (LOG_INFO, "gcm_daemon ended nicely");
@@ -118,10 +144,40 @@ function process_log () {
   * OUTPUT : NONE
   */
   global $dbms;
+  global $dbms_working;
+
+  //Find records in log that still have to be processed.
+
+  $local_sql = "SELECT setting_value FROM db_value WHERE setting = 'log_processing'";
+  $dbms->query($local_sql);
+
+  if ($dbms->fetch_row() == "TRUE") {
+     $last_log = $dbms->db_result_row[0];
+  }
   
-  //Find open records.
-  $local_sql = "SELECT * FROM log WHERE processed = FALSE";
+  //Query the log-table
+  $local_sql = "SELECT * FROM log WHERE logid > CAST(".$last_log." AS BIGINT) order by logid";
   $dbms->query($local_sql);
+
+  //Update the log-statistics in the object-table 
+  $local_statistics_db = copy_db_class($dbms);
+  $local_findobject_db = copy_db_class($dbms);
+
+  //Make totals 
+  $local_upper_row = $dbms->num_rows() + $last_log + 1;
+  $local_sql = "SELECT COUNT(logid), objectid from log WHERE logid > CAST(". $last_log .
+      " AS BIGINT) AND logid < CAST (" . $local_upper_row . " AS BIGINT) GROUP BY objectid";
+  $local_statistics_db->query ($local_sql);
+
+  //Loop the objects
+  for ($i = 1; $i <= $local_statistics_db->num_rows(); $i++) {
+      $local_object_row = $local_statistics_db->fetch_row();
+      $local_sql = "UPDATE object SET log_count = log_count + " . 
+          $local_statistics_db->db_result_row[0] . " WHERE objectid = '" .
+         $local_statistics_db->db_result_row[1] . "'";
+      $local_findobject_db->query($local_sql);  
+  }
+
   $local_counter = 0;
 
   if ($dbms->num_rows() > 0) {
@@ -130,27 +186,24 @@ function process_log () {
     $dbms_changes = copy_db_class($dbms);
     if ($dbms_changes->have_db_connection() == 'TRUE') {
 
-       $local_sql               = 0;     
+       $local_sql               = 0 ;     
+       $local_sql_statistics    = "";
        $local_object_os         = "";
        $local_object_os_version = "";
 
-       //Walk through all the log-records.
-
        while ($local_counter < $dbms->num_rows()) {
+
          $local_return_row = $dbms->fetch_row();
          if ($local_return_row == 'TRUE') {
             //Work on active rows
             $local_log_id = $dbms->db_result_row[0];
 
-            //If this is the first time get information about the object
-            if ($local_object_os == "") {
-              //No OS has been given yet, so let's find the objectid.
-              $local_findobject_db = copy_db_class($dbms);
-
-              $local_sql_findobject = "SELECT os, os_version FROM object WHERE objectid = '".$dbms->db_result_row[0]."'";
-              $local_findobject_db->query($local_sql_findobject);
-              $local_findobject_result = $local_findobject_db->fetch_row();
-              if ($local_findobject_result == 'TRUE') {
+            $local_sql_findobject = "SELECT os, os_version FROM object WHERE objectid = '".$dbms->db_result_row[1]."'";
+            $local_findobject_db->query($local_sql_findobject);
+            $local_findobject_result = $local_findobject_db->fetch_row();
+            if ($local_findobject_result == 'TRUE') {
+               
+               //Now work on the OS again
                 $local_object_os = $local_findobject_db->db_result_row[0];
                 if  ($local_object_os == "") {
                     $local_object_os = "Linux";
@@ -158,10 +211,6 @@ function process_log () {
                 } else {
                   $local_object_os_version = $local_findobject_db->db_result_row[1];
                 }
-              } else {
-                syslog (LOG_INFO, "Couldn't find object for log-records");
-                die("Couldn't match log-records to any existing object");
-              }
              }
 
             switch (strtolower($local_object_os)) {
@@ -172,17 +221,10 @@ function process_log () {
                 syslog (LOG_INFO, "Couldn't find suitable OS for processing the logline");
                 break;
              }
-
-            //Now that the processing took place change the processing state if processing was
-            //completed successfully.
-            if ($local_process_return == 'TRUE') {
-               $local_sql_processed = "UPDATE log SET recognized = TRUE where logid = $local_log_id";
-               $dbms_changes->query($local_sql_processed);
+            
+            if ($local_process_return <> 'TRUE') {
+              $local_process_return = 'FALSE';
             }
-            //Change the status of the log-record to processed.
-            $local_sql_processed = "UPDATE log SET processed = TRUE WHERE logid = $local_log_id";
-            $dbms_changes->query($local_sql_processed);       
 
          } else {
 
@@ -191,13 +233,74 @@ function process_log () {
          }
          $local_counter++;
        } 
+       
+       //Register that the logrecords have been processed.
+       $local_sql = "UPDATE db_value SET setting_value = '".$local_log_id."' where setting = 'log_processing'";
+       $dbms->query($local_sql);
+       
+
+       //Update the statistics for the object-table
+       
+
      } else {
        syslog (LOG_INFO, "Couldn't clone database connection.");
        die ("Couldn't reconnect to the database.\n");
     }     
    }
+
 }
 
-?>
+function notificationstats () {
+
+/* This routine will determine how many new notifications have arrived and will
+ * update the statistics in the object-table to keep the performance acceptable
+ * INPUT  : NONE
+ * OUTPUT : NONE
+ */
+           
+ global $dbms;
+
+ //Find records in log that still have to be processed.
+ $local_sql = "SELECT setting_value FROM db_value WHERE setting = 'last_notification'";
+ $dbms->query($local_sql);
+ $local_dbms = copy_db_class($dbms);
+
+ //Determine the last notification
+ if ($dbms->fetch_row() == "TRUE") {
+    $last_notification = $dbms->db_result_row[0];
+ }
+ //Determine how many records we are going to analyse.
+ $local_sql = "SELECT MAX(notificationid) FROM notification " .
+   "WHERE notificationid > CAST ('" . $last_notification . "' AS BIGINT)";
+ $dbms->query($local_sql);  
+
+ //Only process data if there are new notifications
+ if ($dbms->fetch_row() == "TRUE") {
+  if (intval($dbms->db_result_row[0])>0) {
+     $local_upper = $dbms->db_result_row[0] + 1;
+     $local_max   = $dbms->db_result_row[0];
+     $local_sql   = "SELECT COUNT(objectid), objectid FROM notification " .
+       "WHERE notificationid > CAST ('" .  $last_notification ."' AS BIGINT) " .
+       "AND   notificationid < CAST ('" .  $local_upper .
+       "' AS BIGINT) GROUP BY objectid";
+     $dbms->query($local_sql);
+
+
+     for ($i=0; $i < $dbms->num_rows(); $i++) {
+       $dbms->fetch_row();
+    
+       $local_sql = "UPDATE object SET notification_count = notification_count + " . $dbms->db_result_row[0] .
+         " WHERE objectid = '" . $dbms->db_result_row[1] . "'";
+      $local_dbms->query($local_sql); 
+     }  
+
+     $local_sql = "UPDATE db_value SET setting_value = '" . $local_max . 
+       "' WHERE setting = 'last_notification'";
+     $dbms->query($local_sql);  
+  }   
+ } 
+}
 
+?>