diff --git a/scripts/jobs/cron_tasks.inc.dns.10.bind.php b/scripts/jobs/cron_tasks.inc.dns.10.bind.php index 45d719ca..752e33c0 100644 --- a/scripts/jobs/cron_tasks.inc.dns.10.bind.php +++ b/scripts/jobs/cron_tasks.inc.dns.10.bind.php @@ -92,7 +92,7 @@ class bind $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"; - $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)) { @@ -179,17 +179,23 @@ class bind protected function generateZone($domain) { - if(filter_var($domain['ip'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) - { - $ip_a_record = 'A ' . $domain['ip']; - } - elseif(filter_var($domain['ip'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) - { - $ip_a_record = 'AAAA ' . $domain['ip']; - } - else - { - return ''; + /** Array to save all ips needed in the records (already including IN A/AAAA */ + $ip_a_records = array(); + /** Array to save DNS records */ + $records = array(); + + $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`;"); + + while ($ip = $this->db->fetch_array($result_ip)) { + + if(filter_var($ip['ip'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) + $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'); @@ -223,12 +229,12 @@ class bind if(count($this->mxservers) == 0) { $zonefile.= '@ IN MX 10 mail' . "\n"; - $zonefile.= 'mail IN ' . $ip_a_record . "\n"; + $records[] = 'mail'; if($domain['iswildcarddomain'] != '1') { - $zonefile.= 'imap IN ' . $ip_a_record . "\n"; - $zonefile.= 'smtp IN ' . $ip_a_record . "\n"; - $zonefile.= 'pop3 IN ' . $ip_a_record . "\n"; + $records[] = 'imap'; + $records[] = 'smtp'; + $records[] = 'pop3'; } } else @@ -240,12 +246,12 @@ class bind if($this->settings['system']['dns_createmailentry'] == '1') { - $zonefile.= 'mail IN ' . $ip_a_record . "\n"; + $records[] = 'mail'; if($domain['iswildcarddomain'] != '1') { - $zonefile.= 'imap IN ' . $ip_a_record . "\n"; - $zonefile.= 'smtp IN ' . $ip_a_record . "\n"; - $zonefile.= 'pop3 IN ' . $ip_a_record . "\n"; + $records[] = 'imap'; + $records[] = 'smtp'; + $records[] = 'pop3'; } } } @@ -286,37 +292,34 @@ class bind } } - $zonefile.= '@ IN ' . $ip_a_record . "\n"; - $zonefile.= 'www IN ' . $ip_a_record . "\n"; + $records[] = '@'; + $records[] = 'www'; + 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)) { - if(filter_var($subdomain['ip'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) - { - $zonefile.= str_replace('.' . $domain['domain'], '', $subdomain['domain']) . ' IN A ' . $subdomain['ip'] . "\n"; - - /* Check whether to add a www.-prefix */ - if($domain['wwwserveralias'] == '1') - { - $zonefile.= str_replace('www.' . $domain['domain'], '', $subdomain['domain']) . ' IN A ' . $subdomain['ip'] . "\n"; - } + // Listing domains is enough as there currently is no support for choosing + // different ips for a subdomain => use same IPs as toplevel + $records[] = str_replace('.' . $domain['domain'], '', $subdomain['domain']); + + // Check whether to add a www.-prefix + if ($domain['wwwserveralias'] == '1') { + $records[] = str_replace('.' . $domain['domain'], '', $subdomain['domain']); } - 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 */ - if($domain['wwwserveralias'] == '1') - { - $zonefile.= str_replace('www.' . $domain['domain'], '', $subdomain['domain']) . ' IN AAAA ' . $subdomain['ip'] . "\n"; - } + // Create DNS-Records for every name we have saved + foreach ($records as $record) { + // we create an entry for every ip we have saved + foreach ($ip_a_records as $ip_a_record) { + $zonefile.= $record . "\tIN\t" . $ip_a_record . "\n"; } }