From: hickert Date: Tue, 15 Jan 2008 09:46:31 +0000 (+0000) Subject: Partly extracted copy_FAI_resource_recursive. X-Git-Url: https://git.tokkee.org/?a=commitdiff_plain;h=dfb273f4a7dcf415bd3978962e0605c266d3fb56;p=gosa.git Partly extracted copy_FAI_resource_recursive. - Not finished yet. git-svn-id: https://oss.gonicus.de/repositories/gosa/trunk@8344 594d385d-05f5-0310-b6e9-bd551577e9d8 --- diff --git a/gosa-core/include/class_ldap.inc b/gosa-core/include/class_ldap.inc index 96a7e56ee..53cdac820 100644 --- a/gosa-core/include/class_ldap.inc +++ b/gosa-core/include/class_ldap.inc @@ -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 "

".sprintf(_("Creating copy of %s"),"".LDAP::fix($sourcedn)."")."

"; - }else{ - if(preg_match("/^ou=/",$sourcedn)){ - echo "

"._("Processing")." ".LDAP::fix($destinationdn)."

"; - }else{ - $tmp = split(",",$sourcedn); - - echo " "._("Object").": "; - - $deststr = LDAP::fix($destinationdn); - if(strlen($deststr) > 96){ - $deststr = substr($deststr,0,96)."..."; - } - - echo $deststr."
"; - } - } - - 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()."
"; - print $sourcedn."
"; - print $destinationdn."
"; - print_a( $attr); - exit(); - } - } - } - - echo "" ; - - $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 "

 

"; - } - - } 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 "

".sprintf(_("Creating copy of %s"),"".LDAP::fix($sourcedn)."")."

"; + }else{ + if(preg_match("/^ou=/",$sourcedn)){ + echo "

"._("Processing")." ".LDAP::fix($destinationdn)."

"; + }else{ + $tmp = split(",",$sourcedn); + echo " "._("Object").": "; + $deststr = LDAP::fix($destinationdn); + if(strlen($deststr) > 96){ + $deststr = substr($deststr,0,96)."..."; + } + echo $deststr."
"; + } + } + /* .. 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()."
"; + print $sourcedn."
"; + print $destinationdn."
"; + print_a( $attr); + exit(); + } + } + } + + echo "" ; + + /* 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 "

 

"; + } +} + // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler: ?>