"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)
{
plugin::plugin ($config, $dn);
$this->DisplayName = _("Domain name system 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;
}
$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_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
*/
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 ){
$i --;
$str.=$dn." ";
}
}
/* 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
*/
$tmp = getDNSZoneEntriesDiff($this->config,$this->Zones,$this->orig_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);
show_ldap_error("Zone:".$ldap->get_error(), _("Updating DNS service failed"));
}
}
/* Delete dns
*/
foreach($tmp['del'] as $dn => $del){
$ldap->cd($dn);
$ldap->rmdir_recursive($dn);
show_ldap_error($ldap->get_error(), _("Removing DNS entries failed"));
}
/* 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(), _("Saving DNS entries failed"));
}
}
/* 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());
$this->action_hook();
}
}
function getListEntry()
{
$this->updateStatusState();
$flag = $this->StatusFlag;
if(empty($flag)){
$fields['Status'] = "";
}else{
$fields['Status'] = $this->$flag;
}
$fields['Message'] = _("DNS service");
$fields['AllowStart'] = true;
$fields['AllowStop'] = true;
$fields['AllowRestart'] = true;
$fields['AllowRemove']= true;
$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];
}
}
}
// vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler:
?>