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,$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("(objectClass=FAIclass)",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 echo "<h2>".$Current_DN."</h2>";
139 /* If we are a leaf object */
140 if(count($following_releases) == 0 ){
141 echo "<b>Saving dircetly, is a leaf object</b><br>";
142 }else{
144 echo "<b>This object has sub releases: </b><br>";
146 $r = get_following_releases_that_inherit_this_object($Current_DN);
147 echo "This object must be updated <b>".$r[key($r)]."</b> with <b>".$parent_obj."</b><br>";
148 unset($r[key($r)]);
150 echo "<br> the result will be inherited by .";
151 foreach($r as $release => $value){
152 echo " : <i>".$release."</i><br>";
153 }
154 }
156 echo "<br>.--------------------------------------------------------------------.<br>";
158 }
161 function get_following_releases_that_inherit_this_object($dn)
162 {
163 global $config;
164 $ldap = $config->get_ldap_link();
165 $ldap->cd($config->current['BASE']);
167 $ret = array();
169 /* Get base release */
170 $base_release = get_release_dn($dn);
172 /* Get previous release dns */
173 $sub_releases = get_sub_releases_of_this_release($base_release,true);
175 /* Get dn suffix. Example "FAIvairableEntry=keksdose,FAIvariable=Keksregal," */
176 $dn_suffix = str_ireplace($base_release,"",$dn);
178 /* Check if given object also exists whitin one of these releases */
179 foreach($sub_releases as $p_release => $name){
181 $check_dn = $dn_suffix.$p_release;
183 $ldap->cat($check_dn,array("dn","objectClass"));
185 if($ldap->count()){
186 return($ret);
187 }else{
188 $ret[$check_dn]=$check_dn;
189 }
190 }
191 return($ret);
192 }
195 /* Get previous version of the object dn */
196 function get_parent_release_object($dn)
197 {
198 global $config;
199 $ldap = $config->get_ldap_link();
200 $ldap->cd($config->current['BASE']);
201 $previous_releases= array();
203 /* Get base release */
204 $base_release = get_release_dn($dn);
205 $previous_releases[] = $base_release;
207 /* Get previous release dns */
208 $tmp = get_previous_releases_of_this_release($base_release,true);
209 foreach($tmp as $release){
210 $previous_releases[] = $release;
211 }
213 /* Get dn suffix. Example "FAIvairableEntry=keksdose,FAIvariable=Keksregal," */
214 $dn_suffix = str_ireplace($base_release,"",$dn);
216 /* Check if given object also exists whitin one of these releases */
217 foreach($previous_releases as $p_release){
218 $check_dn = $dn_suffix.$p_release;
219 $ldap->cat($check_dn,array("dn","objectClass"));
221 if($ldap->count()){
222 return($check_dn);
223 }
224 }
225 return("");
226 }
229 /* return release names of all parent releases */
230 function get_previous_releases_of_this_release($dn,$flat)
231 {
232 global $config;
233 $ldap = $config->get_ldap_link();
234 $ldap->cd($config->current['BASE']);
235 $ret = array();
237 /* Explode dns into pieces, to be able to build parent dns */
238 $dns_to_check = ldap_explode_dn(str_ireplace(",".$config->current['BASE'],"",$dn),0);
239 if(!is_array($dns_to_check)){
240 return;
241 }
243 /* Unset first entry which represents the given dn */
244 unset($dns_to_check['count']);
245 unset($dns_to_check[key($dns_to_check)]);
247 /* Create dns addresses and check if this dn is a release dn */
248 $id = 0;
249 while(count($dns_to_check)){
251 /* build parent dn */
252 $new_dn = "";
253 foreach($dns_to_check as $part){
254 $new_dn .= $part.",";
255 }
256 $new_dn .= $config->current['BASE'];
258 /* check if this dn is a release */
259 if(is_release_department($new_dn)){
260 if($flat){
261 $ret[$id] = $new_dn;
262 }else{
263 $ret = array($new_dn=>$ret);
264 }
265 $id ++;
266 }else{
267 return($ret);
268 }
269 reset($dns_to_check);
270 unset($dns_to_check[key($dns_to_check)]);
271 }
272 return($ret);
273 }
276 /* This function returns all sub release names, recursivly */
277 function get_sub_releases_of_this_release($dn,$flat = false)
278 {
279 global $config;
280 $res = array();
281 $ldap = $config->get_ldap_link();
282 $ldap->cd($config->current['BASE']);
283 $ldap->ls("(objectClass=FAIbranch)",$dn,array("objectClass","dn","ou"));
284 while($attr = $ldap->fetch()){
286 /* Append department name */
287 if($flat){
288 $res[$attr['dn']] = $attr['ou'][0];
289 }else{
290 $res[$attr['dn']] = array();
291 }
293 /* Get sub release departments of this department */
294 if(in_array("FAIbranch",$attr['objectClass'])) {
295 if($flat){
296 $tmp = get_sub_releases_of_this_release($attr['dn'],$flat);
297 foreach($tmp as $dn => $value){
298 $res[$dn]=$value;
299 }
300 }else{
301 $res[$attr['dn']] = get_sub_releases_of_this_release($attr['dn']);
302 }
303 }
304 }
305 return($res);
306 }
309 /* Check if the given department is a release department */
310 function is_release_department($dn)
311 {
312 global $config;
313 $ldap = $config->get_ldap_link();
314 $ldap->cd($config->current['BASE']);
315 $ldap->cat($dn,array("objectClass","ou"));
317 /* Check objectClasses and name to check if this is a release department */
318 if($ldap->count()){
319 $attrs = $ldap->fetch();
320 if((in_array("FAIbranch",$attrs['objectClass'])) || ($attrs['ou'][0] == "fai")){
321 return($attrs['dn']);
322 }
323 }
324 return(false);
325 }
328 /* This function returns the dn of the object release */
329 function get_release_dn($Current_DN)
330 {
331 global $config;
332 $ldap = $config->get_ldap_link();
333 $ldap->cd($config->current['BASE']);
335 /* Split dn into pices */
336 $dns_to_check = ldap_explode_dn(str_ireplace(",".$config->current['BASE'],"",$Current_DN),0);
337 if(!is_array($dns_to_check)){
338 return;
339 }
341 /* Use dn pieces, to create sub dns like
342 ou=test,ou=1,ou=0...
343 ou=1,ou=0...
344 ou=0...
345 To check which dn is our release container.
346 */
347 unset($dns_to_check['count']);
348 while(count($dns_to_check)){
350 /* Create dn */
351 $new_dn = "";
352 foreach($dns_to_check as $part){
353 $new_dn .= $part.",";
354 }
355 $new_dn .= $config->current['BASE'];
357 /* Check if this dn is a release dn */
358 if(is_release_department($new_dn)){
359 return($new_dn);
360 }
362 /* Remove first element of dn pieces */
363 reset($dns_to_check);
364 unset($dns_to_check[key($dns_to_check)]);
365 }
366 return("");
367 }
370 ?>