summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: db36f84)
raw | patch | inline | side by side (parent: db36f84)
author | cajus <cajus@594d385d-05f5-0310-b6e9-bd551577e9d8> | |
Thu, 17 Jan 2008 16:43:21 +0000 (16:43 +0000) | ||
committer | cajus <cajus@594d385d-05f5-0310-b6e9-bd551577e9d8> | |
Thu, 17 Jan 2008 16:43:21 +0000 (16:43 +0000) |
git-svn-id: https://oss.gonicus.de/repositories/gosa/trunk@8479 594d385d-05f5-0310-b6e9-bd551577e9d8
14 files changed:
diff --git a/gosa-core/plugins/admin/systems/services/dns/class_DNS.inc b/gosa-core/plugins/admin/systems/services/dns/class_DNS.inc
+++ /dev/null
@@ -1,686 +0,0 @@
-<?php
-
-
-/* All available record types
- */
-$RecordTypes['aRecord'] = "aRecord";
-$RecordTypes['mDRecord'] = "mDRecord";
-$RecordTypes['mXRecord'] = "mXRecord";
-$RecordTypes['nSRecord'] = "nSRecord";
-$RecordTypes['pTRRecord'] = "relativeDomainName";
-$RecordTypes['hInfoRecord'] = "hInfoRecord";
-$RecordTypes['mInfoRecord'] = "mInfoRecord";
-$RecordTypes['cNAMERecord'] = "relativeDomainName";
-$RecordTypes['tXTRecord'] = "tXTRecord";
-$RecordTypes['aFSDBRecord'] = "aFSDBRecord";
-$RecordTypes['SigRecord'] = "SigRecord";
-$RecordTypes['KeyRecord'] = "KeyRecord";
-$RecordTypes['aAAARecord'] = "aAAARecord";
-$RecordTypes['LocRecord'] = "LocRecord";
-$RecordTypes['nXTRecord'] = "nXTRecord";
-$RecordTypes['sRVRecord'] = "sRVRecord";
-$RecordTypes['nAPTRRecord'] = "nAPTRRecord";
-$RecordTypes['kXRecord'] = "kXRecord";
-$RecordTypes['certRecord'] = "certRecord";
-$RecordTypes['a6Record'] = "a6Record";
-$RecordTypes['dSRecord'] = "dSRecord";
-$RecordTypes['sSHFPRecord'] = "sSHFPRecord";
-$RecordTypes['rRSIGRecord'] = "rRSIGRecord";
-$RecordTypes['nSECRecord'] = "nSECRecord";
-
-class DNS
-{
-
- /* Return all record types
- */
- static function getDnsRecordTypes($ForZones = false)
- {
- global $RecordTypes;
- if($ForZones){
- $tmp = $RecordTypes;
- unset($tmp['cNAMERecord']);
- unset($tmp['pTRRecord']);
- unset($tmp['tXTRecord']);
- return($tmp);
- }else{
- return($RecordTypes);
- }
- }
-
-
- /* 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.
- */
- static function FlipIp($ip)
- {
- $tmp = array_reverse(split("\.",$ip));
- $new = "";
- foreach($tmp as $section){
- $new .= $section.".";
- }
- return(preg_replace("/.$/","",$new));
- }
-
-
- /* This static function returns the zones specified for given host
- */
- static function getDNSZoneEntries($config,$HostDn,$silent = false)
- {
- global $RecordTypes;
-
- $ldap = $config->get_ldap_link();
- $ldap->cd($config->current['BASE']);
-
- /* Not all records are allowed within a zone entry
- */
- $SkipRecords = array("tXTRecord","cNAMERecord","pTRRecord");
-
- /* Special sOArecords
- */
- $sOAREcords = array("0"=>"sOAprimary","1"=>"sOAmail","2"=>"sOAserial","3"=>"sOArefresh","4"=>"sOAretry","5"=>"sOAexpire","6"=>"sOAttl");
-
- /* Create tempalte for all fetched zone Data
- */
- $ZoneBase = array();
- $ZoneBase['exists'] = false;
- $ZoneBase['RECORDS'] = array();
- $ZoneBase['zoneName'] = array();
- $ZoneBase['dNSClass'] = array();
-
- foreach($sOAREcords as $attr){
- $ZoneBase[$attr] = "";
- }
-
- $Zones = array();
-
- /* Get & Parse all zone entries
- */
- $ldap->ls("(&(objectClass=dNSZone)(zoneName=*)(relativeDomainName=@))",$HostDn,array("*"));
- $tmp_res = array();
- while($attrs = $ldap->fetch()) {
- $tmp_res[] = $attrs;
- }
-
- /* Parse fetched zones
- */
- foreach($tmp_res as $attrs){
-
- $zoneName = $attrs['zoneName'][0];
- $Zones[$zoneName] = $ZoneBase;
- $Zones[$zoneName]['exists'] = true;
-
- /* Set basic attributes
- */
- foreach(array("zoneName","dNSClass") as $attr){
- if(isset($attrs[$attr][0])){
- $Zones[$zoneName][$attr] = $attrs[$attr][0];
- }
- }
-
- /* Set initial zone name, to be able to detect if this entry was renamed
- */
- $Zones[$zoneName]['InitialzoneName'] = $zoneName;
-
- /* Generate SOA entry
- */
- if(isset($attrs['sOARecord'][0])){
- $tmp = split("\ ",$attrs['sOARecord'][0]) ;
- $tmp2 = array();
-
- /* Assign soa vars */
- foreach($sOAREcords as $key => $name){
- if(isset($tmp[$key])){
- $Zones[$zoneName][$name] = $tmp[$key];
- }else{
- $Zones[$zoneName][$name] = "";
- }
- }
- } // ENDE SOA Record
-
- /* Get record attributes
- */
- foreach($RecordTypes as $name => $value){
-
- /* Skip some attributes
- */
- if(in_array($name,$SkipRecords)) continue;
-
- /* If there is a record attribute
- */
- if(isset($attrs[$name])){
-
- /* get all entries
- */
- for($i = 0 ; $i < $attrs[$value]['count']; $i ++){
- $Zones[$zoneName]['RECORDS'][] = array("type"=>$name,"value"=>$attrs[$value][$i]);
- }
- }
- }
-
- /* Get reverse record ..
- */
- $ldap->ls("(&(objectClass=dNSZone)(relativeDomainName=@)(zoneName=*))",$attrs['dn'],array("zoneName"));
-
- if($ldap->count() == 0){
- if(!$silent){
- msg_dialog::display(_("Error"), sprintf(_("Cannot find reverse zone for DNS zone '%s'. Parsing zone aborted."),$zoneName), ERROR_DIALOG);
- }
- unset($Zones[$zoneName]);
- }elseif($ldap->count()>1){
- if(!$silent){
- msg_dialog::display(_("Error"), sprintf(_("Found more than one reverse zone for '%s'. Parsing zone aborted."),$zoneName), ERROR_DIALOG);
- }
- unset($Zones[$zoneName]);
- }else{
- $tmp = $ldap->fetch();
- $Zones[$zoneName]['ReverseZone'] = FlipIp(str_replace(".in-addr.arpa","",$tmp['zoneName'][0]));
- $Zones[$zoneName]['InitialReverseZone'] = FlipIp(str_replace(".in-addr.arpa","",$tmp['zoneName'][0]));
- }
- }
- return($Zones);
- }
-
-
- /* This static function compares two dns zone objects and returns an
- * array with following indexes
- * - delete, for dns which must be deleted (only if dns zone is removed)
- * - rename, if a dn must be renamed, for example, the zoneName has changed
- * - add, if there is a new dns account created
- */
- static function getDNSZoneEntriesDiff($config,$newZones,$HostDn)
- {
- $oldZones = getDNSZoneEntries($config,$HostDn,true);
-
- $sOAattributes = array("sOAprimary","sOAmail","sOAserial","sOArefresh","sOAretry","sOAexpire","sOAttl");
-
- $move = array();
- $add = array();
- $del = array();
-
- /* Generate a template for zones with default values
- */
- $zoneBase = array();
- $zoneBase['objectClass'] = array("top","dNSZone");
- $zoneBase['zoneName'] = "";
- $zoneBase['relativeDomainName'] = "@";
- $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 ...
- */
- foreach($newZones as $name => $zone){
-
- /* This zone was renamed
- */
- if((!empty($zone['InitialzoneName'])) && ($zone['InitialzoneName'] != $zone['zoneName'])){
-
- /* Move old zone to new position
- */
- $oldDn = "zoneName=".$zone['InitialzoneName'].",".$HostDn;
- $newDn = "zoneName=".$zone['zoneName'].",".$HostDn;
- $PrePareZoneEntries[$zone['InitialzoneName']] = $zone['zoneName'];
- $move [$oldDn] = $newDn;
- }
-
- /* Get old zone if available
- */
- $oldZone=array();
- if(!empty($oldZones[$zone['InitialzoneName']])){
- $oldZone = $oldZones[$zone['InitialzoneName']];
- }
-
- /* Create forward zone entry and put it in our add queue
- */
- $newDn = "zoneName=".$zone['zoneName'].",".$HostDn;
- $obj = $zoneBase;
- $obj['zoneName'] = $zone['zoneName'];
-
- /* Create sOARecord & add it to the obj
- */
- $soa = "";
- foreach($sOAattributes as $attr){
- $soa.=" ".$zone[$attr];
- }
- $obj['sOARecord'] = trim($soa);
- $obj['nSRecord'] = $zone['sOAprimary'];
-
- /* If reverse zone was renamed, move entry
- */
- if(!empty($zone['InitialReverseZone'])){
- if($zone['InitialReverseZone'] != $zone['ReverseZone']){
- $base = "zoneName=".$zone['zoneName'].",".$HostDn;
- $oldRDn = "zoneName=". FlipIp($zone['InitialReverseZone']).".in-addr.arpa,".$base;
- $newRDn = "zoneName=". FlipIp($zone['ReverseZone']).".in-addr.arpa,".$base;
- $PrePareZoneEntries[FlipIp($zone['InitialReverseZone']).".in-addr.arpa"] = FlipIp($zone['ReverseZone']).".in-addr.arpa";
- $move [$oldRDn] = $newRDn;
- }
- }
-
- /* Append record entries
- * Set old value to array, to ensure that
- * they will be deleted if necessary
- */
- if(isset($oldZone['RECORDS'])){
- foreach($oldZone['RECORDS'] as $rec){
- $obj[$rec['type']] = array();
- }
- }
-
- /* 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'];
- }
-
- /* Append udpated Zone Forward Entry to our add queue
- */
- $add[$newDn] = $obj;
-
- /* Create Reverse Entry
- * And append it to our add queue
- */
- $zone['ReverseZone'] = FlipIp($zone['ReverseZone']).".in-addr.arpa";
- $base = "zoneName=".$zone['zoneName'].",".$HostDn;
- $newRDn = "zoneName=".$zone['ReverseZone'].",".$base;
- $rObj = $obj;
- $rObj['zoneName']= $zone['ReverseZone'];
- $add[$newRDn] = $rObj;
-
- /* Remove currently managed zone from oldZones.
- * this gives us the ability to detect removed zones
- */
- if(isset($oldZones[$zone['InitialzoneName']])){
- unset($oldZones[$zone['InitialzoneName']]);
- }
- }
-
- /* The rest of our oldZones must be deleted
- * because they are no longer available in newZones anymore.
- */
- foreach($oldZones as $zone) {
- $oldDn = "zoneName=".$zone['InitialzoneName'].",".$HostDn;
- $del[$oldDn] = $zone;
- }
-
- /* Check for entries which must be updated
- */
- $zoneUpdates = array();
- $udpate = array();
- if(count($PrePareZoneEntries)){
- $ldap = $config->get_ldap_link();
- foreach($PrePareZoneEntries as $FromZoneName => $ToZoneName){
- $ldap->cd($HostDn);
- $ldap->search("(&(objectClass=dNSZone)(zoneName=".$FromZoneName.")(!(relativeDomainName=@)))",array("zoneName"));
- while($attrs = $ldap->fetch()){
- $zoneUpdates[$attrs['dn']] = array("zoneName"=>$ToZoneName);
- }
- }
- }
-
- $ret = array("del" => $del , "move" => $move , "add" => $add,"zoneUpdates"=>$zoneUpdates);
- return($ret);
- }
-
-
- /* This static function returns the dns-host eintries for given
- * name.
- */
- static function getDNSHostEntries($config,$name,$silent = false)
- {
- global $RecordTypes;
-
- $types = array();
- $ret = array();
- $ret['RECORDS'] = array();
- $ret['dNSClass'] = "IN";
- $ret['zoneName'] = "";
- $ret['dNSTTL'] = "7440";
- $ret['exists'] = false;
-
- $ldap = $config->get_ldap_link();
- $ldap->cd($config->current['BASE']);
-
- /* First check all zones for an entry with the given name.
- * If the name occurs in more than one entry alert the user ...
- */
- $foundIn = array();
- $zones = DNS::getAvailableZones($config);
-
- $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]);
- }
-
- foreach($zonesArr as $nameServer => $nameServerArr){
- $foundInTmp = array();
- foreach($nameServerArr as $zoneArr => $zone){
- $zoneMix = $nameServer."/".$zone;
- $zoneDn = DNS::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
- */
- if(count($foundIn) == 0){
- return($ret);
- }
-
- /* Get host informations from zone
- */
- $id_tmp = key($foundIn);
- $ldap->cd($foundIn[$id_tmp]);
- $ldap->search("(&(objectClass=dNSZone)(zoneName=*)(!(relativeDomainName=@)))",array("*"));
- while($attrs = $ldap->fetch()){
-
- /* If relative domainname == cn
- * Try to read dnsclass / TTl / zone
- */
- if($attrs['relativeDomainName'][0] == $name){
- $ret['exists'] = true;
- $ret['zoneName'] = $id_tmp;
- foreach(array("dNSClass","dNSTTL") as $atr){
- if(isset($attrs[$atr][0])){
- $ret[$atr] = $attrs[$atr][0];
- }
- }
- }
-
- /* Create list with all used records */
- foreach($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 ++){
- $types[] = array( "type" => $name,
- "value" => $attrs[$value][$i]);
- }
- }
- }
- $ret['RECORDS'] = $types;
- }
- return($ret);
- }
-
-
-
- /* This static function compares two dns settings and returns an
- * array with following indexes
- * - delete, for dns which must be deleted (only if dns account is removed)
- * - rename, if a dn must be renamed, for example, the relativeDomainName has changed
- * - add, if there is a new dns account created
- */
- static function getDNSHostEntriesDiff($config,$oldName,$newEntry,$newName)
- {
- global $RecordTypes;
-
- $oldEntry = getDNSHostEntries($config,$oldName);
-
- $add = array();
- $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 = DNS::getAvailableZones($config);
- $specialAttributes = array("cNAMERecord","pTRRecord");
- $newRecords = array(); // Used to remember which records are removed
- $zoneNameMix = $newEntry['zoneName'];
- $zoneDn = DNS::getDNSZoneDN($config,$zoneNameMix);
- $tmp = array_flip($zones);
- $zoneName = DNS::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 = DNS::getDNSZoneDN($config,$reverseNameMix);
- if(empty($reverseDn)){
- $newEntry['exists'] = false;
- }
- }else{
- $newEntry['exists'] = false;
- }
-
- /* If account was edited prepare some
- * attributes & arrays ... if required add some
- * dns to $move
- */
- if($oldEntry['exists']){
-
- /* Check if the account was removed
- */
- if($newEntry['exists'] == false){
- $dn = "relativeDomainName=".$oldName.",".DNS::getDNSZoneDN($config,$oldEntry['zoneName']);
- $del[$dn] ="";
- return(array("move"=>$move,"add"=>$add,"del"=>$del));
- }
-
- /* Check if zoneName has changed
- */
- if(count($newEntry['RECORDS'])){
- if($oldEntry['zoneName'] != $newEntry['zoneName']){
- $oldzoneDn = DNS::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;
- }
- }
-
- /* 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=".$newName.",".DNS::getDNSZoneDN($config,$oldEntry['zoneName']);
- $del[$dn] ="";
- $ret = array("move"=>$move,"add"=>$add,"del"=>$del);
- return($ret);
- }
-
- /* Prepare temp obj
- */
- $baseObj = array();
- $baseObj['objectClass'] = array("top","dNSZone");
- $baseObj['dNSTTL'] = $newEntry['dNSTTL'];
- $baseObj['dNSClass'] = $newEntry['dNSClass'];
- $baseObj['zoneName'] = $zoneName;
- $baseObj['relativeDomainName']= $newName;
-
- /* Add Container Object to zone
- * (this possibly already exists, check this before writing to ldap)
- */
- $baseDn = "relativeDomainName=".$newName.",".$zoneDn;
- $add[$baseDn] = $baseObj;
-
- /* Add base obejct which contains all std records
- */
- $stdDn = "relativeDomainName=".$newName.",".$baseDn;
- $add[$stdDn] = $baseObj;
-
- /* Set defaults. Normaly only contains old record names.
- * The old names will be set to array, to ensure that they will be deleted.
- * Or overwritten and filled with new values.
- */
- foreach($newRecords as $name => $def){
- if(!in_array($name,$specialAttributes)){
- $add[$stdDn][$name] = $def;
- }
- }
-
- /* Delete all OLD special attributes.
- */
- foreach($oldEntry['RECORDS'] as $id => $rec){
- if(in_array($rec['type'],$specialAttributes)){
- $deldn= "relativeDomainName=".$rec['value'].",".$baseDn;
- $del[$deldn] = "";
- }
- }
-
-
- /* Create new record entries
- */
- foreach($newEntry['RECORDS'] as $id => $rec){
- /* Create object which contains special records
- * like pTRRecord or CNAMERecord
- */
- if($rec['type'] == "pTRRecord"){
- $PTRdn= "relativeDomainName=".DNS::FlipIP($rec['value']).",".$baseDn;
- $ptrObj = $baseObj;
- $reverseName = DNS::getNameFromMix($reverseNameMix);
- $ptrObj['zoneName'] = $reverseName;
- if(!preg_match("/\.$/",$newName)){
- $ptrObj['pTRRecord'] = preg_replace("/\.\.$/",".",$newName.".".$zoneName.".");
- }else{
- $ptrObj['pTRRecord'] = preg_replace("/\.\.$/",".",$newName.".");
- }
- $ptrObj['relativeDomainName'] = DNS::FlipIP($rec['value']);
-
- $add[$PTRdn] = $ptrObj;
- }else
- if($rec['type'] == "cNAMERecord"){
- $PTRdn= "relativeDomainName=".$rec['value'].",".$baseDn;
- $ptrObj = $baseObj;
- $ptrObj['zoneName'] = $zoneName;
- $ptrObj['cNAMERecord'] = $newName;
- $ptrObj['relativeDomainName'] = $rec['value'];
-
- $add[$PTRdn] = $ptrObj;
- }else{
- /* Append basic attributes
- */
- $add[$stdDn][$rec['type']][] = $rec['value'];
- }
- } // foreach record
-
- $ret = array("move"=>$move,"add"=>$add,"del"=>$del);
- return($ret);
- }
-
- static function getNameFromMix($zoneMix){
- $ret = "";
- if(!strstr($zoneMix, '/')) return($ret);
- $zoneIndex = split("/",$zoneMix);
- return($zoneIndex[1]);
- }
-
- /* returns the dn for a specified zone
- */
- static function getDNSZoneDN($config,$zoneNameMix)
- {
- $ret = "";
- if(!strstr($zoneNameMix, '/')) {
- msg_dialog::display(_("Error"), sprintf(_("Undefined zone name '%s'!"),$zoneNameMix), ERROR_DIALOG);
- 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);
- }
-
-
- /* returns all available zones
- * array[reverseName] = zoneName;
- */
- static function getAvailableZones($config)
- {
- $ret = array();
- $ldap = $config->get_ldap_link();
- $ldap->cd ($config->current['BASE']);
-
- /* Search for zones ...
- */
- $ldap->search("(&(objectClass=dNSZone)(sOARecord=*))",array("zoneName"));
-
- $ForwardZones = array();
- $ReverseZones = array();
- $zones = array();
-
- while($at = $ldap->fetch()){
- if(preg_match("/\.in\-addr\.arpa/",$at['zoneName'][0])){
- $ReverseZones[$at['dn']] = $at;
- }else{
- $ForwardZones[$at['dn']] = $at;
- }
- }
-
- foreach($ForwardZones as $dn => $obj){
-
- /* try to find reverse
- */
- foreach($ReverseZones as $Rdn => $Robj ){
- if(preg_match("/".$dn."/",$Rdn)){
- $zones[strtoupper($ldap->getCn($dn))."/".$Robj['zoneName'][0]] =
- strtoupper($ldap->getCn($dn))."/".$obj['zoneName'][0];
- }
- }
- }
- return($zones);
- }
-}
-// vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler:
-?>
diff --git a/gosa-core/plugins/admin/systems/services/dns/class_servDNS.inc b/gosa-core/plugins/admin/systems/services/dns/class_servDNS.inc
+++ /dev/null
@@ -1,598 +0,0 @@
-<?php
-
-class servdns extends goService
-{
- /* 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");
-
- /* attribute list for save action */
- var $ignore_account = FALSE;
- var $attributes = array();
- var $objectclasses = array("whatever");
-
- var $RecordTypes = array();
- var $Zones = array();
-
- var $orig_dn = "";
-
- var $initially_was_account;
-
- /* ServerService tab vars */
- var $conflicts = array("servdns");
- var $DisplayName = "";
- var $StatusFlag = "";
- var $view_logged = FALSE;
-
- var $dns_server_list = array("ENTRIES"=> array(),"FOR_LIST"=> array());
- var $take_over_id = -1;
-
-
- function servdns (&$config, $dn= NULL, $parent= NULL)
- {
- plugin::plugin ($config, $dn, $parent);
-
- $this->DisplayName = _("DNS service");
-
- $this->orig_dn = $dn;
-
- /* Get record types for zones
- */
- $this->RecordTypes = DNS::getDnsRecordTypes(true);
-
- /* Get all zone Informations
- */
- $this->Zones = DNS::getDNSZoneEntries($config,$dn);
-
- /* If there is at least one entry in this -> types, we have DNS enabled
- */
- if(count($this->Zones) == 0){
- $this->is_account = false;
- $this->dns_server_list = $this->get_list_of_dns_servers();
- }else{
- $this->is_account = true;
- }
- $this->initially_was_account = $this->is_account;
- }
-
-
- function get_list_of_dns_servers()
- {
- $ret = array("ENTRIES"=> array(),"FOR_LIST"=> array());
- $ldap = $this->config->get_ldap_link();
- $ldap->cd($this->config->current['BASE']);
- $ldap->search("(&(objectClass=dNSZone)(zoneName=*))",array("dn","zoneName"));
- $dns = array();
- while($attrs = $ldap->fetch()){
- /* Skip own config */
- if($this->dn != "new" && preg_match("/".normalizePreg($this->dn)."$/",$attrs['dn'])){
- continue;
- }
- $dn = preg_replace("/^zoneName=[^,]+,/","",$attrs['dn']);
- if(preg_match("/^cn=/",$dn) && !in_array($dn,$dns)){
- $dns[] = $dn;
- }
- }
- $i = 0;
- foreach($dns as $dn){
- $ldap->cat($dn,array('*'));
- if($ldap->count()){
- $i ++;
- $attrs = $ldap->fetch();
- $ret['ENTRIES'][$i] = $attrs;
- $ret['FOR_LIST'][$i] = $attrs['cn'][0];
- }
- }
- return($ret);
- }
-
-
- function get_dns_info_string($id)
- {
- $ret="";
- $ldap = $this->config->get_ldap_link();
- $ldap->cd($this->dns_server_list['ENTRIES'][$id]['dn']);
- $ldap->search("(|(zoneName=*)(relativeDomainName=*))",array("dn"));
- while($attrs = $ldap->fetch()){
- $ret .= $attrs['dn']."\n";
- }
- return($ret);
- }
-
-
- function execute()
- {
- /* Call parent execute
- */
- plugin::execute();
-
- if($this->is_account && !$this->view_logged){
- $this->view_logged = TRUE;
- new log("view","server/".get_class($this),$this->dn);
- }
-
- /* Fill templating stuff
- */
- $smarty= get_smarty();
- $smarty->assign("dns_take_over",FALSE);
- $smarty->assign("is_createable",$this->acl_is_createable());
- $display= "";
-
-
- $this->initially_was_account= $this->is_account;
- /*****************/
- /* Handle Take Over Actions
- /*****************/
-
- /* Give smarty the required informations */
- $smarty->assign("dns_server_list", $this->dns_server_list['FOR_LIST']);
- $smarty->assign("dns_server_list_cnt", count($this->dns_server_list['FOR_LIST']));
-
- /* Take over requested, save id */
- if(isset($_POST['take_over_src']) && isset($_POST['take_over'])){
- $id = $_POST['take_over_src'];
- if(isset($this->dns_server_list['ENTRIES'][$id])){
- $this->take_over_id = $id;
- }
- }
-
- /* Abort take over action */
- if(isset($_POST['cancel_take_over'])){
- $this->dialog =false;
- $this->take_over_id = -1;
- $this->dns_server_list = $this->get_list_of_dns_servers();
- }
-
- /* Display informartion about take over that will be started when saving this server
- * and hide default dns output
- */
- if($this->take_over_id != -1){
- $this->dialog = FALSE;
- $id = $this->take_over_id;
- $info = $this->get_dns_info_string($id);
- $smarty->assign("dns_take_over",TRUE);
- $smarty->assign("info",$info);
- $warning = sprintf(_("You are going to migrate the DNS setup from server '%s'."),$this->dns_server_list['ENTRIES'][$id]['cn'][0]);
- $warning2 = _("The migration will be startet when you save this system. To cancel this action, use the cancel button below.");
- $smarty->assign("warning",$warning);
- $smarty->assign("warning2",$warning2);
- return($smarty->fetch(get_template_path('servdns.tpl', TRUE)));
- }
-
-
- /* Do we need to flip is_account state?
- */
- if (isset($_POST['modify_state'])){
- $this->is_account= !$this->is_account;
- }
-
- if ($this->is_account){
- $display= $this->show_disable_header(_("Remove DNS service"),
- _("This server has DNS features enabled. You can disable them by clicking below."));
- } else {
- $display= $this->show_enable_header(_("Add DNS service"),
- _("This server has DNS features disabled. You can enable them by clicking below."));
- return ($display);
- }
-
-
- /* Edited or Added zone
- */
- if(isset($_POST['SaveZoneChanges'])){
- $this->dialog->save_object();
-
- /* Check for errors
- */
- if(count($this->dialog->check())){
- foreach($this->dialog->check() as $msgs){
- print_red($msgs);
- }
- }else{
- /* add new/edited zone
- */
- $ret = $this->dialog->save();
- if(!$this->dialog->isNew){
- unset($this->Zones[$this->dialog->OldZoneName]);
- }
- $this->Zones[$ret['zoneName']] = $ret;
- $this->dialog = FALSE;
- }
- }
-
- /* Cancel zone edit / new
- */
- if(isset($_POST['CancelZoneChanges'])){
- $this->dialog = FALSE;
- }
-
- /* Add empty new zone
- */
- if(isset($_POST['AddZone'])){
- $this->dialog = new servdnseditZone($this->config,$this->dn);
- }
-
- /* Check for edit zone request
- */
- $once = false;
- foreach( $_POST as $name => $value){
-
- /* check all post for edit request
- */
- if(preg_match("/^editZone_/",$name)&&!$once){
- $once =true;
- $tmp = preg_replace("/^editZone_/","",$name);
- $tmp = base64_decode(preg_replace("/_.*$/","",$tmp));
- $this->dialog= new servdnseditZone($this->config,$this->dn,$this->Zones[$tmp]);
- }
-
- /* check posts for delete zone
- */
- if(preg_match("/^delZone_/",$name)&&!$once){
-
- $once =true;
- $tmp = preg_replace("/^delZone_/","",$name);
- $tmp = base64_decode(preg_replace("/_.*$/","",$tmp));
-
- /* Initiate deletion
- */
- $this->RemoveZone($tmp);
- }
- }
-
- if(isset($_GET['act']) && $_GET['act'] == "edit" && isset($_GET['id'])){
- $id = base64_decode($_GET['id']);
- if(isset($this->Zones[$id])){
- $this->dialog= new servdnseditZone($this->config,$this->dn,$this->Zones[$id]);
- }
- }
-
- if(isset($_GET['act']) && $_GET['act'] == "edit" && isset($_GET['id'])){
- $id = base64_decode($_GET['id']);
- if(isset($this->Zones[$id])){
- $this->dialog= new servdnseditZone($this->config,$this->dn,$this->Zones[$id]);
- }
- }
-
- /* Show dialog
- */
- if(is_object($this->dialog)){
- $this->dialog->save_object();
- $this->dialog->parent = $this;
- return($this->dialog->execute());
- }
-
- /* Create Listbox with existing Zones
- */
- $ZoneList = new divSelectBox("dNSZones");
- $ZoneList -> SetHeight(254);
-
- /* Add entries to divlist
- */
- $editImg = "<input type='image' src='images/edit.png' name='editZone_%s'>";
- if($this->acl_is_removeable()){
- $editImg.= "<input type='image' src='images/edittrash.png' name='delZone_%s'>";
- }
-
- $link = "<a href='?plug=".$_GET['plug']."&act=edit&id=%s'>%s</a>";
- foreach($this->Zones as $zone => $values ){
- $ZoneList->AddEntry(array(
- array("string" => sprintf($link,base64_encode($zone),($zone))),
- array("string" => sprintf($link,base64_encode($zone),_("Reverse zone")." : ".($values['ReverseZone']))),
- array("string" => _("TTL")." : ".$values['sOAttl']),
- array("string" => _("Class")." : ".$values['dNSClass']),
- array("string" =>str_replace("%s",base64_encode($zone),$editImg))
- ));
- }
-
- /* Display tempalte
- */
- $smarty->assign("ZoneList",$ZoneList->DrawList());
- $display.= $smarty->fetch(get_template_path('servdns.tpl', TRUE));
- return($display);
- }
-
-
- /* Delete specified zone
- */
- function RemoveZone($id)
- {
- $zones = $this->getUsedZoneNames();
-
- if(isset($this->Zones[$id]['InitialReverseZone'])){
- $rev = DNS::FlipIp($this->Zones[$id]['InitialReverseZone']);
- }else{
- $rev = DNS::FlipIp($this->Zones[$id]['ReverseZone']);
- }
-
- $zonename = "";
- if(isset($this->Zones[$id]['InitialzoneName'])){
- $zonename= $this->Zones[$id]['InitialzoneName'];
- }
-
- $used = array();
-
- /* Add Records which use this zoneName
- */
- if(isset($zones[$zonename])){
- $used = array_merge($used,$zones[$zonename]);
- }
-
- /* Add Records which uses this reverse zone
- */
- if(isset($zones[$rev.".in-addr.arpa"])){
- $used = array_merge($used,$zones[$rev.".in-addr.arpa"]);
- }
-
- /* There are still entries using this configuration
- * Abort deletion
- */
- if(count($used)){
- $i = 2;
- $str ="";
- foreach($used as $dn){
- if($i > 0 && !preg_match("/,relativeDomainName=/",$dn)){
- $i --;
- $name = preg_replace("/^[^=]+=([^,]*),.*$/","\\1",$dn);
- $zone = preg_replace("/^.*zoneName=([^,]*),.*$/","\\1",$dn);
- $str.= $name.".".$zone." ";
- }
- }
-
- /* Only show 2 dns in the error message
- */
- if(count($used)> 2) {
- $str .=" ... ";
- }
- print_red(sprintf(_("Can't delete the selected zone, because it is still in use by these entry/entries '%s'"),trim($str)));
- return(false);
- }else{
- unset($this->Zones[$id]);
- return(true);
- }
- }
-
-
- /* This funtion returns all used Zonenames
- */
- function getUsedZoneNames()
- {
- $ret = array();
- $ldap = $this->config->get_ldap_link();
- $ldap->cd($this->config->current['BASE']);
- $ldap->search("(&(objectClass=dNSZone)(!(relativeDomainName=@))(zoneName=*))",array("zoneName","relativeDomainName"));
- while($attr = $ldap->fetch()){
- $ret[$attr['zoneName'][0]][] = $attr['dn'];
- }
- return($ret);
- }
-
-
- /* Remove dns service
- */
- function remove_from_parent()
- {
- if($this->initially_was_account){
- $bool = true;
- $this->is_account = FALSE;
- foreach($this->Zones as $key => $zone){
- $bool= $bool & $this->RemoveZone($key);
- }
-
- if($bool){
- $this->save();
- }
- return($bool);
- }
- }
-
-
- /* Save to LDAP */
- function save()
- {
-
- /* Take over handling
- * - Create list of zones managed by source server
- * - Copy ldap entries to destination server
- * - Remove old zone entries from source
- */
- if($this->take_over_id != -1){
- $del = array();
- $id = $this->take_over_id;
- $src = $this->dns_server_list['ENTRIES'][$id]['dn'];
- $ldap = $this->config->get_ldap_link();
- $ldap->ls("(objectClass=dnsZone)",$src,array('cn'));
- while($attrs = $ldap->fetch()){
- $src_zone = $attrs['dn'];
- $dst_zone = preg_replace("/".normalizePreg($src)."$/",$this->dn,$src_zone);
- $res = plugin::recursive_move($src_zone, $dst_zone);
-
- if($res){
- $del [] = $src_zone;
- }
- }
- foreach($del as $src_zone){
- $ldap->rmdir_recursive($src_zone);
- }
- return;
- }
-
- /* Save zone editor changes now */
- foreach($this->Zones as $name => $zone){
- if(isset($zone['zoneEditor'] ) && $zone['zoneEditor'] != NULL && is_object($zone['zoneEditor'])){
- $zone['zoneEditor']->save();
- unset($this->Zones[$name]['zoneEditor']);;
- }
- }
-
- $ldap = $this->config->get_ldap_link();
- $ldap->cd($this->config->current['BASE']);
-
- /* Get differences
- */
- $old_dn = $this->orig_dn;
- if($old_dn == "new"){
- $old_dn = $this->dn;
- }
-
- $tmp = DNS::getDNSZoneEntriesDiff($this->config,$this->Zones,$old_dn);
-
- /* Update dns to current object dn */
- $tmp = DNS::getDNSZoneEntriesDiff($this->config,$this->Zones,$old_dn);
- $tmp2 = array();
- foreach($tmp as $key1 => $data1){
- $tmp2[$key1] = array();
- foreach($data1 as $key2 => $data2){
- $tmp2[$key1][preg_replace("/".normalizePreg($old_dn)."$/",$this->dn,$key2)] = $data2;
- }
- }
- $tmp = $tmp2;
-
- /* Updated zone entries if reverser or forward name has changed
- * Must be done before moving entries, else the given dn is invalid
- */
- if(isset($tmp['zoneUpdates'])){
- foreach($tmp['zoneUpdates'] as $dn => $attrs){
- $ldap->cd($dn);
- $ldap->modify($attrs);
- new log("modfiy","unknown/".get_class($this),$this->dn,array_keys($this->attrs),$ldap->get_error());
- show_ldap_error($ldap->get_error(), sprintf(_("Updating of system server/dns with dn '%s' failed."),$this->dn));
- }
- }
-
- /* Delete dns
- */
- foreach($tmp['del'] as $dn => $del){
-
- $for = $del['InitialzoneName'];
- $rev = DNS::FlipIp($del['InitialReverseZone']).".in-addr.arpa";
-
- $ldap->cd($dn);
- $ldap->rmdir_recursive($dn);
- new log("remove","unknown/".get_class($this),$this->dn,array_keys($this->attrs),$ldap->get_error());
- show_ldap_error($ldap->get_error(), sprintf(_("Removing of system server/dns with dn '%s' failed."),$this->dn));
-
- /* Handle Post events */
- if(preg_match("/^zoneName=/",$dn)){
-# $this->handle_post_events("remove",array("dn" => $dn,"zoneName" => $for));
-# $this->handle_post_events("remove",array("dn" => $dn,"zoneName" => $rev));
- }
- }
-
- /* move follwoing entries
- */
- foreach($tmp['move'] as $src => $dst){
- $this->recursive_move($src,$dst);
- }
-
- /* Add || Update new DNS entries
- */
- foreach($tmp['add'] as $dn => $attrs){
- $ldap->cd($dn);
- $ldap->cat($dn, array('dn'));
- if($ldap->fetch()){
- $ldap->cd($dn);
- $ldap->modify ($attrs);
- show_ldap_error($ldap->get_error(), sprintf(_("Saving of system server/dns with dn '%s' failed."),$this->dn));
-
- /* Handle Post events */
- if(preg_match("/^zoneName=/",$dn)){
-# $this->handle_post_events("modify",array("dn" => $dn,"zoneName" => $attrs['zoneName']));
- }
- }else{
- $ldap->cd($dn);
- $ldap->add($attrs);
- show_ldap_error($ldap->get_error(), sprintf(_("Saving of system server/dns with dn '%s' failed."),$this->dn));
-
- /* Handle Post events */
- if(preg_match("/^zoneName=/",$dn)){
-# $this->handle_post_events("add",array("dn" => $dn,"zoneName" => $attrs['zoneName']));
- }
- }
- }
- $this->handle_post_events("modify");
- }
-
-
- /* Directly save new status flag */
- function setStatus($value)
- {
- if($value == "none") return;
- if(!$this->initially_was_account) return;
- if(empty($this->StatusFlag)) return;
- $ldap = $this->config->get_ldap_link();
- $ldap->cd($this->dn);
- $ldap->cat($this->dn,array("objectClass"));
- if($ldap->count()){
-
- $tmp = $ldap->fetch();
- for($i = 0; $i < $tmp['objectClass']['count']; $i ++){
- $attrs['objectClass'][] = $tmp['objectClass'][$i];
- }
- $flag = $this->StatusFlag;
- $attrs[$flag] = $value;
- $this->$flag = $value;
- $ldap->modify($attrs);
- show_ldap_error($ldap->get_error(), sprintf(_("Set status flag for system server/dns with dn '%s' failed."),$this->dn));
- $this->action_hook();
- }
- }
-
-
- function getListEntry()
- {
- $fields = goService::getListEntry();
- $fields['Message'] = _("DNS service");
- $fields['AllowEdit'] = true;
- return($fields);
- }
-
-
- /* Get updates for status flag */
- function updateStatusState()
- {
- if(empty($this->StatusFlag)) return;
-
- $attrs = array();
- $flag = $this->StatusFlag;
- $ldap = $this->config->get_ldap_link();
- $ldap->cd($this->cn);
- $ldap->cat($this->dn,array($flag));
- if($ldap->count()){
- $attrs = $ldap->fetch();
- }
- if(isset($attrs[$flag][0])){
- $this->$flag = $attrs[$flag][0];
- }
- }
-
-
- /* Return plugin informations for acl handling */
- static function plInfo()
- {
- return (array(
- "plShortName" => _("DNS service"),
- "plDescription" => _("DNS service")." ("._("Services").")",
- "plSelfModify" => FALSE,
- "plDepends" => array(),
- "plPriority" => 83,
- "plSection" => array("administration"),
- "plCategory" => array("server"),
-
- "plProvidedAcls"=> array(
- "zoneName" =>_("Zone name"),
- "ReverseZone" =>_("Reverse zone"),
- "sOAprimary" =>_("Primary dns server"),
- "sOAmail" =>_("Mail address"),
- "sOAserial" =>_("Serial"),
- "sOArefresh" =>_("Refresh"),
- "sOAretry" =>_("Retry"),
- "sOAexpire" =>_("Expire"),
- "sOAttl" =>_("TTL"),
- "zoneRecords" =>_("Zone records"))
- ));
- }
-
-}
-// vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler:
-?>
diff --git a/gosa-core/plugins/admin/systems/services/dns/class_servDNSeditZone.inc b/gosa-core/plugins/admin/systems/services/dns/class_servDNSeditZone.inc
+++ /dev/null
@@ -1,603 +0,0 @@
-<?php
-
-class servdnseditZone 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");
-
- /* attribute list for save action */
- var $ignore_account= TRUE;
- var $attributes = array("zoneName","ReverseZone","dNSClass",
- "sOAprimary","sOAmail","sOAserial","sOArefresh","sOAretry","sOAexpire","sOAttl");
- var $objectclasses = array("whatever");
-
- var $RecordTypes = array();
-
- var $ReverseZone = "";
- var $zoneName = "";
- var $dNSClass = "IN";
-
- var $sOAprimary = "";
- var $sOAmail = "";
- var $sOAserial = "";
- var $sOArefresh = "3600";
- var $sOAretry = "1800";
- var $sOAexpire = "720000";
- var $sOAttl = "6400";
-
- var $Records = array();
- var $mXRecords = array();
-
- var $OldZoneName = ""; // To detect changes made with this edit
- var $OldReverseZone = "";
-
- var $InitialReverseZone = "";
- var $InitialzoneName = "";
- var $NetworkClass = "A" ; // One out of A,B,C
-
- var $dialog = false;
-
- var $zoneEditor = NULL;
-
- var $isNew = true;
-
- var $ZoneObject = array();
-
- function servdnseditZone (&$config, $dn= NULL,$attrs = array())
- {
- plugin::plugin ($config, $dn);
-
- /* All types with required attrs */
- $this->RecordTypes = DNS::getDnsRecordTypes(true);
-
- if(!count($attrs)){
- $this->OldZoneName = "";
- $this->OldReverseZone = "";
- $this->isNew = true;
- $this->sOAserial = date("Ymd")."1";
-
- $this->InitialzoneName = "";//$attrs['InitialzoneName'];
- $this->InitialReverseZone = "";//$attrs['InitialReverseZone'];
- }else{
- $this->ZoneObject = $attrs;
-
- if(isset($attrs['zoneEditor'])){
- $this->zoneEditor = $attrs['zoneEditor'];
- }
- $this->OldZoneName = $attrs['zoneName'];
- $this->OldReverseZone = $attrs['ReverseZone'];
-
- $this->InitialzoneName = $attrs['InitialzoneName'];
- $this->InitialReverseZone = $attrs['InitialReverseZone'];
-
- $this->isNew = false;
-
- foreach($this->attributes as $value){
- $this->$value = $attrs[$value];
- }
-
- $this->sOAmail = preg_replace("/\./","@",$this->sOAmail,1);
- $this->sOAmail = preg_replace("/\.$/","",$this->sOAmail);
- $this->sOAprimary = preg_replace("/\.$/","",$this->sOAprimary);
- $this->zoneName = preg_replace("/\.$/","",$this->zoneName);
-
- if(isset($attrs['RECORDS'])){
- $this->Records = $attrs['RECORDS'];
-
- $tmp2 = array();
- $usedPrio = array();
- foreach($this->Records as $key => $rec){
- if($rec['type'] == "mXRecord"){
- $tmp = split(" ",$rec['value']);
- $rec['value'] = $tmp[1];
- $tmp2[$tmp[0]] = $rec;
- unset($this->Records[$key]);
- }
- if($rec['type'] == "nSRecord"){
- unset($this->Records[$key]);
- }
- }
- if(count($tmp2) != 0){
- reset($tmp2);
- ksort($tmp2);
- }
- $this->mXRecords = $tmp2;
- }else{
- $this->mXRecords = array();
- $this->Records = array();
- }
-
- $str = date("Ymd");
- if(preg_match("/^".$str."/",$this->sOAserial)){
- $this->sOAserial = $this->sOAserial + 1;
- }else{
- $this->sOAserial = date("Ymd")."01";
- }
- }
-
- /* Detect Network class */
- if(!empty($this->ReverseZone)){
-
- $dots = count(split("\.",$this->ReverseZone));
- if($dots == 1){
- $this->NetworkClass = "A";
- $this->ReverseZone .= ".0.0.0";
- }elseif($dots == 2){
- $this->NetworkClass = "B";
- $this->ReverseZone .= ".0.0";
- }else{
- $this->NetworkClass = "C";
- $this->ReverseZone .= ".0";
- }
- }
- }
-
- /* TRansports the geiven Arraykey one position up*/
- function ArrayUp($atr,$attrs)
- {
- $ret = $attrs;
- $pos = $atr ;
- $cn = count($attrs);
- if(!(($pos == -1)||($pos == 1)||($pos >$cn))){
- $before = array_slice($attrs,0,($pos-2));
- $mitte = array_reverse(array_slice($attrs,($pos-2),2));
- $unten = array_slice($attrs,$pos);
- $ret = array();
- $ret = $this->combineArrays($before,$mitte,$unten);
- }
- return($ret);
- }
-
-
- /* TRansports the geiven Arraykey one position up*/
- function ArrayDown($atr,$attrs)
- {
- $ret = $attrs;
- $pos = $atr ;
- $cn = count($attrs);
- if(!(($pos == -1)||($pos == $cn))){
- $before = array_slice($attrs,0,($pos-1));
- $mitte = array_reverse(array_slice($attrs,($pos-1),2));
- $unten = array_slice($attrs,($pos+1));
- $ret = array();
- $ret = $this->combineArrays($before,$mitte,$unten);
- }
- return($ret);
- }
-
- /* Combine new array */
- function combineArrays($ar0,$ar1,$ar2)
- {
- $ret = array();
- if(is_array($ar0))
- foreach($ar0 as $ar => $a){
- $ret[]=$a;
- }
- if(is_array($ar1))
- foreach($ar1 as $ar => $a){
- $ret[]=$a;
- }
- if(is_array($ar2))
- foreach($ar2 as $ar => $a){
- $ret[]=$a;
- }
- return($ret);
- }
-
- function getpos($atr,$attrs)
- {
- $i = 0;
- foreach($attrs as $attr => $name) {
- $i++;
- if($attr == $atr){
- return($i);
- }
- }
- return(-1);
- }
-
-
- function execute()
- {
- /* Call parent execute */
- plugin::execute();
-
-
-
- /* Fill templating stuff */
- $smarty= get_smarty();
- $ui = get_userinfo();
-
- $smarty->assign("ACLs",$this->parent->getacl(""));
- $display= "";
-
- /* Open Zone Entry Edit Dialog
- */
- if(!count($this->ZoneObject)){
- $smarty->assign("AllowZoneEdit" , false);
- }else{
- $smarty->assign("AllowZoneEdit" , true);
- if(isset($_POST['EditZoneEntries'])){
- if($this->zoneEditor == NULL){
- $this->zoneEditor= new servDNSeditZoneEntries($this->config,$this->dn,$this->ZoneObject);
- $this->zoneEditor->parent = $this;
- }
- $this->dialog = $this->zoneEditor;
- }
- }
-
- /* Save Zone Entry Edit Dialog
- */
- if(isset($_POST['SaveZoneEntryChanges'])){
- $this->dialog->save_object();
- if(count($this->dialog->check())){
- $msgs = $this->dialog->check();
- foreach($msgs as $msg){
- print_red($msg);
- }
- }else{
- $this->zoneEditor = clone $this->dialog;
- $this->dialog = FALSE;
-# $rev = DNS::FlipIp(DNS::getNameFromMix($this->InitialReverseZone)).".in-addr.arpa";
-# $for = DNS::getNameFromMix($this->InitialzoneName);
-#
-# $this->parent->handle_post_events("modify",array("dn" => $this->dn,"zoneName" => $rev));
-# $this->parent->handle_post_events("modify",array("dn" => $this->dn,"zoneName" => $for));
-# $this->dialog = false;
- }
- }
-
- /* Cancel Zone Entrie Edit Dialog
- */
- if(isset($_POST['CancelZoneEntryChanges'])){
- $this->dialog = false;
- }
-
- /* Display any type of open dialogs
- */
- if(is_object($this->dialog)){
- $this->dialog->save_object();
- return($this->dialog->execute());
- }
-
- $once =true;
- foreach($_POST as $name => $value){
- if((preg_match("/^MXup_/",$name)) && ($once)){
- $once = false;
-
- $id = preg_replace("/^MXup_/","",$name);
- $id = preg_replace("/_.*$/","",$id);
- $id = base64_decode($id);
-
- $this->mXRecords = $this->ArrayUp(($id+1),$this->mXRecords);
- }
- if((preg_match("/^MXdown_/",$name)) && ($once)){
- $once = false;
-
- $id = preg_replace("/^MXdown_/","",$name);
- $id = preg_replace("/_.*$/","",$id);
- $id = base64_decode($id);
-
- $this->mXRecords = $this->ArrayDown(($id+1),$this->mXRecords);
- }
- if((preg_match("/^MXdel_/",$name)) && ($once)){
- $once = false;
-
- $id = preg_replace("/^MXdel_/","",$name);
- $id = preg_replace("/_.*$/","",$id);
- $id = base64_decode($id);
-
- unset($this->mXRecords[$id]);
-
- $tmp =array();
- foreach($this->mXRecords as $entry){
- $tmp[] = $entry;
- }
-
- $this->mXRecords = $tmp;
- }
- }
-
- if((isset($_POST['AddMXRecord'])) && (!empty($_POST['StrMXRecord']))){
- $this->mXRecords[] = array("type"=>"mXRecord","value"=>trim($_POST['StrMXRecord']));
- }
-
- /* Handle Post events */
- $once = true;
- foreach($_POST as $name => $value){
-
- /* Delete record if requested */
- if((preg_match("/RemoveRecord_/",$name))&&($once)){
- $once = false;
- $id= preg_replace("/RemoveRecord_/","",$name);
- unset($this->Records[$id]);
- }
- }
-
- /* Add new Zonerecord */
- if(isset($_POST['AddNewRecord'])){
- $this->Records[] = array("type"=>"aRecord","value"=>"");
- }
-
- /* Fill in values */
- foreach($this->attributes as $name){
- $smarty->assign($name,$this->$name);
- }
-
-
- $div = new divSelectBox("MxRecords");
- $div->setHeight(120);
- $recs = $this->mXRecords;
-
- $oneup = "<input name='MXup_%s' type='image' src='images/sort_up.png' title='"._("Up")."' class='center'> ";
- $onedown = "<input name='MXdown_%s' type='image' src='images/sort_down.png' title='"._("Down")."' class='center'> ";
- $onedel = "<img src='images/empty.png' width='20' class='center'>
- <input name='MXdel_%s' type='image' src='images/edittrash.png' title='"._("Delete")."' class='center'>";
-
- foreach($recs as $key => $rec){
- $div ->AddEntry(array(
- array("string"=>$rec['value']),
-/* array("string"=>$key,
- "attach"=>"style='width:20px;'"),*/
- array("string"=>str_replace("%s",base64_encode($key),$oneup.$onedown.$onedel),
- "attach"=>"style='width:70px;border-right:0px;'")
- ));
- }
-
- /* Assign records list */
- $smarty->assign("NotNew", false);
- $smarty->assign("Mxrecords", $div->DrawList());
- $smarty->assign("records" , $this->generateRecordsList());
- $smarty->assign("NetworkClass", $this->NetworkClass);
- $smarty->assign("NetworkClasses", array("A"=>"255.0.0.0 (Class A)","B"=>"255.255.0.0 (Class B)","C"=>"255.255.255.0 (Class C)"));
-
- /* Display tempalte */
- $display.= $smarty->fetch(get_template_path('servdnseditzone.tpl', TRUE));
- return($display);
- }
-
- function remove_from_parent()
- {
- }
-
- /* Save data to object */
- function save_object()
- {
- //plugin::save_object();
- foreach($this->attributes as $attr){
- if(isset($_POST[$attr])){
- $this->$attr = $_POST[$attr];
- }
- }
-
- foreach($this->Records as $id => $value){
- if(isset($_POST['RecordTypeSelectedFor_'.$id])){
- $this->Records[$id]['type'] = $_POST['RecordTypeSelectedFor_'.$id];
- }
- if(isset($_POST['RecordValue_'.$id])){
- $this->Records[$id]['value'] = $_POST['RecordValue_'.$id];
- }
- }
-
- if(isset($_POST['NetworkClass'])){
- $this->NetworkClass = $_POST['NetworkClass'];
- }
-
- }
-
-
- /* Check supplied data */
- function check()
- {
- /* Call common method to give check the hook */
- $message= plugin::check();
-
- /* Check if zoneName is already in use */
- $usedZones = $this->getUsedZoneNames();
- if(($this->isNew == true)||($this->zoneName != $this->InitialzoneName)||($this->ReverseZone != $this->InitialReverseZone)){
- /* if((isset($usedZones[$this->zoneName]))&&($this->zoneName != $this->InitialzoneName)){
- $message[] =_("This zoneName is already in use");
- }
- if((in_array($this->ReverseZone,$usedZones))&&($this->ReverseZone != $this->InitialReverseZone)){
- $message[] =_("This reverse zone is already in use");
- }*/
- }
-
- if(empty($this->zoneName)){
- $message[] =sprintf(_("Please choose a valid zone name."));
- }
-
- if(empty($this->ReverseZone)){
- $message[] =sprintf(_("Please choose a valid reverse zone name."));
- }
-
- if($this->zoneName != strtolower($this->zoneName)){
- $message[] = _("Only lowercase strings are allowed as zone name.");
- }
-
- if(!is_numeric($this->sOAserial)){
- $message[] = _("Please specify a numeric value for serial number.");
- }
-
- if(!is_numeric($this->sOArefresh)){
- $message[] = _("Please specify a numeric value for refresh.");
- }
-
- if(!is_numeric($this->sOAttl)){
- $message[] = _("Please specify a numeric value for ttl.");
- }
-
- if(!is_numeric($this->sOAexpire)){
- $message[] = _("Please specify a numeric value for expire.");
- }
-
- if(!is_numeric($this->sOAretry)){
- $message[] = _("Please specify a numeric value for retry.");
- }
-
- foreach($this->Records as $name => $values){
- /* 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']);
- }
- }
-
- /* Check class for given Zone Address */
- $addr = preg_replace("/^[^\/]*+\//","",$this->ReverseZone);
-
- /* Check for valid&complete IP address */
- if(!tests::is_ip($addr)){
- $message[] = _("The given network address is not a valid, please specify a valid IP address.");
- }
-
- /* Check if given address matches selected network class */
- switch($this->NetworkClass){
- case 'A': {
- if(!preg_match("/^[0-9]*\.0\.0\.0$/",$addr)){
- $message[] = sprintf(_("The specified network address is not matching with the specified zone class, try it this way x.0.0.0"));
- }
- }
- break;
- case 'B': {
- if(!preg_match("/^[0-9]*\.[0-9]*\.0\.0$/",$addr)){
- $message[] = sprintf(_("The specified network address is not matching with the specified zone class, try it this way x.x.0.0"));
- }
- }
- break;
- case 'C': {
- if(!preg_match("/^[0-9]*\.[0-9]*\.[0-9]*\.0$/",$addr)){
- $message[] = sprintf(_("The specified network address is not matching with the specified zone class, try it this way x.x.x.0"));
- }
- }
- break;
- default : $message[] =sprintf(_("The given network class '%s' is not valid."),$this->NetworkClass);
- }
-
- return ($message);
- }
-
- /* This funtion returns all used Zonenames */
- function getUsedZoneNames()
- {
- $ret = array();
- $ldap = $this->config->get_ldap_link();
- $ldap->cd($this->config->current['BASE']);
- $ldap->search("(&(objectClass=dNSZone)(relativeDomainName=@)(zoneName=*))",array("zoneName","tXTRecord"));
- while($attr = $ldap->fetch()){
- if(preg_match("/in-addr\.arpa/",$attr['zoneName'][0])){
- if(isset($attr['tXTRecord'][0])){
- $zn = preg_replace("/zoneName\=/","",$attr['tXTRecord'][0]);
- $ret[$zn] =DNS::FlipIp(preg_replace("/\.in-addr\.arpa/","",$attr['zoneName'][0]));
- }
- }else{
- $ret[$attr['zoneName'][0]]="";
- }
- }
- return($ret);
- }
-
- /* Save to LDAP */
- function save()
- {
- $ret =array();
- foreach($this->attributes as $name){
- $ret[$name] = $this->$name;
- }
-
- /* Create mx records
- */
- foreach($this->mXRecords as $key => $rec){
- $rec['value']= $key." ".$rec['value'];
- $this->Records [] = $rec;
- }
-
-
- $ret['RECORDS'] = $this->Records;
-
- switch($this->NetworkClass){
- case 'C' : $ret['ReverseZone']= preg_replace("/\.[0-9]*$/","",$this->ReverseZone);break;
- case 'B' : $ret['ReverseZone']= preg_replace("/\.[0-9]*\.[0-9]*$/","",$this->ReverseZone);break;
- case 'A' : $ret['ReverseZone']= preg_replace("/\.[0-9]*\.[0-9]*\.[0-9]*$/","",$this->ReverseZone);break;
- default : trigger_error("Invalid network class given '".$this->NetworkClass."'");
- }
-
- $ret['InitialReverseZone']= $this->InitialReverseZone;
- $ret['InitialzoneName'] = $this->InitialzoneName;
-
- $ret['sOAmail'] = preg_replace("/\@/",".",$this->sOAmail);
-
- foreach(array("sOAprimary","zoneName","sOAmail") as $attr){
- if(!preg_match("/\.$/",$ret[$attr])){
- if(!tests::is_ip($ret[$attr])){
- $ret[$attr] = $ret[$attr].".";
- }
- }
- }
-
- $ret['RECORDS'][] = array("type" => "nSRecord","value" => $ret['sOAprimary']) ;
-
- $ret['zoneEditor'] = $this->zoneEditor;
- return($ret);
- }
-
-
- /* This function generate a table row for each used record.
- This table row displays the recordtype in a select box
- and the specified value for the record, and a remove button.
- The last element of the table also got an 'add' button.
- */
- function generateRecordsList($changeStateForRecords="")
- {
- $changeStateForRecords = "";
-
- $str = "<table summary=''>";
- foreach($this->Records as $key => $entry){
-
- if($entry['type'] == "mXRecord") continue;
-
- $changeStateForRecords.= "changeState('RecordTypeSelectedFor_".$key."');\n";
- $changeStateForRecords.= "changeState('RecordValue_".$key."');\n";
- $changeStateForRecords.= "changeState('RemoveRecord_".$key."');\n";
-
- $str.=" <tr>".
- " <td>".$this->generateRecordListBox($entry['type'],"RecordTypeSelectedFor_".$key)."</td>".
- " <td><input type='text' value='".$entry['value']."' name='RecordValue_".$key."' id='RecordValue_".$key."'></td>".
- " <td><input type='submit' name='RemoveRecord_".$key."' value='"._("Delete")."' id='RemoveRecord_".$key."'></td>".
- "</tr>";
- }
-
- $str.= " <tr>".
- " <td colspan=2></td><td>".
- " <input type='submit' value='"._("Add")."' name='AddNewRecord'>".
- " </td>".
- " </tr>".
- "</table>";
- return($str);
- }
-
- /* This function generates a select box out of $this->RecordTypes options.
- The Parameter $selected is used to predefine an attribute.
- $name is used to specify a post name
- */
- function generateRecordListBox($selected,$name)
- {
- $str = "<select name='".$name."' id='".$name."'>";
- foreach($this->RecordTypes as $type => $value){
-
- if(preg_match("/^mXRecord$/i",$value)) continue;
-
- $use = "";
- if($type == $selected){
- $use = " selected ";
- }
- $str.="\n <option value='".$type."' ".$use.">".strtoupper(preg_replace("/record/i","",$type))."</option>";
- }
- $str.="</select>";
- return($str);
- }
-}
-
-// vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler:
-?>
diff --git a/gosa-core/plugins/admin/systems/services/dns/class_servDNSeditZoneEntries.inc b/gosa-core/plugins/admin/systems/services/dns/class_servDNSeditZoneEntries.inc
+++ /dev/null
@@ -1,498 +0,0 @@
-<?php
-
-class servDNSeditZoneEntries 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");
-
- /* attribute list for save action */
- var $ignore_account = TRUE;
- var $attributes = array();
- var $objectclasses = array("whatever");
-
- var $Devices = array();
-
- var $zoneName = ""; // ZoneName of currently edited Zone
- var $reverseName = ""; // ReverseZone of the currently edited Zone
-
- var $RecordTypes = array(); // Possible record type.
-
- var $disableDialog = false; // Dialog will be disabled, if this zone is new
-
- function servDNSeditZoneEntries (&$config,$dn, &$zoneObject)
- {
- plugin::plugin ($config, $dn);
-
- /* Initialise class
- */
- $this->RecordTypes = DNS::getDnsRecordTypes();
- $this->dn = "zoneName=".$zoneObject['InitialzoneName'].",".$dn;
- $this->zoneName = $zoneObject['InitialzoneName'];
- $this->reverseName = $zoneObject['InitialReverseZone'];
-
- /* Remove nSRecord from listed types */
- if(isset($this->RecordTypes['nSRecord'])){
- unset($this->RecordTypes['nSRecord']);
- }
- /* Remove nSRecord from listed types */
- if(isset($this->RecordTypes['pTRRecord'])){
- unset($this->RecordTypes['pTRRecord']);
- }
-
- /* Get ldap connection
- */
- $ldap = $this->config->get_ldap_link();
- $ldap->cd($this->config->current['BASE']);
-
- /* Get zone content
- */
- $ldap->ls("(&(objectClass=dNSZone)(!(relativeDomainName=@)))",$this->dn,array("relativeDomainName"));
-
- while($attrs = $ldap->fetch()){
- $this->Devices[$attrs['relativeDomainName'][0]] = DNS::getDNSHostEntries($config,$attrs['relativeDomainName'][0],true);
- $this->Devices[$attrs['relativeDomainName'][0]]['OrigCn'] = $attrs['relativeDomainName'][0];
- }
-
- $ldap->cat($this->dn,array("objectClass"));
-
- $this->disableDialog = true;
- if(count($this->Devices)|| $ldap->count()){
- $this->disableDialog = false;
- }
- }
-
- function execute()
- {
- plugin::execute();
-
- /* Fill templating stuff */
- $smarty= get_smarty();
- $display= "";
-
- $table = "";
- foreach($this->Devices as $key => $dev){
- $table .= $this->generateRecordConfigurationRow($key);
- }
-
- $smarty->assign("disableDialog",$this->disableDialog);
- $smarty->assign("table",$table);;
- $display.= $smarty->fetch(get_template_path('servDNSeditZoneEntries.tpl', TRUE));
- return($display);
- }
-
-
- function save_object()
- {
- /* Check posts for operations ...
- */
- $once = true;
- $ptr_updates = array();
- foreach($_POST as $name => $value){
-
- /* Add a new Record in given object
- */
-
- $tmp = preg_replace("/^.*_(.*)_.*$/","\\1",$name);
- $tmp2 = split("\|",$tmp);
-
- /* Add new host entry
- */
- if((preg_match("/^UserRecord_?/",$name)) && ($once)){
- $once = false;
- $entry = DNS::getDNSHostEntries($this->config,"",true);
- $entry['exists'] = true;
- $entry['zoneName'] = strtoupper($this->attrs['cn'][0])."/".$this->zoneName;
- $entry['RECORDS'][] = array("type" => "aRecord" , "value"=>"");
- $this->Devices[_("New entry")] = $entry;
- }
-
- if(count($tmp2) != 2) continue;
-
- $Name = base64_decode($tmp2[0]);
- $RecordID = $tmp2[1];
-
- /* Add new REcord
- */
- if((preg_match("/^AddRecord_/",$name)) && ($once)){
- $once = false;
- $this->Devices[$Name]['RECORDS'][] = $this->Devices[$Name]['RECORDS'][$RecordID];
- }
-
- /* Remove record from given dn
- */
- if((preg_match("/^RemoveRecord_/",$name)) && ($once)){
- $once = false;
- if(isset($this->Devices[$Name]['RECORDS'][$RecordID])){
- unset($this->Devices[$Name]['RECORDS'][$RecordID]);
- }
-
- /* Check if there is at least one visible record. Else remove complete entry */
- $visible = false;
- foreach($this->Devices[$Name]['RECORDS'] as $rec){
- if(in_array($rec['type'],$this->RecordTypes)){
- $visible = true;
- break;
- }
- }
- if(!$visible && isset($this->Devices[$Name]['RECORDS'])){
- $this->Devices[$Name]['RECORDS'] = array();
- }
- }
- }
-
- /* Possible attributes posted
- */
- foreach($_POST as $name => $value){
-
- /* Extract informations out of post name
- */
- $tmp = preg_replace("/^.*_/","\\1",$name);
- $tmp2 = split("\|",$tmp);
-
- if(count($tmp2) != 2) continue;
-
- $Name = base64_decode($tmp2[0]);
- $RecordID = $tmp2[1];
-
- /* Check for value change
- */
- if(preg_match("/ValueSelection_/",$name)){
- if(isset($this->Devices[$Name]['RECORDS'][$RecordID])){
-
- /* Update value */
- $old = $this->Devices[$Name]['RECORDS'][$RecordID]['value'];
- $this->Devices[$Name]['RECORDS'][$RecordID]['value'] = $value;
-
- /* Handle pTRRecord */
- if(!isset($ptr_updates[$Name]) && $this->Devices[$Name]['RECORDS'][$RecordID]['type'] == "aRecord"){
-
- $found = false;
- $ip = $value;
- $match = preg_replace("/^[^\/]*+\//","",$this->reverseName);
- $ip = preg_replace("/^".normalizePreg($match)."/","",$ip);
- $ip = preg_replace("/^\./","",$ip);
-
- foreach($this->Devices[$Name]['RECORDS'] as $key => $dev){
- if($dev['type'] == "pTRRecord"){
- $ptr_updates[$Name] = $Name;
- $this->Devices[$Name]['RECORDS'][$key]['value'] = $ip;
- $found = true;
- break;
- }
- }
- if(!$found){
- $dev = array('type'=> 'pTRRecord', 'value' => $ip);
- $this->Devices[$Name]['RECORDS'][] = $dev;
- }
- }
- }
- }
-
- /* record type changed
- */
- if(preg_match("/^RecordTypeSelection_/",$name)){
- if(isset($this->Devices[$Name]['RECORDS'][$RecordID])){
- $this->Devices[$Name]['RECORDS'][$RecordID]['type'] = $value;
- }
- }
- }
-
- /* check for renamed entries
- */
- foreach($_POST as $name => $value){
-
- /* Extract informations out of post name
- */
- $tmp = preg_replace("/^.*_/","\\1",$name);
- $tmp2 = split("\|",$tmp);
-
- if(count($tmp2) != 2) continue;
-
- $Name = base64_decode($tmp2[0]);
- $RecordID = $tmp2[1];
-
- /* Host renamed
- */
- if(preg_match("/RenameHost_/",$name)){
- if((isset($this->Devices[$Name])) && ($Name != $value)){
-
- if(isset($this->Devices[$value])){
- print_red(sprintf(_("Can't rename '%s' to '%s' there is already an entry with the same name in our zone editing dialog."),$Name,$value));
- }else{
- $this->Devices[$value] = $this->Devices[$Name];
- unset($this->Devices[$Name]);
- }
- }
- }
- }
- }
-
-
- /* check something
- */
- function check()
- {
- /* Call common method to give check the hook */
- $message= plugin::check();
-
- $ldap = $this->config->get_ldap_link();
- $ldap->cd($this->config->current['BASE']);
-
- $names = array();
- foreach($this->Devices as $DevName => $device){
-
- /* Don't need to check empty values ... */
- if(!count($device['RECORDS'])) continue;
-
- /* Checking entry name
- */
- if(!preg_match("/^[a-z0-9_\.-]+$/i", $DevName) || (empty($DevName))){
- $message[] = sprintf(_("Entry name '%s' contains invalid characters."), $DevName);
- }
-
- /* Renaming check for existing devices
- */
- if(isset($device['OrigCn']) && ($DevName != $device['OrigCn'] )){
- $ldap->cd($this->config->current['BASE']);
- $ldap->search("(relativeDomainName=".$DevName.")",array("relativeDomainName"));
- if($ldap->count()){
- $message[] = sprintf(_("Can not rename '%s' to '%s',the destination name already exists."),$device['OrigCn'],$DevName);
- }
- }elseif(!isset($device['OrigCn'])){
- $ldap->cd($this->config->current['BASE']);
- $ldap->search("(relativeDomainName=".$DevName.")",array("relativeDomainName"));
- if($ldap->count()){
- $message[] = sprintf(_("Can not create '%s',the destination name already exists."),$DevName);
- }
- }
-
- /* Check names
- */
- if(!isset($names[$DevName])){
- $names[$DevName] = "";
- }else{
- $message[] = sprintf(_("The name '%s' is used more than once."),$DevName);
- }
-
- /* Names should be written in lowercase
- */
-# if(strtolower($DevName) != $DevName){
-# $message[] = sprintf(_("The host name '%s' should be written in lowercase."), $DevName);
-# }
-
- /* Check records
- */
- $singleEntries = array("cNAMERecord","pTRRecord");
-
- $tmp = array();
- $tmp2 = array();
- foreach($device['RECORDS'] as $Num => $Rec){
-
- /* Check for multiple use of unique record types
- */
- if(in_array($Rec['type'],$singleEntries)){
- if(!isset($tmp[$Rec['type']])){
- $tmp[$Rec['type']] = "";
- }else{
- $message[] = sprintf(_("The record type '%s' is a unique type and can't be defined twice."),$Rec['type']);
- }
- }
-
- /* Check for empty / duplicate entries in record array
- */
- if(empty($Rec['value'])){
- $message[] = sprintf(_("There is an empty '%s' for host '%s'."),$Rec['type'],$DevName);
- }
-
- /* Check for duplicate record entries
- */
- if(!isset($tmp[$Rec['type']][$Rec['value']])){
- $tmp[$Rec['type']][$Rec['value']] = "";
- }else{
- $message[] = sprintf(_("There is a duplicate entry in '%s' for '%s'."),$Rec['type'],$DevName);
- }
- }
- }
- return ($message);
- }
-
- function save()
- {
- if($this->disableDialog) return;
-
- $todo = array();
-
-
-
- /* Create todolist
- */
- foreach($this->Devices as $name => $dev){
- if(isset($dev['OrigCn'])){
- if(count($dev['RECORDS'])){
- $todo[] = DNS::getDNSHostEntriesDiff($this->config,$dev['OrigCn'],$dev,$name);
- }else{
- $dev['exists'] = false;
- $todo[] = DNS::getDNSHostEntriesDiff($this->config,$dev['OrigCn'],$dev,$name);
- }
- }else{
- if(count($dev['RECORDS'])){
- $todo[] = DNS::getDNSHostEntriesDiff($this->config,"",$dev,$name);
- }else{
- $dev['exists'] = false;
- $todo[] = DNS::getDNSHostEntriesDiff($this->config,"",$dev,$name);
- }
- }
- }
-
- $tmp = array();
- $tmp['del'] = array();
- $tmp['add'] = array();
- $tmp['move'] = array();
- foreach($todo as $to){
- foreach($to as $type => $entries){
- $tmp[$type] = array_merge($tmp[$type],$entries);
- }
- }
-
- /* Get ldap link
- */
- $ldap = $this->config->get_ldap_link();
- $ldap->cd ($this->config->current['BASE']);
-
- /* move follwoing entries
- */
- foreach($tmp['move'] as $src => $dst){
- $this->recursive_move($src,$dst);
- }
-
- /* Delete dns */
- foreach($tmp['del'] as $dn => $del){
- $ldap->cd($dn);
- $ldap->rmdir_recursive($dn);
- if(is_object($this->parent->parent)){
- $this->parent->parent->handle_post_events("remove",array("dn" => $dn));
- }
- }
-
- /* Add || Update new DNS entries
- */
- foreach($tmp['add'] as $dn => $attrs){
- $ldap->cd($dn);
- $ldap->cat($dn, array('dn'));
- if(count($ldap->fetch())){
- $ldap->cd($dn);
- $ldap->modify ($attrs);
- if(is_object($this->parent->parent)){
- $this->parent->parent->handle_post_events("modify",array("dn" => $dn));
- }
- }else{
- $ldap->cd($dn);
- $ldap->add($attrs);
- if(is_object($this->parent->parent)){
- $this->parent->parent->handle_post_events("create",array("dn" => $dn));
- }
- }
- }
- }
-
-
- /* Create html table out of given entry
- */
- function generateRecordConfigurationRow($objKey){
-
- /* Get some basic informations
- */
- $obj = $this->Devices[$objKey];
- $objectName = $objKey;
-
- /* Abort if emtpy
- */
- if(count($obj['RECORDS']) == 0) return "";
-
- /* Set title
- */
- $str= "<br>";
-
- $hostNameOnce = true;
-
- /* Walk through all defined records
- */
- $str.= "<table cellspacing='0' cellpadding='0'>";
- foreach($obj['RECORDS'] as $id => $record){
-
- /* Skip not selectable entries */
- if(!isset($this->RecordTypes [$record['type']])) {
- continue;
- }
-
- /* Create unique post name
- */
- $name = base64_encode($objKey)."|".$id;
-
- $str .= "<tr><td style='width:170px;'>\n";
-
- /* Only first host entry name should be editable
- */
- if($hostNameOnce){
- $hostNameOnce = false;
- $str .="<input type='text' name='RenameHost_".$name."' value='".$objectName."'>\n";
- }
-
- /* Create rest. Selectbox, icons ...
- */
- $str .="
- </td>
- <td style='width:90px;'>
- ".$this->createRecordTypeSelection($record['type'],$name)."
- </td>
- <td>
- <input type='text' value='".$record['value']."' name='ValueSelection_".$name."' style='width:250px;'>
- </td>
- <td style='width:75px;text-align:right;'>
- <input type='image' name='AddRecord_".$name."' src='images/list_new.png' alt='"._("Add")."' title='"._("Add")."'>
- <input type='image' name='RemoveRecord_".$name."' src='images/edittrash.png' alt='"._("Remove")."' title='"._("Remove")."'>
- ";
-
-# if($record['type'] == "aRecord"){
-# $str .="<input type='image' name='AddPtr_".$name."' src='images/network.png'
-# alt='"._("Add PTR")."' title='"._("Add PTR record")."'>";
-# }else{
-# $str .= "<img src='images/empty.png' alt=''>";
-# }
-
- $str.=
- "</td>
- </tr>";
- }
- $str .="</table>";
- return($str);
- }
-
-
- /* Create selectbox with all available option types
- */
- function createRecordTypeSelection($id,$refID){
-
- $str = "\n<select name='RecordTypeSelection_".$refID."'>";
- foreach($this->RecordTypes as $type => $atr) {
- if($id == $type){
- $str .="\n<option value='".$type."' selected >".strtoupper(preg_replace("/record/i","",$type))."</option>";
- }else{
- $str .="\n<option value='".$type."'>".strtoupper(preg_replace("/record/i","",$type))."</option>";
- }
- }
- $str.= "\n</select>";
- return($str);
- }
-
-
- function remove_from_parent()
- {
- }
-
-}
-
-// vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler:
-?>
diff --git a/gosa-core/plugins/admin/systems/services/dns/servDNSeditZoneEntries.tpl b/gosa-core/plugins/admin/systems/services/dns/servDNSeditZoneEntries.tpl
+++ /dev/null
@@ -1,27 +0,0 @@
-<h2>{t}This dialog allows you to configure all components of this DNS zone on a single list.{/t}</h2>
-<p class="seperator"> </p>
-{if $disableDialog}
- <br><b>
- {t}This dialog can't be used until the currently edited zone was saved or the zone entry exists in the ldap database.{/t}
- </b>
-{else}
- <br>
- {$table}
- <br>
- <input type='submit' name='UserRecord' value='{t}New entry{/t}' title='{t}Create a new DNS zone entry{/t}'>
-{/if}
-
-<p class="seperator"> </p>
-<div style="text-algin:right;" align="right">
- <p>
- <input type="submit" name="SaveZoneEntryChanges" value="{t}Save{/t}">
- <input type="submit" name="CancelZoneEntryChanges" value="{t}Cancel{/t}">
- </p>
-</div>
-
-<script language="JavaScript" type="text/javascript">
- <!-- // First input field on page
- focus_field('zoneName');
- -->
-</script>
-
diff --git a/gosa-core/plugins/admin/systems/services/dns/servdns.tpl b/gosa-core/plugins/admin/systems/services/dns/servdns.tpl
+++ /dev/null
@@ -1,63 +0,0 @@
-{if $dns_take_over}
-<table summary="" width="100%">
- <tr>
- <td style="width:100%;vertical-align:top;">
- <h2>{t}DNS take over initiated{/t}</h2>
- {$warning}
- {t}This includes 'all' DNS zones that are located within this server. Please double check if your really want to do this.{/t}
- <p>
- {$warning2}
- <br>
- <input type='submit' name='cancel_take_over' value='{t}Cancel{/t}'>
- </p>
- <p>
- {t}Following objects will be taken over{/t} :
- </p>
- <p>
- <pre>{$info}</pre>
- </p>
- </td>
- </tr>
-</table>
-{else}
-<table summary="" width="100%">
-{if $dns_server_list_cnt}
-<tr>
- <td style="width:100%;vertical-align:top;">
- <b>{t}Take over DNS configuration from{/t}</b>
- <select name='take_over_src'>
- {html_options options=$dns_server_list}
- </select>
- <input type="submit" name="take_over" value="{t}Take over{/t}">
- </td>
-</tr>
-{/if}
-<tr>
- <td style="width:100%;vertical-align:top;">
-<h2>{t}Zones{/t}</h2>
- {$ZoneList}
- {if $is_createable}
- <input type="submit" name="AddZone" value="{t}Add{/t}">
- {else}
- <input type="button" value="{t}Add{/t}" disabled>
- {/if}
- </td>
-</tr>
-</table>
-
-
-<script language="JavaScript" type="text/javascript">
- <!-- // First input field on page
- focus_field('AddZone');
- -->
-</script>
-
-{/if}
-<p class="seperator"> </p>
-<p>
-<div style="width:100%; text-align:right;">
- <input type='submit' name='SaveService' value='{t}Save{/t}'>
-
- <input type='submit' name='CancelService' value='{t}Cancel{/t}'>
-</div>
-</p>
diff --git a/gosa-core/plugins/admin/systems/services/dns/servdnseditzone.tpl b/gosa-core/plugins/admin/systems/services/dns/servdnseditzone.tpl
+++ /dev/null
@@ -1,177 +0,0 @@
-<h2>{t}Generic{/t}</h2>
-<table summary="" width="100%">
- <tr>
- <td style="width:50%;vertical-align:top;border-right:1px solid #b0b0b0;">
- <table summary="">
- <tr>
- <td>{t}Zone name{/t}{$must}
- </td>
- <td>
-{render acl=$ACLs}
- <input type="text" name="zoneName" value="{$zoneName}" {if $NotNew} disabled {/if}>
-{/render}
- </td>
- </tr>
- <tr>
- <td>{t}Network address{/t}{$must}
- </td>
- <td>
-{render acl=$ACLs}
- <input type="text" name="ReverseZone" value="{$ReverseZone}" {if $NotNew} disabled {/if}>
-{/render}
- </td>
- </tr>
- <tr>
- <td>{t}Netmask{/t}
- </td>
- <td>
-{render acl=$ACLs}
- <select name="NetworkClass" {if $NotNew} disabled {/if}>
- {html_options options=$NetworkClasses selected=$NetworkClass }
- </select>
-{/render}
- </td>
- </tr>
- </table>
- </td>
- <td style="vertical-align:top;">
- <table summary="">
- <tr>
- <td>
- {t}Zone records{/t}
- <br>
- {if $AllowZoneEdit == false}
- <i>{t}Can't be edited because the zone wasn't saved right now.{/t}</i>
- {/if}
- </td>
- <td>
-{render acl=$ACLs}
- <input type="submit" name="EditZoneEntries" value="{t}Edit{/t}" {if $AllowZoneEdit == false} disabled {/if}>
-{/render}
- </td>
- </tr>
- </table>
- </td>
- </tr>
-</table>
-<p class="seperator"> </p>
-<h2>{t}SOA record{/t}</h2>
-<table summary="" width="100%">
- <tr>
- <td style="vertical-align:top;width:50%;border-right:1px solid #b0b0b0;">
- <table summary="">
- <tr>
- <td>{t}Primary dns server for this zone{/t}{$must}
- </td>
- <td>
-{render acl=$ACLs}
- <input type="text" name="sOAprimary" value="{$sOAprimary}">
-{/render}
- </td>
- </tr>
- <tr>
- <td>{t}Mail address{/t}{$must}
- </td>
- <td>
-{render acl=$ACLs}
- <input type="text" name="sOAmail" value="{$sOAmail}">
-{/render}
- </td>
- </tr>
- <tr>
- <td>{t}Serial number (automatically incremented){/t}{$must}
- </td>
- <td>
-{render acl=$ACLs}
- <input type="text" name="sOAserial" value="{$sOAserial}">
-{/render}
- </td>
- </tr>
- </table>
- </td>
- <td style="vertical-align:top;">
- <table summary="">
- <tr>
- <td>{t}Refresh{/t}{$must}
- </td>
- <td>
-{render acl=$ACLs}
- <input type="text" name="sOArefresh" value="{$sOArefresh}">
-{/render}
- </td>
- </tr>
- <tr>
- <td>{t}Retry{/t}{$must}
- </td>
- <td>
-{render acl=$ACLs}
- <input type="text" name="sOAretry" value="{$sOAretry}">
-{/render}
- </td>
- </tr>
- <tr>
- <td>{t}Expire{/t}{$must}
- </td>
- <td>
-{render acl=$ACLs}
- <input type="text" name="sOAexpire" value="{$sOAexpire}">
-{/render}
- </td>
- </tr>
- <tr>
- <td>{t}TTL{/t}{$must}
- </td>
- <td>
-{render acl=$ACLs}
- <input type="text" name="sOAttl" value="{$sOAttl}">
-{/render}
- </td>
- </tr>
- </table>
- </td>
- </tr>
-</table>
-
-<p class="seperator"> </p>
-<br>
-<table summary="" width="100%">
- <tr>
- <td style="vertical-align:top;width:50%;border-right:1px solid #b0b0b0;">
- <h2>{t}MxRecords{/t}</h2>
- <table width="100%">
- <tr>
- <td>
-{render acl=$ACLs}
- {$Mxrecords}
-{/render}
-{render acl=$ACLs}
- <input type="text" name="StrMXRecord" value="">
-{/render}
-{render acl=$ACLs}
- <input type="submit" name="AddMXRecord" value="{t}Add{/t}">
-{/render}
- </td>
- </tr>
- </table>
- </td>
- <td style="vertical-align:top;">
- <h2>{t}Global zone records{/t}</h2>
-{render acl=$ACLs}
- {$records}
-{/render}
- </td>
- </tr>
-</table>
-<div style="text-algin:right;" align="right">
- <p>
-{render acl=$ACLs}
- <input type="submit" name="SaveZoneChanges" value="{t}Save{/t}">
-{/render}
- <input type="submit" name="CancelZoneChanges" value="{t}Cancel{/t}">
- </p>
-</div>
-<script language="JavaScript" type="text/javascript">
- <!-- // First input field on page
- focus_field('zoneName');
- -->
-</script>
diff --git a/gosa-plugins/dns/admin/systems/services/dns/class_DNS.inc b/gosa-plugins/dns/admin/systems/services/dns/class_DNS.inc
--- /dev/null
@@ -0,0 +1,686 @@
+<?php
+
+
+/* All available record types
+ */
+$RecordTypes['aRecord'] = "aRecord";
+$RecordTypes['mDRecord'] = "mDRecord";
+$RecordTypes['mXRecord'] = "mXRecord";
+$RecordTypes['nSRecord'] = "nSRecord";
+$RecordTypes['pTRRecord'] = "relativeDomainName";
+$RecordTypes['hInfoRecord'] = "hInfoRecord";
+$RecordTypes['mInfoRecord'] = "mInfoRecord";
+$RecordTypes['cNAMERecord'] = "relativeDomainName";
+$RecordTypes['tXTRecord'] = "tXTRecord";
+$RecordTypes['aFSDBRecord'] = "aFSDBRecord";
+$RecordTypes['SigRecord'] = "SigRecord";
+$RecordTypes['KeyRecord'] = "KeyRecord";
+$RecordTypes['aAAARecord'] = "aAAARecord";
+$RecordTypes['LocRecord'] = "LocRecord";
+$RecordTypes['nXTRecord'] = "nXTRecord";
+$RecordTypes['sRVRecord'] = "sRVRecord";
+$RecordTypes['nAPTRRecord'] = "nAPTRRecord";
+$RecordTypes['kXRecord'] = "kXRecord";
+$RecordTypes['certRecord'] = "certRecord";
+$RecordTypes['a6Record'] = "a6Record";
+$RecordTypes['dSRecord'] = "dSRecord";
+$RecordTypes['sSHFPRecord'] = "sSHFPRecord";
+$RecordTypes['rRSIGRecord'] = "rRSIGRecord";
+$RecordTypes['nSECRecord'] = "nSECRecord";
+
+class DNS
+{
+
+ /* Return all record types
+ */
+ static function getDnsRecordTypes($ForZones = false)
+ {
+ global $RecordTypes;
+ if($ForZones){
+ $tmp = $RecordTypes;
+ unset($tmp['cNAMERecord']);
+ unset($tmp['pTRRecord']);
+ unset($tmp['tXTRecord']);
+ return($tmp);
+ }else{
+ return($RecordTypes);
+ }
+ }
+
+
+ /* 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.
+ */
+ static function FlipIp($ip)
+ {
+ $tmp = array_reverse(split("\.",$ip));
+ $new = "";
+ foreach($tmp as $section){
+ $new .= $section.".";
+ }
+ return(preg_replace("/.$/","",$new));
+ }
+
+
+ /* This static function returns the zones specified for given host
+ */
+ static function getDNSZoneEntries($config,$HostDn,$silent = false)
+ {
+ global $RecordTypes;
+
+ $ldap = $config->get_ldap_link();
+ $ldap->cd($config->current['BASE']);
+
+ /* Not all records are allowed within a zone entry
+ */
+ $SkipRecords = array("tXTRecord","cNAMERecord","pTRRecord");
+
+ /* Special sOArecords
+ */
+ $sOAREcords = array("0"=>"sOAprimary","1"=>"sOAmail","2"=>"sOAserial","3"=>"sOArefresh","4"=>"sOAretry","5"=>"sOAexpire","6"=>"sOAttl");
+
+ /* Create tempalte for all fetched zone Data
+ */
+ $ZoneBase = array();
+ $ZoneBase['exists'] = false;
+ $ZoneBase['RECORDS'] = array();
+ $ZoneBase['zoneName'] = array();
+ $ZoneBase['dNSClass'] = array();
+
+ foreach($sOAREcords as $attr){
+ $ZoneBase[$attr] = "";
+ }
+
+ $Zones = array();
+
+ /* Get & Parse all zone entries
+ */
+ $ldap->ls("(&(objectClass=dNSZone)(zoneName=*)(relativeDomainName=@))",$HostDn,array("*"));
+ $tmp_res = array();
+ while($attrs = $ldap->fetch()) {
+ $tmp_res[] = $attrs;
+ }
+
+ /* Parse fetched zones
+ */
+ foreach($tmp_res as $attrs){
+
+ $zoneName = $attrs['zoneName'][0];
+ $Zones[$zoneName] = $ZoneBase;
+ $Zones[$zoneName]['exists'] = true;
+
+ /* Set basic attributes
+ */
+ foreach(array("zoneName","dNSClass") as $attr){
+ if(isset($attrs[$attr][0])){
+ $Zones[$zoneName][$attr] = $attrs[$attr][0];
+ }
+ }
+
+ /* Set initial zone name, to be able to detect if this entry was renamed
+ */
+ $Zones[$zoneName]['InitialzoneName'] = $zoneName;
+
+ /* Generate SOA entry
+ */
+ if(isset($attrs['sOARecord'][0])){
+ $tmp = split("\ ",$attrs['sOARecord'][0]) ;
+ $tmp2 = array();
+
+ /* Assign soa vars */
+ foreach($sOAREcords as $key => $name){
+ if(isset($tmp[$key])){
+ $Zones[$zoneName][$name] = $tmp[$key];
+ }else{
+ $Zones[$zoneName][$name] = "";
+ }
+ }
+ } // ENDE SOA Record
+
+ /* Get record attributes
+ */
+ foreach($RecordTypes as $name => $value){
+
+ /* Skip some attributes
+ */
+ if(in_array($name,$SkipRecords)) continue;
+
+ /* If there is a record attribute
+ */
+ if(isset($attrs[$name])){
+
+ /* get all entries
+ */
+ for($i = 0 ; $i < $attrs[$value]['count']; $i ++){
+ $Zones[$zoneName]['RECORDS'][] = array("type"=>$name,"value"=>$attrs[$value][$i]);
+ }
+ }
+ }
+
+ /* Get reverse record ..
+ */
+ $ldap->ls("(&(objectClass=dNSZone)(relativeDomainName=@)(zoneName=*))",$attrs['dn'],array("zoneName"));
+
+ if($ldap->count() == 0){
+ if(!$silent){
+ msg_dialog::display(_("Error"), sprintf(_("Cannot find reverse zone for DNS zone '%s'. Parsing zone aborted."),$zoneName), ERROR_DIALOG);
+ }
+ unset($Zones[$zoneName]);
+ }elseif($ldap->count()>1){
+ if(!$silent){
+ msg_dialog::display(_("Error"), sprintf(_("Found more than one reverse zone for '%s'. Parsing zone aborted."),$zoneName), ERROR_DIALOG);
+ }
+ unset($Zones[$zoneName]);
+ }else{
+ $tmp = $ldap->fetch();
+ $Zones[$zoneName]['ReverseZone'] = FlipIp(str_replace(".in-addr.arpa","",$tmp['zoneName'][0]));
+ $Zones[$zoneName]['InitialReverseZone'] = FlipIp(str_replace(".in-addr.arpa","",$tmp['zoneName'][0]));
+ }
+ }
+ return($Zones);
+ }
+
+
+ /* This static function compares two dns zone objects and returns an
+ * array with following indexes
+ * - delete, for dns which must be deleted (only if dns zone is removed)
+ * - rename, if a dn must be renamed, for example, the zoneName has changed
+ * - add, if there is a new dns account created
+ */
+ static function getDNSZoneEntriesDiff($config,$newZones,$HostDn)
+ {
+ $oldZones = getDNSZoneEntries($config,$HostDn,true);
+
+ $sOAattributes = array("sOAprimary","sOAmail","sOAserial","sOArefresh","sOAretry","sOAexpire","sOAttl");
+
+ $move = array();
+ $add = array();
+ $del = array();
+
+ /* Generate a template for zones with default values
+ */
+ $zoneBase = array();
+ $zoneBase['objectClass'] = array("top","dNSZone");
+ $zoneBase['zoneName'] = "";
+ $zoneBase['relativeDomainName'] = "@";
+ $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 ...
+ */
+ foreach($newZones as $name => $zone){
+
+ /* This zone was renamed
+ */
+ if((!empty($zone['InitialzoneName'])) && ($zone['InitialzoneName'] != $zone['zoneName'])){
+
+ /* Move old zone to new position
+ */
+ $oldDn = "zoneName=".$zone['InitialzoneName'].",".$HostDn;
+ $newDn = "zoneName=".$zone['zoneName'].",".$HostDn;
+ $PrePareZoneEntries[$zone['InitialzoneName']] = $zone['zoneName'];
+ $move [$oldDn] = $newDn;
+ }
+
+ /* Get old zone if available
+ */
+ $oldZone=array();
+ if(!empty($oldZones[$zone['InitialzoneName']])){
+ $oldZone = $oldZones[$zone['InitialzoneName']];
+ }
+
+ /* Create forward zone entry and put it in our add queue
+ */
+ $newDn = "zoneName=".$zone['zoneName'].",".$HostDn;
+ $obj = $zoneBase;
+ $obj['zoneName'] = $zone['zoneName'];
+
+ /* Create sOARecord & add it to the obj
+ */
+ $soa = "";
+ foreach($sOAattributes as $attr){
+ $soa.=" ".$zone[$attr];
+ }
+ $obj['sOARecord'] = trim($soa);
+ $obj['nSRecord'] = $zone['sOAprimary'];
+
+ /* If reverse zone was renamed, move entry
+ */
+ if(!empty($zone['InitialReverseZone'])){
+ if($zone['InitialReverseZone'] != $zone['ReverseZone']){
+ $base = "zoneName=".$zone['zoneName'].",".$HostDn;
+ $oldRDn = "zoneName=". FlipIp($zone['InitialReverseZone']).".in-addr.arpa,".$base;
+ $newRDn = "zoneName=". FlipIp($zone['ReverseZone']).".in-addr.arpa,".$base;
+ $PrePareZoneEntries[FlipIp($zone['InitialReverseZone']).".in-addr.arpa"] = FlipIp($zone['ReverseZone']).".in-addr.arpa";
+ $move [$oldRDn] = $newRDn;
+ }
+ }
+
+ /* Append record entries
+ * Set old value to array, to ensure that
+ * they will be deleted if necessary
+ */
+ if(isset($oldZone['RECORDS'])){
+ foreach($oldZone['RECORDS'] as $rec){
+ $obj[$rec['type']] = array();
+ }
+ }
+
+ /* 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'];
+ }
+
+ /* Append udpated Zone Forward Entry to our add queue
+ */
+ $add[$newDn] = $obj;
+
+ /* Create Reverse Entry
+ * And append it to our add queue
+ */
+ $zone['ReverseZone'] = FlipIp($zone['ReverseZone']).".in-addr.arpa";
+ $base = "zoneName=".$zone['zoneName'].",".$HostDn;
+ $newRDn = "zoneName=".$zone['ReverseZone'].",".$base;
+ $rObj = $obj;
+ $rObj['zoneName']= $zone['ReverseZone'];
+ $add[$newRDn] = $rObj;
+
+ /* Remove currently managed zone from oldZones.
+ * this gives us the ability to detect removed zones
+ */
+ if(isset($oldZones[$zone['InitialzoneName']])){
+ unset($oldZones[$zone['InitialzoneName']]);
+ }
+ }
+
+ /* The rest of our oldZones must be deleted
+ * because they are no longer available in newZones anymore.
+ */
+ foreach($oldZones as $zone) {
+ $oldDn = "zoneName=".$zone['InitialzoneName'].",".$HostDn;
+ $del[$oldDn] = $zone;
+ }
+
+ /* Check for entries which must be updated
+ */
+ $zoneUpdates = array();
+ $udpate = array();
+ if(count($PrePareZoneEntries)){
+ $ldap = $config->get_ldap_link();
+ foreach($PrePareZoneEntries as $FromZoneName => $ToZoneName){
+ $ldap->cd($HostDn);
+ $ldap->search("(&(objectClass=dNSZone)(zoneName=".$FromZoneName.")(!(relativeDomainName=@)))",array("zoneName"));
+ while($attrs = $ldap->fetch()){
+ $zoneUpdates[$attrs['dn']] = array("zoneName"=>$ToZoneName);
+ }
+ }
+ }
+
+ $ret = array("del" => $del , "move" => $move , "add" => $add,"zoneUpdates"=>$zoneUpdates);
+ return($ret);
+ }
+
+
+ /* This static function returns the dns-host eintries for given
+ * name.
+ */
+ static function getDNSHostEntries($config,$name,$silent = false)
+ {
+ global $RecordTypes;
+
+ $types = array();
+ $ret = array();
+ $ret['RECORDS'] = array();
+ $ret['dNSClass'] = "IN";
+ $ret['zoneName'] = "";
+ $ret['dNSTTL'] = "7440";
+ $ret['exists'] = false;
+
+ $ldap = $config->get_ldap_link();
+ $ldap->cd($config->current['BASE']);
+
+ /* First check all zones for an entry with the given name.
+ * If the name occurs in more than one entry alert the user ...
+ */
+ $foundIn = array();
+ $zones = DNS::getAvailableZones($config);
+
+ $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]);
+ }
+
+ foreach($zonesArr as $nameServer => $nameServerArr){
+ $foundInTmp = array();
+ foreach($nameServerArr as $zoneArr => $zone){
+ $zoneMix = $nameServer."/".$zone;
+ $zoneDn = DNS::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
+ */
+ if(count($foundIn) == 0){
+ return($ret);
+ }
+
+ /* Get host informations from zone
+ */
+ $id_tmp = key($foundIn);
+ $ldap->cd($foundIn[$id_tmp]);
+ $ldap->search("(&(objectClass=dNSZone)(zoneName=*)(!(relativeDomainName=@)))",array("*"));
+ while($attrs = $ldap->fetch()){
+
+ /* If relative domainname == cn
+ * Try to read dnsclass / TTl / zone
+ */
+ if($attrs['relativeDomainName'][0] == $name){
+ $ret['exists'] = true;
+ $ret['zoneName'] = $id_tmp;
+ foreach(array("dNSClass","dNSTTL") as $atr){
+ if(isset($attrs[$atr][0])){
+ $ret[$atr] = $attrs[$atr][0];
+ }
+ }
+ }
+
+ /* Create list with all used records */
+ foreach($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 ++){
+ $types[] = array( "type" => $name,
+ "value" => $attrs[$value][$i]);
+ }
+ }
+ }
+ $ret['RECORDS'] = $types;
+ }
+ return($ret);
+ }
+
+
+
+ /* This static function compares two dns settings and returns an
+ * array with following indexes
+ * - delete, for dns which must be deleted (only if dns account is removed)
+ * - rename, if a dn must be renamed, for example, the relativeDomainName has changed
+ * - add, if there is a new dns account created
+ */
+ static function getDNSHostEntriesDiff($config,$oldName,$newEntry,$newName)
+ {
+ global $RecordTypes;
+
+ $oldEntry = getDNSHostEntries($config,$oldName);
+
+ $add = array();
+ $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 = DNS::getAvailableZones($config);
+ $specialAttributes = array("cNAMERecord","pTRRecord");
+ $newRecords = array(); // Used to remember which records are removed
+ $zoneNameMix = $newEntry['zoneName'];
+ $zoneDn = DNS::getDNSZoneDN($config,$zoneNameMix);
+ $tmp = array_flip($zones);
+ $zoneName = DNS::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 = DNS::getDNSZoneDN($config,$reverseNameMix);
+ if(empty($reverseDn)){
+ $newEntry['exists'] = false;
+ }
+ }else{
+ $newEntry['exists'] = false;
+ }
+
+ /* If account was edited prepare some
+ * attributes & arrays ... if required add some
+ * dns to $move
+ */
+ if($oldEntry['exists']){
+
+ /* Check if the account was removed
+ */
+ if($newEntry['exists'] == false){
+ $dn = "relativeDomainName=".$oldName.",".DNS::getDNSZoneDN($config,$oldEntry['zoneName']);
+ $del[$dn] ="";
+ return(array("move"=>$move,"add"=>$add,"del"=>$del));
+ }
+
+ /* Check if zoneName has changed
+ */
+ if(count($newEntry['RECORDS'])){
+ if($oldEntry['zoneName'] != $newEntry['zoneName']){
+ $oldzoneDn = DNS::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;
+ }
+ }
+
+ /* 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=".$newName.",".DNS::getDNSZoneDN($config,$oldEntry['zoneName']);
+ $del[$dn] ="";
+ $ret = array("move"=>$move,"add"=>$add,"del"=>$del);
+ return($ret);
+ }
+
+ /* Prepare temp obj
+ */
+ $baseObj = array();
+ $baseObj['objectClass'] = array("top","dNSZone");
+ $baseObj['dNSTTL'] = $newEntry['dNSTTL'];
+ $baseObj['dNSClass'] = $newEntry['dNSClass'];
+ $baseObj['zoneName'] = $zoneName;
+ $baseObj['relativeDomainName']= $newName;
+
+ /* Add Container Object to zone
+ * (this possibly already exists, check this before writing to ldap)
+ */
+ $baseDn = "relativeDomainName=".$newName.",".$zoneDn;
+ $add[$baseDn] = $baseObj;
+
+ /* Add base obejct which contains all std records
+ */
+ $stdDn = "relativeDomainName=".$newName.",".$baseDn;
+ $add[$stdDn] = $baseObj;
+
+ /* Set defaults. Normaly only contains old record names.
+ * The old names will be set to array, to ensure that they will be deleted.
+ * Or overwritten and filled with new values.
+ */
+ foreach($newRecords as $name => $def){
+ if(!in_array($name,$specialAttributes)){
+ $add[$stdDn][$name] = $def;
+ }
+ }
+
+ /* Delete all OLD special attributes.
+ */
+ foreach($oldEntry['RECORDS'] as $id => $rec){
+ if(in_array($rec['type'],$specialAttributes)){
+ $deldn= "relativeDomainName=".$rec['value'].",".$baseDn;
+ $del[$deldn] = "";
+ }
+ }
+
+
+ /* Create new record entries
+ */
+ foreach($newEntry['RECORDS'] as $id => $rec){
+ /* Create object which contains special records
+ * like pTRRecord or CNAMERecord
+ */
+ if($rec['type'] == "pTRRecord"){
+ $PTRdn= "relativeDomainName=".DNS::FlipIP($rec['value']).",".$baseDn;
+ $ptrObj = $baseObj;
+ $reverseName = DNS::getNameFromMix($reverseNameMix);
+ $ptrObj['zoneName'] = $reverseName;
+ if(!preg_match("/\.$/",$newName)){
+ $ptrObj['pTRRecord'] = preg_replace("/\.\.$/",".",$newName.".".$zoneName.".");
+ }else{
+ $ptrObj['pTRRecord'] = preg_replace("/\.\.$/",".",$newName.".");
+ }
+ $ptrObj['relativeDomainName'] = DNS::FlipIP($rec['value']);
+
+ $add[$PTRdn] = $ptrObj;
+ }else
+ if($rec['type'] == "cNAMERecord"){
+ $PTRdn= "relativeDomainName=".$rec['value'].",".$baseDn;
+ $ptrObj = $baseObj;
+ $ptrObj['zoneName'] = $zoneName;
+ $ptrObj['cNAMERecord'] = $newName;
+ $ptrObj['relativeDomainName'] = $rec['value'];
+
+ $add[$PTRdn] = $ptrObj;
+ }else{
+ /* Append basic attributes
+ */
+ $add[$stdDn][$rec['type']][] = $rec['value'];
+ }
+ } // foreach record
+
+ $ret = array("move"=>$move,"add"=>$add,"del"=>$del);
+ return($ret);
+ }
+
+ static function getNameFromMix($zoneMix){
+ $ret = "";
+ if(!strstr($zoneMix, '/')) return($ret);
+ $zoneIndex = split("/",$zoneMix);
+ return($zoneIndex[1]);
+ }
+
+ /* returns the dn for a specified zone
+ */
+ static function getDNSZoneDN($config,$zoneNameMix)
+ {
+ $ret = "";
+ if(!strstr($zoneNameMix, '/')) {
+ msg_dialog::display(_("Error"), sprintf(_("Undefined zone name '%s'!"),$zoneNameMix), ERROR_DIALOG);
+ 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);
+ }
+
+
+ /* returns all available zones
+ * array[reverseName] = zoneName;
+ */
+ static function getAvailableZones($config)
+ {
+ $ret = array();
+ $ldap = $config->get_ldap_link();
+ $ldap->cd ($config->current['BASE']);
+
+ /* Search for zones ...
+ */
+ $ldap->search("(&(objectClass=dNSZone)(sOARecord=*))",array("zoneName"));
+
+ $ForwardZones = array();
+ $ReverseZones = array();
+ $zones = array();
+
+ while($at = $ldap->fetch()){
+ if(preg_match("/\.in\-addr\.arpa/",$at['zoneName'][0])){
+ $ReverseZones[$at['dn']] = $at;
+ }else{
+ $ForwardZones[$at['dn']] = $at;
+ }
+ }
+
+ foreach($ForwardZones as $dn => $obj){
+
+ /* try to find reverse
+ */
+ foreach($ReverseZones as $Rdn => $Robj ){
+ if(preg_match("/".$dn."/",$Rdn)){
+ $zones[strtoupper($ldap->getCn($dn))."/".$Robj['zoneName'][0]] =
+ strtoupper($ldap->getCn($dn))."/".$obj['zoneName'][0];
+ }
+ }
+ }
+ return($zones);
+ }
+}
+// vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler:
+?>
diff --git a/gosa-plugins/dns/admin/systems/services/dns/class_servDNS.inc b/gosa-plugins/dns/admin/systems/services/dns/class_servDNS.inc
--- /dev/null
@@ -0,0 +1,598 @@
+<?php
+
+class servdns extends goService
+{
+ /* 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");
+
+ /* attribute list for save action */
+ var $ignore_account = FALSE;
+ var $attributes = array();
+ var $objectclasses = array("whatever");
+
+ var $RecordTypes = array();
+ var $Zones = array();
+
+ var $orig_dn = "";
+
+ var $initially_was_account;
+
+ /* ServerService tab vars */
+ var $conflicts = array("servdns");
+ var $DisplayName = "";
+ var $StatusFlag = "";
+ var $view_logged = FALSE;
+
+ var $dns_server_list = array("ENTRIES"=> array(),"FOR_LIST"=> array());
+ var $take_over_id = -1;
+
+
+ function servdns (&$config, $dn= NULL, $parent= NULL)
+ {
+ plugin::plugin ($config, $dn, $parent);
+
+ $this->DisplayName = _("DNS service");
+
+ $this->orig_dn = $dn;
+
+ /* Get record types for zones
+ */
+ $this->RecordTypes = DNS::getDnsRecordTypes(true);
+
+ /* Get all zone Informations
+ */
+ $this->Zones = DNS::getDNSZoneEntries($config,$dn);
+
+ /* If there is at least one entry in this -> types, we have DNS enabled
+ */
+ if(count($this->Zones) == 0){
+ $this->is_account = false;
+ $this->dns_server_list = $this->get_list_of_dns_servers();
+ }else{
+ $this->is_account = true;
+ }
+ $this->initially_was_account = $this->is_account;
+ }
+
+
+ function get_list_of_dns_servers()
+ {
+ $ret = array("ENTRIES"=> array(),"FOR_LIST"=> array());
+ $ldap = $this->config->get_ldap_link();
+ $ldap->cd($this->config->current['BASE']);
+ $ldap->search("(&(objectClass=dNSZone)(zoneName=*))",array("dn","zoneName"));
+ $dns = array();
+ while($attrs = $ldap->fetch()){
+ /* Skip own config */
+ if($this->dn != "new" && preg_match("/".normalizePreg($this->dn)."$/",$attrs['dn'])){
+ continue;
+ }
+ $dn = preg_replace("/^zoneName=[^,]+,/","",$attrs['dn']);
+ if(preg_match("/^cn=/",$dn) && !in_array($dn,$dns)){
+ $dns[] = $dn;
+ }
+ }
+ $i = 0;
+ foreach($dns as $dn){
+ $ldap->cat($dn,array('*'));
+ if($ldap->count()){
+ $i ++;
+ $attrs = $ldap->fetch();
+ $ret['ENTRIES'][$i] = $attrs;
+ $ret['FOR_LIST'][$i] = $attrs['cn'][0];
+ }
+ }
+ return($ret);
+ }
+
+
+ function get_dns_info_string($id)
+ {
+ $ret="";
+ $ldap = $this->config->get_ldap_link();
+ $ldap->cd($this->dns_server_list['ENTRIES'][$id]['dn']);
+ $ldap->search("(|(zoneName=*)(relativeDomainName=*))",array("dn"));
+ while($attrs = $ldap->fetch()){
+ $ret .= $attrs['dn']."\n";
+ }
+ return($ret);
+ }
+
+
+ function execute()
+ {
+ /* Call parent execute
+ */
+ plugin::execute();
+
+ if($this->is_account && !$this->view_logged){
+ $this->view_logged = TRUE;
+ new log("view","server/".get_class($this),$this->dn);
+ }
+
+ /* Fill templating stuff
+ */
+ $smarty= get_smarty();
+ $smarty->assign("dns_take_over",FALSE);
+ $smarty->assign("is_createable",$this->acl_is_createable());
+ $display= "";
+
+
+ $this->initially_was_account= $this->is_account;
+ /*****************/
+ /* Handle Take Over Actions
+ /*****************/
+
+ /* Give smarty the required informations */
+ $smarty->assign("dns_server_list", $this->dns_server_list['FOR_LIST']);
+ $smarty->assign("dns_server_list_cnt", count($this->dns_server_list['FOR_LIST']));
+
+ /* Take over requested, save id */
+ if(isset($_POST['take_over_src']) && isset($_POST['take_over'])){
+ $id = $_POST['take_over_src'];
+ if(isset($this->dns_server_list['ENTRIES'][$id])){
+ $this->take_over_id = $id;
+ }
+ }
+
+ /* Abort take over action */
+ if(isset($_POST['cancel_take_over'])){
+ $this->dialog =false;
+ $this->take_over_id = -1;
+ $this->dns_server_list = $this->get_list_of_dns_servers();
+ }
+
+ /* Display informartion about take over that will be started when saving this server
+ * and hide default dns output
+ */
+ if($this->take_over_id != -1){
+ $this->dialog = FALSE;
+ $id = $this->take_over_id;
+ $info = $this->get_dns_info_string($id);
+ $smarty->assign("dns_take_over",TRUE);
+ $smarty->assign("info",$info);
+ $warning = sprintf(_("You are going to migrate the DNS setup from server '%s'."),$this->dns_server_list['ENTRIES'][$id]['cn'][0]);
+ $warning2 = _("The migration will be startet when you save this system. To cancel this action, use the cancel button below.");
+ $smarty->assign("warning",$warning);
+ $smarty->assign("warning2",$warning2);
+ return($smarty->fetch(get_template_path('servdns.tpl', TRUE)));
+ }
+
+
+ /* Do we need to flip is_account state?
+ */
+ if (isset($_POST['modify_state'])){
+ $this->is_account= !$this->is_account;
+ }
+
+ if ($this->is_account){
+ $display= $this->show_disable_header(_("Remove DNS service"),
+ _("This server has DNS features enabled. You can disable them by clicking below."));
+ } else {
+ $display= $this->show_enable_header(_("Add DNS service"),
+ _("This server has DNS features disabled. You can enable them by clicking below."));
+ return ($display);
+ }
+
+
+ /* Edited or Added zone
+ */
+ if(isset($_POST['SaveZoneChanges'])){
+ $this->dialog->save_object();
+
+ /* Check for errors
+ */
+ if(count($this->dialog->check())){
+ foreach($this->dialog->check() as $msgs){
+ print_red($msgs);
+ }
+ }else{
+ /* add new/edited zone
+ */
+ $ret = $this->dialog->save();
+ if(!$this->dialog->isNew){
+ unset($this->Zones[$this->dialog->OldZoneName]);
+ }
+ $this->Zones[$ret['zoneName']] = $ret;
+ $this->dialog = FALSE;
+ }
+ }
+
+ /* Cancel zone edit / new
+ */
+ if(isset($_POST['CancelZoneChanges'])){
+ $this->dialog = FALSE;
+ }
+
+ /* Add empty new zone
+ */
+ if(isset($_POST['AddZone'])){
+ $this->dialog = new servdnseditZone($this->config,$this->dn);
+ }
+
+ /* Check for edit zone request
+ */
+ $once = false;
+ foreach( $_POST as $name => $value){
+
+ /* check all post for edit request
+ */
+ if(preg_match("/^editZone_/",$name)&&!$once){
+ $once =true;
+ $tmp = preg_replace("/^editZone_/","",$name);
+ $tmp = base64_decode(preg_replace("/_.*$/","",$tmp));
+ $this->dialog= new servdnseditZone($this->config,$this->dn,$this->Zones[$tmp]);
+ }
+
+ /* check posts for delete zone
+ */
+ if(preg_match("/^delZone_/",$name)&&!$once){
+
+ $once =true;
+ $tmp = preg_replace("/^delZone_/","",$name);
+ $tmp = base64_decode(preg_replace("/_.*$/","",$tmp));
+
+ /* Initiate deletion
+ */
+ $this->RemoveZone($tmp);
+ }
+ }
+
+ if(isset($_GET['act']) && $_GET['act'] == "edit" && isset($_GET['id'])){
+ $id = base64_decode($_GET['id']);
+ if(isset($this->Zones[$id])){
+ $this->dialog= new servdnseditZone($this->config,$this->dn,$this->Zones[$id]);
+ }
+ }
+
+ if(isset($_GET['act']) && $_GET['act'] == "edit" && isset($_GET['id'])){
+ $id = base64_decode($_GET['id']);
+ if(isset($this->Zones[$id])){
+ $this->dialog= new servdnseditZone($this->config,$this->dn,$this->Zones[$id]);
+ }
+ }
+
+ /* Show dialog
+ */
+ if(is_object($this->dialog)){
+ $this->dialog->save_object();
+ $this->dialog->parent = $this;
+ return($this->dialog->execute());
+ }
+
+ /* Create Listbox with existing Zones
+ */
+ $ZoneList = new divSelectBox("dNSZones");
+ $ZoneList -> SetHeight(254);
+
+ /* Add entries to divlist
+ */
+ $editImg = "<input type='image' src='images/edit.png' name='editZone_%s'>";
+ if($this->acl_is_removeable()){
+ $editImg.= "<input type='image' src='images/edittrash.png' name='delZone_%s'>";
+ }
+
+ $link = "<a href='?plug=".$_GET['plug']."&act=edit&id=%s'>%s</a>";
+ foreach($this->Zones as $zone => $values ){
+ $ZoneList->AddEntry(array(
+ array("string" => sprintf($link,base64_encode($zone),($zone))),
+ array("string" => sprintf($link,base64_encode($zone),_("Reverse zone")." : ".($values['ReverseZone']))),
+ array("string" => _("TTL")." : ".$values['sOAttl']),
+ array("string" => _("Class")." : ".$values['dNSClass']),
+ array("string" =>str_replace("%s",base64_encode($zone),$editImg))
+ ));
+ }
+
+ /* Display tempalte
+ */
+ $smarty->assign("ZoneList",$ZoneList->DrawList());
+ $display.= $smarty->fetch(get_template_path('servdns.tpl', TRUE));
+ return($display);
+ }
+
+
+ /* Delete specified zone
+ */
+ function RemoveZone($id)
+ {
+ $zones = $this->getUsedZoneNames();
+
+ if(isset($this->Zones[$id]['InitialReverseZone'])){
+ $rev = DNS::FlipIp($this->Zones[$id]['InitialReverseZone']);
+ }else{
+ $rev = DNS::FlipIp($this->Zones[$id]['ReverseZone']);
+ }
+
+ $zonename = "";
+ if(isset($this->Zones[$id]['InitialzoneName'])){
+ $zonename= $this->Zones[$id]['InitialzoneName'];
+ }
+
+ $used = array();
+
+ /* Add Records which use this zoneName
+ */
+ if(isset($zones[$zonename])){
+ $used = array_merge($used,$zones[$zonename]);
+ }
+
+ /* Add Records which uses this reverse zone
+ */
+ if(isset($zones[$rev.".in-addr.arpa"])){
+ $used = array_merge($used,$zones[$rev.".in-addr.arpa"]);
+ }
+
+ /* There are still entries using this configuration
+ * Abort deletion
+ */
+ if(count($used)){
+ $i = 2;
+ $str ="";
+ foreach($used as $dn){
+ if($i > 0 && !preg_match("/,relativeDomainName=/",$dn)){
+ $i --;
+ $name = preg_replace("/^[^=]+=([^,]*),.*$/","\\1",$dn);
+ $zone = preg_replace("/^.*zoneName=([^,]*),.*$/","\\1",$dn);
+ $str.= $name.".".$zone." ";
+ }
+ }
+
+ /* Only show 2 dns in the error message
+ */
+ if(count($used)> 2) {
+ $str .=" ... ";
+ }
+ print_red(sprintf(_("Can't delete the selected zone, because it is still in use by these entry/entries '%s'"),trim($str)));
+ return(false);
+ }else{
+ unset($this->Zones[$id]);
+ return(true);
+ }
+ }
+
+
+ /* This funtion returns all used Zonenames
+ */
+ function getUsedZoneNames()
+ {
+ $ret = array();
+ $ldap = $this->config->get_ldap_link();
+ $ldap->cd($this->config->current['BASE']);
+ $ldap->search("(&(objectClass=dNSZone)(!(relativeDomainName=@))(zoneName=*))",array("zoneName","relativeDomainName"));
+ while($attr = $ldap->fetch()){
+ $ret[$attr['zoneName'][0]][] = $attr['dn'];
+ }
+ return($ret);
+ }
+
+
+ /* Remove dns service
+ */
+ function remove_from_parent()
+ {
+ if($this->initially_was_account){
+ $bool = true;
+ $this->is_account = FALSE;
+ foreach($this->Zones as $key => $zone){
+ $bool= $bool & $this->RemoveZone($key);
+ }
+
+ if($bool){
+ $this->save();
+ }
+ return($bool);
+ }
+ }
+
+
+ /* Save to LDAP */
+ function save()
+ {
+
+ /* Take over handling
+ * - Create list of zones managed by source server
+ * - Copy ldap entries to destination server
+ * - Remove old zone entries from source
+ */
+ if($this->take_over_id != -1){
+ $del = array();
+ $id = $this->take_over_id;
+ $src = $this->dns_server_list['ENTRIES'][$id]['dn'];
+ $ldap = $this->config->get_ldap_link();
+ $ldap->ls("(objectClass=dnsZone)",$src,array('cn'));
+ while($attrs = $ldap->fetch()){
+ $src_zone = $attrs['dn'];
+ $dst_zone = preg_replace("/".normalizePreg($src)."$/",$this->dn,$src_zone);
+ $res = plugin::recursive_move($src_zone, $dst_zone);
+
+ if($res){
+ $del [] = $src_zone;
+ }
+ }
+ foreach($del as $src_zone){
+ $ldap->rmdir_recursive($src_zone);
+ }
+ return;
+ }
+
+ /* Save zone editor changes now */
+ foreach($this->Zones as $name => $zone){
+ if(isset($zone['zoneEditor'] ) && $zone['zoneEditor'] != NULL && is_object($zone['zoneEditor'])){
+ $zone['zoneEditor']->save();
+ unset($this->Zones[$name]['zoneEditor']);;
+ }
+ }
+
+ $ldap = $this->config->get_ldap_link();
+ $ldap->cd($this->config->current['BASE']);
+
+ /* Get differences
+ */
+ $old_dn = $this->orig_dn;
+ if($old_dn == "new"){
+ $old_dn = $this->dn;
+ }
+
+ $tmp = DNS::getDNSZoneEntriesDiff($this->config,$this->Zones,$old_dn);
+
+ /* Update dns to current object dn */
+ $tmp = DNS::getDNSZoneEntriesDiff($this->config,$this->Zones,$old_dn);
+ $tmp2 = array();
+ foreach($tmp as $key1 => $data1){
+ $tmp2[$key1] = array();
+ foreach($data1 as $key2 => $data2){
+ $tmp2[$key1][preg_replace("/".normalizePreg($old_dn)."$/",$this->dn,$key2)] = $data2;
+ }
+ }
+ $tmp = $tmp2;
+
+ /* Updated zone entries if reverser or forward name has changed
+ * Must be done before moving entries, else the given dn is invalid
+ */
+ if(isset($tmp['zoneUpdates'])){
+ foreach($tmp['zoneUpdates'] as $dn => $attrs){
+ $ldap->cd($dn);
+ $ldap->modify($attrs);
+ new log("modfiy","unknown/".get_class($this),$this->dn,array_keys($this->attrs),$ldap->get_error());
+ show_ldap_error($ldap->get_error(), sprintf(_("Updating of system server/dns with dn '%s' failed."),$this->dn));
+ }
+ }
+
+ /* Delete dns
+ */
+ foreach($tmp['del'] as $dn => $del){
+
+ $for = $del['InitialzoneName'];
+ $rev = DNS::FlipIp($del['InitialReverseZone']).".in-addr.arpa";
+
+ $ldap->cd($dn);
+ $ldap->rmdir_recursive($dn);
+ new log("remove","unknown/".get_class($this),$this->dn,array_keys($this->attrs),$ldap->get_error());
+ show_ldap_error($ldap->get_error(), sprintf(_("Removing of system server/dns with dn '%s' failed."),$this->dn));
+
+ /* Handle Post events */
+ if(preg_match("/^zoneName=/",$dn)){
+# $this->handle_post_events("remove",array("dn" => $dn,"zoneName" => $for));
+# $this->handle_post_events("remove",array("dn" => $dn,"zoneName" => $rev));
+ }
+ }
+
+ /* move follwoing entries
+ */
+ foreach($tmp['move'] as $src => $dst){
+ $this->recursive_move($src,$dst);
+ }
+
+ /* Add || Update new DNS entries
+ */
+ foreach($tmp['add'] as $dn => $attrs){
+ $ldap->cd($dn);
+ $ldap->cat($dn, array('dn'));
+ if($ldap->fetch()){
+ $ldap->cd($dn);
+ $ldap->modify ($attrs);
+ show_ldap_error($ldap->get_error(), sprintf(_("Saving of system server/dns with dn '%s' failed."),$this->dn));
+
+ /* Handle Post events */
+ if(preg_match("/^zoneName=/",$dn)){
+# $this->handle_post_events("modify",array("dn" => $dn,"zoneName" => $attrs['zoneName']));
+ }
+ }else{
+ $ldap->cd($dn);
+ $ldap->add($attrs);
+ show_ldap_error($ldap->get_error(), sprintf(_("Saving of system server/dns with dn '%s' failed."),$this->dn));
+
+ /* Handle Post events */
+ if(preg_match("/^zoneName=/",$dn)){
+# $this->handle_post_events("add",array("dn" => $dn,"zoneName" => $attrs['zoneName']));
+ }
+ }
+ }
+ $this->handle_post_events("modify");
+ }
+
+
+ /* Directly save new status flag */
+ function setStatus($value)
+ {
+ if($value == "none") return;
+ if(!$this->initially_was_account) return;
+ if(empty($this->StatusFlag)) return;
+ $ldap = $this->config->get_ldap_link();
+ $ldap->cd($this->dn);
+ $ldap->cat($this->dn,array("objectClass"));
+ if($ldap->count()){
+
+ $tmp = $ldap->fetch();
+ for($i = 0; $i < $tmp['objectClass']['count']; $i ++){
+ $attrs['objectClass'][] = $tmp['objectClass'][$i];
+ }
+ $flag = $this->StatusFlag;
+ $attrs[$flag] = $value;
+ $this->$flag = $value;
+ $ldap->modify($attrs);
+ show_ldap_error($ldap->get_error(), sprintf(_("Set status flag for system server/dns with dn '%s' failed."),$this->dn));
+ $this->action_hook();
+ }
+ }
+
+
+ function getListEntry()
+ {
+ $fields = goService::getListEntry();
+ $fields['Message'] = _("DNS service");
+ $fields['AllowEdit'] = true;
+ return($fields);
+ }
+
+
+ /* Get updates for status flag */
+ function updateStatusState()
+ {
+ if(empty($this->StatusFlag)) return;
+
+ $attrs = array();
+ $flag = $this->StatusFlag;
+ $ldap = $this->config->get_ldap_link();
+ $ldap->cd($this->cn);
+ $ldap->cat($this->dn,array($flag));
+ if($ldap->count()){
+ $attrs = $ldap->fetch();
+ }
+ if(isset($attrs[$flag][0])){
+ $this->$flag = $attrs[$flag][0];
+ }
+ }
+
+
+ /* Return plugin informations for acl handling */
+ static function plInfo()
+ {
+ return (array(
+ "plShortName" => _("DNS service"),
+ "plDescription" => _("DNS service")." ("._("Services").")",
+ "plSelfModify" => FALSE,
+ "plDepends" => array(),
+ "plPriority" => 83,
+ "plSection" => array("administration"),
+ "plCategory" => array("server"),
+
+ "plProvidedAcls"=> array(
+ "zoneName" =>_("Zone name"),
+ "ReverseZone" =>_("Reverse zone"),
+ "sOAprimary" =>_("Primary dns server"),
+ "sOAmail" =>_("Mail address"),
+ "sOAserial" =>_("Serial"),
+ "sOArefresh" =>_("Refresh"),
+ "sOAretry" =>_("Retry"),
+ "sOAexpire" =>_("Expire"),
+ "sOAttl" =>_("TTL"),
+ "zoneRecords" =>_("Zone records"))
+ ));
+ }
+
+}
+// vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler:
+?>
diff --git a/gosa-plugins/dns/admin/systems/services/dns/class_servDNSeditZone.inc b/gosa-plugins/dns/admin/systems/services/dns/class_servDNSeditZone.inc
--- /dev/null
@@ -0,0 +1,603 @@
+<?php
+
+class servdnseditZone 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");
+
+ /* attribute list for save action */
+ var $ignore_account= TRUE;
+ var $attributes = array("zoneName","ReverseZone","dNSClass",
+ "sOAprimary","sOAmail","sOAserial","sOArefresh","sOAretry","sOAexpire","sOAttl");
+ var $objectclasses = array("whatever");
+
+ var $RecordTypes = array();
+
+ var $ReverseZone = "";
+ var $zoneName = "";
+ var $dNSClass = "IN";
+
+ var $sOAprimary = "";
+ var $sOAmail = "";
+ var $sOAserial = "";
+ var $sOArefresh = "3600";
+ var $sOAretry = "1800";
+ var $sOAexpire = "720000";
+ var $sOAttl = "6400";
+
+ var $Records = array();
+ var $mXRecords = array();
+
+ var $OldZoneName = ""; // To detect changes made with this edit
+ var $OldReverseZone = "";
+
+ var $InitialReverseZone = "";
+ var $InitialzoneName = "";
+ var $NetworkClass = "A" ; // One out of A,B,C
+
+ var $dialog = false;
+
+ var $zoneEditor = NULL;
+
+ var $isNew = true;
+
+ var $ZoneObject = array();
+
+ function servdnseditZone (&$config, $dn= NULL,$attrs = array())
+ {
+ plugin::plugin ($config, $dn);
+
+ /* All types with required attrs */
+ $this->RecordTypes = DNS::getDnsRecordTypes(true);
+
+ if(!count($attrs)){
+ $this->OldZoneName = "";
+ $this->OldReverseZone = "";
+ $this->isNew = true;
+ $this->sOAserial = date("Ymd")."1";
+
+ $this->InitialzoneName = "";//$attrs['InitialzoneName'];
+ $this->InitialReverseZone = "";//$attrs['InitialReverseZone'];
+ }else{
+ $this->ZoneObject = $attrs;
+
+ if(isset($attrs['zoneEditor'])){
+ $this->zoneEditor = $attrs['zoneEditor'];
+ }
+ $this->OldZoneName = $attrs['zoneName'];
+ $this->OldReverseZone = $attrs['ReverseZone'];
+
+ $this->InitialzoneName = $attrs['InitialzoneName'];
+ $this->InitialReverseZone = $attrs['InitialReverseZone'];
+
+ $this->isNew = false;
+
+ foreach($this->attributes as $value){
+ $this->$value = $attrs[$value];
+ }
+
+ $this->sOAmail = preg_replace("/\./","@",$this->sOAmail,1);
+ $this->sOAmail = preg_replace("/\.$/","",$this->sOAmail);
+ $this->sOAprimary = preg_replace("/\.$/","",$this->sOAprimary);
+ $this->zoneName = preg_replace("/\.$/","",$this->zoneName);
+
+ if(isset($attrs['RECORDS'])){
+ $this->Records = $attrs['RECORDS'];
+
+ $tmp2 = array();
+ $usedPrio = array();
+ foreach($this->Records as $key => $rec){
+ if($rec['type'] == "mXRecord"){
+ $tmp = split(" ",$rec['value']);
+ $rec['value'] = $tmp[1];
+ $tmp2[$tmp[0]] = $rec;
+ unset($this->Records[$key]);
+ }
+ if($rec['type'] == "nSRecord"){
+ unset($this->Records[$key]);
+ }
+ }
+ if(count($tmp2) != 0){
+ reset($tmp2);
+ ksort($tmp2);
+ }
+ $this->mXRecords = $tmp2;
+ }else{
+ $this->mXRecords = array();
+ $this->Records = array();
+ }
+
+ $str = date("Ymd");
+ if(preg_match("/^".$str."/",$this->sOAserial)){
+ $this->sOAserial = $this->sOAserial + 1;
+ }else{
+ $this->sOAserial = date("Ymd")."01";
+ }
+ }
+
+ /* Detect Network class */
+ if(!empty($this->ReverseZone)){
+
+ $dots = count(split("\.",$this->ReverseZone));
+ if($dots == 1){
+ $this->NetworkClass = "A";
+ $this->ReverseZone .= ".0.0.0";
+ }elseif($dots == 2){
+ $this->NetworkClass = "B";
+ $this->ReverseZone .= ".0.0";
+ }else{
+ $this->NetworkClass = "C";
+ $this->ReverseZone .= ".0";
+ }
+ }
+ }
+
+ /* TRansports the geiven Arraykey one position up*/
+ function ArrayUp($atr,$attrs)
+ {
+ $ret = $attrs;
+ $pos = $atr ;
+ $cn = count($attrs);
+ if(!(($pos == -1)||($pos == 1)||($pos >$cn))){
+ $before = array_slice($attrs,0,($pos-2));
+ $mitte = array_reverse(array_slice($attrs,($pos-2),2));
+ $unten = array_slice($attrs,$pos);
+ $ret = array();
+ $ret = $this->combineArrays($before,$mitte,$unten);
+ }
+ return($ret);
+ }
+
+
+ /* TRansports the geiven Arraykey one position up*/
+ function ArrayDown($atr,$attrs)
+ {
+ $ret = $attrs;
+ $pos = $atr ;
+ $cn = count($attrs);
+ if(!(($pos == -1)||($pos == $cn))){
+ $before = array_slice($attrs,0,($pos-1));
+ $mitte = array_reverse(array_slice($attrs,($pos-1),2));
+ $unten = array_slice($attrs,($pos+1));
+ $ret = array();
+ $ret = $this->combineArrays($before,$mitte,$unten);
+ }
+ return($ret);
+ }
+
+ /* Combine new array */
+ function combineArrays($ar0,$ar1,$ar2)
+ {
+ $ret = array();
+ if(is_array($ar0))
+ foreach($ar0 as $ar => $a){
+ $ret[]=$a;
+ }
+ if(is_array($ar1))
+ foreach($ar1 as $ar => $a){
+ $ret[]=$a;
+ }
+ if(is_array($ar2))
+ foreach($ar2 as $ar => $a){
+ $ret[]=$a;
+ }
+ return($ret);
+ }
+
+ function getpos($atr,$attrs)
+ {
+ $i = 0;
+ foreach($attrs as $attr => $name) {
+ $i++;
+ if($attr == $atr){
+ return($i);
+ }
+ }
+ return(-1);
+ }
+
+
+ function execute()
+ {
+ /* Call parent execute */
+ plugin::execute();
+
+
+
+ /* Fill templating stuff */
+ $smarty= get_smarty();
+ $ui = get_userinfo();
+
+ $smarty->assign("ACLs",$this->parent->getacl(""));
+ $display= "";
+
+ /* Open Zone Entry Edit Dialog
+ */
+ if(!count($this->ZoneObject)){
+ $smarty->assign("AllowZoneEdit" , false);
+ }else{
+ $smarty->assign("AllowZoneEdit" , true);
+ if(isset($_POST['EditZoneEntries'])){
+ if($this->zoneEditor == NULL){
+ $this->zoneEditor= new servDNSeditZoneEntries($this->config,$this->dn,$this->ZoneObject);
+ $this->zoneEditor->parent = $this;
+ }
+ $this->dialog = $this->zoneEditor;
+ }
+ }
+
+ /* Save Zone Entry Edit Dialog
+ */
+ if(isset($_POST['SaveZoneEntryChanges'])){
+ $this->dialog->save_object();
+ if(count($this->dialog->check())){
+ $msgs = $this->dialog->check();
+ foreach($msgs as $msg){
+ print_red($msg);
+ }
+ }else{
+ $this->zoneEditor = clone $this->dialog;
+ $this->dialog = FALSE;
+# $rev = DNS::FlipIp(DNS::getNameFromMix($this->InitialReverseZone)).".in-addr.arpa";
+# $for = DNS::getNameFromMix($this->InitialzoneName);
+#
+# $this->parent->handle_post_events("modify",array("dn" => $this->dn,"zoneName" => $rev));
+# $this->parent->handle_post_events("modify",array("dn" => $this->dn,"zoneName" => $for));
+# $this->dialog = false;
+ }
+ }
+
+ /* Cancel Zone Entrie Edit Dialog
+ */
+ if(isset($_POST['CancelZoneEntryChanges'])){
+ $this->dialog = false;
+ }
+
+ /* Display any type of open dialogs
+ */
+ if(is_object($this->dialog)){
+ $this->dialog->save_object();
+ return($this->dialog->execute());
+ }
+
+ $once =true;
+ foreach($_POST as $name => $value){
+ if((preg_match("/^MXup_/",$name)) && ($once)){
+ $once = false;
+
+ $id = preg_replace("/^MXup_/","",$name);
+ $id = preg_replace("/_.*$/","",$id);
+ $id = base64_decode($id);
+
+ $this->mXRecords = $this->ArrayUp(($id+1),$this->mXRecords);
+ }
+ if((preg_match("/^MXdown_/",$name)) && ($once)){
+ $once = false;
+
+ $id = preg_replace("/^MXdown_/","",$name);
+ $id = preg_replace("/_.*$/","",$id);
+ $id = base64_decode($id);
+
+ $this->mXRecords = $this->ArrayDown(($id+1),$this->mXRecords);
+ }
+ if((preg_match("/^MXdel_/",$name)) && ($once)){
+ $once = false;
+
+ $id = preg_replace("/^MXdel_/","",$name);
+ $id = preg_replace("/_.*$/","",$id);
+ $id = base64_decode($id);
+
+ unset($this->mXRecords[$id]);
+
+ $tmp =array();
+ foreach($this->mXRecords as $entry){
+ $tmp[] = $entry;
+ }
+
+ $this->mXRecords = $tmp;
+ }
+ }
+
+ if((isset($_POST['AddMXRecord'])) && (!empty($_POST['StrMXRecord']))){
+ $this->mXRecords[] = array("type"=>"mXRecord","value"=>trim($_POST['StrMXRecord']));
+ }
+
+ /* Handle Post events */
+ $once = true;
+ foreach($_POST as $name => $value){
+
+ /* Delete record if requested */
+ if((preg_match("/RemoveRecord_/",$name))&&($once)){
+ $once = false;
+ $id= preg_replace("/RemoveRecord_/","",$name);
+ unset($this->Records[$id]);
+ }
+ }
+
+ /* Add new Zonerecord */
+ if(isset($_POST['AddNewRecord'])){
+ $this->Records[] = array("type"=>"aRecord","value"=>"");
+ }
+
+ /* Fill in values */
+ foreach($this->attributes as $name){
+ $smarty->assign($name,$this->$name);
+ }
+
+
+ $div = new divSelectBox("MxRecords");
+ $div->setHeight(120);
+ $recs = $this->mXRecords;
+
+ $oneup = "<input name='MXup_%s' type='image' src='images/sort_up.png' title='"._("Up")."' class='center'> ";
+ $onedown = "<input name='MXdown_%s' type='image' src='images/sort_down.png' title='"._("Down")."' class='center'> ";
+ $onedel = "<img src='images/empty.png' width='20' class='center'>
+ <input name='MXdel_%s' type='image' src='images/edittrash.png' title='"._("Delete")."' class='center'>";
+
+ foreach($recs as $key => $rec){
+ $div ->AddEntry(array(
+ array("string"=>$rec['value']),
+/* array("string"=>$key,
+ "attach"=>"style='width:20px;'"),*/
+ array("string"=>str_replace("%s",base64_encode($key),$oneup.$onedown.$onedel),
+ "attach"=>"style='width:70px;border-right:0px;'")
+ ));
+ }
+
+ /* Assign records list */
+ $smarty->assign("NotNew", false);
+ $smarty->assign("Mxrecords", $div->DrawList());
+ $smarty->assign("records" , $this->generateRecordsList());
+ $smarty->assign("NetworkClass", $this->NetworkClass);
+ $smarty->assign("NetworkClasses", array("A"=>"255.0.0.0 (Class A)","B"=>"255.255.0.0 (Class B)","C"=>"255.255.255.0 (Class C)"));
+
+ /* Display tempalte */
+ $display.= $smarty->fetch(get_template_path('servdnseditzone.tpl', TRUE));
+ return($display);
+ }
+
+ function remove_from_parent()
+ {
+ }
+
+ /* Save data to object */
+ function save_object()
+ {
+ //plugin::save_object();
+ foreach($this->attributes as $attr){
+ if(isset($_POST[$attr])){
+ $this->$attr = $_POST[$attr];
+ }
+ }
+
+ foreach($this->Records as $id => $value){
+ if(isset($_POST['RecordTypeSelectedFor_'.$id])){
+ $this->Records[$id]['type'] = $_POST['RecordTypeSelectedFor_'.$id];
+ }
+ if(isset($_POST['RecordValue_'.$id])){
+ $this->Records[$id]['value'] = $_POST['RecordValue_'.$id];
+ }
+ }
+
+ if(isset($_POST['NetworkClass'])){
+ $this->NetworkClass = $_POST['NetworkClass'];
+ }
+
+ }
+
+
+ /* Check supplied data */
+ function check()
+ {
+ /* Call common method to give check the hook */
+ $message= plugin::check();
+
+ /* Check if zoneName is already in use */
+ $usedZones = $this->getUsedZoneNames();
+ if(($this->isNew == true)||($this->zoneName != $this->InitialzoneName)||($this->ReverseZone != $this->InitialReverseZone)){
+ /* if((isset($usedZones[$this->zoneName]))&&($this->zoneName != $this->InitialzoneName)){
+ $message[] =_("This zoneName is already in use");
+ }
+ if((in_array($this->ReverseZone,$usedZones))&&($this->ReverseZone != $this->InitialReverseZone)){
+ $message[] =_("This reverse zone is already in use");
+ }*/
+ }
+
+ if(empty($this->zoneName)){
+ $message[] =sprintf(_("Please choose a valid zone name."));
+ }
+
+ if(empty($this->ReverseZone)){
+ $message[] =sprintf(_("Please choose a valid reverse zone name."));
+ }
+
+ if($this->zoneName != strtolower($this->zoneName)){
+ $message[] = _("Only lowercase strings are allowed as zone name.");
+ }
+
+ if(!is_numeric($this->sOAserial)){
+ $message[] = _("Please specify a numeric value for serial number.");
+ }
+
+ if(!is_numeric($this->sOArefresh)){
+ $message[] = _("Please specify a numeric value for refresh.");
+ }
+
+ if(!is_numeric($this->sOAttl)){
+ $message[] = _("Please specify a numeric value for ttl.");
+ }
+
+ if(!is_numeric($this->sOAexpire)){
+ $message[] = _("Please specify a numeric value for expire.");
+ }
+
+ if(!is_numeric($this->sOAretry)){
+ $message[] = _("Please specify a numeric value for retry.");
+ }
+
+ foreach($this->Records as $name => $values){
+ /* 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']);
+ }
+ }
+
+ /* Check class for given Zone Address */
+ $addr = preg_replace("/^[^\/]*+\//","",$this->ReverseZone);
+
+ /* Check for valid&complete IP address */
+ if(!tests::is_ip($addr)){
+ $message[] = _("The given network address is not a valid, please specify a valid IP address.");
+ }
+
+ /* Check if given address matches selected network class */
+ switch($this->NetworkClass){
+ case 'A': {
+ if(!preg_match("/^[0-9]*\.0\.0\.0$/",$addr)){
+ $message[] = sprintf(_("The specified network address is not matching with the specified zone class, try it this way x.0.0.0"));
+ }
+ }
+ break;
+ case 'B': {
+ if(!preg_match("/^[0-9]*\.[0-9]*\.0\.0$/",$addr)){
+ $message[] = sprintf(_("The specified network address is not matching with the specified zone class, try it this way x.x.0.0"));
+ }
+ }
+ break;
+ case 'C': {
+ if(!preg_match("/^[0-9]*\.[0-9]*\.[0-9]*\.0$/",$addr)){
+ $message[] = sprintf(_("The specified network address is not matching with the specified zone class, try it this way x.x.x.0"));
+ }
+ }
+ break;
+ default : $message[] =sprintf(_("The given network class '%s' is not valid."),$this->NetworkClass);
+ }
+
+ return ($message);
+ }
+
+ /* This funtion returns all used Zonenames */
+ function getUsedZoneNames()
+ {
+ $ret = array();
+ $ldap = $this->config->get_ldap_link();
+ $ldap->cd($this->config->current['BASE']);
+ $ldap->search("(&(objectClass=dNSZone)(relativeDomainName=@)(zoneName=*))",array("zoneName","tXTRecord"));
+ while($attr = $ldap->fetch()){
+ if(preg_match("/in-addr\.arpa/",$attr['zoneName'][0])){
+ if(isset($attr['tXTRecord'][0])){
+ $zn = preg_replace("/zoneName\=/","",$attr['tXTRecord'][0]);
+ $ret[$zn] =DNS::FlipIp(preg_replace("/\.in-addr\.arpa/","",$attr['zoneName'][0]));
+ }
+ }else{
+ $ret[$attr['zoneName'][0]]="";
+ }
+ }
+ return($ret);
+ }
+
+ /* Save to LDAP */
+ function save()
+ {
+ $ret =array();
+ foreach($this->attributes as $name){
+ $ret[$name] = $this->$name;
+ }
+
+ /* Create mx records
+ */
+ foreach($this->mXRecords as $key => $rec){
+ $rec['value']= $key." ".$rec['value'];
+ $this->Records [] = $rec;
+ }
+
+
+ $ret['RECORDS'] = $this->Records;
+
+ switch($this->NetworkClass){
+ case 'C' : $ret['ReverseZone']= preg_replace("/\.[0-9]*$/","",$this->ReverseZone);break;
+ case 'B' : $ret['ReverseZone']= preg_replace("/\.[0-9]*\.[0-9]*$/","",$this->ReverseZone);break;
+ case 'A' : $ret['ReverseZone']= preg_replace("/\.[0-9]*\.[0-9]*\.[0-9]*$/","",$this->ReverseZone);break;
+ default : trigger_error("Invalid network class given '".$this->NetworkClass."'");
+ }
+
+ $ret['InitialReverseZone']= $this->InitialReverseZone;
+ $ret['InitialzoneName'] = $this->InitialzoneName;
+
+ $ret['sOAmail'] = preg_replace("/\@/",".",$this->sOAmail);
+
+ foreach(array("sOAprimary","zoneName","sOAmail") as $attr){
+ if(!preg_match("/\.$/",$ret[$attr])){
+ if(!tests::is_ip($ret[$attr])){
+ $ret[$attr] = $ret[$attr].".";
+ }
+ }
+ }
+
+ $ret['RECORDS'][] = array("type" => "nSRecord","value" => $ret['sOAprimary']) ;
+
+ $ret['zoneEditor'] = $this->zoneEditor;
+ return($ret);
+ }
+
+
+ /* This function generate a table row for each used record.
+ This table row displays the recordtype in a select box
+ and the specified value for the record, and a remove button.
+ The last element of the table also got an 'add' button.
+ */
+ function generateRecordsList($changeStateForRecords="")
+ {
+ $changeStateForRecords = "";
+
+ $str = "<table summary=''>";
+ foreach($this->Records as $key => $entry){
+
+ if($entry['type'] == "mXRecord") continue;
+
+ $changeStateForRecords.= "changeState('RecordTypeSelectedFor_".$key."');\n";
+ $changeStateForRecords.= "changeState('RecordValue_".$key."');\n";
+ $changeStateForRecords.= "changeState('RemoveRecord_".$key."');\n";
+
+ $str.=" <tr>".
+ " <td>".$this->generateRecordListBox($entry['type'],"RecordTypeSelectedFor_".$key)."</td>".
+ " <td><input type='text' value='".$entry['value']."' name='RecordValue_".$key."' id='RecordValue_".$key."'></td>".
+ " <td><input type='submit' name='RemoveRecord_".$key."' value='"._("Delete")."' id='RemoveRecord_".$key."'></td>".
+ "</tr>";
+ }
+
+ $str.= " <tr>".
+ " <td colspan=2></td><td>".
+ " <input type='submit' value='"._("Add")."' name='AddNewRecord'>".
+ " </td>".
+ " </tr>".
+ "</table>";
+ return($str);
+ }
+
+ /* This function generates a select box out of $this->RecordTypes options.
+ The Parameter $selected is used to predefine an attribute.
+ $name is used to specify a post name
+ */
+ function generateRecordListBox($selected,$name)
+ {
+ $str = "<select name='".$name."' id='".$name."'>";
+ foreach($this->RecordTypes as $type => $value){
+
+ if(preg_match("/^mXRecord$/i",$value)) continue;
+
+ $use = "";
+ if($type == $selected){
+ $use = " selected ";
+ }
+ $str.="\n <option value='".$type."' ".$use.">".strtoupper(preg_replace("/record/i","",$type))."</option>";
+ }
+ $str.="</select>";
+ return($str);
+ }
+}
+
+// vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler:
+?>
diff --git a/gosa-plugins/dns/admin/systems/services/dns/class_servDNSeditZoneEntries.inc b/gosa-plugins/dns/admin/systems/services/dns/class_servDNSeditZoneEntries.inc
--- /dev/null
@@ -0,0 +1,498 @@
+<?php
+
+class servDNSeditZoneEntries 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");
+
+ /* attribute list for save action */
+ var $ignore_account = TRUE;
+ var $attributes = array();
+ var $objectclasses = array("whatever");
+
+ var $Devices = array();
+
+ var $zoneName = ""; // ZoneName of currently edited Zone
+ var $reverseName = ""; // ReverseZone of the currently edited Zone
+
+ var $RecordTypes = array(); // Possible record type.
+
+ var $disableDialog = false; // Dialog will be disabled, if this zone is new
+
+ function servDNSeditZoneEntries (&$config,$dn, &$zoneObject)
+ {
+ plugin::plugin ($config, $dn);
+
+ /* Initialise class
+ */
+ $this->RecordTypes = DNS::getDnsRecordTypes();
+ $this->dn = "zoneName=".$zoneObject['InitialzoneName'].",".$dn;
+ $this->zoneName = $zoneObject['InitialzoneName'];
+ $this->reverseName = $zoneObject['InitialReverseZone'];
+
+ /* Remove nSRecord from listed types */
+ if(isset($this->RecordTypes['nSRecord'])){
+ unset($this->RecordTypes['nSRecord']);
+ }
+ /* Remove nSRecord from listed types */
+ if(isset($this->RecordTypes['pTRRecord'])){
+ unset($this->RecordTypes['pTRRecord']);
+ }
+
+ /* Get ldap connection
+ */
+ $ldap = $this->config->get_ldap_link();
+ $ldap->cd($this->config->current['BASE']);
+
+ /* Get zone content
+ */
+ $ldap->ls("(&(objectClass=dNSZone)(!(relativeDomainName=@)))",$this->dn,array("relativeDomainName"));
+
+ while($attrs = $ldap->fetch()){
+ $this->Devices[$attrs['relativeDomainName'][0]] = DNS::getDNSHostEntries($config,$attrs['relativeDomainName'][0],true);
+ $this->Devices[$attrs['relativeDomainName'][0]]['OrigCn'] = $attrs['relativeDomainName'][0];
+ }
+
+ $ldap->cat($this->dn,array("objectClass"));
+
+ $this->disableDialog = true;
+ if(count($this->Devices)|| $ldap->count()){
+ $this->disableDialog = false;
+ }
+ }
+
+ function execute()
+ {
+ plugin::execute();
+
+ /* Fill templating stuff */
+ $smarty= get_smarty();
+ $display= "";
+
+ $table = "";
+ foreach($this->Devices as $key => $dev){
+ $table .= $this->generateRecordConfigurationRow($key);
+ }
+
+ $smarty->assign("disableDialog",$this->disableDialog);
+ $smarty->assign("table",$table);;
+ $display.= $smarty->fetch(get_template_path('servDNSeditZoneEntries.tpl', TRUE));
+ return($display);
+ }
+
+
+ function save_object()
+ {
+ /* Check posts for operations ...
+ */
+ $once = true;
+ $ptr_updates = array();
+ foreach($_POST as $name => $value){
+
+ /* Add a new Record in given object
+ */
+
+ $tmp = preg_replace("/^.*_(.*)_.*$/","\\1",$name);
+ $tmp2 = split("\|",$tmp);
+
+ /* Add new host entry
+ */
+ if((preg_match("/^UserRecord_?/",$name)) && ($once)){
+ $once = false;
+ $entry = DNS::getDNSHostEntries($this->config,"",true);
+ $entry['exists'] = true;
+ $entry['zoneName'] = strtoupper($this->attrs['cn'][0])."/".$this->zoneName;
+ $entry['RECORDS'][] = array("type" => "aRecord" , "value"=>"");
+ $this->Devices[_("New entry")] = $entry;
+ }
+
+ if(count($tmp2) != 2) continue;
+
+ $Name = base64_decode($tmp2[0]);
+ $RecordID = $tmp2[1];
+
+ /* Add new REcord
+ */
+ if((preg_match("/^AddRecord_/",$name)) && ($once)){
+ $once = false;
+ $this->Devices[$Name]['RECORDS'][] = $this->Devices[$Name]['RECORDS'][$RecordID];
+ }
+
+ /* Remove record from given dn
+ */
+ if((preg_match("/^RemoveRecord_/",$name)) && ($once)){
+ $once = false;
+ if(isset($this->Devices[$Name]['RECORDS'][$RecordID])){
+ unset($this->Devices[$Name]['RECORDS'][$RecordID]);
+ }
+
+ /* Check if there is at least one visible record. Else remove complete entry */
+ $visible = false;
+ foreach($this->Devices[$Name]['RECORDS'] as $rec){
+ if(in_array($rec['type'],$this->RecordTypes)){
+ $visible = true;
+ break;
+ }
+ }
+ if(!$visible && isset($this->Devices[$Name]['RECORDS'])){
+ $this->Devices[$Name]['RECORDS'] = array();
+ }
+ }
+ }
+
+ /* Possible attributes posted
+ */
+ foreach($_POST as $name => $value){
+
+ /* Extract informations out of post name
+ */
+ $tmp = preg_replace("/^.*_/","\\1",$name);
+ $tmp2 = split("\|",$tmp);
+
+ if(count($tmp2) != 2) continue;
+
+ $Name = base64_decode($tmp2[0]);
+ $RecordID = $tmp2[1];
+
+ /* Check for value change
+ */
+ if(preg_match("/ValueSelection_/",$name)){
+ if(isset($this->Devices[$Name]['RECORDS'][$RecordID])){
+
+ /* Update value */
+ $old = $this->Devices[$Name]['RECORDS'][$RecordID]['value'];
+ $this->Devices[$Name]['RECORDS'][$RecordID]['value'] = $value;
+
+ /* Handle pTRRecord */
+ if(!isset($ptr_updates[$Name]) && $this->Devices[$Name]['RECORDS'][$RecordID]['type'] == "aRecord"){
+
+ $found = false;
+ $ip = $value;
+ $match = preg_replace("/^[^\/]*+\//","",$this->reverseName);
+ $ip = preg_replace("/^".normalizePreg($match)."/","",$ip);
+ $ip = preg_replace("/^\./","",$ip);
+
+ foreach($this->Devices[$Name]['RECORDS'] as $key => $dev){
+ if($dev['type'] == "pTRRecord"){
+ $ptr_updates[$Name] = $Name;
+ $this->Devices[$Name]['RECORDS'][$key]['value'] = $ip;
+ $found = true;
+ break;
+ }
+ }
+ if(!$found){
+ $dev = array('type'=> 'pTRRecord', 'value' => $ip);
+ $this->Devices[$Name]['RECORDS'][] = $dev;
+ }
+ }
+ }
+ }
+
+ /* record type changed
+ */
+ if(preg_match("/^RecordTypeSelection_/",$name)){
+ if(isset($this->Devices[$Name]['RECORDS'][$RecordID])){
+ $this->Devices[$Name]['RECORDS'][$RecordID]['type'] = $value;
+ }
+ }
+ }
+
+ /* check for renamed entries
+ */
+ foreach($_POST as $name => $value){
+
+ /* Extract informations out of post name
+ */
+ $tmp = preg_replace("/^.*_/","\\1",$name);
+ $tmp2 = split("\|",$tmp);
+
+ if(count($tmp2) != 2) continue;
+
+ $Name = base64_decode($tmp2[0]);
+ $RecordID = $tmp2[1];
+
+ /* Host renamed
+ */
+ if(preg_match("/RenameHost_/",$name)){
+ if((isset($this->Devices[$Name])) && ($Name != $value)){
+
+ if(isset($this->Devices[$value])){
+ print_red(sprintf(_("Can't rename '%s' to '%s' there is already an entry with the same name in our zone editing dialog."),$Name,$value));
+ }else{
+ $this->Devices[$value] = $this->Devices[$Name];
+ unset($this->Devices[$Name]);
+ }
+ }
+ }
+ }
+ }
+
+
+ /* check something
+ */
+ function check()
+ {
+ /* Call common method to give check the hook */
+ $message= plugin::check();
+
+ $ldap = $this->config->get_ldap_link();
+ $ldap->cd($this->config->current['BASE']);
+
+ $names = array();
+ foreach($this->Devices as $DevName => $device){
+
+ /* Don't need to check empty values ... */
+ if(!count($device['RECORDS'])) continue;
+
+ /* Checking entry name
+ */
+ if(!preg_match("/^[a-z0-9_\.-]+$/i", $DevName) || (empty($DevName))){
+ $message[] = sprintf(_("Entry name '%s' contains invalid characters."), $DevName);
+ }
+
+ /* Renaming check for existing devices
+ */
+ if(isset($device['OrigCn']) && ($DevName != $device['OrigCn'] )){
+ $ldap->cd($this->config->current['BASE']);
+ $ldap->search("(relativeDomainName=".$DevName.")",array("relativeDomainName"));
+ if($ldap->count()){
+ $message[] = sprintf(_("Can not rename '%s' to '%s',the destination name already exists."),$device['OrigCn'],$DevName);
+ }
+ }elseif(!isset($device['OrigCn'])){
+ $ldap->cd($this->config->current['BASE']);
+ $ldap->search("(relativeDomainName=".$DevName.")",array("relativeDomainName"));
+ if($ldap->count()){
+ $message[] = sprintf(_("Can not create '%s',the destination name already exists."),$DevName);
+ }
+ }
+
+ /* Check names
+ */
+ if(!isset($names[$DevName])){
+ $names[$DevName] = "";
+ }else{
+ $message[] = sprintf(_("The name '%s' is used more than once."),$DevName);
+ }
+
+ /* Names should be written in lowercase
+ */
+# if(strtolower($DevName) != $DevName){
+# $message[] = sprintf(_("The host name '%s' should be written in lowercase."), $DevName);
+# }
+
+ /* Check records
+ */
+ $singleEntries = array("cNAMERecord","pTRRecord");
+
+ $tmp = array();
+ $tmp2 = array();
+ foreach($device['RECORDS'] as $Num => $Rec){
+
+ /* Check for multiple use of unique record types
+ */
+ if(in_array($Rec['type'],$singleEntries)){
+ if(!isset($tmp[$Rec['type']])){
+ $tmp[$Rec['type']] = "";
+ }else{
+ $message[] = sprintf(_("The record type '%s' is a unique type and can't be defined twice."),$Rec['type']);
+ }
+ }
+
+ /* Check for empty / duplicate entries in record array
+ */
+ if(empty($Rec['value'])){
+ $message[] = sprintf(_("There is an empty '%s' for host '%s'."),$Rec['type'],$DevName);
+ }
+
+ /* Check for duplicate record entries
+ */
+ if(!isset($tmp[$Rec['type']][$Rec['value']])){
+ $tmp[$Rec['type']][$Rec['value']] = "";
+ }else{
+ $message[] = sprintf(_("There is a duplicate entry in '%s' for '%s'."),$Rec['type'],$DevName);
+ }
+ }
+ }
+ return ($message);
+ }
+
+ function save()
+ {
+ if($this->disableDialog) return;
+
+ $todo = array();
+
+
+
+ /* Create todolist
+ */
+ foreach($this->Devices as $name => $dev){
+ if(isset($dev['OrigCn'])){
+ if(count($dev['RECORDS'])){
+ $todo[] = DNS::getDNSHostEntriesDiff($this->config,$dev['OrigCn'],$dev,$name);
+ }else{
+ $dev['exists'] = false;
+ $todo[] = DNS::getDNSHostEntriesDiff($this->config,$dev['OrigCn'],$dev,$name);
+ }
+ }else{
+ if(count($dev['RECORDS'])){
+ $todo[] = DNS::getDNSHostEntriesDiff($this->config,"",$dev,$name);
+ }else{
+ $dev['exists'] = false;
+ $todo[] = DNS::getDNSHostEntriesDiff($this->config,"",$dev,$name);
+ }
+ }
+ }
+
+ $tmp = array();
+ $tmp['del'] = array();
+ $tmp['add'] = array();
+ $tmp['move'] = array();
+ foreach($todo as $to){
+ foreach($to as $type => $entries){
+ $tmp[$type] = array_merge($tmp[$type],$entries);
+ }
+ }
+
+ /* Get ldap link
+ */
+ $ldap = $this->config->get_ldap_link();
+ $ldap->cd ($this->config->current['BASE']);
+
+ /* move follwoing entries
+ */
+ foreach($tmp['move'] as $src => $dst){
+ $this->recursive_move($src,$dst);
+ }
+
+ /* Delete dns */
+ foreach($tmp['del'] as $dn => $del){
+ $ldap->cd($dn);
+ $ldap->rmdir_recursive($dn);
+ if(is_object($this->parent->parent)){
+ $this->parent->parent->handle_post_events("remove",array("dn" => $dn));
+ }
+ }
+
+ /* Add || Update new DNS entries
+ */
+ foreach($tmp['add'] as $dn => $attrs){
+ $ldap->cd($dn);
+ $ldap->cat($dn, array('dn'));
+ if(count($ldap->fetch())){
+ $ldap->cd($dn);
+ $ldap->modify ($attrs);
+ if(is_object($this->parent->parent)){
+ $this->parent->parent->handle_post_events("modify",array("dn" => $dn));
+ }
+ }else{
+ $ldap->cd($dn);
+ $ldap->add($attrs);
+ if(is_object($this->parent->parent)){
+ $this->parent->parent->handle_post_events("create",array("dn" => $dn));
+ }
+ }
+ }
+ }
+
+
+ /* Create html table out of given entry
+ */
+ function generateRecordConfigurationRow($objKey){
+
+ /* Get some basic informations
+ */
+ $obj = $this->Devices[$objKey];
+ $objectName = $objKey;
+
+ /* Abort if emtpy
+ */
+ if(count($obj['RECORDS']) == 0) return "";
+
+ /* Set title
+ */
+ $str= "<br>";
+
+ $hostNameOnce = true;
+
+ /* Walk through all defined records
+ */
+ $str.= "<table cellspacing='0' cellpadding='0'>";
+ foreach($obj['RECORDS'] as $id => $record){
+
+ /* Skip not selectable entries */
+ if(!isset($this->RecordTypes [$record['type']])) {
+ continue;
+ }
+
+ /* Create unique post name
+ */
+ $name = base64_encode($objKey)."|".$id;
+
+ $str .= "<tr><td style='width:170px;'>\n";
+
+ /* Only first host entry name should be editable
+ */
+ if($hostNameOnce){
+ $hostNameOnce = false;
+ $str .="<input type='text' name='RenameHost_".$name."' value='".$objectName."'>\n";
+ }
+
+ /* Create rest. Selectbox, icons ...
+ */
+ $str .="
+ </td>
+ <td style='width:90px;'>
+ ".$this->createRecordTypeSelection($record['type'],$name)."
+ </td>
+ <td>
+ <input type='text' value='".$record['value']."' name='ValueSelection_".$name."' style='width:250px;'>
+ </td>
+ <td style='width:75px;text-align:right;'>
+ <input type='image' name='AddRecord_".$name."' src='images/list_new.png' alt='"._("Add")."' title='"._("Add")."'>
+ <input type='image' name='RemoveRecord_".$name."' src='images/edittrash.png' alt='"._("Remove")."' title='"._("Remove")."'>
+ ";
+
+# if($record['type'] == "aRecord"){
+# $str .="<input type='image' name='AddPtr_".$name."' src='images/network.png'
+# alt='"._("Add PTR")."' title='"._("Add PTR record")."'>";
+# }else{
+# $str .= "<img src='images/empty.png' alt=''>";
+# }
+
+ $str.=
+ "</td>
+ </tr>";
+ }
+ $str .="</table>";
+ return($str);
+ }
+
+
+ /* Create selectbox with all available option types
+ */
+ function createRecordTypeSelection($id,$refID){
+
+ $str = "\n<select name='RecordTypeSelection_".$refID."'>";
+ foreach($this->RecordTypes as $type => $atr) {
+ if($id == $type){
+ $str .="\n<option value='".$type."' selected >".strtoupper(preg_replace("/record/i","",$type))."</option>";
+ }else{
+ $str .="\n<option value='".$type."'>".strtoupper(preg_replace("/record/i","",$type))."</option>";
+ }
+ }
+ $str.= "\n</select>";
+ return($str);
+ }
+
+
+ function remove_from_parent()
+ {
+ }
+
+}
+
+// vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler:
+?>
diff --git a/gosa-plugins/dns/admin/systems/services/dns/servDNSeditZoneEntries.tpl b/gosa-plugins/dns/admin/systems/services/dns/servDNSeditZoneEntries.tpl
--- /dev/null
@@ -0,0 +1,27 @@
+<h2>{t}This dialog allows you to configure all components of this DNS zone on a single list.{/t}</h2>
+<p class="seperator"> </p>
+{if $disableDialog}
+ <br><b>
+ {t}This dialog can't be used until the currently edited zone was saved or the zone entry exists in the ldap database.{/t}
+ </b>
+{else}
+ <br>
+ {$table}
+ <br>
+ <input type='submit' name='UserRecord' value='{t}New entry{/t}' title='{t}Create a new DNS zone entry{/t}'>
+{/if}
+
+<p class="seperator"> </p>
+<div style="text-algin:right;" align="right">
+ <p>
+ <input type="submit" name="SaveZoneEntryChanges" value="{t}Save{/t}">
+ <input type="submit" name="CancelZoneEntryChanges" value="{t}Cancel{/t}">
+ </p>
+</div>
+
+<script language="JavaScript" type="text/javascript">
+ <!-- // First input field on page
+ focus_field('zoneName');
+ -->
+</script>
+
diff --git a/gosa-plugins/dns/admin/systems/services/dns/servdns.tpl b/gosa-plugins/dns/admin/systems/services/dns/servdns.tpl
--- /dev/null
@@ -0,0 +1,63 @@
+{if $dns_take_over}
+<table summary="" width="100%">
+ <tr>
+ <td style="width:100%;vertical-align:top;">
+ <h2>{t}DNS take over initiated{/t}</h2>
+ {$warning}
+ {t}This includes 'all' DNS zones that are located within this server. Please double check if your really want to do this.{/t}
+ <p>
+ {$warning2}
+ <br>
+ <input type='submit' name='cancel_take_over' value='{t}Cancel{/t}'>
+ </p>
+ <p>
+ {t}Following objects will be taken over{/t} :
+ </p>
+ <p>
+ <pre>{$info}</pre>
+ </p>
+ </td>
+ </tr>
+</table>
+{else}
+<table summary="" width="100%">
+{if $dns_server_list_cnt}
+<tr>
+ <td style="width:100%;vertical-align:top;">
+ <b>{t}Take over DNS configuration from{/t}</b>
+ <select name='take_over_src'>
+ {html_options options=$dns_server_list}
+ </select>
+ <input type="submit" name="take_over" value="{t}Take over{/t}">
+ </td>
+</tr>
+{/if}
+<tr>
+ <td style="width:100%;vertical-align:top;">
+<h2>{t}Zones{/t}</h2>
+ {$ZoneList}
+ {if $is_createable}
+ <input type="submit" name="AddZone" value="{t}Add{/t}">
+ {else}
+ <input type="button" value="{t}Add{/t}" disabled>
+ {/if}
+ </td>
+</tr>
+</table>
+
+
+<script language="JavaScript" type="text/javascript">
+ <!-- // First input field on page
+ focus_field('AddZone');
+ -->
+</script>
+
+{/if}
+<p class="seperator"> </p>
+<p>
+<div style="width:100%; text-align:right;">
+ <input type='submit' name='SaveService' value='{t}Save{/t}'>
+
+ <input type='submit' name='CancelService' value='{t}Cancel{/t}'>
+</div>
+</p>
diff --git a/gosa-plugins/dns/admin/systems/services/dns/servdnseditzone.tpl b/gosa-plugins/dns/admin/systems/services/dns/servdnseditzone.tpl
--- /dev/null
@@ -0,0 +1,177 @@
+<h2>{t}Generic{/t}</h2>
+<table summary="" width="100%">
+ <tr>
+ <td style="width:50%;vertical-align:top;border-right:1px solid #b0b0b0;">
+ <table summary="">
+ <tr>
+ <td>{t}Zone name{/t}{$must}
+ </td>
+ <td>
+{render acl=$ACLs}
+ <input type="text" name="zoneName" value="{$zoneName}" {if $NotNew} disabled {/if}>
+{/render}
+ </td>
+ </tr>
+ <tr>
+ <td>{t}Network address{/t}{$must}
+ </td>
+ <td>
+{render acl=$ACLs}
+ <input type="text" name="ReverseZone" value="{$ReverseZone}" {if $NotNew} disabled {/if}>
+{/render}
+ </td>
+ </tr>
+ <tr>
+ <td>{t}Netmask{/t}
+ </td>
+ <td>
+{render acl=$ACLs}
+ <select name="NetworkClass" {if $NotNew} disabled {/if}>
+ {html_options options=$NetworkClasses selected=$NetworkClass }
+ </select>
+{/render}
+ </td>
+ </tr>
+ </table>
+ </td>
+ <td style="vertical-align:top;">
+ <table summary="">
+ <tr>
+ <td>
+ {t}Zone records{/t}
+ <br>
+ {if $AllowZoneEdit == false}
+ <i>{t}Can't be edited because the zone wasn't saved right now.{/t}</i>
+ {/if}
+ </td>
+ <td>
+{render acl=$ACLs}
+ <input type="submit" name="EditZoneEntries" value="{t}Edit{/t}" {if $AllowZoneEdit == false} disabled {/if}>
+{/render}
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<p class="seperator"> </p>
+<h2>{t}SOA record{/t}</h2>
+<table summary="" width="100%">
+ <tr>
+ <td style="vertical-align:top;width:50%;border-right:1px solid #b0b0b0;">
+ <table summary="">
+ <tr>
+ <td>{t}Primary dns server for this zone{/t}{$must}
+ </td>
+ <td>
+{render acl=$ACLs}
+ <input type="text" name="sOAprimary" value="{$sOAprimary}">
+{/render}
+ </td>
+ </tr>
+ <tr>
+ <td>{t}Mail address{/t}{$must}
+ </td>
+ <td>
+{render acl=$ACLs}
+ <input type="text" name="sOAmail" value="{$sOAmail}">
+{/render}
+ </td>
+ </tr>
+ <tr>
+ <td>{t}Serial number (automatically incremented){/t}{$must}
+ </td>
+ <td>
+{render acl=$ACLs}
+ <input type="text" name="sOAserial" value="{$sOAserial}">
+{/render}
+ </td>
+ </tr>
+ </table>
+ </td>
+ <td style="vertical-align:top;">
+ <table summary="">
+ <tr>
+ <td>{t}Refresh{/t}{$must}
+ </td>
+ <td>
+{render acl=$ACLs}
+ <input type="text" name="sOArefresh" value="{$sOArefresh}">
+{/render}
+ </td>
+ </tr>
+ <tr>
+ <td>{t}Retry{/t}{$must}
+ </td>
+ <td>
+{render acl=$ACLs}
+ <input type="text" name="sOAretry" value="{$sOAretry}">
+{/render}
+ </td>
+ </tr>
+ <tr>
+ <td>{t}Expire{/t}{$must}
+ </td>
+ <td>
+{render acl=$ACLs}
+ <input type="text" name="sOAexpire" value="{$sOAexpire}">
+{/render}
+ </td>
+ </tr>
+ <tr>
+ <td>{t}TTL{/t}{$must}
+ </td>
+ <td>
+{render acl=$ACLs}
+ <input type="text" name="sOAttl" value="{$sOAttl}">
+{/render}
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+
+<p class="seperator"> </p>
+<br>
+<table summary="" width="100%">
+ <tr>
+ <td style="vertical-align:top;width:50%;border-right:1px solid #b0b0b0;">
+ <h2>{t}MxRecords{/t}</h2>
+ <table width="100%">
+ <tr>
+ <td>
+{render acl=$ACLs}
+ {$Mxrecords}
+{/render}
+{render acl=$ACLs}
+ <input type="text" name="StrMXRecord" value="">
+{/render}
+{render acl=$ACLs}
+ <input type="submit" name="AddMXRecord" value="{t}Add{/t}">
+{/render}
+ </td>
+ </tr>
+ </table>
+ </td>
+ <td style="vertical-align:top;">
+ <h2>{t}Global zone records{/t}</h2>
+{render acl=$ACLs}
+ {$records}
+{/render}
+ </td>
+ </tr>
+</table>
+<div style="text-algin:right;" align="right">
+ <p>
+{render acl=$ACLs}
+ <input type="submit" name="SaveZoneChanges" value="{t}Save{/t}">
+{/render}
+ <input type="submit" name="CancelZoneChanges" value="{t}Cancel{/t}">
+ </p>
+</div>
+<script language="JavaScript" type="text/javascript">
+ <!-- // First input field on page
+ focus_field('zoneName');
+ -->
+</script>