f565c07d1bd58d4fe2a44a0a24f6f7773135ff8a
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 }
184 /* Check if this a leaf release or not */
185 if(count($following_releases) == 0 ){
187 /* This is a leaf object. It isn't unherited by any other object */
188 echo "<b>Saving directly, is a leaf object</b><br> ".$Current_DN;
189 print_a($objectAttrs);
190 save_FAI_object($Current_DN,$objectAttrs);
191 }else{
193 /* This object is inherited by some sub releases */
195 /* Get all releases, that inherit this object */
196 $r = get_following_releases_that_inherit_this_object($Current_DN);
198 /* Get parent object */
199 $ldap->cat($parent_obj);
200 $parent_attrs = prepare_ldap_fetch_to_be_saved($ldap->fetch());
202 /* New objects require special handling */
203 if($is_new){
205 /* check if there is already an entry named like this,
206 in one of our parent releases */
207 if(!empty($parent_obj)){
208 echo "There is already an entry named like this.</b><br>";
210 echo "<b>Saving main object</b>".$Current_DN;
211 print_a($objectAttrs);
213 save_FAI_object($Current_DN,$objectAttrs);
215 foreach($r as $key){
216 echo "<b>Saving parent to following release</b> ".$key;
217 print_a($parent_attrs);
218 save_FAI_object($key,$parent_attrs);
219 }
220 }else{
222 echo "<b>Saving main object</b>".$Current_DN;
223 print_a($objectAttrs);
225 save_FAI_object($Current_DN,$objectAttrs);
227 if(isset($objectAttrs['FAIstate'])){
228 $objectAttrs['FAIstate'] .= "|removed";
229 }else{
230 $objectAttrs['FAIstate'] = "|removed";
231 }
233 foreach($r as $key ){
234 echo "<b>Create an empty placeholder in follwing release</b> ".$key;
235 print_a($objectAttrs);
236 save_FAI_object($key,$objectAttrs);
237 }
238 }
239 }else{
241 /* check if we must patch the follwing release */
242 if(!empty($r)){
243 foreach($r as $key ){
244 echo "<b>Copy current objects original attributes to next release</b> ".$key;
245 print_a($parent_attrs);
246 save_FAI_object($key,$parent_attrs);
247 }
248 }
250 echo "<b>Saving current object</b>".$parent_obj;
251 print_a($objectAttrs);
253 save_FAI_object($parent_obj,$objectAttrs);
255 if($parent_obj != $Current_DN){
256 echo "<b>Error they must be equal : </b>".$parent_obj."<br><b> and </b><br> ".$Current_DN."<br>";
257 }
258 }
259 }
260 echo "<br>.--------------------------------------------------------------------.<br>";
261 }
264 function prepare_ldap_fetch_to_be_saved($attrs)
265 {
266 foreach($attrs as $key => $value){
267 if(is_numeric($key) || ($key == "count") || ($key == "dn")){
268 unset($attrs[$key]);
269 }
270 if(is_array($value) && isset($value['count'])){
271 unset($attrs[$key]['count']);
272 }
273 }
274 return($attrs);
275 }
278 function save_FAI_object($dn,$attrs)
279 {
280 global $config;
281 $ldap = $config->get_ldap_link();
282 $ldap->cd($config->current['BASE']);
283 $ldap->create_missing_trees(preg_replace('/^[^,]+,/', '', $dn));
284 $ldap->cd($dn);
286 $ldap->cat($dn,array("dn"));
287 if($ldap->count()){
288 $ldap->modify($attrs);
289 }else{
290 $ldap->add($attrs);
291 }
292 show_ldap_error($ldap->get_error(),sprintf(_("Release management failed, can't save '%s'"),$dn));
293 }
296 function get_following_releases_that_inherit_this_object($dn)
297 {
298 global $config;
299 $ldap = $config->get_ldap_link();
300 $ldap->cd($config->current['BASE']);
302 $ret = array();
304 /* Get base release */
305 $base_release = get_release_dn($dn);
307 /* Get previous release dns */
308 $sub_releases = get_sub_releases_of_this_release($base_release);
310 /* Get dn suffix. Example "FAIvairableEntry=keksdose,FAIvariable=Keksregal," */
311 $dn_suffix = str_ireplace($base_release,"",$dn);
313 /* Check if given object also exists whitin one of these releases */
314 foreach($sub_releases as $p_release => $name){
316 $check_dn = $dn_suffix.$p_release;
318 $ldap->cat($check_dn,array("dn","objectClass"));
320 if($ldap->count()){
321 //return($ret);
322 }else{
323 $ret[$check_dn]=$check_dn;
324 }
325 }
326 return($ret);
327 }
330 /* Get previous version of the object dn */
331 function get_parent_release_object($dn)
332 {
333 global $config;
334 $ldap = $config->get_ldap_link();
335 $ldap->cd($config->current['BASE']);
336 $previous_releases= array();
338 /* Get base release */
339 $base_release = get_release_dn($dn);
340 $previous_releases[] = $base_release;
342 /* Get previous release dns */
343 $tmp = get_previous_releases_of_this_release($base_release,true);
344 foreach($tmp as $release){
345 $previous_releases[] = $release;
346 }
348 /* Get dn suffix. Example "FAIvairableEntry=keksdose,FAIvariable=Keksregal," */
349 $dn_suffix = str_ireplace($base_release,"",$dn);
351 /* Check if given object also exists whitin one of these releases */
352 foreach($previous_releases as $p_release){
353 $check_dn = $dn_suffix.$p_release;
354 $ldap->cat($check_dn,array("dn","objectClass"));
356 if($ldap->count()){
357 return($check_dn);
358 }
359 }
360 return("");
361 }
364 /* return release names of all parent releases */
365 function get_previous_releases_of_this_release($dn,$flat)
366 {
367 global $config;
368 $ldap = $config->get_ldap_link();
369 $ldap->cd($config->current['BASE']);
370 $ret = array();
372 /* Explode dns into pieces, to be able to build parent dns */
373 $dns_to_check = ldap_explode_dn(str_ireplace(",".$config->current['BASE'],"",$dn),0);
374 if(!is_array($dns_to_check)){
375 return;
376 }
378 /* Unset first entry which represents the given dn */
379 unset($dns_to_check['count']);
380 unset($dns_to_check[key($dns_to_check)]);
382 /* Create dns addresses and check if this dn is a release dn */
383 $id = 0;
384 while(count($dns_to_check)){
386 /* build parent dn */
387 $new_dn = "";
388 foreach($dns_to_check as $part){
389 $new_dn .= $part.",";
390 }
391 $new_dn .= $config->current['BASE'];
393 /* check if this dn is a release */
394 if(is_release_department($new_dn)){
395 if($flat){
396 $ret[$id] = $new_dn;
397 }else{
398 $ret = array($new_dn=>$ret);
399 }
400 $id ++;
401 }else{
402 return($ret);
403 }
404 reset($dns_to_check);
405 unset($dns_to_check[key($dns_to_check)]);
406 }
407 return($ret);
408 }
411 /* This function returns all sub release names, recursivly */
412 function get_sub_releases_of_this_release($dn,$flat = false)
413 {
414 global $config;
415 $res = array();
416 $ldap = $config->get_ldap_link();
417 $ldap->cd($config->current['BASE']);
418 $ldap->ls("(objectClass=FAIbranch)",$dn,array("objectClass","dn","ou"));
419 while($attr = $ldap->fetch()){
421 /* Append department name */
422 if($flat){
423 $res[$attr['dn']] = $attr['ou'][0];
424 }else{
425 $res[$attr['dn']] = array();
426 }
428 /* Get sub release departments of this department */
429 if(in_array("FAIbranch",$attr['objectClass'])) {
430 if($flat){
431 $tmp = get_sub_releases_of_this_release($attr['dn'],$flat);
432 foreach($tmp as $dn => $value){
433 $res[$dn]=$value;
434 }
435 }else{
436 $res[$attr['dn']] = get_sub_releases_of_this_release($attr['dn']);
437 }
438 }
439 }
440 return($res);
441 }
444 /* Check if the given department is a release department */
445 function is_release_department($dn)
446 {
447 global $config;
448 $ldap = $config->get_ldap_link();
449 $ldap->cd($config->current['BASE']);
450 $ldap->cat($dn,array("objectClass","ou"));
452 /* Check objectClasses and name to check if this is a release department */
453 if($ldap->count()){
454 $attrs = $ldap->fetch();
456 $ou = "";
457 if(isset($attrs['ou'][0])){
458 $ou = $attrs['ou'][0];
459 }
461 if((in_array("FAIbranch",$attrs['objectClass'])) || ($ou == "fai")){
462 return($attrs['dn']);
463 }
464 }
465 return(false);
466 }
469 /* This function returns the dn of the object release */
470 function get_release_dn($Current_DN)
471 {
472 global $config;
473 $ldap = $config->get_ldap_link();
474 $ldap->cd($config->current['BASE']);
476 /* Split dn into pices */
477 $dns_to_check = ldap_explode_dn(str_ireplace(",".$config->current['BASE'],"",$Current_DN),0);
478 if(!is_array($dns_to_check)){
479 return;
480 }
482 /* Use dn pieces, to create sub dns like
483 ou=test,ou=1,ou=0...
484 ou=1,ou=0...
485 ou=0...
486 To check which dn is our release container.
487 */
488 unset($dns_to_check['count']);
489 while(count($dns_to_check)){
491 /* Create dn */
492 $new_dn = "";
493 foreach($dns_to_check as $part){
494 $new_dn .= $part.",";
495 }
496 $new_dn .= $config->current['BASE'];
498 /* Check if this dn is a release dn */
499 if(is_release_department($new_dn)){
500 return($new_dn);
501 }
503 /* Remove first element of dn pieces */
504 reset($dns_to_check);
505 unset($dns_to_check[key($dns_to_check)]);
506 }
507 return("");
508 }
510 // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler:
511 ?>