15d18f373dcbcbc2c4e079a2cc813c3533153248
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)
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 /* Check if this a leaf release or not */
159 if(count($following_releases) == 0 ){
161 /* This is a leaf object. It isn't unherited by any other object */
162 echo "<b>Saving directly, is a leaf object</b><br> ".$Current_DN;
163 print_a($objectAttrs);
164 save_FAI_object($Current_DN,$objectAttrs);
165 }else{
167 /* This object is inherited by some sub releases */
169 /* Get all releases, that inherit this object */
170 $r = get_following_releases_that_inherit_this_object($Current_DN);
172 /* Get parent object */
173 $ldap->cat($parent_obj);
174 $parent_attrs = prepare_ldap_fetch_to_be_saved($ldap->fetch());
176 /* New objects require special handling */
177 if($is_new){
179 /* check if there is already an entry named like this,
180 in one of our parent releases */
181 if(!empty($parent_obj)){
182 echo "There is already an entry named like this.</b><br>";
184 echo "<b>Saving main object</b>".$Current_DN;
185 print_a($objectAttrs);
187 $key = $r[key($r)];
188 echo "<b>Saving parent to following release</b> ".$key;
189 print_a($parent_attrs);
191 save_FAI_object($Current_DN,$objectAttrs);
192 save_FAI_object($key,$parent_attrs);
194 }else{
196 echo "<b>Saving main object</b>".$Current_DN;
197 print_a($objectAttrs);
199 save_FAI_object($Current_DN,$objectAttrs);
201 $key = $r[key($r)];
202 echo "<b>Create an empty placeholder in follwing release</b> ".$key;
203 if(isset($objectAttrs['FAIstate'])){
204 $objectAttrs['FAIstate'] .= "|removed";
205 }else{
206 $objectAttrs['FAIstate'] = "|removed";
207 }
208 print_a($objectAttrs);
209 save_FAI_object($key,$objectAttrs);
210 }
211 }else{
213 /* check if we must patch the follwing release */
214 if(!empty($r)){
215 $key = $r[key($r)];
216 echo "<b>Copy current objects original attributes to next release</b> ".$key;
217 print_a($parent_attrs);
218 save_FAI_object($key,$parent_attrs);
219 }
221 echo "<b>Saving current object</b>".$parent_obj;
222 print_a($objectAttrs);
224 save_FAI_object($parent_obj,$objectAttrs);
226 if($parent_obj != $Current_DN){
227 echo "<b>Error they must be equal : </b>".$parent_obj."<br><b> and </b><br> ".$Current_DN."<br>";
228 }
229 }
230 unset($r[key($r)]);
231 echo "<br> the result will be inherited by .";
232 foreach($r as $release => $value){
233 echo "<br> : <i>".$release."</i>";
234 }
235 }
236 echo "<br>.--------------------------------------------------------------------.<br>";
237 }
240 function prepare_ldap_fetch_to_be_saved($attrs)
241 {
242 foreach($attrs as $key => $value){
243 if(is_numeric($key) || ($key == "count") || ($key == "dn")){
244 unset($attrs[$key]);
245 }
246 if(is_array($value) && isset($value['count'])){
247 unset($attrs[$key]['count']);
248 }
249 }
250 return($attrs);
251 }
254 function save_FAI_object($dn,$attrs)
255 {
256 global $config;
257 $ldap = $config->get_ldap_link();
258 $ldap->cd($config->current['BASE']);
259 $ldap->create_missing_trees(preg_replace('/^[^,]+,/', '', $dn));
260 $ldap->cd($dn);
262 $ldap->cat($dn,array("dn"));
263 if($ldap->count()){
264 $ldap->modify($attrs);
265 }else{
266 $ldap->add($attrs);
267 }
268 show_ldap_error($ldap->get_error(),sprintf(_("Release management failed, can't save '%s'"),$dn));
269 }
272 function get_following_releases_that_inherit_this_object($dn)
273 {
274 global $config;
275 $ldap = $config->get_ldap_link();
276 $ldap->cd($config->current['BASE']);
278 $ret = array();
280 /* Get base release */
281 $base_release = get_release_dn($dn);
283 /* Get previous release dns */
284 $sub_releases = get_sub_releases_of_this_release($base_release,true);
286 /* Get dn suffix. Example "FAIvairableEntry=keksdose,FAIvariable=Keksregal," */
287 $dn_suffix = str_ireplace($base_release,"",$dn);
289 /* Check if given object also exists whitin one of these releases */
290 foreach($sub_releases as $p_release => $name){
292 $check_dn = $dn_suffix.$p_release;
294 $ldap->cat($check_dn,array("dn","objectClass"));
296 if($ldap->count()){
297 return($ret);
298 }else{
299 $ret[$check_dn]=$check_dn;
300 }
301 }
302 return($ret);
303 }
306 /* Get previous version of the object dn */
307 function get_parent_release_object($dn)
308 {
309 global $config;
310 $ldap = $config->get_ldap_link();
311 $ldap->cd($config->current['BASE']);
312 $previous_releases= array();
314 /* Get base release */
315 $base_release = get_release_dn($dn);
316 $previous_releases[] = $base_release;
318 /* Get previous release dns */
319 $tmp = get_previous_releases_of_this_release($base_release,true);
320 foreach($tmp as $release){
321 $previous_releases[] = $release;
322 }
324 /* Get dn suffix. Example "FAIvairableEntry=keksdose,FAIvariable=Keksregal," */
325 $dn_suffix = str_ireplace($base_release,"",$dn);
327 /* Check if given object also exists whitin one of these releases */
328 foreach($previous_releases as $p_release){
329 $check_dn = $dn_suffix.$p_release;
330 $ldap->cat($check_dn,array("dn","objectClass"));
332 if($ldap->count()){
333 return($check_dn);
334 }
335 }
336 return("");
337 }
340 /* return release names of all parent releases */
341 function get_previous_releases_of_this_release($dn,$flat)
342 {
343 global $config;
344 $ldap = $config->get_ldap_link();
345 $ldap->cd($config->current['BASE']);
346 $ret = array();
348 /* Explode dns into pieces, to be able to build parent dns */
349 $dns_to_check = ldap_explode_dn(str_ireplace(",".$config->current['BASE'],"",$dn),0);
350 if(!is_array($dns_to_check)){
351 return;
352 }
354 /* Unset first entry which represents the given dn */
355 unset($dns_to_check['count']);
356 unset($dns_to_check[key($dns_to_check)]);
358 /* Create dns addresses and check if this dn is a release dn */
359 $id = 0;
360 while(count($dns_to_check)){
362 /* build parent dn */
363 $new_dn = "";
364 foreach($dns_to_check as $part){
365 $new_dn .= $part.",";
366 }
367 $new_dn .= $config->current['BASE'];
369 /* check if this dn is a release */
370 if(is_release_department($new_dn)){
371 if($flat){
372 $ret[$id] = $new_dn;
373 }else{
374 $ret = array($new_dn=>$ret);
375 }
376 $id ++;
377 }else{
378 return($ret);
379 }
380 reset($dns_to_check);
381 unset($dns_to_check[key($dns_to_check)]);
382 }
383 return($ret);
384 }
387 /* This function returns all sub release names, recursivly */
388 function get_sub_releases_of_this_release($dn,$flat = false)
389 {
390 global $config;
391 $res = array();
392 $ldap = $config->get_ldap_link();
393 $ldap->cd($config->current['BASE']);
394 $ldap->ls("(objectClass=FAIbranch)",$dn,array("objectClass","dn","ou"));
395 while($attr = $ldap->fetch()){
397 /* Append department name */
398 if($flat){
399 $res[$attr['dn']] = $attr['ou'][0];
400 }else{
401 $res[$attr['dn']] = array();
402 }
404 /* Get sub release departments of this department */
405 if(in_array("FAIbranch",$attr['objectClass'])) {
406 if($flat){
407 $tmp = get_sub_releases_of_this_release($attr['dn'],$flat);
408 foreach($tmp as $dn => $value){
409 $res[$dn]=$value;
410 }
411 }else{
412 $res[$attr['dn']] = get_sub_releases_of_this_release($attr['dn']);
413 }
414 }
415 }
416 return($res);
417 }
420 /* Check if the given department is a release department */
421 function is_release_department($dn)
422 {
423 global $config;
424 $ldap = $config->get_ldap_link();
425 $ldap->cd($config->current['BASE']);
426 $ldap->cat($dn,array("objectClass","ou"));
428 /* Check objectClasses and name to check if this is a release department */
429 if($ldap->count()){
430 $attrs = $ldap->fetch();
432 $ou = "";
433 if(isset($attrs['ou'][0])){
434 $ou = $attrs['ou'][0];
435 }
437 if((in_array("FAIbranch",$attrs['objectClass'])) || ($ou == "fai")){
438 return($attrs['dn']);
439 }
440 }
441 return(false);
442 }
445 /* This function returns the dn of the object release */
446 function get_release_dn($Current_DN)
447 {
448 global $config;
449 $ldap = $config->get_ldap_link();
450 $ldap->cd($config->current['BASE']);
452 /* Split dn into pices */
453 $dns_to_check = ldap_explode_dn(str_ireplace(",".$config->current['BASE'],"",$Current_DN),0);
454 if(!is_array($dns_to_check)){
455 return;
456 }
458 /* Use dn pieces, to create sub dns like
459 ou=test,ou=1,ou=0...
460 ou=1,ou=0...
461 ou=0...
462 To check which dn is our release container.
463 */
464 unset($dns_to_check['count']);
465 while(count($dns_to_check)){
467 /* Create dn */
468 $new_dn = "";
469 foreach($dns_to_check as $part){
470 $new_dn .= $part.",";
471 }
472 $new_dn .= $config->current['BASE'];
474 /* Check if this dn is a release dn */
475 if(is_release_department($new_dn)){
476 return($new_dn);
477 }
479 /* Remove first element of dn pieces */
480 reset($dns_to_check);
481 unset($dns_to_check[key($dns_to_check)]);
482 }
483 return("");
484 }
486 // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler:
487 ?>