Code

Reverte 8071, because it has drawbacks that I don't want to debug right now. Moving...
authorcajus <cajus@594d385d-05f5-0310-b6e9-bd551577e9d8>
Wed, 12 Dec 2007 10:11:10 +0000 (10:11 +0000)
committercajus <cajus@594d385d-05f5-0310-b6e9-bd551577e9d8>
Wed, 12 Dec 2007 10:11:10 +0000 (10:11 +0000)
git-svn-id: https://oss.gonicus.de/repositories/gosa/branches/2.5@8094 594d385d-05f5-0310-b6e9-bd551577e9d8

plugins/admin/systems/class_workstationStartup.inc

index 6177cff8b04c9add66c42f929e9f6abd51c210ee..0f47013a881e76eb534cea75ce53d47d1120e4e5 100644 (file)
@@ -93,6 +93,9 @@ class workstartup extends plugin
     /* Perform some special FAI stuff, only if it is activated */
     if($this->fai_activated){
 
+      $_SESSION['getAvailableClassesForThisRelease_CACHE'] = array();
+      $_SESSION['getAvailableClassesForThisRelease_CACHED_CLASSES'] = array();
+
       $ui = get_userinfo();
       $res = get_list(          "(|(objectClass=FAIpackageList)".
           "(objectClass=FAItemplate)".
@@ -107,6 +110,8 @@ class workstartup extends plugin
       foreach($res as $attr){
         $cn = $attr['cn'][0];
 
+        $_SESSION['getAvailableClassesForThisRelease_CACHED_CLASSES'][] = $attr;
+
         if(!isset($attr['description'])){
           $attr['description'][0] = "";
         }
@@ -165,59 +170,46 @@ class workstartup extends plugin
         $this->FAIclassInfo = array();
       }
 
-      /* Build up a release array */
+      /* Build up an array like this one :
+         [$url]['SERVER'] = 'srv1-002';
+         [$url]['RELEASE']['siga/rc9.0.2']
+         ['SECTIONS'][0] "main";
+         ['SECTIONS'][1] "non-free";
+         [$url]['RELEASE']['siga/rc9.0.2']
+         ['PACKAGES'][0] "pkg1";
+         ['PACKAGES'][1] "postfix";
+       */
       $filter= "";
       $ui= get_userinfo();
       if (isset($config->current['STRICT_UNITS']) && preg_match('/TRUE/i', $config->current['STRICT_UNITS']) && $ui->gosaUnitTag != ""){                                                                                                                                  $filter= "(gosaUnitTag=".$ui->gosaUnitTag.")";
-      }
-      
-      /* Fill up releases array */
-      $release_bases= array();
-      $res= get_list("(&(objectClass=FAIbranch)$filter)", $ui->subtreeACL, $this->config->current['BASE'], array());
-      foreach ($res as $value){
-        if (!preg_match('/,ou=(apps|mime),/', $value['dn'])){
-          $release_bases[$value['dn']]= $value['dn'];
-        }
-      }
-
-      /* Load all classes for each release */
-      $releases= array();
-      foreach($release_bases as $base){
-        $tmp= preg_replace('/,ou=fai,ou=configs,ou=systems,.*$/', '', $base);
-        $tmp= explode('ou=', trim(preg_replace('/ou=fai,ou=configs,ou=systems,.*$/', '', $tmp), ','));
-        $release= trim(implode('/', array_reverse($tmp)), '/');
-        foreach (array("disk", "hooks", "scripts", "packages", "profiles", "templates", "variables") as $type){
-          $res= get_list("(&(objectClass=FAIclass)$filter)", $ui->subtreeACL,
-                         "ou=$type,".$base, array(), GL_NONE);
-          foreach ($res as $value){
-            $name= preg_replace('/^[^=]+=([^,]+),.*$/', '\1', $value['dn']);
-            $releases[$release][]= $name;
-          }
-        }
-
-        sort($releases[$release]);
-        $releases[$release]= array_unique($releases[$release]);
-      }
-
-      /* Load all classes for this release */
-      $res= get_list("(&(objectClass=FAIbranch)$filter)", $ui->subtreeACL, $this->config->current['BASE'], array());
-
-      /* Fill up server array */
-      $ldap->search("(&(FAIrepository=*)(objectClass=FAIrepositoryServer)$filter)",array("FAIrepository"));
+      }                                                                                                                                $ldap->search("(&(FAIrepository=*)(objectClass=FAIrepositoryServer)$filter)",array("FAIrepository"));
       $test = array();
       while($attr = $ldap->fetch()){
         if(isset($attr['FAIrepository'])){
+
           unset($attr['FAIrepository']['count']);
+
           foreach($attr['FAIrepository'] as $rep){
-            list($url, $server, $release, $sections)= split("\|",$rep);
+            $tmp = split("\|",$rep);
+
+            if(count($tmp)==4){
+              $sections = split(",",$tmp[3]);
+              $release  = $tmp[2];
+              $server   = $tmp[1];
+              $url      = $tmp[0];
 
-            /* Assign non-auto releases */
-            $test[$url][$release]['SECTIONS'] = split(',', $sections);
-            $test[$url][$release]['CLASSES'] = isset($releases[$release])?$releases[$release]:array();
+              $test[$url]['RELEASE'][$release]['SECTIONS'] = $sections;
 
-            /* auto gets all releases/classes */
-            $test['auto'][$release]['SECTION'] = $sections;
-            $test['auto'][$release]['CLASSES'] = isset($releases[$release])?$releases[$release]:array();
+              /* Result will be cached
+               */
+              $test[$url]['RELEASE'][$release]['PACKAGES'] = $this->getAvailableClassesForThisRelease($release);
+              $test[$url]['SERVER'] = $server;
+
+              /* auto gets all releases/classes 
+               */
+              $test['auto']['RELEASE'][$release]['SECTION'] = $sections;
+              $test['auto']['RELEASE'][$release]['PACKAGES'] = $this->getAvailableClassesForThisRelease($release);
+            }
           }
         }
       }
@@ -227,7 +219,7 @@ class workstartup extends plugin
       foreach ($lines as $hline){
         $entries= split(";", $hline);
         if (isset($entries[1]) && !isset($test[$entries[1]])){
-          $test[$entries[1]]= array();
+          $test[$entries[1]]['RELEASE']= array();
 
           /* Split releases */
           if (isset($entries[2])){
@@ -237,11 +229,11 @@ class workstartup extends plugin
               $rname= preg_replace('/:.*$/', '', $release);
               $sections= split(':', preg_replace('/^[^:]+:([^|]+)|.*$/', '\1', $release));
               $classes= split('\|', preg_replace('/^[^|]+\|(.*)$/', '\1', $release));
-              $test[$entries[1]][$rname]= array();
-              $test[$entries[1]][$rname]['SECTION']= $sections;
+              $test[$entries[1]]['RELEASE'][$rname]= array();
+              $test[$entries[1]]['RELEASE'][$rname]['SECTION']= $sections;
               foreach ($classes as $class){
                 if ($class != ""){
-                  $test[$entries[1]][$rname]['CLASSES'][$class]= $class;
+                  $test[$entries[1]]['RELEASE'][$rname]['PACKAGES'][$class]= $class;
                 }
               }
             }
@@ -414,6 +406,45 @@ class workstartup extends plugin
   }
 
   
+  /* This class is called by the contrucktor ONLY.
+   *   It return the available classes for each 
+   *    Server / Release combination ... 
+   *   (Release specifies which classes are available) 
+   */
+  function getAvailableClassesForThisRelease($release)
+  {
+    /* There could be more than one server providing this release,
+        so use cached result if available
+     */ 
+    if(isset($_SESSION['getAvailableClassesForThisRelease_CACHE'][$release]))  {
+      return($_SESSION['getAvailableClassesForThisRelease_CACHE'][$release]);
+    }
+
+    /* Walk through cache and get out what we need.
+     *   
+     *   Function od : "$this->generateDNSyn($release)"
+     *    It returns an array like this one :
+     *       array("ou=packges,ou=rc0.9.2,ou=siga,", 
+     *            "ou=scripts.. " 
+     *             ...);
+     *   This helps us to select the correct classes for each release. 
+     *   It prevents errors like:  'siga' is selected as release, but all classes
+     *     with ou='siga' in their dn are shown, also ou=rc...,ou=siga...  
+     */
+    $tmp2 = $this->generateDNSyn($release)     ; 
+    $test2 = array();
+    foreach($_SESSION['getAvailableClassesForThisRelease_CACHED_CLASSES'] as $attr){  
+      foreach($tmp2 as $dns){
+        if(preg_match("/".$dns."/",$attr['dn'])){
+          $test2[$attr['cn'][0]] = $attr['cn'][0];
+        }
+      }
+    }
+    $_SESSION['getAvailableClassesForThisRelease_CACHE'][$release] = $test2;
+    return($test2);
+  }
+
+
   /*  Create array to display available classes/profiles in a selectbox 
    *   This function only displays the available classes.
    *   If a class is available is defined by these facts : 
@@ -445,11 +476,11 @@ class workstartup extends plugin
     /* Get all Packages for this server/release combination
      */
 
-    if(!isset($this->FAIServRepConfig[$this->FAIdebianMirror][$this->FAIrelease]['CLASSES'])){
+    if(!isset($this->FAIServRepConfig[$this->FAIdebianMirror]['RELEASE'][$this->FAIrelease]['PACKAGES'])){
       $pkgs = array();
       print_red(_("There are packages in your configuration, which can't be resolved with current server/release settings."));
     }else{
-      $pkgs = $this->FAIServRepConfig[$this->FAIdebianMirror][$this->FAIrelease]['CLASSES'];
+      $pkgs = $this->FAIServRepConfig[$this->FAIdebianMirror]['RELEASE'][$this->FAIrelease]['PACKAGES'];
     }
 
     /* Check each and every single class name 
@@ -863,7 +894,7 @@ class workstartup extends plugin
       }else{
         $tmp = $this->getFAIreleases();
         foreach($tmp as $release => $data){
-          if(isset($rest[$release]) && $release == $this->FAIrelease){
+          if(isset($rest['RELEASE'][$release]) && $release == $this->FAIrelease){
             $use = $data['USE']; 
           }
         } 
@@ -891,13 +922,13 @@ class workstartup extends plugin
     }
 
     $errorClasses = array();
-    if(isset($this->FAIServRepConfig[$this->FAIdebianMirror])) {
-      foreach($this->FAIServRepConfig[$this->FAIdebianMirror] as $release => $sections){
+    if(isset($this->FAIServRepConfig[$this->FAIdebianMirror]['RELEASE'])) {
+      foreach($this->FAIServRepConfig[$this->FAIdebianMirror]['RELEASE'] as $release => $sections){
         $use = true;
 
         if(!count($this->FAIclass) == 0){
           foreach($this->FAIclass as $class){
-            if(!in_array($class, $sections['CLASSES'])){
+            if(!in_array($class, $sections['PACKAGES'])){
               $use = false;
               $errorClasses[$class] = $class;
             }else{