diff --git a/trunk/gosa-plugins/fai/admin/fai/class_FAI.inc b/trunk/gosa-plugins/fai/admin/fai/class_FAI.inc
index 0278c5a1747f8d687f88a43308a71326bdbb4992..eb78fe08a9cb2a04193952d10e369fae340ab46a 100644 (file)
/* Ldap search for fai classes specified in this release */
$attributes = array("dn","objectClass","FAIstate","cn");
- $res_tmp = get_list($filter,"fai",$fai_base,$attributes,GL_SUBSEARCH | GL_SIZELIMIT);
+ $res_tmp = get_list($filter,"fai",$fai_base,$attributes,GL_SUBSEARCH);
/* check the returned objects, and add/replace them in our return variable */
foreach($res_tmp as $attr){
$name = preg_replace("/".preg_quote($release, '/')."/i","",$attr['dn']);
if(isset($attr['FAIstate'][0])){
- if(preg_match("/removed$/",$attr['FAIstate'][0])){
+ if(preg_match("/removed/",$attr['FAIstate'][0])){
if(isset($res[$name])){
unset($res[$name]);
}
/* Check if this Profile uses the source class ($cn)
*/
- if(preg_match("/".preg_quote($cn, '/')."/",$attrs['FAIclass'])){
- $attrs['FAIclass'] = preg_replace("/[ ]*".preg_quote($cn, '/')."[ ]*/i"," ",$attrs['FAIclass']);
- if(empty($attrs['FAIclass'])){
- $attrs['FAIclass'] = array();
- }
- $ldap->cd($dn['dn']);
- $ldap->modify($attrs);
-
- if (!$ldap->success()){
- msg_dialog::display(_("LDAP error"), msgPool::ldaperror($ldap->get_error(), $this->dn, LDAP_MOD, get_class()));
- }
+ $classlist = split(" ", $attrs['FAIclass']);
+ $new_classlist = "";
+ foreach($classlist as $class){
+ if($class != $cn){
+ $new_classlist = $new_classlist." ".$class;
+ }
+ }
+ $attrs['FAIclass'] = $new_classlist;
+ if(empty($attrs['FAIclass'])){
+ $attrs['FAIclass'] = array();
+ }
+ $ldap->cd($dn['dn']);
+ $ldap->modify($attrs);
+
+ if (!$ldap->success()){
+ msg_dialog::display(_("LDAP error"), msgPool::ldaperror($ldap->get_error(), $this->dn, LDAP_MOD, get_class()));
}
}
}
if(!empty($r)){
foreach($r as $key ){
- if(DEBUG_FAI_FUNC) {
- echo "<b>Copy current objects original attributes to next release</b> ".$key;
- print_a($parent_attrs);
- }
-
- /* Only update the freeze tag if the entry actually exists. */
- $ldap->cat($key);
- if($ldap->count()){
- /* Append FAIstate tag to ensure that freezed objects stay freezed
- */
- $rTag = FAI::get_release_tag(FAI::get_release_dn($key));
- $parent_attrs['FAIstate'] = $rTag;
+ /* Append FAIstate tag to ensure that freezed objects stay freezed
+ */
+ $rTag = FAI::get_release_tag(FAI::get_release_dn($key));
+ $parent_attrs['FAIstate'] = $rTag;
+ /* Don't copy over subobjects in subreleases if their parent is in "removed" state */
+ if(!FAI::parent_is_removed($key)){
+ /* FAItemplateFile can be binary, therefore it needs to be fetched with
+ * $ldap->get_attribute */
+ if (isset($parent_attrs['FAItemplateFile'])) {
+ $parent_attrs['FAItemplateFile'] = $ldap->get_attribute($parent_obj, 'FAItemplateFile');
+ }
+ if(DEBUG_FAI_FUNC) {
+ echo "<b>Copy current objects original attributes to next release</b> ".$key;
+ print_a($parent_attrs);
+ }
+ FAI::save_FAI_object($key,$parent_attrs);
}
- FAI::save_FAI_object($key,$parent_attrs);
}
}
/* this function will remove all unused (deleted) objects,
- that have no parent object */
- static function clean_up_releases($Current_DN)
+ that have no parent object. If $recursive is set to true,
+ also check sub releases. */
+ static function clean_up_releases($Current_DN, $recursive=true)
{
global $config;
$ldap = $config->get_ldap_link();
/* We must also include the given release dn */
$previous_releases[] = $base_release;
- /* Merge parent, current and child releases into one big release to
- iterate over */
$all_releases = $previous_releases;
- foreach($sub_releases as $sub_release){
- $all_releases[] = $sub_release;
+
+ if ($recursive) {
+ /* Merge parent, current and child releases into one big release to
+ iterate over */
+ foreach($sub_releases as $sub_release){
+ $all_releases[] = $sub_release;
+ }
}
/* Walk through all releases */
/* Ldap search for fai classes specified in this release */
$ldap->cd($fai_base);
- $ldap->search("(objectClass=FAIclass)",array("dn","objectClass","FAIstate"));
+ $ldap->search("(|(objectClass=FAIclass)(objectClass=FAIdebconfInfo))",array("dn","objectClass","FAIstate"));
/* check the returned objects, and add/replace them in our return variable */
while($attr = $ldap->fetch()){
global $config;
$Current_DN = $dn;
- /* special case partitions, as they don't start with cn= in their DN (schema bug?) */
- if (preg_match('/^FAIpartitionNr=/', $Current_DN)){
+ /* special case partitions and debconf variables, as they don't start with cn= in their DN */
+ if (preg_match('/^(FAIpartitionNr|FAIvariable)=/', $Current_DN)){
return false;
}
$tmp_dn = $Current_DN;
$parent_dn = array();
- /* special case partitions, as they don't start with cn= in their DN (schema bug?) */
- $tmp_dn = preg_replace('/^FAIpartitionNr=/', 'cn=', $tmp_dn);
+ /* special case partitions and debconf variables, as they don't start with cn= in their DN */
+ $tmp_dn = preg_replace('/^(FAIpartitionNr|FAIvariable)=/', 'cn=', $tmp_dn);
$tmp_dn = gosa_ldap_explode_dn($tmp_dn);
while(preg_match('/^cn=/', $tmp_dn[$i])) {
return false;
}
+ static function get_leaf_objects($dn, $cn, $subclass, $rdn) {
+ $valid_releases = FAI::get_previous_releases_of_this_release(FAI::get_release_dn($dn), true);
+ /* Remove the last release DN */
+ array_pop($valid_releases);
+ $valid_releases[] = FAI::get_release_dn($dn);
+
+ $objects = FAI::get_all_objects_for_given_base($dn,"(&(objectClass=FAIclass)(objectClass=".$subclass."))");
+ $res = array();
+ /* Strip elements which are not a leaf object of the current dn */
+ foreach($objects as $obj){
+ $keep = FALSE;
+ foreach($valid_releases as $valid_release) {
+ if (preg_match("/cn=".$cn.",".$rdn.$valid_release."$/", $obj['dn'])) {
+ $keep = TRUE;
+ break;
+ }
+ }
+
+ if ($keep) {
+ $res[] = $obj;
+ }
+ }
+
+ return $res;
+ }
+
+
}