From b9a3ef486ebcde18a5ade37865ff8f397185d24f Mon Sep 17 00:00:00 2001 From: Till Brehm <tbrehm@ispconfig.org> Date: Sun, 24 Jul 2016 05:30:59 -0400 Subject: [PATCH] Fixed #3979 Mailbox users unable to save autoresponders --- server/mods-available/dns_module.inc.php | 175 +++++++++++++++++++++++++++++++++++++++++----------------- 1 files changed, 123 insertions(+), 52 deletions(-) diff --git a/server/mods-available/dns_module.inc.php b/server/mods-available/dns_module.inc.php index 72ae1df..d3c1303 100644 --- a/server/mods-available/dns_module.inc.php +++ b/server/mods-available/dns_module.inc.php @@ -29,100 +29,171 @@ */ class dns_module { - + var $module_name = 'dns_module'; var $class_name = 'dns_module'; - var $actions_available = array( 'dns_soa_insert', - 'dns_soa_update', - 'dns_soa_delete', - 'dns_rr_insert', - 'dns_rr_update', - 'dns_rr_delete'); - + var $actions_available = array( 'dns_soa_insert', + 'dns_soa_update', + 'dns_soa_delete', + 'dns_slave_insert', + 'dns_slave_update', + 'dns_slave_delete', + 'dns_rr_insert', + 'dns_rr_update', + 'dns_rr_delete'); + //* This function is called during ispconfig installation to determine // if a symlink shall be created for this plugin. function onInstall() { global $conf; - - return true; - + + if($conf['services']['dns'] == true) { + return true; + } else { + return false; + } + } - + /* This function is called when the module is loaded */ - + function onLoad() { global $app; - + /* - Annonce the actions that where provided by this module, so plugins + Annonce the actions that where provided by this module, so plugins can register on them. */ - - $app->plugins->announceEvents($this->module_name,$this->actions_available); - + + $app->plugins->announceEvents($this->module_name, $this->actions_available); + /* As we want to get notified of any changes on several database tables, we register for them. - + The following function registers the function "functionname" - to be executed when a record for the table "dbtable" is + to be executed when a record for the table "dbtable" is processed in the sys_datalog. "classname" is the name of the class that contains the function functionname. */ - - $app->modules->registerTableHook('dns_soa',$this->module_name,'process'); - $app->modules->registerTableHook('dns_rr',$this->module_name,'process'); - - + + $app->modules->registerTableHook('dns_soa', $this->module_name, 'process'); + $app->modules->registerTableHook('dns_slave', $this->module_name, 'process'); + $app->modules->registerTableHook('dns_rr', $this->module_name, 'process'); + + // Register service - $app->services->registerService('bind','dns_module','restartBind'); - + $app->services->registerService('bind', 'dns_module', 'restartBind'); + $app->services->registerService('powerdns', 'dns_module', 'restartPowerDNS'); + } - + /* This function is called when a change in one of the registered tables is detected. The function then raises the events for the plugins. */ - function process($tablename,$action,$data) { + function process($tablename, $action, $data) { global $app; - + switch ($tablename) { - case 'dns_soa': - if($action == 'i') $app->plugins->raiseEvent('dns_soa_insert',$data); - if($action == 'u') $app->plugins->raiseEvent('dns_soa_update',$data); - if($action == 'd') $app->plugins->raiseEvent('dns_soa_delete',$data); + case 'dns_soa': + if($action == 'i') $app->plugins->raiseEvent('dns_soa_insert', $data); + if($action == 'u') $app->plugins->raiseEvent('dns_soa_update', $data); + if($action == 'd') $app->plugins->raiseEvent('dns_soa_delete', $data); break; - case 'dns_rr': - if($action == 'i') $app->plugins->raiseEvent('dns_rr_insert',$data); - if($action == 'u') $app->plugins->raiseEvent('dns_rr_update',$data); - if($action == 'd') $app->plugins->raiseEvent('dns_rr_delete',$data); + case 'dns_slave': + if($action == 'i') $app->plugins->raiseEvent('dns_slave_insert', $data); + if($action == 'u') $app->plugins->raiseEvent('dns_slave_update', $data); + if($action == 'd') $app->plugins->raiseEvent('dns_slave_delete', $data); + break; + case 'dns_rr': + if($action == 'i') $app->plugins->raiseEvent('dns_rr_insert', $data); + if($action == 'u') $app->plugins->raiseEvent('dns_rr_update', $data); + if($action == 'd') $app->plugins->raiseEvent('dns_rr_delete', $data); break; } // end switch } // end function - - + + function restartBind($action = 'restart') { - global $app; - - $command = ''; - if(is_file('/etc/init.d/bind9')) { - $command = '/etc/init.d/bind9'; + global $app, $conf; + + $app->uses('system'); + + $daemon = ''; + if(is_file($conf['init_scripts'] . '/' . 'bind9')) { + $daemon = 'bind9'; } else { - $command = '/etc/init.d/named'; + $daemon = 'named'; } - + + $retval = array('output' => '', 'retval' => 0); if($action == 'restart') { - exec($command.' restart'); + exec($app->system->getinitcommand($daemon, 'restart').' 2>&1', $retval['output'], $retval['retval']); } else { - exec($command.' reload'); + exec($app->system->getinitcommand($daemon, 'reload').' 2>&1', $retval['output'], $retval['retval']); } - + return $retval; } - + + function restartPowerDNS($action = 'restart') { + global $app, $conf; + + $app->uses('system'); + $app->log("restartPDNS called.", LOGLEVEL_DEBUG); + + /** Since PowerDNS does not currently allow to limit AXFR for specific zones to specific + * IP addresses, we create a list of IPs allowed of AXFR transfers from our PowerDNS, + * however any of these IPs is allowed to AXFR transfer any of the zones we are masters + * for. + */ + + + $tmps = $app->db->queryAllRecords("SELECT DISTINCT xfer FROM dns_soa WHERE active = 'Y' UNION SELECT DISTINCT xfer FROM dns_slave WHERE active = 'Y' "); + + //* Make sure the list is never empty + $options='127.0.0.1'; + foreach($tmps as $tmp) { + if (trim($tmp['xfer'])!='') { + if ($options=='') { + $options.=$tmp['xfer']; + } else { + $options=$options.",".$tmp['xfer']; + } + } + } + + //* Remove duplicate IPs from the array + $options = "allow-axfr-ips=".implode(",", array_unique(explode(",", $options))); + $app->log("".$options, LOGLEVEL_DEBUG); + + + + /** Not an ideal way to use a hardcoded path like that, but currently + * we have no way to find out where powerdns' configuration files are + * located, so we have to work on assumption. + */ + file_put_contents('/etc/powerdns/pdns.d/pdns.ispconfig-axfr', $options."\n"); + + $daemon= ''; + if (is_file($conf['init_scripts'] . '/' . 'powerdns')) { + $daemon = 'powerdns'; + } else { + $daemon = 'pdns'; + } + + $retval = array('output' => '', 'retval' => 0); + exec($app->system->getinitcommand($daemon, 'restart').' 2>&1', $retval['output'], $retval['retval']); + + // unset $tmps; + return $retval; + + } + } // end class -?> \ No newline at end of file +?> -- Gitblit v1.9.1