X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=trunk%2Fgosa-plugins%2Ffai%2Fadmin%2Ffai%2Fclass_FAI.inc;h=eb78fe08a9cb2a04193952d10e369fae340ab46a;hb=fc142c3335ee89bf2ebe45cddc7d6a4fa53e2393;hp=0278c5a1747f8d687f88a43308a71326bdbb4992;hpb=05860bbb315cfaaa6bec5b667faedf4bbf4c019d;p=gosa.git diff --git a/trunk/gosa-plugins/fai/admin/fai/class_FAI.inc b/trunk/gosa-plugins/fai/admin/fai/class_FAI.inc index 0278c5a17..eb78fe08a 100644 --- a/trunk/gosa-plugins/fai/admin/fai/class_FAI.inc +++ b/trunk/gosa-plugins/fai/admin/fai/class_FAI.inc @@ -64,7 +64,7 @@ class FAI /* 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){ @@ -73,7 +73,7 @@ class FAI $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]); } @@ -249,17 +249,22 @@ class FAI /* 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())); } } } @@ -518,20 +523,23 @@ class FAI if(!empty($r)){ foreach($r as $key ){ - if(DEBUG_FAI_FUNC) { - echo "Copy current objects original attributes to next release ".$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 "Copy current objects original attributes to next release ".$key; + print_a($parent_attrs); + } + FAI::save_FAI_object($key,$parent_attrs); } - FAI::save_FAI_object($key,$parent_attrs); } } @@ -571,8 +579,9 @@ class FAI /* 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(); @@ -588,11 +597,14 @@ class FAI /* 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 */ @@ -606,7 +618,7 @@ class FAI /* 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()){ @@ -1286,8 +1298,8 @@ class FAI 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; } @@ -1335,8 +1347,8 @@ class FAI $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])) { @@ -1414,6 +1426,33 @@ class FAI 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; + } + + }