Add multistack configuration to Bind nameserver, fixes #585

This commit is contained in:
Tilman Klaeger (tilman19)
2012-12-02 15:15:51 +01:00
committed by Michael Kaufmann (d00p)
parent af899c290f
commit 0d3daace49

View File

@@ -92,7 +92,7 @@ class bind
$known_filenames = array(); $known_filenames = array();
$bindconf_file = '# ' . $this->settings['system']['bindconf_directory'] . 'froxlor_bind.conf' . "\n" . '# Created ' . date('d.m.Y H:i') . "\n" . '# Do NOT manually edit this file, all changes will be deleted after the next domain change at the panel.' . "\n" . "\n"; $bindconf_file = '# ' . $this->settings['system']['bindconf_directory'] . 'froxlor_bind.conf' . "\n" . '# Created ' . date('d.m.Y H:i') . "\n" . '# Do NOT manually edit this file, all changes will be deleted after the next domain change at the panel.' . "\n" . "\n";
$result_domains = $this->db->query("SELECT `d`.`id`, `d`.`domain`, `d`.`iswildcarddomain`, `d`.`customerid`, `d`.`zonefile`, `d`.`bindserial`, `d`.`dkim`, `d`.`dkim_id`, `d`.`dkim_pubkey`, `d`.`wwwserveralias`, `ip`.`ip`, `c`.`loginname`, `c`.`guid` FROM `" . TABLE_PANEL_DOMAINS . "` `d` LEFT JOIN `" . TABLE_PANEL_CUSTOMERS . "` `c` USING(`customerid`) LEFT JOIN `" . TABLE_PANEL_IPSANDPORTS . "` AS `ip` ON(`d`.`ipandport`=`ip`.`id`) WHERE `d`.`isbinddomain` = '1' ORDER BY `d`.`domain` ASC"); $result_domains = $this->db->query("SELECT `d`.`id`, `d`.`domain`, `d`.`iswildcarddomain`, `d`.`wwwserveralias`, `d`.`customerid`, `d`.`zonefile`, `d`.`bindserial`, `d`.`dkim`, `d`.`dkim_id`, `d`.`dkim_pubkey`, `c`.`loginname`, `c`.`guid` FROM `" . TABLE_PANEL_DOMAINS . "` `d` LEFT JOIN `" . TABLE_PANEL_CUSTOMERS . "` `c` USING(`customerid`) WHERE `d`.`isbinddomain` = '1' ORDER BY `d`.`domain` ASC");
while($domain = $this->db->fetch_array($result_domains)) while($domain = $this->db->fetch_array($result_domains))
{ {
@@ -179,17 +179,23 @@ class bind
protected function generateZone($domain) protected function generateZone($domain)
{ {
if(filter_var($domain['ip'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) /** Array to save all ips needed in the records (already including IN A/AAAA */
{ $ip_a_records = array();
$ip_a_record = 'A ' . $domain['ip']; /** Array to save DNS records */
} $records = array();
elseif(filter_var($domain['ip'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV6))
{ $result_ip = $this->db->query("SELECT `p`.`ip` AS `ip` FROM `".TABLE_PANEL_IPSANDPORTS."` `p`, `".TABLE_DOMAINTOIP."` `di` WHERE `di`.`id_domain` = '$domain[id]' AND `p`.`id` = `di`.`id_ipandports` GROUP BY `p`.`ip`;");
$ip_a_record = 'AAAA ' . $domain['ip'];
} while ($ip = $this->db->fetch_array($result_ip)) {
else
{ if(filter_var($ip['ip'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV4))
return ''; $ip_a_records[] = "A $ip[ip]";
elseif(filter_var($ip['ip'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV6))
$ip_a_records[] = "AAAA $ip[ip]";
else
return ";Error in at least one IP Adress ($ip[ip]), could not create zonefile!";
} }
$date = date('Ymd'); $date = date('Ymd');
@@ -223,12 +229,12 @@ class bind
if(count($this->mxservers) == 0) if(count($this->mxservers) == 0)
{ {
$zonefile.= '@ IN MX 10 mail' . "\n"; $zonefile.= '@ IN MX 10 mail' . "\n";
$zonefile.= 'mail IN ' . $ip_a_record . "\n"; $records[] = 'mail';
if($domain['iswildcarddomain'] != '1') if($domain['iswildcarddomain'] != '1')
{ {
$zonefile.= 'imap IN ' . $ip_a_record . "\n"; $records[] = 'imap';
$zonefile.= 'smtp IN ' . $ip_a_record . "\n"; $records[] = 'smtp';
$zonefile.= 'pop3 IN ' . $ip_a_record . "\n"; $records[] = 'pop3';
} }
} }
else else
@@ -240,12 +246,12 @@ class bind
if($this->settings['system']['dns_createmailentry'] == '1') if($this->settings['system']['dns_createmailentry'] == '1')
{ {
$zonefile.= 'mail IN ' . $ip_a_record . "\n"; $records[] = 'mail';
if($domain['iswildcarddomain'] != '1') if($domain['iswildcarddomain'] != '1')
{ {
$zonefile.= 'imap IN ' . $ip_a_record . "\n"; $records[] = 'imap';
$zonefile.= 'smtp IN ' . $ip_a_record . "\n"; $records[] = 'smtp';
$zonefile.= 'pop3 IN ' . $ip_a_record . "\n"; $records[] = 'pop3';
} }
} }
} }
@@ -286,37 +292,34 @@ class bind
} }
} }
$zonefile.= '@ IN ' . $ip_a_record . "\n"; $records[] = '@';
$zonefile.= 'www IN ' . $ip_a_record . "\n"; $records[] = 'www';
if($domain['iswildcarddomain'] == '1') if($domain['iswildcarddomain'] == '1')
{ {
$zonefile.= '* IN ' . $ip_a_record . "\n"; $records[] = '*';
} }
$subdomains = $this->db->query('SELECT `d`.`domain`, `ip`.`ip` AS `ip` FROM `' . TABLE_PANEL_DOMAINS . '` `d`, `' . TABLE_PANEL_IPSANDPORTS . '` `ip` WHERE `parentdomainid`=\'' . $domain['id'] . '\' AND `d`.`ipandport`=`ip`.`id`'); $subdomains = $this->db->query("SELECT `domain` FROM `".TABLE_PANEL_DOMAINS."` WHERE `parentdomainid` = '$domain[id]';");
while($subdomain = $this->db->fetch_array($subdomains)) while($subdomain = $this->db->fetch_array($subdomains))
{ {
if(filter_var($subdomain['ip'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) // Listing domains is enough as there currently is no support for choosing
{ // different ips for a subdomain => use same IPs as toplevel
$zonefile.= str_replace('.' . $domain['domain'], '', $subdomain['domain']) . ' IN A ' . $subdomain['ip'] . "\n"; $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[] = str_replace('.' . $domain['domain'], '', $subdomain['domain']);
$zonefile.= str_replace('www.' . $domain['domain'], '', $subdomain['domain']) . ' IN A ' . $subdomain['ip'] . "\n";
}
} }
elseif(filter_var($domain['ip'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) }
{
$zonefile.= str_replace('.' . $domain['domain'], '', $subdomain['domain']) . ' IN AAAA ' . $subdomain['ip'] . "\n";
/* Check whether to add a www.-prefix */ // Create DNS-Records for every name we have saved
if($domain['wwwserveralias'] == '1') foreach ($records as $record) {
{ // we create an entry for every ip we have saved
$zonefile.= str_replace('www.' . $domain['domain'], '', $subdomain['domain']) . ' IN AAAA ' . $subdomain['ip'] . "\n"; foreach ($ip_a_records as $ip_a_record) {
} $zonefile.= $record . "\tIN\t" . $ip_a_record . "\n";
} }
} }