24ff61ec81169f7f7462fa8f003b2a5ac310da4b
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"));
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 /* In detailed mode are some additonal informations visible */
44 if($detailed){
46 /* Create list of parents */
47 if(isset($res[$name])){
48 $buffer = $res[$name];
49 $buffer['parents'][] = $res[$name]['dn'];
50 }else{
51 $buffer['parents'] = array();
52 }
54 /* Append objectClass to resulsts */
55 $buffer['objectClass'] = $attr['objectClass'];
56 unset($buffer['objectClass'][0]);
57 }
59 /* Add this object to our list */
60 $buffer['dn'] = $attr['dn'];
61 $res[$name] = $buffer;
62 }
63 }
64 }
65 return($res);
66 }
70 /* Return the object defining ObjectClass e.g. FAIscriptEntry */
71 function get_FAI_type($attr)
72 {
73 $arr = array( "FAIprofile","FAIpartitionTable", "FAIpartitionDisk","FAIpartitionEntry","FAIhook","FAIhookEntry",
74 "FAIscriptEntry","FAIscript","FAIvariable","FAIvariableEntry","FAIpackageList","FAItemplate",
75 "FAItemplateEntry","FAIdebconfInfo","FAIrepository","FAIrepositoryServer","FAIbranch","FAIreleaseTag");
76 foreach($arr as $name){
77 if(in_array($name,$attr['objectClass'])){
78 preg_match("");
79 return($name);
80 }
81 }
82 echo "Not found";
83 return("");
84 }
87 /* Return all relevant FAI departments */
88 function get_FAI_departments($suffix = "")
89 {
90 $arr = array("hooks","scripts","disk","packages","profiles","templates","variables");
91 $tmp = array();
92 if(preg_match("/^,/",$suffix)){
93 $suffix = preg_replace("/^,/","",$suffix);
94 }
95 foreach($arr as $name){
96 if(empty($suffix)){
97 $tmp[$name] = "ou=".$name;
98 }else{
99 $tmp[$name] = "ou=".$name.",".$suffix;
100 }
101 }
102 return($tmp);
103 }
106 function get_all_releases_from_base($dn)
107 {
108 global $config;
109 $base = "ou=fai,ou=configs,ou=systems,".$dn;
110 $res = array();
112 $ldap = $config->get_ldap_link();
113 $ldap->cd($base);
114 $ldap->search("(objectClass=FAIbranch)",array("ou","dn"));
115 while($attrs = $ldap->fetch()){
116 $res[$attrs['dn']] = $attrs['ou'][0];
117 }
118 return($res);
119 }
122 /* This function does everything to be able to save the given dn.
124 !!!!!!! No functionality just output
126 */
127 function prepare_to_save_FAI_object($Current_DN)
128 {
129 /* Get some basic informations */
130 $base_release = get_release_dn($Current_DN);
131 $sub_releases = get_sub_releases_of_this_release($base_release,true);
132 $parent_obj = get_parent_release_object($Current_DN);
134 $previous_releases = get_previous_releases_of_this_release($base_release,true);
135 $following_releases= get_sub_releases_of_this_release($base_release,true);
137 global $config;
138 $ldap = $config->get_ldap_link();
139 $ldap->cd($config->current['BASE']);
140 $ldap->cat($Current_DN);
141 if(!$ldap->count()){
142 $is_new = true;
143 }else{
144 $is_new = false;
145 }
147 echo "<h2>".$Current_DN."</h2>";
149 /* If we are a leaf object */
150 if(count($following_releases) == 0 ){
151 echo "<b>Saving dircetly, is a leaf object</b><br>";
152 }else{
154 $r = get_following_releases_that_inherit_this_object($Current_DN);
156 if($is_new){
157 echo "Creating an empty entry for <b>".$r[key($r)]."</b><br>";
158 echo "By setting <b>'FAIstate'</b> to <b>'*|removed'</b><br>";
159 }else{
160 echo "<b>This object has sub releases: </b><br>";
161 echo "This object must be updated <b>".$r[key($r)]."</b> with <b>".$parent_obj."</b><br>";
162 }
163 unset($r[key($r)]);
164 echo "<br> the result will be inherited by .";
165 foreach($r as $release => $value){
166 echo "<br> : <i>".$release."</i>";
167 }
168 }
169 echo "<br>.--------------------------------------------------------------------.<br>";
170 }
173 function get_following_releases_that_inherit_this_object($dn)
174 {
175 global $config;
176 $ldap = $config->get_ldap_link();
177 $ldap->cd($config->current['BASE']);
179 $ret = array();
181 /* Get base release */
182 $base_release = get_release_dn($dn);
184 /* Get previous release dns */
185 $sub_releases = get_sub_releases_of_this_release($base_release,true);
187 /* Get dn suffix. Example "FAIvairableEntry=keksdose,FAIvariable=Keksregal," */
188 $dn_suffix = str_ireplace($base_release,"",$dn);
190 /* Check if given object also exists whitin one of these releases */
191 foreach($sub_releases as $p_release => $name){
193 $check_dn = $dn_suffix.$p_release;
195 $ldap->cat($check_dn,array("dn","objectClass"));
197 if($ldap->count()){
198 return($ret);
199 }else{
200 $ret[$check_dn]=$check_dn;
201 }
202 }
203 return($ret);
204 }
207 /* Get previous version of the object dn */
208 function get_parent_release_object($dn)
209 {
210 global $config;
211 $ldap = $config->get_ldap_link();
212 $ldap->cd($config->current['BASE']);
213 $previous_releases= array();
215 /* Get base release */
216 $base_release = get_release_dn($dn);
217 $previous_releases[] = $base_release;
219 /* Get previous release dns */
220 $tmp = get_previous_releases_of_this_release($base_release,true);
221 foreach($tmp as $release){
222 $previous_releases[] = $release;
223 }
225 /* Get dn suffix. Example "FAIvairableEntry=keksdose,FAIvariable=Keksregal," */
226 $dn_suffix = str_ireplace($base_release,"",$dn);
228 /* Check if given object also exists whitin one of these releases */
229 foreach($previous_releases as $p_release){
230 $check_dn = $dn_suffix.$p_release;
231 $ldap->cat($check_dn,array("dn","objectClass"));
233 if($ldap->count()){
234 return($check_dn);
235 }
236 }
237 return("");
238 }
241 /* return release names of all parent releases */
242 function get_previous_releases_of_this_release($dn,$flat)
243 {
244 global $config;
245 $ldap = $config->get_ldap_link();
246 $ldap->cd($config->current['BASE']);
247 $ret = array();
249 /* Explode dns into pieces, to be able to build parent dns */
250 $dns_to_check = ldap_explode_dn(str_ireplace(",".$config->current['BASE'],"",$dn),0);
251 if(!is_array($dns_to_check)){
252 return;
253 }
255 /* Unset first entry which represents the given dn */
256 unset($dns_to_check['count']);
257 unset($dns_to_check[key($dns_to_check)]);
259 /* Create dns addresses and check if this dn is a release dn */
260 $id = 0;
261 while(count($dns_to_check)){
263 /* build parent dn */
264 $new_dn = "";
265 foreach($dns_to_check as $part){
266 $new_dn .= $part.",";
267 }
268 $new_dn .= $config->current['BASE'];
270 /* check if this dn is a release */
271 if(is_release_department($new_dn)){
272 if($flat){
273 $ret[$id] = $new_dn;
274 }else{
275 $ret = array($new_dn=>$ret);
276 }
277 $id ++;
278 }else{
279 return($ret);
280 }
281 reset($dns_to_check);
282 unset($dns_to_check[key($dns_to_check)]);
283 }
284 return($ret);
285 }
288 /* This function returns all sub release names, recursivly */
289 function get_sub_releases_of_this_release($dn,$flat = false)
290 {
291 global $config;
292 $res = array();
293 $ldap = $config->get_ldap_link();
294 $ldap->cd($config->current['BASE']);
295 $ldap->ls("(objectClass=FAIbranch)",$dn,array("objectClass","dn","ou"));
296 while($attr = $ldap->fetch()){
298 /* Append department name */
299 if($flat){
300 $res[$attr['dn']] = $attr['ou'][0];
301 }else{
302 $res[$attr['dn']] = array();
303 }
305 /* Get sub release departments of this department */
306 if(in_array("FAIbranch",$attr['objectClass'])) {
307 if($flat){
308 $tmp = get_sub_releases_of_this_release($attr['dn'],$flat);
309 foreach($tmp as $dn => $value){
310 $res[$dn]=$value;
311 }
312 }else{
313 $res[$attr['dn']] = get_sub_releases_of_this_release($attr['dn']);
314 }
315 }
316 }
317 return($res);
318 }
321 /* Check if the given department is a release department */
322 function is_release_department($dn)
323 {
324 global $config;
325 $ldap = $config->get_ldap_link();
326 $ldap->cd($config->current['BASE']);
327 $ldap->cat($dn,array("objectClass","ou"));
329 /* Check objectClasses and name to check if this is a release department */
330 if($ldap->count()){
331 $attrs = $ldap->fetch();
333 $ou = "";
334 if(isset($attrs['ou'][0])){
335 $ou = $attrs['ou'][0];
336 }
338 if((in_array("FAIbranch",$attrs['objectClass'])) || ($ou == "fai")){
339 return($attrs['dn']);
340 }
341 }
342 return(false);
343 }
346 /* This function returns the dn of the object release */
347 function get_release_dn($Current_DN)
348 {
349 global $config;
350 $ldap = $config->get_ldap_link();
351 $ldap->cd($config->current['BASE']);
353 /* Split dn into pices */
354 $dns_to_check = ldap_explode_dn(str_ireplace(",".$config->current['BASE'],"",$Current_DN),0);
355 if(!is_array($dns_to_check)){
356 return;
357 }
359 /* Use dn pieces, to create sub dns like
360 ou=test,ou=1,ou=0...
361 ou=1,ou=0...
362 ou=0...
363 To check which dn is our release container.
364 */
365 unset($dns_to_check['count']);
366 while(count($dns_to_check)){
368 /* Create dn */
369 $new_dn = "";
370 foreach($dns_to_check as $part){
371 $new_dn .= $part.",";
372 }
373 $new_dn .= $config->current['BASE'];
375 /* Check if this dn is a release dn */
376 if(is_release_department($new_dn)){
377 return($new_dn);
378 }
380 /* Remove first element of dn pieces */
381 reset($dns_to_check);
382 unset($dns_to_check[key($dns_to_check)]);
383 }
384 return("");
385 }
387 // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler:
388 ?>