"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 $dialog = NULL;
var $usedDNS = array();
var $orig_dn = "";
var $DNSinitially_was_account;
function servdns ($config, $dn= NULL)
{
plugin::plugin ($config, $dn);
$this->orig_dn = $dn;
/* All types with required attrs */
$this->RecordTypes['aRecord'] = "aRecord"; // ok
$this->RecordTypes['mDRecord'] = "mDRecord"; // ok
$this->RecordTypes['mXRecord'] = "mXRecord"; // ok
$this->RecordTypes['nSRecord'] = "nSRecord"; // ok
$this->RecordTypes['pTRRecord'] = "relativeDomainName";// ok
$this->RecordTypes['hInfoRecord'] = "hInfoRecord"; // ok
$this->RecordTypes['mInfoRecord'] = "mInfoRecord"; // ok
$this->RecordTypes['tXTRecord'] = "tXTRecord"; // ok
$this->RecordTypes['aFSDBRecord'] = "aFSDBRecord"; // ok
$this->RecordTypes['SigRecord'] = "SigRecord"; // ok
$this->RecordTypes['KeyRecord'] = "KeyRecord"; // ok
$this->RecordTypes['aAAARecord'] = "aAAARecord"; // ok
$this->RecordTypes['LocRecord'] = "LocRecord"; // ok
$this->RecordTypes['nXTRecord'] = "nXTRecord"; // ok
$this->RecordTypes['sRVRecord'] = "sRVRecord"; // ok
$this->RecordTypes['nAPTRRecord'] = "nAPTRRecord"; // ok
$this->RecordTypes['kXRecord'] = "kXRecord"; // ok
$this->RecordTypes['certRecord'] = "certRecord"; // ok
$this->RecordTypes['a6Record'] = "a6Record"; // ok
$this->RecordTypes['dSRecord'] = "dSRecord"; // ok
$this->RecordTypes['sSHFPRecord'] = "sSHFPRecord"; // ok
$this->RecordTypes['rRSIGRecord'] = "rRSIGRecord"; // ok
$this->RecordTypes['nSECRecord'] = "nSECRecord"; // ok
$types = array();
/* Get all records */
$ldap = $this->config->get_ldap_link();
$ldap->cd($this->dn);
$ldap->search("(&(objectClass=dNSZone)(relativeDomainName=@))",array("*"));
while($attrs = $ldap->fetch()){
/* If relative domainname
* Try to read dnsclass / TTl / zone
*/
$this->usedDNS[$attrs['dn']] = $attrs['dn'];
if((isset($attrs['tXTRecord'][0]))&&(preg_match("/zoneName\=/",$attrs['tXTRecord'][0]))){
$zoneName= preg_replace("/zoneName\=/","",$attrs['tXTRecord'][0]);
$z = preg_replace("/\.in\-addr\.arpa/","",$attrs['zoneName'][0]);
$z = $this->FlipIp($z);
$types[$zoneName]['ReverseZone'] = $z;
$types[$zoneName]['ReverseDN'] = $attrs['dn'];
}else{
/* Generate SOA entry */
if(isset($attrs['sOARecord'][0])){
$tmp = split("\ ",$attrs['sOARecord'][0]) ;
$tmp2 = array();
$ar = array("0"=>"sOAprimary","1"=>"sOAmail","2"=>"sOAserial","3"=>"sOArefresh","4"=>"sOAretry","5"=>"sOAexpire","6"=>"sOAttl");
/* Assign soa vars */
foreach($ar as $key => $name){
if(isset($tmp[$key])){
$types[$attrs['zoneName'][0]][$name] = $tmp[$key];
}else{
$types[$attrs['zoneName'][0]][$name] = "";
}
}
}
/* Set TTL value */
if(isset($attrs['dNSTTL'][0])){
$types[$attrs['zoneName'][0]]['dNSTTL'] = $attrs['dNSTTL'][0];
}
/* Set dns Class*/
if(isset($attrs['dNSClass'][0])){
$types[$attrs['zoneName'][0]]['dNSClass'] = $attrs['dNSClass'][0];
}
/* Set zone Name */
if(isset($attrs['zoneName'][0])){
$types[$attrs['zoneName'][0]]['zoneName'] = $attrs['zoneName'][0];
}
/* Create list with all used records */
foreach($this->RecordTypes as $name => $value){
/* If there is a record attribute */
if(isset($attrs[$name])){
$types[$attrs['zoneName'][0]]['Records']=array();
/* get all entries */
for($i = 0 ; $i < $attrs[$value]['count']; $i ++){
$types[$attrs['zoneName'][0]]['Records'][] =array("type" =>$name,
"inittype" =>$name,
"value" =>$attrs[$value][$i],
"status" =>"edited",
"dn" =>$attrs['dn']);
}
}
}
}
}
/* If there is at least one entry in this -> types, we have DNS enabled */
$this->Zones = $types;
if(count($this->Zones) == 0){
$this->is_account = false;
}else{
$this->is_account = true;
}
/* Store initally account settings */
$this->DNSinitially_was_account = $this->is_account;
}
/* this is used to flip the ip address for example
12.3.45 -> 54.3.12
Because some entries (like zones) are store like that 54.3.12.in-addr.arpa
but we want to display 12.3.45.
*/
function FlipIp($ip)
{
$tmp = array_reverse(split("\.",$ip));
$new = "";
foreach($tmp as $section){
$new .= $section.".";
}
return(preg_replace("/.$/","",$new));
}
function execute()
{
/* Call parent execute */
plugin::execute();
/* Fill templating stuff */
$smarty= get_smarty();
$display= "";
/* Do we need to flip is_account state? */
if (isset($_POST['modify_state'])){
$this->is_account= !$this->is_account;
}
/* Show tab dialog headers */
if ($this->is_account){
$display= $this->show_header(_("Remove DNS service"),
_("This server has DNS features enabled. You can disable them by clicking below."));
} else {
$display= $this->show_header(_("Add DNS service"),
_("This server has DNS features disabled. You can enable them by clicking below."));
return ($display);
}
/* Edited or Added zone hould be saved saved */
if(isset($_POST['SaveZoneChanges'])){
$this->dialog->save_object();
/* Check if noting went wrong */
if(count($this->dialog->check())){
foreach($this->dialog->check() as $msgs){
print_red($msgs);
}
}else{
/* add new/edited zone */
$ret = $this->dialog->save();
unset($this->Zones[$this->dialog->InitiallyZoneName]);
$this->Zones[$ret['zoneName']] = $ret;
$this->dialog = NULL;
}
}
/* Cancel zone edit / new */
if(isset($_POST['CancelZoneChanges'])){
$this->dialog = NULL;
}
/* Add empty new zone */
if(isset($_POST['AddZone'])){
$this->dialog = new servdnseditZone($this->config,$this->dn,$this->RecordTypes);
}
/* 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->RecordTypes,$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));
$zones = $this->getUsedZoneNames();
$rev = $this->Zones[$tmp]['ReverseZone'];
$res = array_merge(($zones[$tmp]),($zones[$rev.".in-addr.arpa"]));
if(count($res)){
$i = 2;
$str ="";
foreach($res as $dn){
if($i > 0 ){
$i --;
$str.=$dn." ";
}
}
if(count($res)> 2) $str .=" ... ";
print_red(sprintf(_("Can't delete the selected zone, because it is still in use by these entry/entries '%s'"),trim($str)));
}else{
unset($this->Zones[$tmp]);
}
}
}
/* Show dialog */
if($this->dialog!= NULL){
$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 = "
";
foreach($this->Zones as $zone => $values ){
$ZoneList->AddEntry(array(
array("string" => $zone),
array("string" => _("Reverse zone")." : ".$values['ReverseZone']),
array("string" => _("TTL")." : ".$values['dNSTTL']),
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);
}
/* 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","tXTRecord"));
while($attr = $ldap->fetch()){
if(preg_match("/in-addr\.arpa/",$attr['zoneName'][0])){
$ret[$attr['zoneName'][0]][] = $attr['dn'];
}else{
$ret[$attr['zoneName'][0]][] = $attr['dn'];
}
}
return($ret);
}
/* Remove dns service */
function remove_from_parent()
{
if(!$this->DNSinitially_was_account){
return;
}
$ldap = $this->config->get_ldap_link();
$ldap->cd($this->config->current['BASE']);
foreach($this->usedDNS as $dn){
$ldap->cd($dn);
$ldap->rmdir_recursive($dn);
}
$ldap = $this->config->get_ldap_link();
$ldap->cd($this->orig_dn);
$ldap->search("(&(objectClass=dNSZone)(zoneName=*)(relativeDomainName=@))",array("relativeDomainName","zoneName"));
while($attr = $ldap->fetch()){
$ldap->cd($attr['dn']);
$ldap->rmDir($attr['dn']);
}
show_ldap_error($ldap->get_error());
}
/* Save data to object */
function save_object()
{
}
/* Check supplied data */
function check()
{
$message= array();
return ($message);
}
/* Save to LDAP */
function save()
{
/* Ldap conenction / var initialization */
$ldap = $this->config->get_ldap_link();
$ldap->cd($this->config->current['BASE']);
$actions =array("update"=>array(),"add"=>array(),"delete"=>array());
/* Generate entries for all zones, and check if they must be updated deleted added */
foreach($this->Zones as $zone){
/* Get ldap syntax */
$tmp = $this->generate_LDAP_entries($zone);
/* Check if dn is new, or if entry was edited */
foreach($tmp as $key => $values){
if(isset($this->usedDNS[$key])){
$actions['update'][$key]=$values;
unset($this->usedDNS[$key]);
}else{
$actions['add'][$key] = $values;
}
}
}
/* Check which dns are not used anymore ...*/
foreach($this->usedDNS as $key => $values){
$actions['delete'][$key] = $values;
}
/* Remove deleted zones */
foreach($actions['delete'] as $dn => $attrs){
$ldap->cd($dn);
$ldap->rmdir_recursive($dn);
}
/* Add new zones */
foreach($actions['add'] as $dn => $attrs){
$ldap->cd($this->config->current['BASE']);
// $ldap->create_missing_trees($dn);
$ldap->cd($dn);
$ldap->add($attrs);
}
/* Update existing entries */
foreach($actions['update'] as $dn => $attrs){
$ldap->cd($dn);
//$this->cleanup();
$ldap->modify ($attrs);
}
show_ldap_error($ldap->get_error());
}
/* This function generates ldap friendly output
of all changes for a single zone (reverse and forward)
*/
function generate_LDAP_entries($zone)
{
$tmp = array();
$tmp['objectClass'] = array("top","dNSZone");
$tmp['dNSTTL'] = $zone['dNSTTL'];
$tmp['dNSClass'] = $zone['dNSClass'];
$tmp['relativeDomainName'] = "@";//$zone['relativeDomainName'];
$str = "";
foreach(array("sOAprimary","sOAmail","sOAserial","sOArefresh","sOAretry","sOAexpire","sOAttl") as $name){
$str .= $zone[$name]." ";
}
$tmp['sOARecord'] = $str;
/* Generate Record entries */
$arr = array("SigRecord","KeyRecord","aAAARecord","nSRecord","iaFSDBRecord","mInfoRecord","hInfoRecord","mXRecord","mDRecord","tXTRecord",
"LocRecord","nXTRecord","sRVRecord","nAPTRRecord","kXRecord","certRecord","a6Record","dSRecord","sSHFPRecord","rRSIGRecord","nSECRecord");
$aRecords = array();
foreach($arr as $ar){
if((isset($zone['Records']))&&(is_array($zone['Records']))){
foreach($zone['Records'] as $type){
if(($type['type'] == $ar)&&($type['status']!="deleted")){
$tmp[$ar][] = $type['value'];
}
}
}
}
/* Check if there are records removed,
if there are some removed records, the append an array
to ensure that these record types are deleted
*/
if((isset($zone['Records']))&&(is_array($zone['Records']))){
foreach($zone['Records'] as $type){
if((isset($type['inittype']))&&($type['inittype']!="")){
if($type['type'] != $type['inittype']){
$tmp[$type['inittype']] = array();
}
}
}
}
/* generate forward entry */
$dn = "zoneName=".$zone['zoneName'].",".$this->dn;
$tmp2[$dn] = $tmp;
$tmp2[$dn]['zoneName'] = $zone['zoneName'];
/* generate reverse entry */
$dn = "zoneName=".$this->FlipIp($zone['ReverseZone']).".in-addr.arpa,".$this->dn;
$tmp2[$dn] = $tmp;
$tmp2[$dn]['tXTRecord'] ="zoneName=".$zone['zoneName'];
$tmp2[$dn]['zoneName'] = $this->FlipIp($zone['ReverseZone']).".in-addr.arpa";
return($tmp2);
}
}
// vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler:
?>