Code

Partly extracted copy_FAI_resource_recursive.
authorhickert <hickert@594d385d-05f5-0310-b6e9-bd551577e9d8>
Tue, 15 Jan 2008 09:46:31 +0000 (09:46 +0000)
committerhickert <hickert@594d385d-05f5-0310-b6e9-bd551577e9d8>
Tue, 15 Jan 2008 09:46:31 +0000 (09:46 +0000)
- Not finished yet.

git-svn-id: https://oss.gonicus.de/repositories/gosa/trunk@8344 594d385d-05f5-0310-b6e9-bd551577e9d8

gosa-core/include/class_ldap.inc

index 96a7e56ee679444c3902766fca45e608bd821bf2..53cdac8204bdf4eba8b344938b8362111c98ea70 100644 (file)
@@ -444,175 +444,6 @@ class LDAP{
     }
   }
 
-  /* Copy given attributes and sub-dns with attributes to destination dn 
-  */
-  function copy_FAI_resource_recursive($sourcedn,$destinationdn,$destinationName,$type="branch",$is_first = true,$depth=0)
-  {
-    error_reporting(E_ALL | E_STRICT);
-    
-    if($is_first){
-      echo "<h2>".sprintf(_("Creating copy of %s"),"<i>".LDAP::fix($sourcedn)."</i>")."</h2>";
-    }else{
-      if(preg_match("/^ou=/",$sourcedn)){
-        echo "<h3>"._("Processing")." <i>".LDAP::fix($destinationdn)."</i></h3>";
-      }else{
-        $tmp = split(",",$sourcedn);
-        
-        echo "&nbsp;<b>"._("Object").":</b> ";
-
-        $deststr = LDAP::fix($destinationdn);
-        if(strlen($deststr) > 96){
-          $deststr = substr($deststr,0,96)."...";
-        }
-
-        echo $deststr."<br>";
-      }
-    }
-
-    flush();
-    
-    if($this->hascon){
-      if ($this->reconnect) $this->connect();
-
-      /* Save base dn */
-      $basedn= $this->basedn;
-      $delarray= array();
-     
-      /* Check if destination entry already exists */
-      $this->cat($destinationdn);
-
-      if($this->count()){
-        return;
-      }else{
-        
-        $this->clearResult();
-
-        /* Get source entry */
-        $this->cd($basedn);
-        $this->cat($sourcedn);
-        $attr = $this->fetch();
-
-        /* Error while fetching object / attribute abort*/
-        if((!$attr) || (count($attr)) ==0) {
-          echo _("Error while fetching source dn - aborted!");
-          return;
-        }
-  
-        /* check if this is a department */
-        if(in_array("organizationalUnit",$attr['objectClass'])){
-          $attr['dn'] = LDAP::convert($destinationdn);
-          $this->cd($basedn);
-          $this->create_missing_trees($destinationdn);
-          $this->cd($destinationdn);
-
-          /* If is first entry, append FAIbranch to department entry */
-          if($is_first){
-            $this->cat($destinationdn);
-            $attr= $this->fetch();
-
-            /* Filter unneeded informations */
-            foreach($attr as $key => $value){
-              if(is_numeric($key)) unset($attr[$key]);
-              if(isset($attr[$key]['count'])){
-                if(is_array($attr[$key])){
-                  unset($attr[$key]['count']);
-                }
-              }
-            }
-            
-            unset($attr['count']);
-            unset($attr['dn']);
-
-            /* Add marking attribute */
-            $attr['objectClass'][] = "FAIbranch";
-            
-            /* Add this entry */
-            $this->modify($attr);
-          }
-        }else{
-
-          /* If this is no department */
-          foreach($attr as $key => $value){
-            if(in_array($key ,array("FAItemplateFile","FAIscript", "gotoLogonScript", "gosaApplicationIcon","gotoMimeIcon"))){
-              $sr= ldap_read($this->cid, LDAP::fix($sourcedn), "$key=*", array($key));
-              $ei= ldap_first_entry($this->cid, $sr);
-              if ($tmp= @ldap_get_values_len($this->cid, $ei,$key)){
-                $attr[$key] = $tmp;
-              }
-            }
-
-            if(is_numeric($key)) unset($attr[$key]);
-            if(isset($attr[$key]['count'])){
-              if(is_array($attr[$key])){
-                unset($attr[$key]['count']);
-              }
-            }
-          }
-          unset($attr['count']);
-          unset($attr['dn']);
-
-          if((!in_array("gosaApplication" , $attr['objectClass'])) && (!in_array("gotoMimeType", $attr['objectClass']))){
-            $attr['FAIdebianRelease'] = $destinationName;
-            if($type=="branch"){
-              $attr['FAIstate'] ="branch";
-            }elseif($type=="freeze"){
-              $attr['FAIstate'] ="freeze";
-            }else{
-              msg_dialog::display(_("Internal error"), sprintf(_("FAIstate '%s' is unknown!"),$type), ERROR_DIALOG);
-            }
-          }
-
-          /* Replace FAIdebianRelease with new release name */
-          if(in_array("FAIpackageList" , $attr['objectClass'])){
-            $attr['FAIdebianRelease'] = $destinationName; 
-          }
-
-          /* Add entry */
-          $this->cd($destinationdn);
-          $this->cat($destinationdn);
-          $a = $this->fetch();
-          if(!count($a)){
-            $this->add($attr);
-          }
-
-          if($this->error != "Success"){
-            /* Some error occurred */
-            print "---------------------------------------------";
-            print $this->get_error()."<br>";
-            print $sourcedn."<br>";
-            print $destinationdn."<br>";
-            print_a( $attr);
-            exit();
-          }          
-        }
-      }
-
-      echo "<script language=\"javascript\" type=\"text/javascript\">scrollDown2();</script>" ;
-
-      $this->ls ("(objectClass=*)",$sourcedn);
-      while ($this->fetch()){
-        $deldn= $this->getDN();
-        $delarray[$deldn]= strlen($deldn);
-      }
-      asort ($delarray);
-      reset ($delarray);
-
-       $depth ++;
-      foreach($delarray as $dn => $bla){
-        if($dn != $destinationdn){
-          $this->cd($basedn);
-          $item = $this->fetch($this->cat($dn));
-          if(!in_array("FAIbranch",$item['objectClass'])){
-            $this->copy_FAI_resource_recursive($dn,str_replace($sourcedn,$destinationdn,$dn),$destinationName,$type,false,$depth);
-          } 
-        }
-      }
-    }
-    if($is_first){
-      echo "<p class='seperator'>&nbsp;</p>";
-    }
-
-  }
 
   function modify($attrs)
   {
@@ -1434,5 +1265,198 @@ class LDAP{
 
 }
 
+
+/*! \brief Create a new FAI branch.
+ *  @param $sourcedn          String  The source release dn
+ *  @param $destinationdn     String  The destination dn
+ *  @param $destinationName   String  The name of the new release 
+ *  @param $type              String  The release type (freeze/branch)
+ *  @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)
+{
+  global $config;
+  error_reporting(E_ALL | E_STRICT);
+  $ldap     = $config->get_ldap_link();
+  $basedn   = $config->current['BASE'];
+  $delarray = array();
+
+  /* The following code will output a status string
+   *  for each handled object, in a seperate iframe. 
+   */
+
+    
+  /* Display current action information.
+   */
+  if($is_first){
+    echo "<h2>".sprintf(_("Creating copy of %s"),"<i>".LDAP::fix($sourcedn)."</i>")."</h2>";
+  }else{
+    if(preg_match("/^ou=/",$sourcedn)){
+      echo "<h3>"._("Processing")." <i>".LDAP::fix($destinationdn)."</i></h3>";
+    }else{
+      $tmp = split(",",$sourcedn);
+      echo "&nbsp;<b>"._("Object").":</b> ";
+      $deststr = LDAP::fix($destinationdn);
+      if(strlen($deststr) > 96){
+        $deststr = substr($deststr,0,96)."...";
+      }
+      echo $deststr."<br>";
+    }
+  }
+  /* .. immediately display infos */
+  flush();
+
+
+
+  /* Check if destination entry already exists 
+   */
+  $ldap->cat($destinationdn);
+  if($ldap->count()){
+    echo _("Could not create new release, the destination dn is already in use.");
+    return;
+  }else{
+
+    $ldap->clearResult();
+
+    /* Get source entry 
+     *  if it does not exist, abort here.
+     */
+    $ldap->cd($basedn);
+    $ldap->cat($sourcedn);
+    $attr = $ldap->fetch();
+    if((!$attr) || (count($attr)) ==0) {
+      echo _("Error while fetching source dn - aborted!");
+      return;
+    }
+
+    /* The current object we want to create is an department. 
+     * Create the department and add the FAIbranch tag.
+     */
+    if(in_array("organizationalUnit",$attr['objectClass'])){
+      $attr['dn'] = LDAP::convert($destinationdn);
+      $ldap->cd($basedn);
+      $ldap->create_missing_trees($destinationdn);
+      $ldap->cd($destinationdn);
+
+      /* If is first entry, append FAIbranch to department entry */
+      if($is_first){
+        $ldap->cat($destinationdn);
+        $attr= $ldap->fetch();
+
+        /* Filter unneeded informations */
+        foreach($attr as $key => $value){
+          if(is_numeric($key)) unset($attr[$key]);
+          if(isset($attr[$key]['count'])){
+            if(is_array($attr[$key])){
+              unset($attr[$key]['count']);
+            }
+          }
+        }
+
+        unset($attr['count']);
+        unset($attr['dn']);
+
+        /* Add marking attribute */
+        $attr['objectClass'][] = "FAIbranch";
+
+        /* Add this entry */
+        $ldap->modify($attr);
+      }
+    }else{
+
+      /* Replicate all relevant FAI objects here. 
+       * FAI objects, Apps and Mimetypes.
+       * Get all attributes as binary value, to ensure that Icon, File template aso
+       *  are created correctly.
+       */
+      foreach($attr as $key => $value){
+        if(in_array($key ,array("FAItemplateFile","FAIscript", "gotoLogonScript", "gosaApplicationIcon","gotoMimeIcon"))){
+          $sr= ldap_read($ldap->cid, LDAP::fix($sourcedn), "$key=*", array($key));
+          $ei= ldap_first_entry($ldap->cid, $sr);
+          if ($tmp= @ldap_get_values_len($ldap->cid, $ei,$key)){
+            $attr[$key] = $tmp;
+          }
+        }
+
+        if(is_numeric($key)) unset($attr[$key]);
+        if(isset($attr[$key]['count'])){
+          if(is_array($attr[$key])){
+            unset($attr[$key]['count']);
+          }
+        }
+      }
+      unset($attr['count']);
+      unset($attr['dn']);
+
+      /* Add FAIstate attribute to all FAI objects. 
+       */
+      if((!in_array("gosaApplication" , $attr['objectClass'])) && (!in_array("gotoMimeType", $attr['objectClass']))){
+        $attr['FAIdebianRelease'] = $destinationName;
+        if($type=="branch"){
+          $attr['FAIstate'] ="branch";
+        }elseif($type=="freeze"){
+          $attr['FAIstate'] ="freeze";
+        }else{
+          msg_dialog::display(_("Internal error"), sprintf(_("FAIstate '%s' is unknown!"),$type), ERROR_DIALOG);
+        }
+      }
+
+      /* Replace FAIdebianRelease with new release name.
+       */
+      if(in_array("FAIpackageList" , $attr['objectClass'])){
+        $attr['FAIdebianRelease'] = $destinationName; 
+      }
+
+      /* Add entry 
+       */
+      $ldap->cd($destinationdn);
+      $ldap->cat($destinationdn);
+      $a = $ldap->fetch();
+      if(!count($a)){
+        $ldap->add($attr);
+      }
+
+      if($ldap->error != "Success"){
+
+        /* Some error occurred */
+        print "---------------------------------------------";
+        print $ldap->get_error()."<br>";
+        print $sourcedn."<br>";
+        print $destinationdn."<br>";
+        print_a( $attr);
+        exit();
+      }          
+    }
+  }
+
+  echo "<script language=\"javascript\" type=\"text/javascript\">scrollDown2();</script>" ;
+
+  /* Prepare for recursive copy.
+   * Get all object within the source dn and 
+   *  call the recursive copy for each.
+   */
+  $ldap->ls ("(objectClass=*)",$sourcedn);
+  while ($ldap->fetch()){
+    $deldn= $ldap->getDN();
+    $delarray[$deldn]= strlen($deldn);
+  }
+  asort ($delarray);
+  reset ($delarray);
+  $depth ++;
+  foreach($delarray as $dn => $bla){
+    if($dn != $destinationdn){
+      $ldap->cd($basedn);
+      $item = $ldap->fetch($ldap->cat($dn));
+      if(!in_array("FAIbranch",$item['objectClass'])){
+        copy_FAI_resource_recursive($dn,str_replace($sourcedn,$destinationdn,$dn),$destinationName,$type,false,$depth);
+      } 
+    }
+  }
+  if($is_first){
+    echo "<p class='seperator'>&nbsp;</p>";
+  }
+}
+
 // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler:
 ?>