X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=include%2Ffunctions_dns.inc;h=f24ec32473c67c3d1415e0ff87a0bdffc832efa6;hb=2a57ce5c805f18c400cff1d6083de54e078c02ee;hp=21f4fe60541445810b09db8205d8cb7ef31c5731;hpb=b5c65d4a29ec0363af4de3f23079f362185fb075;p=gosa.git diff --git a/include/functions_dns.inc b/include/functions_dns.inc index 21f4fe605..f24ec3247 100644 --- a/include/functions_dns.inc +++ b/include/functions_dns.inc @@ -28,6 +28,7 @@ $RecordTypes['sSHFPRecord'] = "sSHFPRecord"; $RecordTypes['rRSIGRecord'] = "rRSIGRecord"; $RecordTypes['nSECRecord'] = "nSECRecord"; + /* Return all record types */ function getDnsRecordTypes($ForZones = false) @@ -45,9 +46,9 @@ function getDnsRecordTypes($ForZones = false) } -/* this is used to flip the ip address for example - 12.3.45 -> 54.3.12 - Because some entries (like zones) are store like that 54.3.12.in-addr.arpa +/* This fucntion is used to flip the ip address, for example + 12.3.45 -> 45.3.12 + Because some entries (like zones) are store like that 45.3.12.in-addr.arpa but we want to display 12.3.45. */ function FlipIp($ip) @@ -65,13 +66,12 @@ function FlipIp($ip) */ function getDNSZoneEntries($config,$HostDn,$silent = false) { - global $RecordTypes; $ldap = $config->get_ldap_link(); $ldap->cd($config->current['BASE']); - /* Not all records are allowen within a zone entry + /* Not all records are allowed within a zone entry */ $SkipRecords = array("tXTRecord","cNAMERecord","pTRRecord"); @@ -105,7 +105,7 @@ function getDNSZoneEntries($config,$HostDn,$silent = false) */ foreach($tmp_res as $attrs){ - $zoneName = $attrs['zoneName'][0]; + $zoneName = $attrs['zoneName'][0]; $Zones[$zoneName] = $ZoneBase; $Zones[$zoneName]['exists'] = true; @@ -117,7 +117,7 @@ function getDNSZoneEntries($config,$HostDn,$silent = false) } } - /* Set initial zone name, to be able to detect if this entry is renamed + /* Set initial zone name, to be able to detect if this entry was renamed */ $Zones[$zoneName]['InitialzoneName'] = $zoneName; @@ -173,7 +173,7 @@ function getDNSZoneEntries($config,$HostDn,$silent = false) unset($Zones[$zoneName]); }else{ $tmp = $ldap->fetch(); - $Zones[$zoneName]['ReverseZone'] = FlipIp(str_replace(".in-addr.arpa","",$tmp['zoneName'][0])); + $Zones[$zoneName]['ReverseZone'] = FlipIp(str_replace(".in-addr.arpa","",$tmp['zoneName'][0])); $Zones[$zoneName]['InitialReverseZone'] = FlipIp(str_replace(".in-addr.arpa","",$tmp['zoneName'][0])); } } @@ -206,6 +206,9 @@ function getDNSZoneEntriesDiff($config,$newZones,$HostDn) $zoneBase['dNSClass'] = "IN"; $zoneBase['sOARecord'] = ""; + /* Contains all renamed zoneNames + * For zone entry udpdates + */ $PrePareZoneEntries = array(); /* Walk through all zones and detect renamed/added/deleted zones ... @@ -227,7 +230,7 @@ function getDNSZoneEntriesDiff($config,$newZones,$HostDn) /* Get old zone if available */ $oldZone=array(); - if(isset($oldZones[$zone['InitialzoneName']])){ + if(!empty($oldZones[$zone['InitialzoneName']])){ $oldZone = $oldZones[$zone['InitialzoneName']]; } @@ -296,7 +299,7 @@ function getDNSZoneEntriesDiff($config,$newZones,$HostDn) } /* The rest of our oldZones must be deleted - * because they wern't available in newZones anymore. + * because they are no longer available in newZones anymore. */ foreach($oldZones as $zone) { $oldDn = "zoneName=".$zone['InitialzoneName'].",".$HostDn; @@ -346,18 +349,27 @@ function getDNSHostEntries($config,$name,$silent = false) */ $foundIn = array(); $zones = getAvailableZones($config); - foreach($zones as $zone){ - $zoneDn = getDNSZoneDN($config,$zone); - $ldap->ls("(&(objectClass=dNSZone)(zoneName=*)(relativeDomainName=".$name.")(!(relativeDomainName=@)))", $zoneDn,$attrs = array("*")); - while($attrs = $ldap->fetch()){ - $foundIn [] = $attrs['dn']; + + $zonesArr = array(); + foreach($zones as $zoneMix){ + $zoneIndex = split("/",$zoneMix); + if(!array_key_exists($zoneIndex[0],$zonesArr)) { + $zonesArr[$zoneIndex[0]] = array(); } + array_push($zonesArr[$zoneIndex[0]],$zoneIndex[1]); } - - /* Alert if there is more than one zone with an entry named like $name - */ - if((count($foundIn) > 1) && (!$silent)) { - print_red(sprintf(_("Found more than one dns zone which contains an entry named '%s'. Aborting getting dns informations for this device."),$name)); + + foreach($zonesArr as $nameServer => $nameServerArr){ + $foundInTmp = array(); + foreach($nameServerArr as $zoneArr => $zone){ + $zoneMix = $nameServer."/".$zone; + $zoneDn = getDNSZoneDN($config,$zoneMix); + $ldap->ls("(&(objectClass=dNSZone)(zoneName=*)(relativeDomainName=".$name.")(!(relativeDomainName=@)))", $zoneDn,$attrs = array("*")); + while($attrs = $ldap->fetch()){ + $foundInTmp [$zoneMix] = $attrs['dn']; + $foundIn [$zoneMix] = $attrs['dn']; + } + } } /* No zone found which contains an entry for us @@ -368,7 +380,8 @@ function getDNSHostEntries($config,$name,$silent = false) /* Get host informations from zone */ - $ldap->cd($foundIn[0]); + $id_tmp = key($foundIn); + $ldap->cd($foundIn[$id_tmp]); $ldap->search("(&(objectClass=dNSZone)(zoneName=*)(!(relativeDomainName=@)))",array("*")); while($attrs = $ldap->fetch()){ @@ -377,7 +390,8 @@ function getDNSHostEntries($config,$name,$silent = false) */ if($attrs['relativeDomainName'][0] == $name){ $ret['exists'] = true; - foreach(array("dNSClass","zoneName","dNSTTL") as $atr){ + $ret['zoneName'] = $id_tmp; + foreach(array("dNSClass","dNSTTL") as $atr){ if(isset($attrs[$atr][0])){ $ret[$atr] = $attrs[$atr][0]; } @@ -420,30 +434,34 @@ function getDNSHostEntriesDiff($config,$oldName,$newEntry,$newName) $del = array(); $move = array(); - $zones = getAvailableZones($config); + /* Don't go further if there is nothing to do + * Is no account / was no account + */ + if(($newEntry['exists'] == false )&& ($oldEntry['exists'] == false)){ + return(array("move"=>$move,"add"=>$add,"del"=>$del)); + } + $zones = getAvailableZones($config); $specialAttributes = array("cNAMERecord","pTRRecord"); - $newRecords = array(); // Used to remember which records are removed - - $zoneName = $newEntry['zoneName']; - $zoneDn = getDNSZoneDN($config,$zoneName); - - $tmp = array_flip($zones); - - if(isset($tmp[$zoneName])){ - $reverseName = $tmp[$zoneName]; - $reverseDn = getDNSZoneDN($config,$reverseName); + $zoneNameMix = $newEntry['zoneName']; + $zoneDn = getDNSZoneDN($config,$zoneNameMix); + $tmp = array_flip($zones); + $zoneName = getNameFromMix($zoneNameMix); + + /* If reverseZone can't be resolved ... this + * can't be a valid entry, so remove this account + */ + if(isset($tmp[$zoneNameMix])){ + $reverseNameMix = $tmp[$zoneNameMix]; + $reverseDn = getDNSZoneDN($config,$reverseNameMix); + if(empty($reverseDn)){ + $newEntry['exists'] = false; + } }else{ $newEntry['exists'] = false; } - /* Don't go further if there is nothing to do - */ - if(($newEntry['exists'] == false )&& ($oldEntry['exists'] == false)){ - return(array("move"=>$move,"add"=>$add,"del"=>$del)); - } - /* If account was edited prepare some * attributes & arrays ... if required add some * dns to $move @@ -460,36 +478,39 @@ function getDNSHostEntriesDiff($config,$oldName,$newEntry,$newName) /* Check if zoneName has changed */ - if($oldEntry['zoneName'] != $newEntry['zoneName']){ - $oldzoneDn = getDNSZoneDN($config,$oldEntry['zoneName']); - $dn = "relativeDomainName=".$oldName.",".$oldzoneDn; - $dn2= "relativeDomainName=".$oldName.",".$zoneDn; - $move[$dn]=$dn2; - } + if(count($newEntry['RECORDS'])){ + if($oldEntry['zoneName'] != $newEntry['zoneName']){ + $oldzoneDn = getDNSZoneDN($config,$oldEntry['zoneName']); + $dn = "relativeDomainName=".$oldName.",".$oldzoneDn; + $dn2= "relativeDomainName=".$oldName.",".$zoneDn; + $move[$dn]=$dn2; + } - /* Check if host name has changed - */ - if($oldName != $newName){ - $dn = "relativeDomainName=".$oldName.",".$zoneDn; - $dn2= "relativeDomainName=".$newName.",".$zoneDn; - $move[$dn]=$dn2; - $dn = "relativeDomainName=".$oldName.",".$dn2; - $dn2= "relativeDomainName=".$newName.",".$dn2; - $move[$dn]=$dn2; + /* Check if host name has changed + */ + if($oldName != $newName){ + $dn = "relativeDomainName=".$oldName.",".$zoneDn; + $dn2= "relativeDomainName=".$newName.",".$zoneDn; + $move[$dn]=$dn2; + $dn = "relativeDomainName=".$oldName.",".$dn2; + $dn2= "relativeDomainName=".$newName.",".$dn2; + $move[$dn]=$dn2; + } } - - /* Prepare record entries - */ + + /* Prepare record entries + * Fill old records with array(); + * To ensure that they will be deleted if they stay unused + */ foreach($oldEntry['RECORDS'] as $id => $rec){ $newRecords[$rec['type']] = array(); } } - /* There must be at least one record in our entry */ if((!count($newEntry['RECORDS'])) || (!$newEntry['exists'])){ - $dn = "relativeDomainName=".$oldName.",".getDNSZoneDN($config,$oldEntry['zoneName']); + $dn = "relativeDomainName=".$newName.",".getDNSZoneDN($config,$oldEntry['zoneName']); $del[$dn] =""; $ret = array("move"=>$move,"add"=>$add,"del"=>$del); return($ret); @@ -544,17 +565,18 @@ function getDNSHostEntriesDiff($config,$oldName,$newEntry,$newName) if($rec['type'] == "pTRRecord"){ $PTRdn= "relativeDomainName=".$rec['value'].",".$baseDn; $ptrObj = $baseObj; + $reverseName = getNameFromMix($reverseNameMix); $ptrObj['zoneName'] = $reverseName; - $ptrObj['pTRRecord'] = $newName.".".$zoneName; + $ptrObj['pTRRecord'] = $newName.".".$zoneName."."; $ptrObj['relativeDomainName'] = $rec['value']; - + $add[$PTRdn] = $ptrObj; }else if($rec['type'] == "cNAMERecord"){ $PTRdn= "relativeDomainName=".$rec['value'].",".$baseDn; $ptrObj = $baseObj; - $ptrObj['zoneName'] = $reverseName; - $ptrObj['cNAMERecord'] = $newName.".".$zoneName; + $ptrObj['zoneName'] = $zoneName; + $ptrObj['cNAMERecord'] = $newName; $ptrObj['relativeDomainName'] = $rec['value']; $add[$PTRdn] = $ptrObj; @@ -569,18 +591,44 @@ function getDNSHostEntriesDiff($config,$oldName,$newEntry,$newName) return($ret); } +function getNameFromMix($zoneMix){ + $ret = ""; + if(!strstr($zoneMix, '/')) return($ret); + $zoneIndex = split("/",$zoneMix); + return($zoneIndex[1]); +} /* returns the dn for a specified zone */ -function getDNSZoneDN($config,$zoneName){ +function getDNSZoneDN($config,$zoneNameMix) +{ $ret = ""; - $ldap = $config->get_ldap_link(); + if(!strstr($zoneNameMix, '/')) { + print_red(sprintf(_("Undefined zone name '%s'. Zone name must look like this 'server/zone.com'."),$zoneNameMix)); + return($ret); + } + + $zoneNameIndex = split("/",$zoneNameMix); + $zoneName = $zoneNameIndex[1]; + $nameServer = strtolower($zoneNameIndex[0]); + $ldap = $config->get_ldap_link(); + + /* search for the nameserver */ $ldap-> cd($config->current['BASE']); + $ldap->search("(&(objectClass=goServer)(cn=".$nameServer."))",array("cn")); + if($ldap->count()){ + $attr = $ldap->fetch(); + } else { + return($ret); + } + + $ldap-> cd($attr['dn']); $ldap->search("(&(objectClass=dNSZone)(sOARecord=*)(zoneName=".$zoneName."))",array("zoneName")); if($ldap->count()){ $attr = $ldap->fetch(); return($attr['dn']); } + return($ret); } @@ -594,8 +642,6 @@ function getAvailableZones($config) $ldap = $config->get_ldap_link(); $ldap->cd ($config->current['BASE']); - restore_error_handler(); - /* Search for zones ... */ $ldap->search("(&(objectClass=dNSZone)(sOARecord=*))",array("zoneName")); @@ -618,9 +664,10 @@ function getAvailableZones($config) */ foreach($ReverseZones as $Rdn => $Robj ){ if(preg_match("/".$dn."/",$Rdn)){ - $zones[$Robj['zoneName'][0]] = $obj['zoneName'][0]; + $zones[strtoupper($ldap->getCn($dn))."/".$Robj['zoneName'][0]] = + strtoupper($ldap->getCn($dn))."/".$obj['zoneName'][0]; } - } + } } return($zones); }