From 8973f6b93a0475b1f0167c440fdc63bc04c02f59 Mon Sep 17 00:00:00 2001 From: hickert Date: Thu, 30 Mar 2006 05:07:05 +0000 Subject: [PATCH] New term dns functionality more readable. Excluded some funtionality to functions_dns.inc git-svn-id: https://oss.gonicus.de/repositories/gosa/trunk@2928 594d385d-05f5-0310-b6e9-bd551577e9d8 --- plugins/admin/systems/class_termDNS.inc | 501 +++++++----------------- 1 file changed, 141 insertions(+), 360 deletions(-) diff --git a/plugins/admin/systems/class_termDNS.inc b/plugins/admin/systems/class_termDNS.inc index 9ec385ffb..4439e903d 100644 --- a/plugins/admin/systems/class_termDNS.inc +++ b/plugins/admin/systems/class_termDNS.inc @@ -3,156 +3,95 @@ class termDNS extends plugin { /* CLI vars */ - var $cli_summary= "Manage server basic objects"; - var $cli_description= "Some longer text\nfor help"; - var $cli_parameters= array("eins" => "Eins ist toll", "zwei" => "Zwei ist noch besser"); + var $cli_summary = "Manage server basic objects"; + var $cli_description = "Some longer text\nfor help"; + var $cli_parameters = array("eins" => "Eins ist toll", "zwei" => "Zwei ist noch besser"); /* attribute list for save action */ - var $ignore_account= TRUE; - var $DNSattributes = array("dNSClass","zoneName","dNSTTL"); - var $attributes= array("ipHostNumber","macAddress"); - var $objectclasses= array("whatever"); + var $ignore_account = TRUE; - var $ipHostNumber =""; // IP address - var $macAddress =""; // Mac address - var $cn =""; // CN of currently edited device + /* Basic informations + */ + var $attributes = array("ipHostNumber","macAddress"); + var $objectclasses = array("whatever"); - var $Zones = array(); // All Available Zones like array("3.2.1"=>"MyServer.de") - var $RecordTypes= array(); // Possible record types - - var $dNSClass = "IN"; // dNSClass name - var $zoneName = ""; // Used ZoneName - var $dNSTTL = 7200; // TTL settings for the created entries + var $ipHostNumber = ""; // IP address + var $macAddress = ""; // Mac address + var $cn = ""; // CN of currently edited device + var $OrigCn = ""; // Initial cn + var $IPisMust = false; + var $MACisMust = false; - /* Used records */ - var $types = array(); + /* DNS attributes + */ + var $DNSattributes = array("dNSClass","zoneName","dNSTTL"); + var $DNS_is_Account = false; var $DNSinitially_was_account = false; + var $dnsEntry = array(); + var $DNSenabled = false; - var $orig_dn =""; - - var $IPisMust = false; - var $MACisMust= false; - - var $found = false; - + /* Terminal dns + */ function termDNS ($config, $dn,$objectClasses,$IPisMust = false) { - /* We need to know which objectClasses are used, to store the ip/mac*/ - $this->objectclasses= $objectClasses; + /* We need to know which objectClasses are used, to store the ip/mac + * Because of different type of devices + */ + $this->objectclasses = $objectClasses; + $this->IPisMust = $IPisMust; + plugin::plugin ($config, $dn); - $this->orig_dn= $dn; - - $this->IPisMust = $IPisMust; + $this->OrigCn = $this->attrs['cn'][0]; + /* Hide all dns specific code, if dns is not available */ - $found = false; + $DNSenabled = false; foreach($this->config->data['TABS']['SERVTABS'] as $tab){ if(preg_match("/^servdns$/",$tab['CLASS'])){ - $found = true; + $this->DNSenabled = true; } } - $this->found = $found; - if(!$this->found){ + if(!$this->DNSenabled){ $this->DNS_is_account = false; return; } - - /* All types with required attrs */ - $this->RecordTypes['aRecord'] = "aRecord"; // ok - $this->RecordTypes['mDRecord'] = "mDRecord"; // ok - $this->RecordTypes['mXRecord'] = "mXRecord"; // ok - $this->RecordTypes['nSRecord'] = "nSRecord"; // ok - $this->RecordTypes['pTRRecord'] = "relativeDomainName";// ok - $this->RecordTypes['hInfoRecord'] = "hInfoRecord"; // ok - $this->RecordTypes['mInfoRecord'] = "mInfoRecord"; // ok - $this->RecordTypes['cNAMERecord'] = "relativeDomainName";// ok - $this->RecordTypes['tXTRecord'] = "tXTRecord"; // ok - $this->RecordTypes['aFSDBRecord'] = "aFSDBRecord"; // ok - $this->RecordTypes['SigRecord'] = "SigRecord"; // ok - $this->RecordTypes['KeyRecord'] = "KeyRecord"; // ok - $this->RecordTypes['aAAARecord'] = "aAAARecord"; // ok - $this->RecordTypes['LocRecord'] = "LocRecord"; // ok - $this->RecordTypes['nXTRecord'] = "nXTRecord"; // ok - $this->RecordTypes['sRVRecord'] = "sRVRecord"; // ok - $this->RecordTypes['nAPTRRecord'] = "nAPTRRecord"; // ok - $this->RecordTypes['kXRecord'] = "kXRecord"; // ok - $this->RecordTypes['certRecord'] = "certRecord"; // ok - $this->RecordTypes['a6Record'] = "a6Record"; // ok - $this->RecordTypes['dSRecord'] = "dSRecord"; // ok - $this->RecordTypes['sSHFPRecord'] = "sSHFPRecord"; // ok - $this->RecordTypes['rRSIGRecord'] = "rRSIGRecord"; // ok - $this->RecordTypes['nSECRecord'] = "nSECRecord"; // ok - - /* Get all available zones */ - if(empty($this->cn)&&(isset($this->attrs['cn'][0]))){ - $this->cn = $this->attrs['cn'][0]; - } - $this->Zones = $this->get_Zones(); - $types = array(); - - /* Get all records */ - $ldap = $this->config->get_ldap_link(); - $ldap->cd($this->dn); - $ldap->ls("(&(objectClass=dNSZone)(zoneName=*)(!(relativeDomainName=@)))",$this->dn,array("*")); - - $found = false; - - while($attrs = $ldap->fetch()){ - /* If relative domainname == cn - * Try to read dnsclass / TTl / zone - */ + /* Get Zones + */ + $this->Zones = getAvailableZones($config); - if($attrs['relativeDomainName'][0] == $this->cn){ - /* Get class */ - if(isset($attrs['dNSClass'][0])){ - $this->dNSClass = $attrs['dNSClass'][0]; - $found = true; - } - /* Get Zone*/ - if(isset($attrs['zoneName'][0])){ - $this->zoneName = $attrs['zoneName'][0]; - $found = true; - } - /* Get ttl */ - if(isset($attrs['dNSTTL'][0])){ - $this->dNSTTL = $attrs['dNSTTL'][0]; - $found = true; - } - } + /* Get Entry + */ + $this->dnsEntry = getDNSHostEntries($config,$this->OrigCn); - /* Create list with all used records */ - foreach($this->RecordTypes as $name => $value){ - - /* If there is a record attribute */ - if(isset($attrs[$name])){ - - - /* get all entries */ - for($i = 0 ; $i < $attrs[$value]['count']; $i ++){ - if(($value == "aRecord")&&($this->ipHostNumber==$attrs[$value][$i])){ - continue; - } - $types[] =array("type"=>$name,"inittype"=>$name,"value"=>$attrs[$value][$i],"status"=>"edited","dn"=>$attrs['dn']); - } - } + /* Remove A record which equals $this->ipHostNumber + */ + foreach($this->dnsEntry['RECORDS'] as $key => $rec){ + if(($rec['type'] == "aRecord") && ($rec['value'] == $this->ipHostNumber)){ + unset($this->dnsEntry['RECORDS'][$key]); } } - /* If there is at least one entry in this -> types, we have DNS enabled */ - $this->types = $types; - if((count($this->types) == 0) &&($found == false)){ - $this->DNS_is_account = false; - }else{ + /* Get Record types + */ + $this->RecordTypes = getDnsRecordTypes(); + + /* If there is at least one entry in this -> types, we have DNS enabled + */ + if($this->dnsEntry['exists']){ $this->DNS_is_account = true; + }else{ + $this->DNS_is_account = false; } - /* Store initally account settings */ + /* Store initally account settings + */ $this->DNSinitially_was_account = $this->DNS_is_account; } + function getVarsForSaving($attrs) { foreach($this->attributes as $attr){ @@ -173,8 +112,9 @@ class termDNS extends plugin /* There is no dns available */ - if($this->found == false){ - + if($this->DNSenabled == false){ + + /* Is IP address must ? */ $smarty->assign("DNS_is_account",false); $smarty->assign("IPisMust",(($this->IPisMust)||($this->DNS_is_account))); @@ -189,9 +129,9 @@ class termDNS extends plugin $smarty->assign("DNS_is_account",true); } - /* Add new empty array with status new, to our record list */ + /* Add new empty array to our record list */ if(isset($_POST['AddNewRecord'])){ - $this->types[] =array("type"=>"aRecord","value"=>"","status"=>"new"); + $this->dnsEntry['RECORDS'][] =array("type"=>"aRecord","value"=>""); } /* Handle all posts */ @@ -209,12 +149,8 @@ class termDNS extends plugin $id = preg_replace("/_.*$/","",$id); /* Delete this record, mark edited entries to be able to delete them */ - if(isset($this->types[$id])){ - if($this->types[$id]['status'] == "edited"){ - $this->types[$id]['status'] = "deleted"; - }else{ - unset($this->types[$id]); - } + if(isset($this->dnsEntry['RECORDS'][$id])){ + unset($this->dnsEntry['RECORDS'][$id]); } } } @@ -226,7 +162,7 @@ class termDNS extends plugin /* Assign smarty all DNS attributes */ foreach($this->DNSattributes as $attr){ - $smarty->assign($attr,$this->$attr); + $smarty->assign($attr,$this->dnsEntry[$attr]); } /* Assign all needed vars */ @@ -236,16 +172,20 @@ class termDNS extends plugin $smarty->assign("IPisMust",(($this->IPisMust)||($this->DNS_is_account))); $tmp = $this->generateRecordsList(); + $changeStateForRecords = $tmp['changeStateForRecords']; + $smarty->assign("records",$tmp['str']); $smarty->assign("changeStateForRecords",$changeStateForRecords); $smarty->assign("staticAddress","*"); + $display.= $smarty->fetch(get_template_path('network.tpl', TRUE)); return($display); } function remove_from_parent() { + /* $ldap = $this->config->get_ldap_link(); $ldap->cd($this->orig_dn); $ldap->search("(&(objectClass=dNSZone)(zoneName=*)(!(relativeDomainName=@)))",array("relativeDomainName","zoneName")); @@ -253,6 +193,7 @@ class termDNS extends plugin $ldap->cd($attr['dn']); $ldap->rmDir($attr['dn']); } + */ } /* Save data to object */ @@ -272,22 +213,22 @@ class termDNS extends plugin if(isset($_POST['network_tpl_posted'])){ /* Check for posted record changes */ - foreach($this->types as $key => $value){ + foreach($this->dnsEntry['RECORDS'] as $key => $value){ /* Check if type has changed */ if(isset($_POST['RecordTypeSelectedFor_'.$key])){ - $this->types[$key]['type'] = $_POST['RecordTypeSelectedFor_'.$key]; + $this->dnsEntry['RECORDS'][$key]['type'] = $_POST['RecordTypeSelectedFor_'.$key]; } /* Check if value has changed */ if(isset($_POST['RecordValue_'.$key])){ - $this->types[$key]['value'] = $_POST['RecordValue_'.$key]; + $this->dnsEntry['RECORDS'][$key]['value'] = $_POST['RecordValue_'.$key]; } } /* Get all basic DNS attributes (TTL, Clas ..)*/ foreach($this->DNSattributes as $attr){ if(isset($_POST[$attr])){ - $this->$attr = $_POST[$attr]; + $this->dnsEntry[$attr] = $_POST[$attr]; } } @@ -306,26 +247,32 @@ class termDNS extends plugin { $message= array(); - + /* Check if ip must be given + */ if(($this->IPisMust)||($this->DNS_is_account)){ - /* Check if ip is empty */ + + /* Check if ip is empty + */ if ($this->ipHostNumber == "" && chkacl ($this->acl, "ipHostNumber") == ""){ $message[]= _("The required field 'IP-address' is not set."); } - /* check if given ip is valid ip*/ + /* check if given ip is valid ipi + */ $num="(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])"; if (!preg_match("/^$num\\.$num\\.$num\\.$num$/", $this->ipHostNumber)){ $message[]= _("Wrong IP format in field IP-address."); } } - /* Check if mac is empty */ + /* Check if mac is empty + */ if ($this->macAddress == "" && chkacl ($this->acl, "macAddress") == ""){ $message[]= _("The required field 'MAC-address' is not set."); } - /* Check if given mac is valid mac */ + /* Check if given mac is valid mac + */ $tr = count(split(":",$this->macAddress)); if($tr!=6){ $message[]=(_("The given macaddress is invalid. There must be 6 1byte segments seperated by ':'.")); @@ -336,16 +283,23 @@ class termDNS extends plugin $checkArray = array(); $onlyOnce = array(); + $onlyOnce['cNAMERecord'] = 0; - - foreach($this->types as $name => $values){ + /* Walk through all entries and detect duplicates or mismatches + */ + foreach($this->dnsEntry['RECORDS'] as $name => $values){ + + /* Count record values, to detect duplicate entries for a specific record + */ if(!isset($checkArray[$values['type']][$values['value']])){ $checkArray[$values['type']][$values['value']] = 0; }else{ $message[] = sprintf(_("Found duplicate value for record type '%s'."),$values['type']); } + /* Check if given entries in $onlyOnce are used more than once + */ if(isset($onlyOnce[$values['type']])){ $onlyOnce[$values['type']] ++; if($onlyOnce[$values['type']] > 1){ @@ -353,15 +307,19 @@ class termDNS extends plugin } } + /* Skip txt record ... + */ if($values['type'] == "tXTRecord") continue; - /* Check if there is an aRecord defined which uses the same IP as used in IPhostAddress */ - if(($values['type'] == "aRecord")&&($values['value'] == $this->ipHostNumber)&&($values['status']!="deleted")){ + /* Check if there is an aRecord defined which uses the same IP as used in IPhostAddress + */ + if(($values['type'] == "aRecord")&&($values['value'] == $this->ipHostNumber)){ $message[]=sprintf(_("The device IP '%s' is added as 'A Record', this will be done automatically, please remove the record."), $this->ipHostNumber); } - /* only lower-case is allowed in record entries ... */ + /* only lower-case is allowed in record entries ... + */ if($values['value'] != strtolower($values['value'])){ $message[] = sprintf(_("Only lowercase is allowed, please check your '%ss'."),$values['type']); } @@ -389,8 +347,7 @@ class termDNS extends plugin /* Write back to ldap */ $ldap->cd($this->dn); $this->cleanup(); -$ldap->modify ($this->attrs); - + $ldap->modify ($this->attrs); /****************/ /* DNS HANDLING */ @@ -399,56 +356,52 @@ $ldap->modify ($this->attrs); /* If isn't DNS account but initially was DNS account remove all DNS entries */ - if(!$this->DNS_is_account){ - if($this->DNSinitially_was_account){ - $tmp = array(); - - $ldap->ls("(&(objectClass=dNSZone)(!(relativeDomainName=@)))",$this->dn,array("relativeDomainName")); - while($attrs = $ldap->fetch()){ - $dn=$attrs['dn']; - $ldap->cd($dn); - $ldap->rmdir_recursive($dn); - } - } + + /* Add ipHostNumber to aRecords + */ + $this->dnsEntry['RECORDS'][] = array("type"=>"aRecord","value"=>$this->ipHostNumber); + + /* Create diff and follow instructions + * If Account was disabled, remove account by setting exists to false + */ + if((!$this->DNS_is_account)&&($this->DNSinitially_was_account)){ + $this->dnsEntry['exists'] = false; + $tmp = getDNSHostEntriesDiff($this->config,$this->OrigCn,$this->dnsEntry,$this->cn); }else{ - - /* DNS is enabled, check what we have to do */ - $delete = array(); - - /* Generate a list of new ldap entries, - & $delete contains all dns which should be deleted - */ - $tmp = $this->generate_LDAP_entries(); + $tmp = getDNSHostEntriesDiff($this->config,$this->OrigCn,$this->dnsEntry,$this->cn); + } - $entries = $tmp['entries']; - $delete = $tmp['delete']; + /* Delete dns */ + foreach($tmp['del'] as $dn => $del){ + $ldap->cd($dn); + $ldap->rmdir_recursive($dn); + } - /* Delete dns */ - foreach($delete as $dn => $del){ - $ldap->cd($dn); - $ldap->rmDir($dn); - } + /* move follwoing entries + */ + foreach($tmp['move'] as $src => $dst){ + $this->recursive_move($src,$dst); + } - /* Add || Update new DNS entries */ - foreach($entries as $dn => $attrs){ + /* Add || Update new DNS entries + */ + foreach($tmp['add'] as $dn => $attrs){ + $ldap->cd($dn); + $ldap->cat($dn); + if(count($ldap->fetch())){ $ldap->cd($dn); - $ldap->cat($dn); - - if(count($ldap->fetch())){ - $ldap->cd($dn); -// $this->cleanup(); - $ldap->modify ($attrs); - - }else{ - $ldap->cd($dn); - $ldap->add($attrs); - } + $ldap->modify ($attrs); + }else{ + $ldap->cd($dn); + $ldap->add($attrs); } } + + /* Display errors + */ if($ldap->get_error() != "Success"){ show_ldap_error($ldap->get_error()); } - } /* Create html table with all used record types @@ -463,8 +416,7 @@ $ldap->modify ($this->attrs); } $str = ""; - foreach($this->types as $key => $entry){ - if($entry['status'] == "deleted") continue; + foreach($this->dnsEntry['RECORDS'] as $key => $entry){ $changeStateForRecords.= "changeState('RecordTypeSelectedFor_".$key."');\n"; $changeStateForRecords.= "changeState('RecordValue_".$key."');\n"; @@ -487,7 +439,9 @@ $ldap->modify ($this->attrs); return($ret); } - /* Create a html select box which allows us to select different types of records */ + + /* Create a html select box which allows us to select different types of records + */ function generateRecordListBox($selected,$name) { $str = ""; return($str); } - - /* return all Zone names */ - function get_Zones() - { - $ret = array(); - $ldap = $this->config->get_ldap_link(); - $ldap-> cd ($this->config->current['BASE']); - $ldap->search("(&(objectClass=dNSZone)(sOARecord=*))",array("zoneName","tXTRecord")); - - while($at = $ldap->fetch()){ - if(preg_match("/\.in\-addr\.arpa/",$at['zoneName'][0])){ - $name = preg_replace("/^zoneName=/","",$at['tXTRecord'][0]); - $ret[$name]['addr']= $at['zoneName'][0]; - }else{ - $name = $at['zoneName'][0]; - $ret[$name]['name']= $at['zoneName'][0]; - } - } - - $tmp =array(); - foreach($ret as $name => $entry){ - if((isset($entry['addr']))&&(isset($entry['name']))){ - $tmp[$entry['addr']]=$entry['name']; - } - } - $ret = $tmp; - return($ret); - } - - /* this is used to generate ldap friendly output of our - dns configuration - */ - function generate_LDAP_entries() - { - $entries = array(); - $delete = array(); - - /* Generate Main Entry */ - $dn = "relativeDomainName=".$this->cn.",".$this->dn; - $entries[$dn]['dNSClass'] = $this->dNSClass; - $entries[$dn]['zoneName'] = $this->zoneName; - $entries[$dn]['dNSTTL'] = $this->dNSTTL; - $entries[$dn]['relativeDomainName'] = $this->cn; - - /* Generate cNAMERecord */ - $aRecords = array(); - foreach($this->types as $type){ - if($type['type'] == "cNAMERecord"){ - - $Cdn = "relativeDomainName=".$type['value'].",".$this->dn; - if($type['status']=="deleted"){ - $delete [$type['dn']] = $Cdn; - }else{ - $entries[$Cdn] = $entries[$dn]; - $entries[$Cdn]['relativeDomainName'] = $type['value']; - $entries[$Cdn]['cNAMERecord'] = $this->cn.".".$this->zoneName; - } - } - } - - /* Generate tXTRecord */ - $aRecords = array(); - foreach($this->types as $type){ - if(($type['type'] == "tXTRecord")&&($type['status']!="deleted")){ - $entries[$dn]['tXTRecord'][] = $type['value']; - } - } - - /* Generate mDRecord */ - $aRecords = array(); - foreach($this->types as $type){ - if(($type['type'] == "mDRecord")&&($type['status']!="deleted")){ - $entries[$dn]['mDRecord'][] = $type['value']; - } - } - - /* Generate mXRecord */ - $aRecords = array(); - foreach($this->types as $type){ - if(($type['type'] == "mXRecord")&&($type['status']!="deleted")){ - $entries[$dn]['mXRecord'][] = $type['value']; - } - } - - /* Generate hInfoRecord */ - $aRecords = array(); - foreach($this->types as $type){ - if(($type['type'] == "hInfoRecord")&&($type['status']!="deleted")){ - $entries[$dn]['hInfoRecord'][] = $type['value']; - } - } - - /* Generate mInfoRecord */ - $aRecords = array(); - foreach($this->types as $type){ - if(($type['type'] == "mInfoRecord")&&($type['status']!="deleted")){ - $entries[$dn]['mInfoRecord'][] = $type['value']; - } - } - - /* Generate aFSDBRecord */ - $aRecords = array(); - foreach($this->types as $type){ - if(($type['type'] == "aFSDBRecord")&&($type['status']!="deleted")){ - $entries[$dn]['aFSDBRecord'][] = $type['value']; - } - } - - /* Generate some attrs */ - $arr = array("SigRecord","KeyRecord","aAAARecord","nSRecord", - "LocRecord","nXTRecord","sRVRecord","nAPTRRecord","kXRecord","certRecord","a6Record","dSRecord","sSHFPRecord","rRSIGRecord","nSECRecord"); - $aRecords = array(); - foreach($arr as $ar){ - foreach($this->types as $type){ - if(($type['type'] == $ar)&&($type['status']!="deleted")){ - $entries[$dn][$ar][] = $type['value']; - } - } - } - - - /* Generate A Records (IP Address relation) */ - $aRecords = array(); - foreach($this->types as $type){ - if(($type['type'] == "aRecord")&&($type['status']!="deleted")){ - $aRecords[] = $type['value']; - } - } - if(count($aRecords)){ - - /* Add ipHostNumber as default aRecord */ - $aRecords[] = $this->ipHostNumber; - - $dn = "relativeDomainName=".$this->cn.",".$this->dn; - foreach($aRecords as $rec){ - $entries[$dn]['aRecord'][] = $rec; - } - } - - /* Generate pTRRecord Records */ - foreach($this->types as $type){ - if($type['type'] == "pTRRecord"){ - $PTRdn= "relativeDomainName=".$type['value'].",".$this->dn; - if($type['status']=="deleted"){ - $delete [$type['dn']] = $PTRdn; - }else{ - $zones = array_flip($this->Zones); - $zone = $zones[$this->zoneName]; - $entries[$PTRdn]['relativeDomainName'] = $type['value']; - $entries[$PTRdn]['pTRRecord'] = $this->cn.".".$this->zoneName; - $entries[$PTRdn]['zoneName'] = $zone; - } - } - } - - /* add ObjectClasses */ - foreach($entries as $key => $entry ){ - $entries[$key]['objectClass']=array("top","dNSZone"); - $entries[$key] = array_reverse($entries[$key]); - } - - /* Check if record type has changed, and if we need to delete this record attribute from ldap entry */ - foreach($this->types as $type){ - if(isset($type['inittype'])){ - if(!isset($entries[$dn][$type['inittype']])){ - $entries[$dn][$type['inittype']] = array(); - } - } - } - - $ret = array("entries"=> $entries,"delete"=>$delete); - return($ret); - } } // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler: -- 2.30.2