Code

- Added a section how to report a bug
[gosa.git] / include / functions_dns.inc
1 <?php
4 /* All available record types 
5  */
6 $RecordTypes['aRecord']       = "aRecord";           
7 $RecordTypes['mDRecord']      = "mDRecord";         
8 $RecordTypes['mXRecord']      = "mXRecord";         
9 $RecordTypes['nSRecord']      = "nSRecord";          
10 $RecordTypes['pTRRecord']     = "relativeDomainName";
11 $RecordTypes['hInfoRecord']   = "hInfoRecord";      
12 $RecordTypes['mInfoRecord']   = "mInfoRecord";       
13 $RecordTypes['cNAMERecord']   = "relativeDomainName";
14 $RecordTypes['tXTRecord']     = "tXTRecord";         
15 $RecordTypes['aFSDBRecord']   = "aFSDBRecord";       
16 $RecordTypes['SigRecord']     = "SigRecord";         
17 $RecordTypes['KeyRecord']     = "KeyRecord";         
18 $RecordTypes['aAAARecord']    = "aAAARecord";        
19 $RecordTypes['LocRecord']     = "LocRecord";         
20 $RecordTypes['nXTRecord']     = "nXTRecord";        
21 $RecordTypes['sRVRecord']     = "sRVRecord";         
22 $RecordTypes['nAPTRRecord']   = "nAPTRRecord";       
23 $RecordTypes['kXRecord']      = "kXRecord";          
24 $RecordTypes['certRecord']    = "certRecord";        
25 $RecordTypes['a6Record']      = "a6Record";          
26 $RecordTypes['dSRecord']      = "dSRecord";          
27 $RecordTypes['sSHFPRecord']   = "sSHFPRecord";       
28 $RecordTypes['rRSIGRecord']   = "rRSIGRecord";      
29 $RecordTypes['nSECRecord']    = "nSECRecord";       
32 /* Return all record types 
33  */
34 function getDnsRecordTypes($ForZones = false)
35 {
36   global $RecordTypes;
37   if($ForZones){
38     $tmp = $RecordTypes;
39     unset($tmp['cNAMERecord']);
40     unset($tmp['pTRRecord']);
41     unset($tmp['tXTRecord']);
42     return($tmp);
43   }else{
44     return($RecordTypes);
45   }
46 }
49 /* This fucntion is used to flip the ip address, for example
50    12.3.45  ->  45.3.12
51    Because some entries (like zones) are store like that 45.3.12.in-addr.arpa
52    but we want to display 12.3.45.
53  */
54 function FlipIp($ip)
55 {
56   $tmp = array_reverse(split("\.",$ip));
57   $new = "";
58   foreach($tmp as $section){
59     $new .= $section.".";
60   }
61   return(preg_replace("/.$/","",$new));
62 }
65 /* This function returns the zones specified for given host
66  */
67 function getDNSZoneEntries($config,$HostDn,$silent = false)
68 {
69   global $RecordTypes;
71   $ldap = $config->get_ldap_link();
72   $ldap->cd($config->current['BASE']); 
74   /* Not all records are allowed within a zone entry
75    */  
76   $SkipRecords = array("tXTRecord","cNAMERecord","pTRRecord");
78   /* Special sOArecords 
79    */
80   $sOAREcords  = array("0"=>"sOAprimary","1"=>"sOAmail","2"=>"sOAserial","3"=>"sOArefresh","4"=>"sOAretry","5"=>"sOAexpire","6"=>"sOAttl");
82   /* Get host entry */
83   $ldap->cat($HostDn);
84   $host_attr = $ldap->fetch();
86   /* Create tempalte for all fetched zone Data 
87    */
88   $ZoneBase = array();
89   $ZoneBase['exists']  = false;
90   $ZoneBase['RECORDS'] = array();
91   $ZoneBase['zoneName'] = array();
92   $ZoneBase['dNSClass'] = array();
93    
94   foreach($sOAREcords as $attr){
95     $ZoneBase[$attr] = "";
96   }
97  
98   $Zones    = array();
100   /* Get & Parse all zone entries 
101    */
102   $ldap->ls("(&(objectClass=dNSZone)(zoneName=*)(relativeDomainName=@))",$HostDn,array("*"));
103   $tmp_res = array();
104   while($attrs = $ldap->fetch()) {
105     $tmp_res[] = $attrs;
106   }
108   /* Parse fetched zones 
109    */
110   foreach($tmp_res as $attrs){
112     $zoneName                   = strtoupper($host_attr['cn'][0])."/".$attrs['zoneName'][0];
113     $Zones[$zoneName]           = $ZoneBase;
114     $Zones[$zoneName]['exists'] = true;
116     /* Set basic attributes 
117      */
118     if(isset($attrs["dNSClass"][0])){
119       $Zones[$zoneName]["dNSClass"] = $attrs["dNSClass"][0];
120     }
122     /* Set initial zone name, to be able to detect if this entry was renamed 
123      */
124     $Zones[$zoneName]['InitialzoneName'] = $zoneName;
125     $Zones[$zoneName]['zoneName'] = $zoneName;
127     /* Generate SOA entry
128      */
129     if(isset($attrs['sOARecord'][0])){
130       $tmp = split("\ ",$attrs['sOARecord'][0]) ;
131       $tmp2 = array();
133       /* Assign soa vars */
134       foreach($sOAREcords as $key => $name){
135         if(isset($tmp[$key])){
136           $Zones[$zoneName][$name] = $tmp[$key];
137         }else{
138           $Zones[$zoneName][$name] = "";
139         }
140       }
141     } // ENDE SOA Record 
142   
143     /* Get record attributes 
144     */
145     foreach($RecordTypes as $name => $value){
146   
147       /* Skip some attributes 
148        */
149       if(in_array($name,$SkipRecords)) continue;
151       /* If there is a record attribute
152        */
153       if(isset($attrs[$name])){
155         /* get all entries
156          */
157         for($i = 0 ; $i < $attrs[$value]['count']; $i ++){
158           $Zones[$zoneName]['RECORDS'][] =  array("type"=>$name,"value"=>$attrs[$value][$i]);
159         }
160       }
161     }
163     /* Get reverse record ..
164      */
165     $ldap->ls("(&(objectClass=dNSZone)(relativeDomainName=@)(zoneName=*))",$attrs['dn'],array("zoneName"));
167     if($ldap->count() == 0){
168       if(!$silent){
169         print_red(sprintf(_("Can't find reverse zone for dns zone '%s'. Aborting parsing this zone."),$zoneName));
170       }
171       unset($Zones[$zoneName]);
172     }elseif($ldap->count()>1){
173       if(!$silent){
174         print_red(sprintf(_("Found more than one reverse zone for dns zone '%s'. Aborting parsing this zone."),$zoneName));
175       }
176       unset($Zones[$zoneName]);
177     }else{
178       $tmp = $ldap->fetch();
179       $Zones[$zoneName]['ReverseZone']        = strtoupper($host_attr['cn'][0])."/".FlipIp(str_replace(".in-addr.arpa","",$tmp['zoneName'][0]));
180       $Zones[$zoneName]['InitialReverseZone'] = strtoupper($host_attr['cn'][0])."/".FlipIp(str_replace(".in-addr.arpa","",$tmp['zoneName'][0]));
181     }
182   }
183   return($Zones);
187 /* This function compares two dns zone objects and returns an 
188  *  array with following indexes 
189  *   - delete, for dns which must be deleted (only if dns zone is removed)
190  *   - rename, if a dn must be renamed, for example, the zoneName has changed
191  *   - add,    if there is a new dns account created    
192  */
193 function getDNSZoneEntriesDiff($config,$newZones,$HostDn)
195   $oldZones = getDNSZoneEntries($config,$HostDn,true);
196   
197   $sOAattributes =  array("sOAprimary","sOAmail","sOAserial","sOArefresh","sOAretry","sOAexpire","sOAttl");
199   $move   = array();
200   $add    = array();
201   $del    = array();
203   /* Generate a template for zones with default values
204    */
205   $zoneBase                       = array();
206   $zoneBase['objectClass']        = array("top","dNSZone");
207   $zoneBase['zoneName']           = "";
208   $zoneBase['relativeDomainName'] = "@";
209   $zoneBase['dNSClass']           = "IN";
210   $zoneBase['sOARecord']          = "";
212   /* Contains all renamed zoneNames 
213    * For zone entry udpdates
214    */
215   $PrePareZoneEntries = array();
216   
217   /* Walk through all zones and detect renamed/added/deleted zones ... 
218    */
219   foreach($newZones as $name => $zone){
220    
221     /* This zone was renamed 
222      */
223     if((!empty($zone['InitialzoneName'])) && ($zone['InitialzoneName'] != $zone['zoneName'])){
224       
225       /* Move old zone to new position 
226        */ 
227       $oldDn = "zoneName=".getNameFromMix($zone['InitialzoneName']).",".$HostDn;
228       $newDn = "zoneName=".getNameFromMix($zone['zoneName']).",".$HostDn;
229       $PrePareZoneEntries[getNameFromMix($zone['InitialzoneName'])] = getNameFromMix($zone['zoneName']);
230       $move [$oldDn] = $newDn;      
231     }
233     /* Get old zone if available
234      */
235     $oldZone=array();
236     if(!empty($oldZones[$zone['InitialzoneName']])){
237       $oldZone = $oldZones[$zone['InitialzoneName']];
238     }
240     /* Create forward zone entry and put it in our add queue
241      */
242     $newDn  = "zoneName=".getNameFromMix($zone['zoneName']).",".$HostDn;
243     $obj    =  $zoneBase;
244     $obj['zoneName'] = getNameFromMix($zone['zoneName']);
245  
246     /* Create sOARecord & add it to the obj
247      */ 
248     $soa = "";
249     foreach($sOAattributes as $attr){
250       $soa.=" ".$zone[$attr];
251     }  
252     $obj['sOARecord'] = trim($soa);
253     $obj['nSRecord'] = $zone['sOAprimary'];
255     /* If reverse zone was renamed, move entry 
256      */
257     if(!empty($zone['InitialReverseZone'])){
258       if($zone['InitialReverseZone'] != $zone['ReverseZone']){
259         $base = "zoneName=".getNameFromMix($zone['zoneName']).",".$HostDn;
260         $oldRDn = "zoneName=". FlipIp(getNameFromMix($zone['InitialReverseZone'])).".in-addr.arpa,".$base; 
261         $newRDn = "zoneName=". FlipIp(getNameFromMix($zone['ReverseZone'])).".in-addr.arpa,".$base;
262         $PrePareZoneEntries[FlipIp(getNameFromMix($zone['InitialReverseZone'])).".in-addr.arpa"] = FlipIp(getNameFromMix($zone['ReverseZone'])).".in-addr.arpa";
263         $move [$oldRDn] = $newRDn;
264       }
265     }
267     /* Append record entries 
268      *  Set old value to array, to ensure that 
269      *  they will be deleted if necessary
270      */
271     if(isset($oldZone['RECORDS'])){
272       foreach($oldZone['RECORDS'] as $rec){
273         $obj[$rec['type']] = array();
274       }
275     }
277     /* Add new Records 
278      */
279     foreach($zone['RECORDS'] as $rec){
280       if(!isset($obj[$rec['type']])||!is_array($obj[$rec['type']])){
281         $obj[$rec['type']] = array();
282       }
283       $obj[$rec['type']][] = $rec['value'];
284     }
286     /* Append udpated Zone Forward Entry to our add queue
287      */    
288     $add[$newDn] = $obj;   
290     /* Create Reverse Entry 
291      * And append it to our add queue
292      */
293     $zone['ReverseZone'] = FlipIp(getNameFromMix($zone['ReverseZone'])).".in-addr.arpa";
294     $base = "zoneName=".getNameFromMix($zone['zoneName']).",".$HostDn;
295     $newRDn = "zoneName=".$zone['ReverseZone'].",".$base;
296     $rObj = $obj;
297     $rObj['zoneName']= $zone['ReverseZone'];
298     $add[$newRDn] = $rObj;
299  
300     /* Remove currently managed zone from oldZones.
301      *  this gives us the ability to detect removed zones
302      */
303     if(isset($oldZones[$zone['InitialzoneName']])){
304       unset($oldZones[$zone['InitialzoneName']]); 
305     }
306   }
307  
308   /* The rest of our oldZones must be deleted
309    *  because they are no longer available in newZones anymore.
310    */
311   foreach($oldZones as $zone)  {
312     $oldDn = "zoneName=".getNameFromMix($zone['InitialzoneName']).",".$HostDn;
313     $del[$oldDn] = $zone;
314   }
316   /* Check for entries which must be updated 
317    */
318   $zoneUpdates = array();
319   $udpate = array();
320   if(count($PrePareZoneEntries)){
321     $ldap = $config->get_ldap_link();
323     foreach($PrePareZoneEntries as $FromZoneName => $ToZoneName){
324       $ldap->cd($HostDn);
325       $ldap->search("(&(objectClass=dNSZone)(zoneName=".$FromZoneName.")(!(relativeDomainName=@)))",array("zoneName"));
326       while($attrs = $ldap->fetch()){
327         $attr_to_change = array();
328         $attr_to_change['zoneName'] = $ToZoneName;
329         $zoneUpdates[$attrs['dn']] = $attr_to_change;
330       }
331     }
332   }
333   $ret = array("del" => $del , "move" => $move , "add" => $add,"zoneUpdates"=>$zoneUpdates);
334   return($ret);
338 /* This function returns the dns-host eintries for given 
339  *  name.
340  */
341 function getDNSHostEntries($config,$name,$silent = false)
343   global $RecordTypes;
345   $types = array();
346   $ret = array();
347   $ret['RECORDS']   = array();
348   $ret['dNSClass']  = "IN";
349   $ret['zoneName']  = "";
350   $ret['dNSTTL']    = "7440";
351   $ret['exists']    = false;
352  
353   $ldap = $config->get_ldap_link();
354   $ldap->cd($config->current['BASE']);
355   
356   /* First check all zones for an entry with the given name.
357    * If the name occurs in more than one entry alert the user ...
358    */
359   $foundIn = array();
360   $zones = getAvailableZones($config);
361   
362   $zonesArr = array();
363   foreach($zones as $zoneMix){
364         $zoneIndex = split("/",$zoneMix);
365         if(!array_key_exists($zoneIndex[0],$zonesArr)) {
366       $zonesArr[$zoneIndex[0]] = array();
367     }
368                 array_push($zonesArr[$zoneIndex[0]],$zoneIndex[1]);
369   }
370   
371   foreach($zonesArr as $nameServer => $nameServerArr){
372         $foundInTmp = array();
373         foreach($nameServerArr as $zoneArr => $zone){
375       /* Strip eventually domain part from hostname
376        */
377       $zN = trim($zone,".");
378       $nN = trim($name,".");
379       if(preg_match("/".normalizePreg($zN)."$/",$nN)){
380         $nN = preg_replace("/[\.]*".normalizePreg($zN)."[\.]*$/","",$nN);
381       }else{
382         $nN = $name;
383       }
385                 $zoneMix = $nameServer."/".$zone;
386         $zoneDn = getDNSZoneDN($config,$zoneMix);
387         $ldap->ls("(&(objectClass=dNSZone)(zoneName=*)(relativeDomainName=".$nN.")(!(relativeDomainName=@)))", $zoneDn,$attrs = array("*"));
388         while($attrs = $ldap->fetch()){
389           $foundInTmp [$zoneMix] = $attrs['dn'];
390           $foundIn [$zoneMix] = $attrs['dn'];
391         }
392         }
393   }
395   /* No zone found which contains an entry for us
396    */
397   if(count($foundIn) == 0){
398     return($ret);
399   }
401   /* Get host informations from zone
402    */ 
403   $id_tmp = key($foundIn);
404   $ldap->cd($foundIn[$id_tmp]);
405   $ldap->search("(&(objectClass=dNSZone)(zoneName=*)(!(relativeDomainName=@)))",array("*"));
406   while($attrs = $ldap->fetch()){
408     /* Strip eventually domain part from hostname
409      */
410     $zN = trim($attrs['zoneName'][0],".");
411     $nN = trim($name,".");
412     $testname = $attrs['relativeDomainName'][0].".".$zN;
414     /* Check given host name with zone settings
415      */
416     if(preg_match("/".normalizePreg($testname)."[\.]*$/",$nN) || $attrs['relativeDomainName'][0] == $name){
417       $ret['exists'] = true;
418       $ret['zoneName'] = $id_tmp;
419       foreach(array("dNSClass","dNSTTL") as $atr){
420         if(isset($attrs[$atr][0])){
421           $ret[$atr] = $attrs[$atr][0];
422         }
423       }
424     }
426     /* Create list with all used records */
427     foreach($RecordTypes as $name => $value){
429       /* If there is a record attribute  */
430       if(isset($attrs[$name])){
432         /* get all entries */
433         for($i = 0 ; $i < $attrs[$value]['count']; $i ++){
434           $types[] = array( "type"    => $name,
435                             "value"   => $attrs[$value][$i]);
436         }
437       }
438     }
439     $ret['RECORDS'] = $types;
440   }
441   return($ret);
442 }  
446 /* This function compares two dns settings and returns an 
447  *  array with following indexes 
448  *   - delete, for dns which must be deleted (only if dns account is removed)
449  *   - rename, if a dn must be renamed, for example, the relativeDomainName has changed
450  *   - add,    if there is a new dns account created    
451  */
452 function getDNSHostEntriesDiff($config,$oldName,$newEntry,$newName)
454   global $RecordTypes;
456   $oldEntry = getDNSHostEntries($config,$oldName);
458   $add    = array();
459   $del    = array();
460   $move   = array();
462   $zones              = getAvailableZones($config);
463   $specialAttributes  = array("cNAMERecord","pTRRecord");
464   $newRecords         = array();  // Used to remember which records are removed 
465   $zoneNameMix           = $newEntry['zoneName'];
466   $zoneDn             = getDNSZoneDN($config,$zoneNameMix);
467   $tmp                = array_flip($zones);
468   $zoneName                                     = getNameFromMix($zoneNameMix);
470   /* Strip domain part out of dns host entry
471    */
472   $zN = trim($zoneName,".");
473   $nN = trim($newName,".");
474   $oN = trim($oldName,".");
475   $newName = preg_replace("/[\.]*".normalizePreg($zN)."$/i","",$nN);
476   $oldName = preg_replace("/[\.]*".normalizePreg($zN)."$/i","",$oN);
477  
478   /* If reverseZone can't be resolved ... this 
479    *  can't be a valid entry, so remove this account
480    */ 
481   if(isset($tmp[$zoneNameMix])){
482     $reverseNameMix  = $tmp[$zoneNameMix];
483     $reverseDn    = getDNSZoneDN($config,$reverseNameMix);
484     if(empty($reverseDn)){
485       $newEntry['exists'] = false;
486     }
487   }else{
488     $newEntry['exists'] = false;
489   }
491   /* Don't go further if there is nothing to do
492    * Is no account / was no account
493    */
494   if(($newEntry['exists'] == false )&& ($oldEntry['exists'] == false)){
495     return(array("move"=>$move,"add"=>$add,"del"=>$del));
496   }
497   
498   /* If account was edited prepare some
499    *  attributes & arrays ... if required add some 
500    *  dns to $move 
501    */
502   if($oldEntry['exists']){
504     /* Check if the account was removed 
505      */
506     if($newEntry['exists'] == false){
507       $dn = "relativeDomainName=".$oldName.",".getDNSZoneDN($config,$oldEntry['zoneName']);
508       $del[$dn] ="";
509       return(array("move"=>$move,"add"=>$add,"del"=>$del));
510     }
512     /* Check if zoneName has changed 
513      */   
514     if(count($newEntry['RECORDS'])){
515       if($oldEntry['zoneName'] != $newEntry['zoneName']){
516         $oldzoneDn = getDNSZoneDN($config,$oldEntry['zoneName']);
517         $dn = "relativeDomainName=".$oldName.",".$oldzoneDn;
518         $dn2= "relativeDomainName=".$oldName.",".$zoneDn;
519         $move[$dn]=$dn2;
520       }
522       /* Check if host name has changed 
523        */ 
524       if($oldName != $newName){
525         $dn = "relativeDomainName=".$oldName.",".$zoneDn;
526         $dn2= "relativeDomainName=".$newName.",".$zoneDn;
527         $move[$dn]=$dn2;
528         $dn = "relativeDomainName=".$oldName.",".$dn2;
529         $dn2= "relativeDomainName=".$newName.",".$dn2;
530         $move[$dn]=$dn2;
531       }
532     }
534     /* Prepare record entries
535      *  Fill old records with array();
536      *  To ensure that they will be deleted if they stay unused
537      */
538     foreach($oldEntry['RECORDS'] as $id => $rec){
539       $newRecords[$rec['type']] = array();
540     }
541   }
543   /* There must be at least one record in our entry  
544    */
545   if((!count($newEntry['RECORDS'])) || (!$newEntry['exists'])){
546     $dn = "relativeDomainName=".$newName.",".getDNSZoneDN($config,$oldEntry['zoneName']);
547     $del[$dn] ="";
548     $ret = array("move"=>$move,"add"=>$add,"del"=>$del);
549     return($ret);
550   }
552   /* Prepare temp obj
553    */
554   $baseObj =  array();
555   $baseObj['objectClass']       = array("top","dNSZone");
556   $baseObj['dNSTTL']            = $newEntry['dNSTTL'];
557   $baseObj['dNSClass']          = $newEntry['dNSClass'];
558   $baseObj['zoneName']          = $zoneName; 
559   $baseObj['relativeDomainName']= $newName; 
560     
561   /* Add Container Object to zone
562    *  (this possibly already exists, check this before writing to ldap)
563    */
564   $baseDn =  "relativeDomainName=".$newName.",".$zoneDn;
565   $add[$baseDn] = $baseObj;
567   /* Add base obejct which contains all std records
568    */
569   $stdDn = "relativeDomainName=".$newName.",".$baseDn;
570   $add[$stdDn] = $baseObj;
572   /* Set defaults. Normaly only contains old record names.
573    *  The old names will be set to array, to ensure that they will be deleted.
574    *  Or overwritten and filled with new values.
575    */
576   foreach($newRecords as $name => $def){
577     if(!in_array($name,$specialAttributes)){
578       $add[$stdDn][$name] = $def;
579     }
580   }
582   /* Delete all OLD special attributes.
583    */
584   foreach($oldEntry['RECORDS'] as $id => $rec){
585     if(in_array($rec['type'],$specialAttributes)){
586       $deldn= "relativeDomainName=".$rec['value'].",".$baseDn;
587       $del[$deldn] = "";
588     }
589   }
592   /* Create new record entries 
593    */
594   foreach($newEntry['RECORDS'] as $id => $rec){
595     /* Create object which contains special records 
596      *  like pTRRecord or CNAMERecord
597      */
598     if($rec['type']  == "pTRRecord"){
599       $PTRdn= "relativeDomainName=".FlipIP($rec['value']).",".$baseDn;
600       $ptrObj = $baseObj;
601       $reverseName = getNameFromMix($reverseNameMix);
602       $ptrObj['zoneName']           = $reverseName;
603       if(!preg_match("/\.$/",$newName)){
604         $ptrObj['pTRRecord']          = preg_replace("/\.\.$/",".",$newName.".".$zoneName.".");
605       }else{
606         $ptrObj['pTRRecord']          = preg_replace("/\.\.$/",".",$newName.".");
607       }
608       $ptrObj['relativeDomainName'] = FlipIP($rec['value']);
609     
610       $add[$PTRdn] = $ptrObj;
611     }else  
612     if($rec['type']  == "cNAMERecord"){
613       $PTRdn= "relativeDomainName=".$rec['value'].",".$baseDn;
614       $ptrObj = $baseObj;
615       $ptrObj['zoneName']           = $zoneName;
616       $ptrObj['cNAMERecord']        = $newName;
617       $ptrObj['relativeDomainName'] = $rec['value'];
618       
619       $add[$PTRdn] = $ptrObj;
620     }else{
621       /* Append basic attributes
622        */
623       $add[$stdDn][$rec['type']][] = $rec['value'];  
624     }
625   } // foreach record 
627   $ret = array("move"=>$move,"add"=>$add,"del"=>$del);
628   return($ret);
629
631 function getNameFromMix($zoneMix){
632         $ret = "";
633   if(!strstr($zoneMix, '/')) return($ret);      
634   $zoneIndex            = split("/",$zoneMix);
635   return($zoneIndex[1]);
638 /* returns the dn for a specified zone
639  */
640 function getDNSZoneDN($config,$zoneNameMix)
642   $ret = "";
643   if(!strstr($zoneNameMix, '/')) {
644     print_red(sprintf(_("Undefined zone name '%s'. Zone name must look like this 'server/zone.com'."),$zoneNameMix));
645     return($ret);
646   }
648   $zoneNameIndex                = split("/",$zoneNameMix); 
649   $zoneName           = $zoneNameIndex[1];
650   $nameServer                           = strtolower($zoneNameIndex[0]);
651   $ldap               = $config->get_ldap_link();
653   /* search for the nameserver */
654   $ldap-> cd($config->current['BASE']);
655   $ldap->search("(&(objectClass=goServer)(cn=".$nameServer."))",array("cn"));
656   if($ldap->count()){
657     $attr = $ldap->fetch();
658   } else {
659     return($ret);
660   }
661   
662   $ldap-> cd($attr['dn']);
663   $ldap->search("(&(objectClass=dNSZone)(sOARecord=*)(zoneName=".$zoneName."))",array("zoneName"));
664   if($ldap->count()){
665     $attr = $ldap->fetch();
666     return($attr['dn']);
667   }
668   
669   return($ret);
673 /* returns all available zones 
674  *  array[reverseName] = zoneName;
675  */
676 function getAvailableZones($config)
678   $ret = array();
679   $ldap = $config->get_ldap_link();
680   $ldap->cd ($config->current['BASE']);
682   /* Search for zones ...
683    */
684   $ldap->search("(&(objectClass=dNSZone)(sOARecord=*))",array("zoneName"));
686   $ForwardZones = array();
687   $ReverseZones = array();
688   $zones = array();
690   while($at = $ldap->fetch()){
691     if(preg_match("/\.in\-addr\.arpa/",$at['zoneName'][0])){
692       $ReverseZones[$at['dn']] = $at;
693     }else{
694       $ForwardZones[$at['dn']] = $at;
695     }
696   }
698   foreach($ForwardZones as $dn => $obj){
699     
700     /* try to find reverse
701      */  
702     foreach($ReverseZones as $Rdn => $Robj ){
703       if(preg_match("/".$dn."/",$Rdn)){
704         $zones[strtoupper($ldap->getCn($dn))."/".$Robj['zoneName'][0]] =  
705                         strtoupper($ldap->getCn($dn))."/".$obj['zoneName'][0];
706       }
707     }   
708   }
709   return($zones);
712 // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler:
713 ?>