Code

- Yeah, we have complete svn build of GOsa, GOto, GOsa-si with svn tags and
[gosa.git] / gosa-core / include / class_log.inc
index daad88908e19a8211f9338350e61f0021f146f40..33e58523a94abddb8a76b4cd4bf8edc1fcc187d9 100644 (file)
@@ -1,24 +1,25 @@
 <?php
 /*
-   This code is part of GOsa (https://gosa.gonicus.de)
-   Copyright (C) 2003  Cajus Pollmeier
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ * This code is part of GOsa (http://www.gosa-project.org)
+ * Copyright (C) 2003-2008 GONICUS GmbH
+ *
+ * ID: $$Id$$
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 
-
 /*! \brief   The logging base class
   \author  Fabian Hickert <hickert@gonicus.de>
   \version 2.6
@@ -51,11 +52,11 @@ class log {
     }
 
     $entry = array(); 
-    if(!isset($_SESSION['config'])){
+    if(!session::global_is_set('config')){
       $entry['user']= "unkown";
     }else{
 
-      $this->config = &$_SESSION['config'];
+      $this->config = session::global_get('config');
       $ui           = get_userinfo(); 
       $entry['user']= @$ui->dn;
     }
@@ -75,7 +76,7 @@ class log {
     $entry['changes']   = $changes;
     $entry['result']    = $result;
 
-    if(!isset($this->config->current['LOGGING']) && empty($entry['user'])){
+    if(!isset($this->config) || ( $this->config->get_cfg_value("logging") == ""  && empty($entry['user']))){
       $entry['user']  = "unknown";
     }
  
@@ -84,26 +85,22 @@ class log {
     if(count($msgs)){
       foreach($msgs as $msg){
         trigger_error("Logging failed, reason was: ".$msg);
-        print_red("Logging failed, reason was: ".$msg); 
+        msg_dialog::display(_("Internal error"), sprintf(_("Logging failed: %s"), $msg), ERROR_DIALOG);
       }
       
     }else{
 
-      if(!isset($this->config->current['LOGGING'])){
-        $this->log_into_syslog($entry);
-      }else{
-
-        /* Start logging for configured methods */
-        if(isset($this->config->current['LOGGING']) && preg_match("/(^|,)syslog(,|$)/i",$this->config->current['LOGGING'])){
+      if (isset ($this->config)){
+        if ($this->config->get_cfg_value("logging") == ""){
           $this->log_into_syslog($entry);
-        }
-        if(isset($this->config->current['LOGGING']) && preg_match("/(^|,)mysql(,|$)/i",$this->config->current['LOGGING'])){
-          $res = $this->log_into_db($entry);
+        }else{
 
-          if(!$res){
-            global $config;
-            $config->current['LOGGING'] = preg_replace("/(^|,)mysql(,|$)/",",",$config->current['LOGGING']);
-            msg_dialog::display(_("Logging to MySQL disabled"),_("The logging to a MySQL database is now disabled for this session of GOsa, due to communication errors with the specified logging database."), INFO_DIALOG);
+          /* Start logging for configured methods */
+          if(preg_match("/(^|,)syslog(,|$)/i",$this->config->get_cfg_value("logging"))){
+            $this->log_into_syslog($entry);
+          }
+          if(preg_match("/(^|,)mysql(,|$)/i",$this->config->get_cfg_value("logging"))){
+            $this->log_into_db($entry);
           }
         }
       }
@@ -116,11 +113,11 @@ class log {
     $msgs = array();
 
     if(!isset($entry['action']) || !in_array($entry['action'],array("modify","create","remove","copy","snapshot","view","security","debug"))){
-      $msgs[] = "Invalid option specified '".$entry['action']."'";
+      $msgs[] = sprintf(_("Invalid option '%s' specified!"), $entry['action']);
     }
 
     if(!isset($entry['objecttype']) || empty($entry['objecttype'])){
-      $msgs[] = "Specified objectType is empty or invalid.";
+      $msgs[] = _("Specified objectType is empty or invalid!");
     }
   
     return($msgs);
@@ -130,58 +127,131 @@ class log {
   /* This function is used to into the systems syslog */
   function log_into_syslog($entry)
   {
-    $str = $entry['user']." ".$entry['action']." ".$entry['object']." from type ".$entry['objecttype']." ".$entry['changes']." : Result was ".$entry['result'];
+    $str= "";
+    if (empty($entry['object']) && empty($entry['changes'])) {
+      $str = "(".$entry['action'].") ".$entry['objecttype'].": ".$entry['result'];
+    } else {
+      $str = "(".$entry['action'].") ".$entry['object']." of type ".$entry['objecttype']." ".$entry['changes'].": ".$entry['result'];
+    }
     gosa_log($str);
   }
 
 
+  function disable_mysql_log($server,$error)
+  {
+    global $config;
+    msg_dialog::display(_("Error"), $error, ERROR_DIALOG);
+    msg_dialog::display(_("MySQL error"),sprintf(_("Logging to MySQL database will be disabled for server '%s'!"),$server), INFO_DIALOG);
+    unset($config->data['SERVERS']['LOGGING'][$server]) ;
+    $this->config = $config;
+  }
+
+
   /* Log into configured logging databses.*/
   function log_into_db($entry)
   {
     if(isset($this->config->data['SERVERS']['LOGGING'])){
       $servers = $this->config->data['SERVERS']['LOGGING'];
     }else{
-      print_red(_("You have enabled the logging into mysql databse, but there are no logging servers available."));
       return(FALSE);
     }
 
+    /* Log into each configured server 
+     */
     foreach($servers as $server_name => $server){
+
+      $error = "";
+   
+      /* Connect to the database 
+       */
+      ini_set("mysql.connect_timeout",5);
       $con = @mysql_pconnect($server_name,$server['USER'],$server['PWD']);
       if(!$con){
-        print_red(sprintf(_("Could not connect to logging server %s."),$server_name));
-        return(FALSE);
-      }else{
-        $db = mysql_select_db($server['DB'],$con);
-        if(!$db){
-          print_red(sprintf(_("Could not select database %s on server %s. Server says :%s"),$server['DB'],$server['SERVER'],mysql_error($con)));
-          return(FALSE);
-        }else{
+        $error = msgPool::dbconnect(_("MySQL logging"),mysql_error());
+        $this->disable_mysql_log($server_name,$error);
+        continue;
+      }
+
+      /* Check if the database is available 
+       */
+      $db = @mysql_select_db($server['DB'],$con);
+      if(!$db){
+        $error = msgPool::dbselect(_("MySQL logging"),mysql_error());
+        $this->disable_mysql_log($server_name,$error);
+        continue;
+      }
+
+      /* Check if our current location is already registerd 
+         in this case get its id.
+         If it wasn't registered yet, create it. 
+       */
+      $base = mysql_escape_string($this->config->current['BASE']);
+      $query= "SELECT id FROM gosa_locations WHERE location=\"".$base."\";";
+      $res  = mysql_query($query);  
+      if(!$res){
+        $error = msgPool::dbquery(_("MySQL logging"),mysql_error());
+        $this->disable_mysql_log($server_name,$error);
+        continue;
+      }
 
-          /* Create mysql syntax */
-          $query ="INSERT INTO gosa_log 
-                    (timestamp,user,action,objecttype,object,changes,result)
-                   VALUES 
-                    (
-                        \"".addslashes($entry['timestamp'])."\", 
-                        \"".addslashes($entry['user'])."\", 
-                        \"".addslashes($entry['action'])."\", 
-                        \"".addslashes($entry['objecttype'])."\", 
-                        \"".addslashes($entry['object'])."\", 
-                        \"".addslashes($entry['changes'])."\", 
-                        \"".addslashes($entry['result'])."\" 
-                    );
-              ";
-          $res = mysql_query($query,$con);
-          if(!$res){
-            print_red(sprintf(_("Could not query database %s on server %s. Server says :%s"),$server['DB'],$server['SERVER'],mysql_error($con)));
-            return(FALSE);
-          } 
+      $location_id = -1;
+      while($attrs = mysql_fetch_assoc($res)){
+        $location_id = $attrs['id'];
+        break;
+      }
+
+      /* No location found that matches our location.
+         Create it.
+       */
+      if($location_id == -1){
+        $query = "INSERT INTO gosa_locations (location) VALUES ('".$base."');";
+        if(!mysql_query($query,$con)){
+          $error = msgPool::dbquery(_("MySQL logging"),mysql_error());
+          $this->disable_mysql_log($server_name,$error);
+          continue;
+        }
+
+        /* Try to detect the location again 
+         */ 
+        $query= "SELECT id FROM gosa_locations WHERE location=\"".$base."\";";
+        $res  = mysql_query($query);
+        $location_id = -1;
+        while($attrs = mysql_fetch_assoc($res)){
+          $location_id = $attrs['id'];
+          break;
+        }
+        if($location_id == -1){
+          $error = sprintf(_("Cannot add location to the database!")."<br><br>"._("Error").": %s",mysql_error($con));
+          $this->disable_mysql_log($server_name,$error);
+          continue;
         }
+      }  
+
+      /* Create mysql syntax */
+      $query ="INSERT INTO gosa_log 
+        (timestamp,user,action,objecttype,object,changes,result,location_id)
+        VALUES 
+        (
+         \"".mysql_escape_string($entry['timestamp'])."\", 
+         \"".mysql_escape_string($entry['user'])."\", 
+         \"".mysql_escape_string($entry['action'])."\", 
+         \"".mysql_escape_string($entry['objecttype'])."\", 
+         \"".mysql_escape_string($entry['object'])."\", 
+         \"".mysql_escape_string($entry['changes'])."\", 
+         \"".mysql_escape_string($entry['result'])."\", 
+         \"".mysql_escape_string($location_id)."\" 
+        );
+      ";
+      $res = mysql_query($query,$con);
+      if(!$res){
+        $error = dbquery(_("MySQL logging"), mysql_error());
+        $this->disable_mysql_log($server_name,$error);
+        continue;
+      } 
+      if(is_resource($con)){
         mysql_close($con);
       }
     }
-    return(TRUE);
   }
 }