X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=include%2Ffunctions_FAI.inc;h=781f66c93386b5cc222b33aa0502d6f335e9bad7;hb=3e4be8c6a8a23bdeaada8a873ca63284c75e7d90;hp=f565c07d1bd58d4fe2a44a0a24f6f7773135ff8a;hpb=e054d4a7f561b252a1bcd4f2c1284b0e45f55cf7;p=gosa.git diff --git a/include/functions_FAI.inc b/include/functions_FAI.inc index f565c07d1..781f66c93 100644 --- a/include/functions_FAI.inc +++ b/include/functions_FAI.inc @@ -1,22 +1,28 @@ get_ldap_link(); $ldap->cd($config->current['BASE']); + $res = array(); + $tmp = array(); + + if(!is_release_department($Current_DN)) { + return($res); + } /* Collect some basic informations and initialize some variables */ $base_release = get_release_dn($Current_DN); $previous_releases = array_reverse(get_previous_releases_of_this_release($base_release,true)); - $res = array(); - $tmp = array(); /* We must also include the given release dn */ $previous_releases[] = $base_release; @@ -34,11 +40,12 @@ function get_all_objects_for_given_base($Current_DN,$filter,$detailed = false) $ldap->cd($fai_base); $ldap->search($filter,array("dn","objectClass","FAIstate")); - /* check the returned objects, and add/replace them in our return vareable */ + /* check the returned objects, and add/replace them in our return variable */ while($attr = $ldap->fetch()){ $buffer = array(); - $name = str_ireplace($release,"",$attr['dn']); +# $name = str_ireplace($release,"",$attr['dn']); + $name = preg_replace("/".normalizePreg($release)."/i","",$attr['dn']); if(isset($attr['FAIstate'][0])){ if(preg_match("/removed$/",$attr['FAIstate'][0])){ @@ -76,24 +83,6 @@ function get_all_objects_for_given_base($Current_DN,$filter,$detailed = false) } - -/* Return the object defining ObjectClass e.g. FAIscriptEntry */ -function get_FAI_type($attr) -{ - $arr = array( "FAIprofile","FAIpartitionTable", "FAIpartitionDisk","FAIpartitionEntry","FAIhook","FAIhookEntry", - "FAIscriptEntry","FAIscript","FAIvariable","FAIvariableEntry","FAIpackageList","FAItemplate", - "FAItemplateEntry","FAIdebconfInfo","FAIrepository","FAIrepositoryServer","FAIbranch","FAIreleaseTag"); - foreach($arr as $name){ - if(in_array($name,$attr['objectClass'])){ - preg_match(""); - return($name); - } - } - echo "Not found"; - return(""); -} - - /* Return all relevant FAI departments */ function get_FAI_departments($suffix = "") { @@ -113,154 +102,330 @@ function get_FAI_departments($suffix = "") } -function get_all_releases_from_base($dn) +/* Return all releases within the given base */ +function get_all_releases_from_base($dn,$appendedName=false) { global $config; - $base = "ou=fai,ou=configs,ou=systems,".$dn; + + if(!preg_match("/ou=fai,ou=configs,ou=systems,/",$dn)){ + $base = "ou=fai,ou=configs,ou=systems,".$dn; + }else{ + $base = $dn; + } $res = array(); $ldap = $config->get_ldap_link(); $ldap->cd($base); $ldap->search("(objectClass=FAIbranch)",array("ou","dn")); while($attrs = $ldap->fetch()){ - $res[$attrs['dn']] = $attrs['ou'][0]; - } + if($appendedName){ + $res[$attrs['dn']] = convert_department_dn(preg_replace("/,ou=fai,ou=configs,ou=system.*$/","",$attrs['dn'])); + }else{ + $res[$attrs['dn']] = $attrs['ou'][0]; + } + } return($res); } -/* This function does everything to be able to save the given dn. - - !!!!!!! No functionality just output - - */ +/* Add this object to list of objects, that must be checked for release saving */ function prepare_to_save_FAI_object($Current_DN,$objectAttrs,$removed = false) { /* Get ldap object */ global $config; - $ldap = $config->get_ldap_link(); - $ldap->cd($config->current['BASE']); + $addObj['Current_DN'] = $Current_DN; + $addObj['objectAttrs']= $objectAttrs; + $addObj['removed'] = $removed; + $addObj['diff'] = TRUE; + + if(!$removed){ + $ldap = $config->get_ldap_link(); + $ldap->cd($config->current['BASE']); + + /* Get some basic informations */ + $parent_obj = get_parent_release_object($Current_DN); + if(!empty($parent_obj)){ + $ldap->cat($parent_obj,array("*")); + $attrs = prepare_ldap_fetch_to_be_saved($ldap->fetch()); + + if(!array_diff_FAI( $attrs,$objectAttrs)){ + $addObj['diff'] = FALSE; + } + } + } + + $_SESSION['FAI_objects_to_save'][$Current_DN] = $addObj; +} - /* Get some basic informations */ - $base_release = get_release_dn($Current_DN); - $sub_releases = get_sub_releases_of_this_release($base_release,true); - $parent_obj = get_parent_release_object($Current_DN); - $following_releases = get_sub_releases_of_this_release($base_release,true); - - /* Check if given dn exists or if is a new entry */ - $ldap->cat($Current_DN); - if(!$ldap->count()){ - $is_new = true; - }else{ - $is_new = false; + +/* Detect differences in attribute arrays */ +function array_diff_FAI($ar1,$ar2) +{ + + if((!isset($ar1['description'])) || (isset($ar1['description']) && (count($ar1['description']) == 0))){ + $ar1['description'] = ""; + } + if((!isset($ar2['description'])) || (isset($ar2['description']) && (count($ar2['description']) == 0))){ + $ar2['description'] = ""; } - - /* if parameter removed is true, we have to add FAIstate to the current attrs - FAIstate should end with ...|removed after this operation */ - if($removed ){ - $ldap->cat($Current_DN); - if((!$ldap->count()) && !empty($parent_obj)){ - $ldap->cat($parent_obj); + if(count($ar1) != count($ar2)) { + return (true); + } + + foreach($ar1 as $key1 => $val1){ + + if((is_array($val1)) && (count($val1)==1)){ + $ar1[$key1] = $val1[0]; } - if(!$ldap->count()){ - echo "Error can't remove this object ".$Current_DN; - return; - - }else{ + if((is_array($ar2[$key1])) && (count($ar2[$key1])==1)){ + $val1 = $val1[0]; + $ar2[$key1] = $ar2[$key1][0]; + } + } + ksort($ar1); + ksort($ar2); + if(count( array_diff($ar1,$ar2))){ + return(true); + }else{ + return(false); + } +} - $objectAttrs = prepare_ldap_fetch_to_be_saved($ldap->fetch()); - if(isset($objectAttrs['FAIstate'][0])){ - if(!preg_match("/removed$/",$objectAttrs['FAIstate'][0])){ - $objectAttrs['FAIstate'][0] .= "|removed"; - } - }else{ - $objectAttrs['FAIstate'][0] = "|removed"; + +/* check which objects must be saved, and save them */ +function save_release_changes_now() +{ + /* Variable init*/ + $to_save = array(); + + /* check which objects must be saved */ + foreach($_SESSION['FAI_objects_to_save'] as $Current_DN => $object){ + if($object['diff']){ + $sub_name = $Current_DN; + while(isset($_SESSION['FAI_objects_to_save'][$sub_name])){ + $to_save[strlen($sub_name)][$sub_name] = $_SESSION['FAI_objects_to_save'][$sub_name]; + unset($_SESSION['FAI_objects_to_save'][$sub_name]); + $sub_name = preg_replace('/^[^,]+,/', '', $sub_name); } } } - - /* Check if this a leaf release or not */ - if(count($following_releases) == 0 ){ - /* This is a leaf object. It isn't unherited by any other object */ - echo "Saving directly, is a leaf object
".$Current_DN; - print_a($objectAttrs); - save_FAI_object($Current_DN,$objectAttrs); - }else{ + /* Sort list of objects that must be saved, and ensure that + container objects are safed, before their childs are saved */ + ksort($to_save); + $tmp = array(); + foreach($to_save as $SubObjects){ + foreach($SubObjects as $object){ + $tmp[] = $object; + } + } + $to_save = $tmp; - /* This object is inherited by some sub releases */ + /* Save objects and manage the correct release behavior*/ + foreach($to_save as $save){ - /* Get all releases, that inherit this object */ - $r = get_following_releases_that_inherit_this_object($Current_DN); + $Current_DN = $save['Current_DN']; + $removed = $save['removed']; + $objectAttrs= $save['objectAttrs']; - /* Get parent object */ - $ldap->cat($parent_obj); - $parent_attrs = prepare_ldap_fetch_to_be_saved($ldap->fetch()); - - /* New objects require special handling */ - if($is_new){ + /* Get ldap object */ + global $config; + $ldap = $config->get_ldap_link(); + $ldap->cd($config->current['BASE']); - /* check if there is already an entry named like this, - in one of our parent releases */ - if(!empty($parent_obj)){ - echo "There is already an entry named like this.
"; + /* Get some basic informations */ + $base_release = get_release_dn($Current_DN); + $sub_releases = get_sub_releases_of_this_release($base_release,true); + $parent_obj = get_parent_release_object($Current_DN); + $following_releases = get_sub_releases_of_this_release($base_release,true); + + /* Check if given dn exists or if is a new entry */ + $ldap->cat($Current_DN); + if(!$ldap->count()){ + $is_new = true; + }else{ + $is_new = false; + } + + /* if parameter removed is true, we have to add FAIstate to the current attrs + FAIstate should end with ...|removed after this operation */ + if($removed ){ + $ldap->cat($Current_DN); + + /* Get current object, because we must add the FAIstate ...|removed */ + if((!$ldap->count()) && !empty($parent_obj)){ + $ldap->cat($parent_obj); + } - echo "Saving main object".$Current_DN; - print_a($objectAttrs); - - save_FAI_object($Current_DN,$objectAttrs); + /* Check if we have found a suiteable object */ + if(!$ldap->count()){ + echo "Error can't remove this object ".$Current_DN; + return; + }else{ - foreach($r as $key){ - echo "Saving parent to following release ".$key; - print_a($parent_attrs); - save_FAI_object($key,$parent_attrs); + /* Set FAIstate to current objectAttrs */ + $objectAttrs = prepare_ldap_fetch_to_be_saved($ldap->fetch()); + if(isset($objectAttrs['FAIstate'][0])){ + if(!preg_match("/removed$/",$objectAttrs['FAIstate'][0])){ + $objectAttrs['FAIstate'][0] .= "|removed"; + } + }else{ + $objectAttrs['FAIstate'][0] = "|removed"; } - }else{ + } + } + + /* Check if this a leaf release or not */ + if(count($following_releases) == 0 ){ - echo "Saving main object".$Current_DN; + /* This is a leaf object. It isn't unherited by any other object */ + if(DEBUG_FAI_FUNC) { + echo "Saving directly, is a leaf object
".$Current_DN; print_a($objectAttrs); + } + save_FAI_object($Current_DN,$objectAttrs); + }else{ - save_FAI_object($Current_DN,$objectAttrs); + /* This object is inherited by some sub releases */ - if(isset($objectAttrs['FAIstate'])){ - $objectAttrs['FAIstate'] .= "|removed"; + /* Get all releases, that inherit this object */ + $r = get_following_releases_that_inherit_this_object($Current_DN); + + /* Get parent object */ + $ldap->cat($parent_obj); + $parent_attrs = prepare_ldap_fetch_to_be_saved($ldap->fetch()); + + /* New objects require special handling */ + if($is_new){ + + /* check if there is already an entry named like this, + in one of our parent releases */ + if(!empty($parent_obj)){ + if(DEBUG_FAI_FUNC) { + echo "There is already an entry named like this.
"; + + echo "Saving main object".$Current_DN; + print_a($objectAttrs); + } + save_FAI_object($Current_DN,$objectAttrs); + + foreach($r as $key){ + if(DEBUG_FAI_FUNC) { + echo "Saving parent to following release ".$key; + print_a($parent_attrs); + } + save_FAI_object($key,$parent_attrs); + } }else{ - $objectAttrs['FAIstate'] = "|removed"; + + if(DEBUG_FAI_FUNC) { + echo "Saving main object".$Current_DN; + print_a($objectAttrs); + } + save_FAI_object($Current_DN,$objectAttrs); + + if(isset($objectAttrs['FAIstate'])){ + $objectAttrs['FAIstate'] .= "|removed"; + }else{ + $objectAttrs['FAIstate'] = "|removed"; + } + + foreach($r as $key ){ + if(DEBUG_FAI_FUNC) { + echo "Create an empty placeholder in follwing release ".$key; + print_a($objectAttrs); + } + save_FAI_object($key,$objectAttrs); + } + } + }else{ + + /* check if we must patch the follwing release */ + 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); + } + save_FAI_object($key,$parent_attrs); + } } - foreach($r as $key ){ - echo "Create an empty placeholder in follwing release ".$key; + if(DEBUG_FAI_FUNC) { + echo "Saving current object".$parent_obj; print_a($objectAttrs); - save_FAI_object($key,$objectAttrs); } - } - }else{ + save_FAI_object($parent_obj,$objectAttrs); - /* check if we must patch the follwing release */ - if(!empty($r)){ - foreach($r as $key ){ - echo "Copy current objects original attributes to next release ".$key; - print_a($parent_attrs); - save_FAI_object($key,$parent_attrs); + if(($parent_obj != $Current_DN)){ + print_red(sprintf(_("Error, following objects should be equal '%s' and '%s'"),$parent_obj,$Current_DN)); } } + } + } + $_SESSION['FAI_objects_to_save'] = array(); +} + + +/* this function will remove all unused (deleted) objects, + that have no parent object */ +function clean_up_releases($Current_DN) +{ + global $config; + $ldap = $config->get_ldap_link(); + $ldap->cd($config->current['BASE']); + + /* Collect some basic informations and initialize some variables */ + $base_release = get_release_dn($Current_DN); + $previous_releases = array_reverse(get_previous_releases_of_this_release($base_release,true)); + $Kill = array(); + $Skip = array(); + + /* We must also include the given release dn */ + $previous_releases[] = $base_release; + + /* Walk through all releases */ + foreach($previous_releases as $release){ + + /* Get fai departments */ + $deps_to_search = get_FAI_departments($release); + + /* For every single department (ou=hoos,ou ..) */ + foreach($deps_to_search as $fai_base){ + + /* Ldap search for fai classes specified in this release */ + $ldap->cd($fai_base); + $ldap->search("(objectClass=FAIclass)",array("dn","objectClass","FAIstate")); - echo "Saving current object".$parent_obj; - print_a($objectAttrs); + /* check the returned objects, and add/replace them in our return variable */ + while($attr = $ldap->fetch()){ + + $buffer = array(); +# $name = str_ireplace($release,"",$attr['dn']); + $name = preg_replace("/".normalizePreg($release)."/i","",$attr['dn']); - save_FAI_object($parent_obj,$objectAttrs); + if(isset($attr['FAIstate'][0])&&(preg_match("/removed$/",$attr['FAIstate'][0]))){ - if($parent_obj != $Current_DN){ - echo "Error they must be equal : ".$parent_obj."
and
".$Current_DN."
"; + /* Check if this object is required somehow */ + if(!isset($Skip[$name])){ + $Kill[$attr['dn']] = $attr['dn']; + } + }else{ + + /* This object is required (not removed), so do not + delete any following sub releases of this object */ + $Skip[$name] = $attr['dn']; + } } } - } - echo "
.--------------------------------------------------------------------.
"; + } + return($Kill); } +/* Remove numeric index and 'count' from ldap->fetch result */ function prepare_ldap_fetch_to_be_saved($attrs) { foreach($attrs as $key => $value){ @@ -275,6 +440,7 @@ function prepare_ldap_fetch_to_be_saved($attrs) } +/* Save given attrs to specified dn*/ function save_FAI_object($dn,$attrs) { global $config; @@ -282,17 +448,52 @@ function save_FAI_object($dn,$attrs) $ldap->cd($config->current['BASE']); $ldap->create_missing_trees(preg_replace('/^[^,]+,/', '', $dn)); $ldap->cd($dn); - + $ldap->cat($dn,array("dn")); if($ldap->count()){ + + /* Remove FAIstate*/ + if(!isset($attrs['FAIstate'])){ + $attrs['FAIstate'] = array(); + } + $ldap->modify($attrs); }else{ + + /* Unset description if empty */ + if(empty($attrs['description'])){ + unset($attrs['description']); + } + $ldap->add($attrs); } show_ldap_error($ldap->get_error(),sprintf(_("Release management failed, can't save '%s'"),$dn)); } +/* Return FAIstate freeze branch or "" for specified release department */ +function get_release_tag($dn) +{ + global $config; + $ldap = $config->get_ldap_link(); + $ldap->cd($dn); + $ldap->cat($dn,array("FAIstate")); + + if($ldap->count()){ + + $attr = $ldap->fetch(); + if(isset($attr['FAIstate'][0])){ + if(preg_match("/freeze/",$attr['FAIstate'][0])){ + return("freeze"); + }elseif(preg_match("/branch/",$attr['FAIstate'][0])){ + return("branch"); + } + } + } + return(""); +} + + function get_following_releases_that_inherit_this_object($dn) { global $config; @@ -308,7 +509,8 @@ function get_following_releases_that_inherit_this_object($dn) $sub_releases = get_sub_releases_of_this_release($base_release); /* Get dn suffix. Example "FAIvairableEntry=keksdose,FAIvariable=Keksregal," */ - $dn_suffix = str_ireplace($base_release,"",$dn); +# $dn_suffix = str_ireplace($base_release,"",$dn); + $dn_suffix = preg_replace("/".normalizePreg($base_release)."/i","",$dn); /* Check if given object also exists whitin one of these releases */ foreach($sub_releases as $p_release => $name){ @@ -328,7 +530,7 @@ function get_following_releases_that_inherit_this_object($dn) /* Get previous version of the object dn */ -function get_parent_release_object($dn) +function get_parent_release_object($dn,$include_myself=true) { global $config; $ldap = $config->get_ldap_link(); @@ -337,7 +539,9 @@ function get_parent_release_object($dn) /* Get base release */ $base_release = get_release_dn($dn); - $previous_releases[] = $base_release; + if($include_myself){ + $previous_releases[] = $base_release; + } /* Get previous release dns */ $tmp = get_previous_releases_of_this_release($base_release,true); @@ -346,7 +550,8 @@ function get_parent_release_object($dn) } /* Get dn suffix. Example "FAIvairableEntry=keksdose,FAIvariable=Keksregal," */ - $dn_suffix = str_ireplace($base_release,"",$dn); +# $dn_suffix = str_ireplace($base_release,"",$dn); + $dn_suffix = preg_replace("/".normalizePreg($base_release)."/i","",$dn); /* Check if given object also exists whitin one of these releases */ foreach($previous_releases as $p_release){ @@ -370,7 +575,9 @@ function get_previous_releases_of_this_release($dn,$flat) $ret = array(); /* Explode dns into pieces, to be able to build parent dns */ - $dns_to_check = ldap_explode_dn(str_ireplace(",".$config->current['BASE'],"",$dn),0); +# $dns_to_check = gosa_ldap_explode_dn(str_ireplace(",".$config->current['BASE'],"",$dn),0); + $dns_to_check = gosa_ldap_explode_dn(preg_replace("/".normalizePreg(",".$config->current['BASE'])."/i","",$dn)); + if(!is_array($dns_to_check)){ return; } @@ -474,7 +681,9 @@ function get_release_dn($Current_DN) $ldap->cd($config->current['BASE']); /* Split dn into pices */ - $dns_to_check = ldap_explode_dn(str_ireplace(",".$config->current['BASE'],"",$Current_DN),0); +# $dns_to_check = gosa_ldap_explode_dn(str_ireplace(",".$config->current['BASE'],"",$Current_DN),0); + $dns_to_check = gosa_ldap_explode_dn(preg_replace("/".normalizePreg(",".$config->current['BASE'])."/i","",$Current_DN)); + if(!is_array($dns_to_check)){ return; }