Code

Do not remove invalid user accounts.
[gosa.git] / include / functions_dns.inc
index b8346e26c19b82cf77fbb28a6e6dd51911765253..d300589d76d39bd34866e486fc7f1fe35c9e0c70 100644 (file)
@@ -217,7 +217,7 @@ function getDNSZoneEntriesDiff($config,$newZones,$HostDn)
   /* Walk through all zones and detect renamed/added/deleted zones ... 
    */
   foreach($newZones as $name => $zone){
-    
+   
     /* This zone was renamed 
      */
     if((!empty($zone['InitialzoneName'])) && ($zone['InitialzoneName'] != $zone['zoneName'])){
@@ -226,7 +226,7 @@ function getDNSZoneEntriesDiff($config,$newZones,$HostDn)
        */ 
       $oldDn = "zoneName=".getNameFromMix($zone['InitialzoneName']).",".$HostDn;
       $newDn = "zoneName=".getNameFromMix($zone['zoneName']).",".$HostDn;
-      $PrePareZoneEntries[$zone['InitialzoneName']] = getNameFromMix($zone['zoneName']);
+      $PrePareZoneEntries[getNameFromMix($zone['InitialzoneName'])] = getNameFromMix($zone['zoneName']);
       $move [$oldDn] = $newDn;      
     }
 
@@ -250,6 +250,7 @@ function getDNSZoneEntriesDiff($config,$newZones,$HostDn)
       $soa.=" ".$zone[$attr];
     }  
     $obj['sOARecord'] = trim($soa);
+    $obj['nSRecord'] = $zone['sOAprimary'];
 
     /* If reverse zone was renamed, move entry 
      */
@@ -258,7 +259,7 @@ function getDNSZoneEntriesDiff($config,$newZones,$HostDn)
         $base = "zoneName=".getNameFromMix($zone['zoneName']).",".$HostDn;
         $oldRDn = "zoneName=". FlipIp(getNameFromMix($zone['InitialReverseZone'])).".in-addr.arpa,".$base; 
         $newRDn = "zoneName=". FlipIp(getNameFromMix($zone['ReverseZone'])).".in-addr.arpa,".$base;
-        $PrePareZoneEntries[FlipIp($zone['InitialReverseZone']).".in-addr.arpa"] = FlipIp($zone['ReverseZone']).".in-addr.arpa";
+        $PrePareZoneEntries[FlipIp(getNameFromMix($zone['InitialReverseZone'])).".in-addr.arpa"] = FlipIp(getNameFromMix($zone['ReverseZone'])).".in-addr.arpa";
         $move [$oldRDn] = $newRDn;
       }
     }
@@ -276,6 +277,9 @@ function getDNSZoneEntriesDiff($config,$newZones,$HostDn)
     /* Add new Records 
      */
     foreach($zone['RECORDS'] as $rec){
+      if(!isset($obj[$rec['type']])||!is_array($obj[$rec['type']])){
+        $obj[$rec['type']] = array();
+      }
       $obj[$rec['type']][] = $rec['value'];
     }
 
@@ -306,7 +310,7 @@ function getDNSZoneEntriesDiff($config,$newZones,$HostDn)
    */
   foreach($oldZones as $zone)  {
     $oldDn = "zoneName=".getNameFromMix($zone['InitialzoneName']).",".$HostDn;
-    $del[$oldDn] = "";
+    $del[$oldDn] = $zone;
   }
 
   /* Check for entries which must be updated 
@@ -315,15 +319,17 @@ function getDNSZoneEntriesDiff($config,$newZones,$HostDn)
   $udpate = array();
   if(count($PrePareZoneEntries)){
     $ldap = $config->get_ldap_link();
+
     foreach($PrePareZoneEntries as $FromZoneName => $ToZoneName){
       $ldap->cd($HostDn);
-      $ldap->search("(&(objectClass=dNSZone)(zoneName=".getNameFromMix($FromZoneName).")(!(relativeDomainName=@)))",array("zoneName"));
+      $ldap->search("(&(objectClass=dNSZone)(zoneName=".$FromZoneName.")(!(relativeDomainName=@)))",array("zoneName"));
       while($attrs = $ldap->fetch()){
-        $zoneUpdates[$attrs['dn']] = array("zoneName"=>$ToZoneName);
+        $attr_to_change = array();
+        $attr_to_change['zoneName'] = $ToZoneName;
+        $zoneUpdates[$attrs['dn']] = $attr_to_change;
       }
     }
   }
-
   $ret = array("del" => $del , "move" => $move , "add" => $add,"zoneUpdates"=>$zoneUpdates);
   return($ret);
 }
@@ -365,9 +371,20 @@ function getDNSHostEntries($config,$name,$silent = false)
   foreach($zonesArr as $nameServer => $nameServerArr){
        $foundInTmp = array();
        foreach($nameServerArr as $zoneArr => $zone){
+
+      /* Strip eventually domain part from hostname
+       */
+      $zN = trim($zone,".");
+      $nN = trim($name,".");
+      if(preg_match("/".normalizePreg($zN)."$/",$nN)){
+        $nN = preg_replace("/[\.]*".normalizePreg($zN)."[\.]*$/","",$nN);
+      }else{
+        $nN = $name;
+      }
+
                $zoneMix = $nameServer."/".$zone;
        $zoneDn = getDNSZoneDN($config,$zoneMix);
-       $ldap->ls("(&(objectClass=dNSZone)(zoneName=*)(relativeDomainName=".$name.")(!(relativeDomainName=@)))", $zoneDn,$attrs = array("*"));
+       $ldap->ls("(&(objectClass=dNSZone)(zoneName=*)(relativeDomainName=".$nN.")(!(relativeDomainName=@)))", $zoneDn,$attrs = array("*"));
        while($attrs = $ldap->fetch()){
          $foundInTmp [$zoneMix] = $attrs['dn'];
          $foundIn [$zoneMix] = $attrs['dn'];
@@ -388,10 +405,15 @@ function getDNSHostEntries($config,$name,$silent = false)
   $ldap->search("(&(objectClass=dNSZone)(zoneName=*)(!(relativeDomainName=@)))",array("*"));
   while($attrs = $ldap->fetch()){
 
-    /* If relative domainname == cn
-     * Try to read dnsclass / TTl / zone
+    /* Strip eventually domain part from hostname
+     */
+    $zN = trim($attrs['zoneName'][0],".");
+    $nN = trim($name,".");
+    $testname = $attrs['relativeDomainName'][0].".".$zN;
+
+    /* Check given host name with zone settings
      */
-    if($attrs['relativeDomainName'][0] == $name){
+    if(preg_match("/".normalizePreg($testname)."[\.]*$/",$nN) || $attrs['relativeDomainName'][0] == $name){
       $ret['exists'] = true;
       $ret['zoneName'] = $id_tmp;
       foreach(array("dNSClass","dNSTTL") as $atr){
@@ -444,6 +466,14 @@ function getDNSHostEntriesDiff($config,$oldName,$newEntry,$newName)
   $zoneDn             = getDNSZoneDN($config,$zoneNameMix);
   $tmp                = array_flip($zones);
   $zoneName                                    = getNameFromMix($zoneNameMix);
+
+  /* Strip domain part out of dns host entry
+   */
+  $zN = trim($zoneName,".");
+  $nN = trim($newName,".");
+  $oN = trim($oldName,".");
+  $newName = preg_replace("/[\.]*".normalizePreg($zN)."$/i","",$nN);
+  $oldName = preg_replace("/[\.]*".normalizePreg($zN)."$/i","",$oN);
  
   /* If reverseZone can't be resolved ... this 
    *  can't be a valid entry, so remove this account
@@ -566,12 +596,16 @@ function getDNSHostEntriesDiff($config,$oldName,$newEntry,$newName)
      *  like pTRRecord or CNAMERecord
      */
     if($rec['type']  == "pTRRecord"){
-      $PTRdn= "relativeDomainName=".$rec['value'].",".$baseDn;
+      $PTRdn= "relativeDomainName=".FlipIP($rec['value']).",".$baseDn;
       $ptrObj = $baseObj;
       $reverseName = getNameFromMix($reverseNameMix);
       $ptrObj['zoneName']           = $reverseName;
-      $ptrObj['pTRRecord']          = $newName.".".$zoneName.".";
-      $ptrObj['relativeDomainName'] = $rec['value'];
+      if(!preg_match("/\.$/",$newName)){
+        $ptrObj['pTRRecord']          = preg_replace("/\.\.$/",".",$newName.".".$zoneName.".");
+      }else{
+        $ptrObj['pTRRecord']          = preg_replace("/\.\.$/",".",$newName.".");
+      }
+      $ptrObj['relativeDomainName'] = FlipIP($rec['value']);
     
       $add[$PTRdn] = $ptrObj;
     }else