807e60558564fadf6ad7361935f199d9e6718b72
1 <?php
3 /* TEST PHASE .... */
5 /* Returns all object for the given release.
6 This function resolves the release management
7 from base to the given dn.
8 */
9 function get_all_objects_for_given_base($Current_DN,$filter,$detailed = false)
10 {
11 global $config;
12 $ldap = $config->get_ldap_link();
13 $ldap->cd($config->current['BASE']);
15 /* Collect some basic informations and initialize some variables */
16 $base_release = get_release_dn($Current_DN);
17 $previous_releases = array_reverse(get_previous_releases_of_this_release($base_release,true));
18 $res = array();
19 $tmp = array();
21 /* We must also include the given release dn */
22 $previous_releases[] = $base_release;
24 /* Walk through all releases */
25 foreach($previous_releases as $release){
27 /* Get fai departments */
28 $deps_to_search = get_FAI_departments($release);
30 /* For every single department (ou=hoos,ou ..) */
31 foreach($deps_to_search as $fai_base){
33 /* Ldap search for fai classes specified in this release */
34 $ldap->cd($fai_base);
35 $ldap->search($filter,array("dn","objectClass","FAIstate"));
37 /* check the returned objects, and add/replace them in our return vareable */
38 while($attr = $ldap->fetch()){
40 $buffer = array();
41 $name = str_ireplace($release,"",$attr['dn']);
43 if(isset($attr['FAIstate'][0])){
44 if(preg_match("/removed$/",$attr['FAIstate'][0])){
45 if(isset($res[$name])){
46 unset($res[$name]);
47 }
48 continue;
49 }
50 }
53 /* In detailed mode are some additonal informations visible */
54 if($detailed){
56 /* Create list of parents */
57 if(isset($res[$name])){
58 $buffer = $res[$name];
59 $buffer['parents'][] = $res[$name]['dn'];
60 }else{
61 $buffer['parents'] = array();
62 }
64 /* Append objectClass to resulsts */
65 $buffer['objectClass'] = $attr['objectClass'];
66 unset($buffer['objectClass'][0]);
67 }
69 /* Add this object to our list */
70 $buffer['dn'] = $attr['dn'];
71 $res[$name] = $buffer;
72 }
73 }
74 }
75 return($res);
76 }
80 /* Return the object defining ObjectClass e.g. FAIscriptEntry */
81 function get_FAI_type($attr)
82 {
83 $arr = array( "FAIprofile","FAIpartitionTable", "FAIpartitionDisk","FAIpartitionEntry","FAIhook","FAIhookEntry",
84 "FAIscriptEntry","FAIscript","FAIvariable","FAIvariableEntry","FAIpackageList","FAItemplate",
85 "FAItemplateEntry","FAIdebconfInfo","FAIrepository","FAIrepositoryServer","FAIbranch","FAIreleaseTag");
86 foreach($arr as $name){
87 if(in_array($name,$attr['objectClass'])){
88 preg_match("");
89 return($name);
90 }
91 }
92 echo "Not found";
93 return("");
94 }
97 /* Return all relevant FAI departments */
98 function get_FAI_departments($suffix = "")
99 {
100 $arr = array("hooks","scripts","disk","packages","profiles","templates","variables");
101 $tmp = array();
102 if(preg_match("/^,/",$suffix)){
103 $suffix = preg_replace("/^,/","",$suffix);
104 }
105 foreach($arr as $name){
106 if(empty($suffix)){
107 $tmp[$name] = "ou=".$name;
108 }else{
109 $tmp[$name] = "ou=".$name.",".$suffix;
110 }
111 }
112 return($tmp);
113 }
116 function get_all_releases_from_base($dn)
117 {
118 global $config;
119 $base = "ou=fai,ou=configs,ou=systems,".$dn;
120 $res = array();
122 $ldap = $config->get_ldap_link();
123 $ldap->cd($base);
124 $ldap->search("(objectClass=FAIbranch)",array("ou","dn"));
125 while($attrs = $ldap->fetch()){
126 $res[$attrs['dn']] = $attrs['ou'][0];
127 }
128 return($res);
129 }
132 /* This function does everything to be able to save the given dn.
134 !!!!!!! No functionality just output
136 */
137 function prepare_to_save_FAI_object($Current_DN,$objectAttrs,$removed = false)
138 {
139 /* Get ldap object */
140 global $config;
141 $ldap = $config->get_ldap_link();
142 $ldap->cd($config->current['BASE']);
144 /* Get some basic informations */
145 $base_release = get_release_dn($Current_DN);
146 $sub_releases = get_sub_releases_of_this_release($base_release,true);
147 $parent_obj = get_parent_release_object($Current_DN);
148 $following_releases = get_sub_releases_of_this_release($base_release,true);
150 /* Check if given dn exists or if is a new entry */
151 $ldap->cat($Current_DN);
152 if(!$ldap->count()){
153 $is_new = true;
154 }else{
155 $is_new = false;
156 }
158 /* if parameter removed is true, we have to add FAIstate to the current attrs
159 FAIstate should end with ...|removed after this operation */
160 if($removed ){
161 $ldap->cat($Current_DN);
163 if((!$ldap->count()) && !empty($parent_obj)){
164 $ldap->cat($parent_obj);
165 }
166 if(!$ldap->count()){
168 echo "Error can't remove this object ".$Current_DN;
169 return;
171 }else{
173 $objectAttrs = prepare_ldap_fetch_to_be_saved($ldap->fetch());
174 if(isset($objectAttrs['FAIstate'][0])){
175 if(!preg_match("/removed$/",$objectAttrs['FAIstate'][0])){
176 $objectAttrs['FAIstate'][0] .= "|removed";
177 }
178 }else{
179 $objectAttrs['FAIstate'][0] = "|removed";
180 }
181 }
182 }
185 /* Check if this a leaf release or not */
186 if(count($following_releases) == 0 ){
188 /* This is a leaf object. It isn't unherited by any other object */
189 echo "<b>Saving directly, is a leaf object</b><br> ".$Current_DN;
190 print_a($objectAttrs);
191 save_FAI_object($Current_DN,$objectAttrs);
192 }else{
194 /* This object is inherited by some sub releases */
196 /* Get all releases, that inherit this object */
197 $r = get_following_releases_that_inherit_this_object($Current_DN);
199 /* Get parent object */
200 $ldap->cat($parent_obj);
201 $parent_attrs = prepare_ldap_fetch_to_be_saved($ldap->fetch());
203 /* New objects require special handling */
204 if($is_new){
206 /* check if there is already an entry named like this,
207 in one of our parent releases */
208 if(!empty($parent_obj)){
209 echo "There is already an entry named like this.</b><br>";
211 echo "<b>Saving main object</b>".$Current_DN;
212 print_a($objectAttrs);
214 save_FAI_object($Current_DN,$objectAttrs);
216 foreach($r as $key){
217 echo "<b>Saving parent to following release</b> ".$key;
218 print_a($parent_attrs);
219 save_FAI_object($key,$parent_attrs);
220 }
221 }else{
223 echo "<b>Saving main object</b>".$Current_DN;
224 print_a($objectAttrs);
226 save_FAI_object($Current_DN,$objectAttrs);
228 if(isset($objectAttrs['FAIstate'])){
229 $objectAttrs['FAIstate'] .= "|removed";
230 }else{
231 $objectAttrs['FAIstate'] = "|removed";
232 }
234 foreach($r as $key ){
235 echo "<b>Create an empty placeholder in follwing release</b> ".$key;
236 print_a($objectAttrs);
237 save_FAI_object($key,$objectAttrs);
238 }
239 }
240 }else{
242 /* check if we must patch the follwing release */
243 if(!empty($r)){
244 foreach($r as $key ){
245 echo "<b>Copy current objects original attributes to next release</b> ".$key;
246 print_a($parent_attrs);
247 save_FAI_object($key,$parent_attrs);
248 }
249 }
251 echo "<b>Saving current object</b>".$parent_obj;
252 print_a($objectAttrs);
254 save_FAI_object($parent_obj,$objectAttrs);
256 if($parent_obj != $Current_DN){
257 echo "<b>Error they must be equal : </b>".$parent_obj."<br><b> and </b><br> ".$Current_DN."<br>";
258 }
259 }
260 }
261 /* Remove the source object from ldap. It is no longer required */
262 if($removed){
263 if(get_parent_release_object($Current_DN,false) == ""){
264 $ldap->clearResult();
265 $ldap->cat($Current_DN);
267 $tmp = $ldap->fetch();
268 return($tmp['dn']);
269 }
270 }
271 echo "<br>.--------------------------------------------------------------------.<br>";
273 return("");
274 }
277 function prepare_ldap_fetch_to_be_saved($attrs)
278 {
279 foreach($attrs as $key => $value){
280 if(is_numeric($key) || ($key == "count") || ($key == "dn")){
281 unset($attrs[$key]);
282 }
283 if(is_array($value) && isset($value['count'])){
284 unset($attrs[$key]['count']);
285 }
286 }
287 return($attrs);
288 }
291 function save_FAI_object($dn,$attrs)
292 {
293 global $config;
294 $ldap = $config->get_ldap_link();
295 $ldap->cd($config->current['BASE']);
296 $ldap->create_missing_trees(preg_replace('/^[^,]+,/', '', $dn));
297 $ldap->cd($dn);
299 $ldap->cat($dn,array("dn"));
300 if($ldap->count()){
301 $ldap->modify($attrs);
302 }else{
303 $ldap->add($attrs);
304 }
305 show_ldap_error($ldap->get_error(),sprintf(_("Release management failed, can't save '%s'"),$dn));
306 }
309 function get_following_releases_that_inherit_this_object($dn)
310 {
311 global $config;
312 $ldap = $config->get_ldap_link();
313 $ldap->cd($config->current['BASE']);
315 $ret = array();
317 /* Get base release */
318 $base_release = get_release_dn($dn);
320 /* Get previous release dns */
321 $sub_releases = get_sub_releases_of_this_release($base_release);
323 /* Get dn suffix. Example "FAIvairableEntry=keksdose,FAIvariable=Keksregal," */
324 $dn_suffix = str_ireplace($base_release,"",$dn);
326 /* Check if given object also exists whitin one of these releases */
327 foreach($sub_releases as $p_release => $name){
329 $check_dn = $dn_suffix.$p_release;
331 $ldap->cat($check_dn,array("dn","objectClass"));
333 if($ldap->count()){
334 //return($ret);
335 }else{
336 $ret[$check_dn]=$check_dn;
337 }
338 }
339 return($ret);
340 }
343 /* Get previous version of the object dn */
344 function get_parent_release_object($dn,$include_myself=true)
345 {
346 global $config;
347 $ldap = $config->get_ldap_link();
348 $ldap->cd($config->current['BASE']);
349 $previous_releases= array();
351 /* Get base release */
352 $base_release = get_release_dn($dn);
353 if($include_myself){
354 $previous_releases[] = $base_release;
355 }
357 /* Get previous release dns */
358 $tmp = get_previous_releases_of_this_release($base_release,true);
359 foreach($tmp as $release){
360 $previous_releases[] = $release;
361 }
363 /* Get dn suffix. Example "FAIvairableEntry=keksdose,FAIvariable=Keksregal," */
364 $dn_suffix = str_ireplace($base_release,"",$dn);
366 /* Check if given object also exists whitin one of these releases */
367 foreach($previous_releases as $p_release){
368 $check_dn = $dn_suffix.$p_release;
369 $ldap->cat($check_dn,array("dn","objectClass"));
371 if($ldap->count()){
372 return($check_dn);
373 }
374 }
375 return("");
376 }
379 /* return release names of all parent releases */
380 function get_previous_releases_of_this_release($dn,$flat)
381 {
382 global $config;
383 $ldap = $config->get_ldap_link();
384 $ldap->cd($config->current['BASE']);
385 $ret = array();
387 /* Explode dns into pieces, to be able to build parent dns */
388 $dns_to_check = ldap_explode_dn(str_ireplace(",".$config->current['BASE'],"",$dn),0);
389 if(!is_array($dns_to_check)){
390 return;
391 }
393 /* Unset first entry which represents the given dn */
394 unset($dns_to_check['count']);
395 unset($dns_to_check[key($dns_to_check)]);
397 /* Create dns addresses and check if this dn is a release dn */
398 $id = 0;
399 while(count($dns_to_check)){
401 /* build parent dn */
402 $new_dn = "";
403 foreach($dns_to_check as $part){
404 $new_dn .= $part.",";
405 }
406 $new_dn .= $config->current['BASE'];
408 /* check if this dn is a release */
409 if(is_release_department($new_dn)){
410 if($flat){
411 $ret[$id] = $new_dn;
412 }else{
413 $ret = array($new_dn=>$ret);
414 }
415 $id ++;
416 }else{
417 return($ret);
418 }
419 reset($dns_to_check);
420 unset($dns_to_check[key($dns_to_check)]);
421 }
422 return($ret);
423 }
426 /* This function returns all sub release names, recursivly */
427 function get_sub_releases_of_this_release($dn,$flat = false)
428 {
429 global $config;
430 $res = array();
431 $ldap = $config->get_ldap_link();
432 $ldap->cd($config->current['BASE']);
433 $ldap->ls("(objectClass=FAIbranch)",$dn,array("objectClass","dn","ou"));
434 while($attr = $ldap->fetch()){
436 /* Append department name */
437 if($flat){
438 $res[$attr['dn']] = $attr['ou'][0];
439 }else{
440 $res[$attr['dn']] = array();
441 }
443 /* Get sub release departments of this department */
444 if(in_array("FAIbranch",$attr['objectClass'])) {
445 if($flat){
446 $tmp = get_sub_releases_of_this_release($attr['dn'],$flat);
447 foreach($tmp as $dn => $value){
448 $res[$dn]=$value;
449 }
450 }else{
451 $res[$attr['dn']] = get_sub_releases_of_this_release($attr['dn']);
452 }
453 }
454 }
455 return($res);
456 }
459 /* Check if the given department is a release department */
460 function is_release_department($dn)
461 {
462 global $config;
463 $ldap = $config->get_ldap_link();
464 $ldap->cd($config->current['BASE']);
465 $ldap->cat($dn,array("objectClass","ou"));
467 /* Check objectClasses and name to check if this is a release department */
468 if($ldap->count()){
469 $attrs = $ldap->fetch();
471 $ou = "";
472 if(isset($attrs['ou'][0])){
473 $ou = $attrs['ou'][0];
474 }
476 if((in_array("FAIbranch",$attrs['objectClass'])) || ($ou == "fai")){
477 return($attrs['dn']);
478 }
479 }
480 return(false);
481 }
484 /* This function returns the dn of the object release */
485 function get_release_dn($Current_DN)
486 {
487 global $config;
488 $ldap = $config->get_ldap_link();
489 $ldap->cd($config->current['BASE']);
491 /* Split dn into pices */
492 $dns_to_check = ldap_explode_dn(str_ireplace(",".$config->current['BASE'],"",$Current_DN),0);
493 if(!is_array($dns_to_check)){
494 return;
495 }
497 /* Use dn pieces, to create sub dns like
498 ou=test,ou=1,ou=0...
499 ou=1,ou=0...
500 ou=0...
501 To check which dn is our release container.
502 */
503 unset($dns_to_check['count']);
504 while(count($dns_to_check)){
506 /* Create dn */
507 $new_dn = "";
508 foreach($dns_to_check as $part){
509 $new_dn .= $part.",";
510 }
511 $new_dn .= $config->current['BASE'];
513 /* Check if this dn is a release dn */
514 if(is_release_department($new_dn)){
515 return($new_dn);
516 }
518 /* Remove first element of dn pieces */
519 reset($dns_to_check);
520 unset($dns_to_check[key($dns_to_check)]);
521 }
522 return("");
523 }
525 // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler:
526 ?>