create a dns-config for the froxlor-hostname, fixes #1090
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
This commit is contained in:
@@ -81,55 +81,24 @@ class bind {
|
|||||||
WHERE `d`.`isbinddomain` = '1' ORDER BY `d`.`domain` ASC
|
WHERE `d`.`isbinddomain` = '1' ORDER BY `d`.`domain` ASC
|
||||||
");
|
");
|
||||||
|
|
||||||
|
// customer-domains
|
||||||
while ($domain = $result_domains_stmt->fetch(PDO::FETCH_ASSOC)) {
|
while ($domain = $result_domains_stmt->fetch(PDO::FETCH_ASSOC)) {
|
||||||
|
$bindconf_file .= $this->_generateDomainConfig($domain);
|
||||||
fwrite($this->debugHandler, ' cron_tasks: Task4 - Writing ' . $domain['id'] . '::' . $domain['domain'] . "\n");
|
|
||||||
$this->logger->logAction(CRON_ACTION, LOG_INFO, 'Writing ' . $domain['id'] . '::' . $domain['domain']);
|
|
||||||
|
|
||||||
if ($domain['zonefile'] == '') {
|
|
||||||
$zonefile = $this->generateZone($domain);
|
|
||||||
$domain['zonefile'] = 'domains/' . $domain['domain'] . '.zone';
|
|
||||||
$zonefile_name = makeCorrectFile(Settings::Get('system.bindconf_directory') . '/' . $domain['zonefile']);
|
|
||||||
$known_filenames[] = basename($zonefile_name);
|
|
||||||
$zonefile_handler = fopen($zonefile_name, 'w');
|
|
||||||
fwrite($zonefile_handler, $zonefile);
|
|
||||||
fclose($zonefile_handler);
|
|
||||||
fwrite($this->debugHandler, ' cron_tasks: Task4 - `' . $zonefile_name . '` zone written' . "\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
$bindconf_file.= '# Domain ID: ' . $domain['id'] . ' - CustomerID: ' . $domain['customerid'] . ' - CustomerLogin: ' . $domain['loginname'] . "\n";
|
|
||||||
$bindconf_file.= 'zone "' . $domain['domain'] . '" in {' . "\n";
|
|
||||||
$bindconf_file.= ' type master;' . "\n";
|
|
||||||
$bindconf_file.= ' file "' . makeCorrectFile(Settings::Get('system.bindconf_directory') . '/' . $domain['zonefile']) . '";' . "\n";
|
|
||||||
$bindconf_file.= ' allow-query { any; };' . "\n";
|
|
||||||
|
|
||||||
if (count($this->nameservers) > 0
|
|
||||||
|| count($this->axfrservers) > 0
|
|
||||||
) {
|
|
||||||
// open allow-transfer
|
|
||||||
$bindconf_file.= ' allow-transfer {' . "\n";
|
|
||||||
// put nameservers in allow-transfer
|
|
||||||
if (count($this->nameservers) > 0) {
|
|
||||||
foreach ($this->nameservers as $ns) {
|
|
||||||
$bindconf_file.= ' ' . $ns['ip'] . ';' . "\n";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// AXFR server #100
|
|
||||||
if (count($this->axfrservers) > 0) {
|
|
||||||
foreach ($this->axfrservers as $axfrserver) {
|
|
||||||
if (validate_ip($axfrserver, true) !== false) {
|
|
||||||
$bindconf_file.= ' ' . $axfrserver . ';' . "\n";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// close allow-transfer
|
|
||||||
$bindconf_file.= ' };' . "\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
$bindconf_file.= '};' . "\n";
|
|
||||||
$bindconf_file.= "\n";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// frolxor-hostname (#1090)
|
||||||
|
$hostname_arr = array(
|
||||||
|
'id' => 'none',
|
||||||
|
'domain' => Settings::Get('system.hostname'),
|
||||||
|
'customerid' => 'none',
|
||||||
|
'loginname' => 'froxlor.panel',
|
||||||
|
'bindserial' => date('Ymd').'00',
|
||||||
|
'dkim' => '0',
|
||||||
|
'iswildcarddomain' => '1',
|
||||||
|
'zonefile' => ''
|
||||||
|
);
|
||||||
|
$bindconf_file .= $this->_generateDomainConfig($hostname_arr, true);
|
||||||
|
|
||||||
$bindconf_file_handler = fopen(makeCorrectFile(Settings::Get('system.bindconf_directory') . '/froxlor_bind.conf'), 'w');
|
$bindconf_file_handler = fopen(makeCorrectFile(Settings::Get('system.bindconf_directory') . '/froxlor_bind.conf'), 'w');
|
||||||
fwrite($bindconf_file_handler, $bindconf_file);
|
fwrite($bindconf_file_handler, $bindconf_file);
|
||||||
fclose($bindconf_file_handler);
|
fclose($bindconf_file_handler);
|
||||||
@@ -160,20 +129,88 @@ class bind {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function _generateDomainConfig($domain = array(), $froxlorhost = false) {
|
||||||
|
|
||||||
protected function generateZone($domain) {
|
$bindconf_file = '';
|
||||||
|
|
||||||
|
fwrite($this->debugHandler, ' cron_tasks: Task4 - Writing ' . $domain['id'] . '::' . $domain['domain'] . "\n");
|
||||||
|
$this->logger->logAction(CRON_ACTION, LOG_INFO, 'Writing ' . $domain['id'] . '::' . $domain['domain']);
|
||||||
|
|
||||||
|
if ($domain['zonefile'] == '') {
|
||||||
|
$zonefile = $this->generateZone($domain, $froxlorhost);
|
||||||
|
$domain['zonefile'] = 'domains/' . $domain['domain'] . '.zone';
|
||||||
|
$zonefile_name = makeCorrectFile(Settings::Get('system.bindconf_directory') . '/' . $domain['zonefile']);
|
||||||
|
$known_filenames[] = basename($zonefile_name);
|
||||||
|
$zonefile_handler = fopen($zonefile_name, 'w');
|
||||||
|
fwrite($zonefile_handler, $zonefile);
|
||||||
|
fclose($zonefile_handler);
|
||||||
|
fwrite($this->debugHandler, ' cron_tasks: Task4 - `' . $zonefile_name . '` zone written' . "\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
$bindconf_file.= '# Domain ID: ' . $domain['id'] . ' - CustomerID: ' . $domain['customerid'] . ' - CustomerLogin: ' . $domain['loginname'] . "\n";
|
||||||
|
$bindconf_file.= 'zone "' . $domain['domain'] . '" in {' . "\n";
|
||||||
|
$bindconf_file.= ' type master;' . "\n";
|
||||||
|
$bindconf_file.= ' file "' . makeCorrectFile(Settings::Get('system.bindconf_directory') . '/' . $domain['zonefile']) . '";' . "\n";
|
||||||
|
$bindconf_file.= ' allow-query { any; };' . "\n";
|
||||||
|
|
||||||
|
if (count($this->nameservers) > 0
|
||||||
|
|| count($this->axfrservers) > 0
|
||||||
|
) {
|
||||||
|
// open allow-transfer
|
||||||
|
$bindconf_file.= ' allow-transfer {' . "\n";
|
||||||
|
// put nameservers in allow-transfer
|
||||||
|
if (count($this->nameservers) > 0) {
|
||||||
|
foreach ($this->nameservers as $ns) {
|
||||||
|
$bindconf_file.= ' ' . $ns['ip'] . ';' . "\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// AXFR server #100
|
||||||
|
if (count($this->axfrservers) > 0) {
|
||||||
|
foreach ($this->axfrservers as $axfrserver) {
|
||||||
|
if (validate_ip($axfrserver, true) !== false) {
|
||||||
|
$bindconf_file.= ' ' . $axfrserver . ';' . "\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// close allow-transfer
|
||||||
|
$bindconf_file.= ' };' . "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
$bindconf_file.= '};' . "\n";
|
||||||
|
$bindconf_file.= "\n";
|
||||||
|
|
||||||
|
return $bindconf_file;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* generate bind zone content. If froxlorhost is true,
|
||||||
|
* we will use ALL available IP addresses
|
||||||
|
*
|
||||||
|
* @param array $domain
|
||||||
|
* @param boolean $froxlorhost
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
protected function generateZone($domain, $froxlorhost = false) {
|
||||||
// Array to save all ips needed in the records (already including IN A/AAAA)
|
// Array to save all ips needed in the records (already including IN A/AAAA)
|
||||||
$ip_a_records = array();
|
$ip_a_records = array();
|
||||||
// Array to save DNS records
|
// Array to save DNS records
|
||||||
$records = array();
|
$records = array();
|
||||||
|
|
||||||
|
$domainidquery = '';
|
||||||
|
$query_params = array();
|
||||||
|
if (!$froxlorhost) {
|
||||||
|
$domainidquery = "`di`.`id_domain` = :domainid AND ";
|
||||||
|
$query_params['domainid'] = $domain['id'];
|
||||||
|
}
|
||||||
|
|
||||||
$result_ip_stmt = Database::prepare("
|
$result_ip_stmt = Database::prepare("
|
||||||
SELECT `p`.`ip` AS `ip`
|
SELECT `p`.`ip` AS `ip`
|
||||||
FROM `".TABLE_PANEL_IPSANDPORTS."` `p`, `".TABLE_DOMAINTOIP."` `di`
|
FROM `".TABLE_PANEL_IPSANDPORTS."` `p`, `".TABLE_DOMAINTOIP."` `di`
|
||||||
WHERE `di`.`id_domain` = :domainid AND `p`.`id` = `di`.`id_ipandports`
|
WHERE ".$domainidquery."`p`.`id` = `di`.`id_ipandports`
|
||||||
GROUP BY `p`.`ip`;
|
GROUP BY `p`.`ip`;
|
||||||
");
|
");
|
||||||
Database::pexecute($result_ip_stmt, array('domainid' => $domain['id']));
|
Database::pexecute($result_ip_stmt, $query_params);
|
||||||
|
|
||||||
while ($ip = $result_ip_stmt->fetch(PDO::FETCH_ASSOC)) {
|
while ($ip = $result_ip_stmt->fetch(PDO::FETCH_ASSOC)) {
|
||||||
|
|
||||||
@@ -191,12 +228,14 @@ class bind {
|
|||||||
$date = date('Ymd');
|
$date = date('Ymd');
|
||||||
$bindserial = (preg_match('/^' . $date . '/', $domain['bindserial']) ? $domain['bindserial'] + 1 : $date . '00');
|
$bindserial = (preg_match('/^' . $date . '/', $domain['bindserial']) ? $domain['bindserial'] + 1 : $date . '00');
|
||||||
|
|
||||||
$upd_stmt = Database::prepare("
|
if (!$froxlorhost) {
|
||||||
UPDATE `" . TABLE_PANEL_DOMAINS . "` SET
|
$upd_stmt = Database::prepare("
|
||||||
`bindserial` = :serial
|
UPDATE `" . TABLE_PANEL_DOMAINS . "` SET
|
||||||
WHERE `id` = :id
|
`bindserial` = :serial
|
||||||
");
|
WHERE `id` = :id
|
||||||
Database::pexecute($upd_stmt, array('serial' => $bindserial, 'id' => $domain['id']));
|
");
|
||||||
|
Database::pexecute($upd_stmt, array('serial' => $bindserial, 'id' => $domain['id']));
|
||||||
|
}
|
||||||
|
|
||||||
$zonefile = '$TTL ' . (int)Settings::Get('system.defaultttl') . "\n";
|
$zonefile = '$TTL ' . (int)Settings::Get('system.defaultttl') . "\n";
|
||||||
if (count($this->nameservers) == 0) {
|
if (count($this->nameservers) == 0) {
|
||||||
@@ -259,23 +298,25 @@ class bind {
|
|||||||
*/
|
*/
|
||||||
$zonefile.= $this->generateDkim($domain);
|
$zonefile.= $this->generateDkim($domain);
|
||||||
|
|
||||||
$nssubdomains_stmt = Database::prepare("
|
if (!$froxlorhost) {
|
||||||
SELECT `domain` FROM `" . TABLE_PANEL_DOMAINS . "`
|
$nssubdomains_stmt = Database::prepare("
|
||||||
WHERE `isbinddomain` = '1' AND `domain` LIKE :domain
|
SELECT `domain` FROM `" . TABLE_PANEL_DOMAINS . "`
|
||||||
");
|
WHERE `isbinddomain` = '1' AND `domain` LIKE :domain
|
||||||
Database::pexecute($nssubdomains_stmt, array('domain' => '%.' . $domain['domain']));
|
");
|
||||||
|
Database::pexecute($nssubdomains_stmt, array('domain' => '%.' . $domain['domain']));
|
||||||
|
|
||||||
while ($nssubdomain = $nssubdomains_stmt->fetch(PDO::FETCH_ASSOC)) {
|
while ($nssubdomain = $nssubdomains_stmt->fetch(PDO::FETCH_ASSOC)) {
|
||||||
|
|
||||||
if (preg_match('/^[^\.]+\.' . preg_quote($domain['domain'], '/') . '/', $nssubdomain['domain'])) {
|
if (preg_match('/^[^\.]+\.' . preg_quote($domain['domain'], '/') . '/', $nssubdomain['domain'])) {
|
||||||
|
|
||||||
$nssubdomain = str_replace('.' . $domain['domain'], '', $nssubdomain['domain']);
|
$nssubdomain = str_replace('.' . $domain['domain'], '', $nssubdomain['domain']);
|
||||||
|
|
||||||
if (count($this->nameservers) == 0) {
|
if (count($this->nameservers) == 0) {
|
||||||
$zonefile.= $nssubdomain . ' IN NS ns.' . $nssubdomain . "\n";
|
$zonefile.= $nssubdomain . ' IN NS ns.' . $nssubdomain . "\n";
|
||||||
} else {
|
} else {
|
||||||
foreach ($this->nameservers as $nameserver) {
|
foreach ($this->nameservers as $nameserver) {
|
||||||
$zonefile.= $nssubdomain . ' IN NS ' . trim($nameserver['hostname']) . "\n";
|
$zonefile.= $nssubdomain . ' IN NS ' . trim($nameserver['hostname']) . "\n";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -288,20 +329,22 @@ class bind {
|
|||||||
$records[] = '*';
|
$records[] = '*';
|
||||||
}
|
}
|
||||||
|
|
||||||
$subdomains_stmt = Database::prepare("
|
if (!$froxlorhost) {
|
||||||
SELECT `domain` FROM `".TABLE_PANEL_DOMAINS."`
|
$subdomains_stmt = Database::prepare("
|
||||||
WHERE `parentdomainid` = :domainid
|
SELECT `domain` FROM `".TABLE_PANEL_DOMAINS."`
|
||||||
");
|
WHERE `parentdomainid` = :domainid
|
||||||
Database::pexecute($subdomains_stmt, array('domainid' => $domain['id']));
|
");
|
||||||
|
Database::pexecute($subdomains_stmt, array('domainid' => $domain['id']));
|
||||||
|
|
||||||
while ($subdomain = $subdomains_stmt->fetch(PDO::FETCH_ASSOC)) {
|
while ($subdomain = $subdomains_stmt->fetch(PDO::FETCH_ASSOC)) {
|
||||||
// Listing domains is enough as there currently is no support for choosing
|
// Listing domains is enough as there currently is no support for choosing
|
||||||
// different ips for a subdomain => use same IPs as toplevel
|
// different ips for a subdomain => use same IPs as toplevel
|
||||||
$records[] = str_replace('.' . $domain['domain'], '', $subdomain['domain']);
|
$records[] = str_replace('.' . $domain['domain'], '', $subdomain['domain']);
|
||||||
|
|
||||||
// Check whether to add a www.-prefix
|
// Check whether to add a www.-prefix
|
||||||
if ($domain['wwwserveralias'] == '1') {
|
if ($domain['wwwserveralias'] == '1') {
|
||||||
$records[] = 'www.'.str_replace('.' . $domain['domain'], '', $subdomain['domain']);
|
$records[] = 'www.'.str_replace('.' . $domain['domain'], '', $subdomain['domain']);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -472,6 +515,4 @@ class bind {
|
|||||||
$this->logger->logAction(CRON_ACTION, LOG_INFO, 'Dkim-milter reloaded');
|
$this->logger->logAction(CRON_ACTION, LOG_INFO, 'Dkim-milter reloaded');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user