"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 $orig_dn = "";
var $initially_was_account;
/* ServerService tab vars */
var $conflicts = array("servdns");
var $DisplayName = "";
var $StatusFlag = "";
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 = getDnsRecordTypes(true);
/* Get all zone Informations
*/
$this->Zones = 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;
}else{
$this->is_account = true;
}
if($this->is_account){
@log::log("view","unknown/".get_class($this),$this->dn);
}
$this->initially_was_account = $this->is_account;
}
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;
}
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 = 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);
}
/* 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);
}
}
/* 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['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 = FlipIp($this->Zones[$id]['InitialReverseZone']);
}else{
$rev = 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;
foreach($this->Zones as $key => $zone){
$bool= $bool & $this->RemoveZone($key);
}
if($bool){
$this->save();
}
return($bool);
}
}
/* Save to LDAP */
function save()
{
$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 = getDNSZoneEntriesDiff($this->config,$this->Zones,$old_dn);
/* 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);
@log::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){
$ldap->cd($dn);
$ldap->rmdir_recursive($dn);
@log::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));
}
/* 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(count($ldap->fetch())){
$ldap->cd($dn);
$ldap->modify ($attrs);
}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));
}
}
/* 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 */
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:
?>