X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=gosa-plugins%2Fsystems%2Fadmin%2Fsystems%2Fclass_termDNS.inc;h=c3806820105ab012dc51e1928edf2d20c0de74eb;hb=e9d5e9913de62425bb7dfd4d993fbcd8ac609aa4;hp=1cf1a4c1848c6c192ad48f8426c3eb88f57adf55;hpb=049d82cc1f343b829bcfdcb751a0b2222d3d7f15;p=gosa.git diff --git a/gosa-plugins/systems/admin/systems/class_termDNS.inc b/gosa-plugins/systems/admin/systems/class_termDNS.inc index 1cf1a4c18..c38068201 100644 --- a/gosa-plugins/systems/admin/systems/class_termDNS.inc +++ b/gosa-plugins/systems/admin/systems/class_termDNS.inc @@ -65,10 +65,11 @@ class termDNS extends plugin var $dnsEntry = array(); var $DNSenabled = false; var $hide_dns_check_box = FALSE; + var $namingAttr = "cn"; /* Terminal dns */ - function termDNS (&$config, $parent,$objectClasses,$IPisMust = false) + function termDNS (&$config, $parent,$objectClasses,$IPisMust = false,$namingAttr = "cn") { /* We need to know which objectClasses are used, to store the ip/mac * Because of different type of devices @@ -76,12 +77,15 @@ class termDNS extends plugin $this->parent = $parent; $this->objectclasses = $objectClasses; $this->IPisMust = $IPisMust; + $this->namingAttr = $namingAttr; - plugin::plugin ($config, $parent->dn); + plugin::plugin ($config, $parent->dn, $this->parent); + + $this->attrs = &$this->parent->attrs; - if(isset($this->attrs['cn'][0])){ - $this->OrigCn = preg_replace("/\\\$\$/","",$this->attrs['cn'][0]); - $this->cn = preg_replace("/\\\$\$/","",$this->attrs['cn'][0]); + if(isset($this->attrs[$namingAttr][0])){ + $this->OrigCn = preg_replace("/\\\$\$/","",$this->attrs[$namingAttr][0]); + $this->cn = preg_replace("/\\\$\$/","",$this->attrs[$namingAttr][0]); } /* Create list of additional ipHostNumber. @@ -98,7 +102,7 @@ class termDNS extends plugin ************/ /* Hide all dhcp specific code, if dhcp plugin is not present in config */ - $dhcpEnabled = FALSE; + $this->dhcpEnabled = FALSE; if($this->config->search("servdhcp","class",array("tabs"))){ $this->dhcpEnabled = TRUE; } @@ -152,9 +156,10 @@ class termDNS extends plugin */ $this->dnsEntry = DNS::getDNSHostEntries($config,$this->OrigCn); + $ptr = DNS::FlipIp($this->get_pTRRecord()); + /* Remove A record which equals $this->ipHostNumber */ - $ptr = $this->get_pTRRecord(); foreach($this->dnsEntry['RECORDS'] as $key => $rec){ if(($rec['type'] == "aRecord") && ($rec['value'] == $this->ipHostNumber)){ unset($this->dnsEntry['RECORDS'][$key]); @@ -231,7 +236,7 @@ class termDNS extends plugin function netmaskIsCoherent($idZone) { - $netmask = DNS::FlipIp(str_replace(".in-addr.arpa","",DNS::getNameFromMix($idZone))); + $netmask = DNS::FlipIp(str_replace(".in-addr.arpa.","",DNS::getNameFromMix($idZone))); if(!strstr($this->ipHostNumber, $netmask)){ return false; }else{ @@ -254,6 +259,7 @@ class termDNS extends plugin { /* Call parent execute */ $smarty= get_smarty(); + $smarty->assign("autonetACL",$this->acl_is_writeable("macAddress") && $this->acl_is_writeable("ipHostNumber")?"rw":""); $tmp = $this->plInfo(); foreach($tmp['plProvidedAcls'] as $name => $translation){ @@ -321,7 +327,7 @@ class termDNS extends plugin $this->dialog->read_only = !$this->acl_is_writeable("dhcpSetup"); $this->dialog->dhcpHWAddress = "ethernet ".$this->macAddress; if(!empty($this->ipHostNumber)){ - $this->dialog->statements['fixed-address'] = $this->ipHostNumber; + $this->dialog->statements->set('fixed-address', $this->ipHostNumber); } } @@ -329,7 +335,7 @@ class termDNS extends plugin $this->dialog = FALSE; } - if(isset($_POST['save_dhcp']) && $this->acl_is_writeable("dhcpSetup")){ + if(isset($_POST['save_dhcp']) && $this->acl_is_writeable("dhcpSetup") && is_object($this->dialog)){ $this->dialog->save_object(); $msgs = $this->dialog->check(array()); if(count($msgs)){ @@ -387,8 +393,8 @@ class termDNS extends plugin if(isset($_POST['propose_ip']) && $this->acl_is_writeable("ipHostNumber")){ foreach($this->Zones as $key => $name){ if($name == $this->dnsEntry['zoneName']){ - $net = DNS::FlipIp(str_replace(".in-addr.arpa","",DNS::getNameFromMix($key))); - $this->ipHostNumber = $this->generateRandomIp($net); + $net = DNS::FlipIp(str_replace(".in-addr.arpa.","",DNS::getNameFromMix($key))); + $this->ipHostNumber = $this->generateRandomIP($net); } } } @@ -422,7 +428,7 @@ class termDNS extends plugin /* Assign smarty all DNS attributes */ foreach($this->DNSattributes as $attr){ - $smarty->assign($attr,$this->dnsEntry[$attr]); + $smarty->assign($attr,htmlentities($this->dnsEntry[$attr])); } /* Assign all needed vars */ @@ -454,7 +460,7 @@ class termDNS extends plugin $smarty->assign("changeStateForRecords",$changeStateForRecords); $smarty->assign("staticAddress","*"); - $smarty->assign("autonetACL",$this->acl_is_writeable("macAddress").$this->acl_is_writeable("ipHostNumber")); + $smarty->assign("autonetACL",$this->acl_is_writeable("macAddress") && $this->acl_is_writeable("ipHostNumber")?"rw":""); $display.= $smarty->fetch(get_template_path('network.tpl', TRUE)); } @@ -538,11 +544,15 @@ class termDNS extends plugin DNS posts ******/ - /* Check if DNS should be enabled / disabled */ - if($this->DNS_is_account && $this->acl_is_writeable("dnsSetup") && !isset($_POST['DNS_is_account'])){ - $this->DNS_is_account = false; - }elseif(!$this->DNS_is_account && $this->acl_is_writeable("dnsSetup") && isset($_POST['DNS_is_account'])){ - $this->DNS_is_account = true; + /* Check if DNS should be enabled / disabled + * -skip this, if the dns account is enforced. + */ + if(!$this->hide_dns_check_box){ + if($this->DNS_is_account && $this->acl_is_writeable("dnsSetup") && !isset($_POST['DNS_is_account'])){ + $this->DNS_is_account = false; + }elseif(!$this->DNS_is_account && $this->acl_is_writeable("dnsSetup") && isset($_POST['DNS_is_account'])){ + $this->DNS_is_account = true; + } } /* Get dns attributes */ @@ -558,7 +568,7 @@ class termDNS extends plugin } /* Check if value has changed */ if(isset($_POST['RecordValue_'.$key])){ - $this->dnsEntry['RECORDS'][$key]['value'] = $_POST['RecordValue_'.$key]; + $this->dnsEntry['RECORDS'][$key]['value'] = get_post('RecordValue_'.$key); } } } @@ -566,7 +576,7 @@ class termDNS extends plugin /* Get all basic DNS attributes (TTL, Clas ..)*/ foreach($this->DNSattributes as $attr){ if(isset($_POST[$attr])){ - $this->dnsEntry[$attr] = $_POST[$attr]; + $this->dnsEntry[$attr] = get_post($attr); } } } @@ -711,6 +721,11 @@ class termDNS extends plugin $this->attrs['ipHostNumber'][] = $value; } + /* Do not add the objectClass ipHost if no ip address is given */ + if(!isset($this->attrs['ipHostNumber'])){ + $this->attrs['objectClass'] = array_remove_entries(array("ipHost"),$this->attrs['objectClass']); + } + /* Write back to ldap */ $ldap->cd($this->dn); $this->cleanup(); @@ -728,7 +743,7 @@ class termDNS extends plugin $this->dialog->cn = $this->cn; $this->dialog->dhcpHWAddress = "ethernet ".$this->macAddress; if(!empty($this->ipHostNumber)){ - $this->dialog->statements['fixed-address'] = $this->ipHostNumber; + $this->dialog->statements->set('fixed-address', $this->ipHostNumber); } $this->dialog->execute(); $this->dialog->save_object(); @@ -736,6 +751,15 @@ class termDNS extends plugin if(count($this->dhcpHostEntry['dhcpOption']) == 0){ $this->dhcpHostEntry['dhcpOption']= array("host-name ".$this->cn); } + }else{ + + // Updated Host-Name entry + foreach($this->dhcpHostEntry['dhcpOption'] as $key => $entry){ + if(preg_match("/^host-name/", $entry)){ + $this->dhcpHostEntry['dhcpOption'][$key] = "host-name ".$this->cn; + break; + } + } } /* Write mac address to dhcp settings */ @@ -748,7 +772,7 @@ class termDNS extends plugin } /* Updated IP host number */ - if($this->dhcp_is_Account){ + if($this->dhcp_is_Account && $this->dhcpHostEntry['dhcpStatements']){ foreach($this->dhcpHostEntry['dhcpStatements'] as $id => $value){ if(preg_match("/^fixed-address/",$value)){ $this->dhcpHostEntry['dhcpStatements'][$id] = "fixed-address ".$this->ipHostNumber; @@ -797,7 +821,7 @@ class termDNS extends plugin if(($this->initial_dhcpParentNode != $this->dhcpParentNode) || ($this->cn != $this->OrigCn)){ $attrs = $this->dhcpHostEntry; - $attrs['cn'] = $this->cn; + $attrs[$this->namingAttr] = $this->cn; unset($attrs['dn']); unset($attrs['MODIFIED']); $ldap->cd("cn=".$this->cn.",".$this->dhcpParentNode); @@ -869,6 +893,10 @@ class termDNS extends plugin $this->dnsEntry['exists'] = $this->DNS_is_account; $tmp = DNS::getDNSHostEntriesDiff($this->config,$this->OrigCn,$this->dnsEntry,$this->cn); } + + /* Update SOA record if needed + */ + $this->updateSOARecord(); /* move follwoing entries */ @@ -932,7 +960,7 @@ class termDNS extends plugin $str.=" ". " ".$this->generateRecordListBox($entry['type'],"RecordTypeSelectedFor_".$key)."". - " ". + " ". " ". ""; } @@ -944,6 +972,7 @@ class termDNS extends plugin " ". ""; $ret = array("str" => $str, "changeStateForRecords" => $changeStateForRecords); + return($ret); } @@ -1022,7 +1051,7 @@ class termDNS extends plugin { $ldap = $this->config->get_ldap_link(); $ldap->cd($this->config->current['BASE']); - $ldap->search ("(&(objectClass=dhcpHost)(cn=".$this->cn."))",array("cn","dn")); + $ldap->search ("(&(objectClass=dhcpHost)(cn=".$this->cn."))",array("uid","cn","dn")); if($ldap->count()){ $attr = $ldap->fetch(); @@ -1083,7 +1112,7 @@ class termDNS extends plugin $attrs = $ldap->fetch(); $tmp = array_flip($this->Zones); $tmp = preg_replace("/^[^\/]*+\//","",$tmp[$this->dnsEntry['zoneName']]); - $tmp = trim(preg_replace("/\.in-addr.arpa$/","",$tmp)); + $tmp = trim(preg_replace("/\.in-addr.arpa\.$/","",$tmp)); $ptr = preg_replace("/^".preg_quote(DNS::FlipIp($tmp), '/')."\./","",$this->ipHostNumber); return($ptr); }else{ @@ -1096,13 +1125,50 @@ class termDNS extends plugin { $str = $net; $cnt = 4; - while(substr_count($str,".") < 3 && $cnt > 0){ - $str .= ".".rand(0,255); - $str = preg_replace("/\.\.*/",".",$str); - $str = trim($str,". "); - $cnt --; + + // first gather all IPs + $ldap = $this->config->get_ldap_link(); + $ocs = + "(objectClass=goFonHardware)". + "(objectClass=goServer)". + "(objectClass=GOhard)". + "(objectClass=gotoTerminal)". + "(objectClass=gotoWorkstation)". + "(objectClass=gotoPrinter)". + "(objectClass=ipHost)"; + $list = array(); + $ldap->search("(&(|{$ocs})(ipHostNumber=*))",array("ipHostNumber")); + while($attrs = $ldap->fetch()){ + if (preg_match("/^$net\./", $attrs['ipHostNumber'][0])) { + $list[] = $attrs['ipHostNumber'][0]; + } + } + + // Set starting ip. + $ip_data = preg_split("/\./",$net); + for($i=0;$i<4;$i++){ + if(!isset($ip_data[$i])) $ip_data[$i] = 0; + } + + // Search the next free and valid ip. + while(in_array(implode(".",$ip_data),$list) || $ip_data[3] <= 1){ + $ip_data[3] ++ ; + if($ip_data[3] > 255){ + $ip_data[3] = 1 ; + $ip_data[2] ++ ; + } + if($ip_data[2] > 255){ + $ip_data[2] = 1 ; + $ip_data[1] ++ ; + } + if($ip_data[1] > 255){ + $ip_data[1] = 1 ; + $ip_data[0] ++ ; + } + if($ip_data[0] > 255) break; } - return($str); + + return(implode(".",$ip_data)); } @@ -1133,6 +1199,15 @@ class termDNS extends plugin } } } + + function updateSOARecord() + { + $oldEntries = DNS::getDNSHostEntries($this->config,$this->OrigCn); + $newEntries = $this->dnsEntry; + if(array_differs($newEntries['RECORDS'],$oldEntries['RECORDS'])){ + DNS::touchDNSZone($this->config,$this->dnsEntry['zoneName']); + } + } } // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler: