index 21f4fe60541445810b09db8205d8cb7ef31c5731..7ce7c33efc056d19ae9ff4e64543f95d6e317744 100644 (file)
$RecordTypes['rRSIGRecord'] = "rRSIGRecord";
$RecordTypes['nSECRecord'] = "nSECRecord";
$RecordTypes['rRSIGRecord'] = "rRSIGRecord";
$RecordTypes['nSECRecord'] = "nSECRecord";
+
/* Return all record types
*/
function getDnsRecordTypes($ForZones = false)
/* Return all record types
*/
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)
but we want to display 12.3.45.
*/
function FlipIp($ip)
*/
function getDNSZoneEntries($config,$HostDn,$silent = false)
{
*/
function getDNSZoneEntries($config,$HostDn,$silent = false)
{
-
global $RecordTypes;
$ldap = $config->get_ldap_link();
$ldap->cd($config->current['BASE']);
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");
*/
$SkipRecords = array("tXTRecord","cNAMERecord","pTRRecord");
*/
foreach($tmp_res as $attrs){
*/
foreach($tmp_res as $attrs){
- $zoneName = $attrs['zoneName'][0];
+ $zoneName = $attrs['zoneName'][0];
$Zones[$zoneName] = $ZoneBase;
$Zones[$zoneName]['exists'] = true;
$Zones[$zoneName] = $ZoneBase;
$Zones[$zoneName]['exists'] = true;
}
}
}
}
- /* 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;
*/
$Zones[$zoneName]['InitialzoneName'] = $zoneName;
unset($Zones[$zoneName]);
}else{
$tmp = $ldap->fetch();
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]));
}
}
$Zones[$zoneName]['InitialReverseZone'] = FlipIp(str_replace(".in-addr.arpa","",$tmp['zoneName'][0]));
}
}
$zoneBase['dNSClass'] = "IN";
$zoneBase['sOARecord'] = "";
$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 ...
$PrePareZoneEntries = array();
/* Walk through all zones and detect renamed/added/deleted zones ...
/* Get old zone if available
*/
$oldZone=array();
/* Get old zone if available
*/
$oldZone=array();
- if(isset($oldZones[$zone['InitialzoneName']])){
+ if(!empty($oldZones[$zone['InitialzoneName']])){
$oldZone = $oldZones[$zone['InitialzoneName']];
}
$oldZone = $oldZones[$zone['InitialzoneName']];
}
$soa.=" ".$zone[$attr];
}
$obj['sOARecord'] = trim($soa);
$soa.=" ".$zone[$attr];
}
$obj['sOARecord'] = trim($soa);
+ $obj['nSRecord'] = $zone['sOAprimary'];
/* If reverse zone was renamed, move entry
*/
/* If reverse zone was renamed, move entry
*/
/* Add new Records
*/
foreach($zone['RECORDS'] as $rec){
/* 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'];
}
$obj[$rec['type']][] = $rec['value'];
}
}
/* The rest of our oldZones must be deleted
}
/* 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;
*/
foreach($oldZones as $zone) {
$oldDn = "zoneName=".$zone['InitialzoneName'].",".$HostDn;
- $del[$oldDn] = "";
+ $del[$oldDn] = $zone;
}
/* Check for entries which must be updated
}
/* Check for entries which must be updated
*/
$foundIn = array();
$zones = getAvailableZones($config);
*/
$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
}
/* No zone found which contains an entry for us
/* Get host informations from zone
*/
/* 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()){
$ldap->search("(&(objectClass=dNSZone)(zoneName=*)(!(relativeDomainName=@)))",array("*"));
while($attrs = $ldap->fetch()){
*/
if($attrs['relativeDomainName'][0] == $name){
$ret['exists'] = true;
*/
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];
}
if(isset($attrs[$atr][0])){
$ret[$atr] = $attrs[$atr][0];
}
$del = array();
$move = array();
$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");
$specialAttributes = array("cNAMERecord","pTRRecord");
-
$newRecords = array(); // Used to remember which records are removed
$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;
}
}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
/* If account was edited prepare some
* attributes & arrays ... if required add some
* dns to $move
/* Check if zoneName has changed
*/
/* 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();
}
}
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'])){
/* 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);
$del[$dn] ="";
$ret = array("move"=>$move,"add"=>$add,"del"=>$del);
return($ret);
* like pTRRecord or CNAMERecord
*/
if($rec['type'] == "pTRRecord"){
* like pTRRecord or CNAMERecord
*/
if($rec['type'] == "pTRRecord"){
- $PTRdn= "relativeDomainName=".$rec['value'].",".$baseDn;
+ $PTRdn= "relativeDomainName=".FlipIP($rec['value']).",".$baseDn;
$ptrObj = $baseObj;
$ptrObj = $baseObj;
+ $reverseName = getNameFromMix($reverseNameMix);
$ptrObj['zoneName'] = $reverseName;
$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
if($rec['type'] == "cNAMERecord"){
$PTRdn= "relativeDomainName=".$rec['value'].",".$baseDn;
$ptrObj = $baseObj;
$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;
$ptrObj['relativeDomainName'] = $rec['value'];
$add[$PTRdn] = $ptrObj;
return($ret);
}
return($ret);
}
+function getNameFromMix($zoneMix){
+ $ret = "";
+ if(!strstr($zoneMix, '/')) return($ret);
+ $zoneIndex = split("/",$zoneMix);
+ return($zoneIndex[1]);
+}
/* returns the dn for a specified zone
*/
/* returns the dn for a specified zone
*/
-function getDNSZoneDN($config,$zoneName){
+function getDNSZoneDN($config,$zoneNameMix)
+{
$ret = "";
$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-> 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']);
}
$ldap->search("(&(objectClass=dNSZone)(sOARecord=*)(zoneName=".$zoneName."))",array("zoneName"));
if($ldap->count()){
$attr = $ldap->fetch();
return($attr['dn']);
}
+
return($ret);
}
return($ret);
}
$ldap = $config->get_ldap_link();
$ldap->cd ($config->current['BASE']);
$ldap = $config->get_ldap_link();
$ldap->cd ($config->current['BASE']);
- restore_error_handler();
-
/* Search for zones ...
*/
$ldap->search("(&(objectClass=dNSZone)(sOARecord=*))",array("zoneName"));
/* Search for zones ...
*/
$ldap->search("(&(objectClass=dNSZone)(sOARecord=*))",array("zoneName"));
*/
foreach($ReverseZones as $Rdn => $Robj ){
if(preg_match("/".$dn."/",$Rdn)){
*/
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);
}
}
return($zones);
}