X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=include%2Ffunctions_dns.inc;h=f24ec32473c67c3d1415e0ff87a0bdffc832efa6;hb=2a57ce5c805f18c400cff1d6083de54e078c02ee;hp=1eeba0c359f2dd7ab00bb277ed32162e8b8f42bb;hpb=1eda8869e7b21b04d62ffe3c2d3c1a2998269b79;p=gosa.git diff --git a/include/functions_dns.inc b/include/functions_dns.inc index 1eeba0c35..f24ec3247 100644 --- a/include/functions_dns.inc +++ b/include/functions_dns.inc @@ -349,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 @@ -371,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()){ @@ -380,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]; } @@ -423,19 +434,27 @@ function getDNSHostEntriesDiff($config,$oldName,$newEntry,$newName) $del = array(); $move = array(); + /* 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); + $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[$zoneName])){ - $reverseName = $tmp[$zoneName]; - $reverseDn = getDNSZoneDN($config,$reverseName); + if(isset($tmp[$zoneNameMix])){ + $reverseNameMix = $tmp[$zoneNameMix]; + $reverseDn = getDNSZoneDN($config,$reverseNameMix); if(empty($reverseDn)){ $newEntry['exists'] = false; } @@ -443,13 +462,6 @@ function getDNSHostEntriesDiff($config,$oldName,$newEntry,$newName) $newEntry['exists'] = false; } - /* 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)); - } - /* If account was edited prepare some * attributes & arrays ... if required add some * dns to $move @@ -553,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; @@ -578,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); } @@ -625,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); }