Code

Updated FAI state detction.
[gosa.git] / gosa-plugins / fai / admin / fai / class_FAI.inc
index 1fef153b638bc87723acf6a0508d7f0c0725b73e..34c36746540238525e476cf333b0460a01f25543 100644 (file)
@@ -26,7 +26,14 @@ class FAI
 
     /* Collect some basic informations and initialize some variables */ 
     $base_release       = FAI::get_release_dn($Current_DN);
-    $previous_releases  = array_reverse(FAI::             get_previous_releases_of_this_release($base_release,true));
+    $previous_releases  = array_reverse(FAI::get_previous_releases_of_this_release($base_release,true));
+
+    $ldap->cat($base_release);
+    $attrs = $ldap->fetch();
+    $FAIstate = "branch";
+    if(isset($attrs['FAIstate'][0])){
+      $FAIstate = $attrs['FAIstate'][0];
+    }
 
     /* We must also include the given release dn */
     $previous_releases[] = $base_release;
@@ -59,6 +66,22 @@ class FAI
             }
           }
 
+          /* Seems to be an inherited class, apply current FAIstate to this classes 
+           */
+          if(!preg_match("/".normalizePreg($base_release)."$/i",$attr['dn'])){
+            $buffer['FAIstate'] = $FAIstate; 
+          }else{
+
+            /* Seems to be created within this release department.
+               This indicates - it can't be of state "freeze"
+             */             
+            if(isset($attr['FAIstate'])){
+              $buffer['FAIstate'] = $attr['FAIstate'][0];
+            }else{
+              $buffer['FAIstate'] = "branch"; 
+            }
+          }
+
           /* In detailed mode are some additonal informations visible */
           if($detailed){
 
@@ -170,14 +193,16 @@ class FAI
       /* Dont't try to modify non FAIclasses  
        */
       if(!preg_match("/[^,]+,".normalizePreg(get_ou("faiou"))."/",$obj_dn)){
-        echo "PLEASE check fai class handling in ".__LINE__." -> ".__FILE__;        
+        trigger_error("PLEASE check fai class handling in ".__LINE__." -> ".__FILE__);        
+        echo "<br>-->".$Current_DN."<br>";
+        echo "<br>-->".$obj_dn."<br>";
       }else{
 
         /* Get source object and check if it is a base FAIclass
          */
         $ldap->cat($obj_dn);
         $attrs = $ldap->fetch();
-        $classes = array("FAIprofile","FAIscript","FAIpackage","FAIpartitionTable","FAIHook","FAIvariable","FAItemplate");
+        $classes = array("FAIprofile","FAIscript","FAIpackageList","FAIpartitionTable","FAIHook","FAIvariable","FAItemplate");
         if(count(array_intersect($classes,$attrs['objectClass']))){
           $cn    = $attrs['cn'][0];
 
@@ -273,9 +298,12 @@ class FAI
   {
     foreach($ar1 as $ak1 => $av1){
       if(!isset($ar2[$ak1]) || (!($av1 === $ar2[$ak1]))){
-        return(true);
+        return(TRUE);    
       }elseif(is_array($av1)){
-        return(FAI::arr_diff($av1,$ar2[$ak1]));
+        $ret = (FAI::arr_diff($av1,$ar2[$ak1]));
+        if($ret) {
+          return(TRUE);
+        }
       }
     }
     return(FALSE);
@@ -287,15 +315,23 @@ class FAI
   /* check which objects must be saved, and save them */
   static function save_release_changes_now()
   {
+    global $config;
     /* Variable init*/
     $to_save = array();
+    
+    $reload_fai_classes = FALSE;
 
     /* check which objects must be saved */
+    if(!session::is_set('FAI_objects_to_save')){
+      return;
+    }
     $FAI_objects_to_save = session::get('FAI_objects_to_save');
     if(!is_array($FAI_objects_to_save)) {
+      print_a(array(session::get('FAI_objects_to_save')));
       trigger_error("Can't save FAI objects, no array given.");
       return;
     }
+  
     foreach($FAI_objects_to_save as $Current_DN => $object){
       if($object['diff']){
         $sub_name = $Current_DN;
@@ -319,6 +355,7 @@ class FAI
     }
     $to_save = $tmp;
 
+
     /* Save objects and manage the correct release behavior*/
     foreach($to_save as $save){
 
@@ -327,7 +364,6 @@ class FAI
       $objectAttrs= $save['objectAttrs'];
 
       /* Get ldap object */ 
-      global $config;
       $ldap = $config->get_ldap_link();
       $ldap->cd($config->current['BASE']);
 
@@ -370,6 +406,12 @@ class FAI
           }else{
             $objectAttrs['FAIstate'][0] = "|removed";
           }
+
+          /* Force reload of FAI classes */
+          $classes = array("FAIprofile","FAIscript","FAIpackageList","FAIpartitionTable","FAIHook","FAIvariable","FAItemplate");
+          if(count(array_intersect($classes,$objectAttrs['objectClass']))){
+            $reload_fai_classes = TRUE;
+          }
         }
       }
 
@@ -382,6 +424,13 @@ class FAI
           print_a($objectAttrs);
         }
         FAI::save_FAI_object($Current_DN,$objectAttrs);
+
+        /* Force reload of FAI classes */
+        $classes = array("FAIprofile","FAIscript","FAIpackageList","FAIpartitionTable","FAIHook","FAIvariable","FAItemplate");
+        if(count(array_intersect($classes,$objectAttrs['objectClass']))){
+          $reload_fai_classes = TRUE;
+        }
+
       }else{
 
         /* This object is inherited by some sub releases */  
@@ -396,6 +445,12 @@ class FAI
         /* New objects require special handling */
         if($is_new){
 
+          /* Force reload of FAI classes */
+          $classes = array("FAIprofile","FAIscript","FAIpackageList","FAIpartitionTable","FAIHook","FAIvariable","FAItemplate");
+          if(count(array_intersect($classes,$objectAttrs['objectClass']))){
+            $reload_fai_classes = TRUE;
+          }
+
           /* check if there is already an entry named like this,
              in one of our parent releases */
           if(!empty($parent_obj)){
@@ -460,7 +515,26 @@ class FAI
           }
         }
       }
-    } 
+    }
+
+    /* Reload GOsa si FAI DB/cache
+     */
+    if($reload_fai_classes){
+      if( class_available("DaemonEvent") && class_available("gosaSupportDaemon")){
+        $events = DaemonEvent::get_event_types(SYSTEM_EVENT | HIDDEN_EVENT);        
+        if(isset($events['TRIGGERED']['DaemonEvent_recreate_fai_release_db'])){
+          $evt = $events['TRIGGERED']['DaemonEvent_recreate_fai_release_db']; 
+          $tmp = new $evt['CLASS_NAME']($config);
+          $tmp->set_type(TRIGGERED_EVENT);
+          $tmp->add_targets(array("GOsa"));
+          $o_queue = new gosaSupportDaemon();
+          if(!$o_queue->append($tmp)){
+            msg_dialog::display(_("Service infrastructure"),msgPool::siError($o_queue->get_error()),ERROR_DIALOG);
+          }
+        }
+      }
+    }
+
     session::set('FAI_objects_to_save',array());
   }
 
@@ -895,7 +969,7 @@ class FAI
     $to_copy = array();
     foreach($source_dns as $dn => $attrs){
       $ldap->cd($dn);
-      $ldap->ls("(objectClass=gotoSubmenuEntry)(objectClass=gotoMenuEntry)",$dn,array("dn"));
+      $ldap->ls("(|(objectClass=gotoSubmenuEntry)(objectClass=gotoMenuEntry))",$dn,array("dn"));
       while($attrs = $ldap->fetch()){
         $destination = preg_replace("/".normalizePreg($dn)."$/","ou=".$destination_name.",".$dn,$attrs['dn']);
         $to_copy[$attrs['dn']] = $destination;
@@ -928,7 +1002,7 @@ class FAI
    *  @param $is_first          Boolean Use to identify the first func. call when recursivly called.
    *  @param $depth             Integer Current depth of recursion.
    */
-  function copy_FAI_resource_recursive($sourcedn,$destinationdn,$destinationName,$type="branch",$is_first = true,$depth=0)
+  static function copy_FAI_resource_recursive($sourcedn,$destinationdn,$destinationName,$type="branch",$is_first = true,$depth=0)
   {
     global $config;
     error_reporting(E_ALL | E_STRICT);