View Full Version : Getting Slave Zonefiles
DOCK
14th March 2007, 15:41
Hi,
I want to use my own nameserver pair. ISPconfig is the primary nameserver.
Now I want to get a list of domains to build the slave zonefiles on the secondary nameserver.
Normally I do this like this, for instance on a VHCS2 Primary:
header("Content-type: text/plain");
$output = '';
$SQL = "SELECT
domain_name AS domain,
ip_number AS ip
FROM
domain,
server_ips
WHERE
domain.domain_ip_id = server_ips.ip_id
ORDER BY
domain_id";
$query = mysql_query($SQL);
while($row = mysql_fetch_assoc($query)) {
$output .= "zone \"".$row['domain']."\" IN {\n".
"\ttype slave;\n".
"\tfile \"/var/cache/bind/".$row['domain'].".db\";\n".
"\tmasters {".$row['ip'].";};\n".
"};\n\n";
}
echo $output;
How is this done with ISPconfig?
There must be a way to retrieve those information in order to build the slave files?
till
14th March 2007, 16:01
You may get them from the MySQL database in ISPConfig too, they are in the dns_isp_dns database table.
DOCK
14th March 2007, 16:07
What do you think about the following?
<?php
header("Content-type: text/plain");
define('DB_HOST','localhost');
define('DB_USER','2ndDNSUser');
define('DB_PASSWD','xxxx');
mysql_connect(DB_HOST, DB_USER, DB_PASSWD);
$output = '';
$SQL = "SELECT
domain_domain AS domain,
domain_ip AS ip
FROM
ispconfig.isp_isp_domain
WHERE
domain_domain != '' &&
domain_dns = 1
GROUP BY
domain_domain
ORDER BY
domain_domain ASC";
$query = mysql_query($SQL);
while($row = mysql_fetch_assoc($query)) {
$output .= "zone \"".$row['domain']."\" IN {\n".
"\ttype slave;\n".
"\tfile \"/var/cache/bind/".$row['domain'].".db\";\n".
"\tmasters {".$row['ip'].";};\n".
"};\n\n";
}
echo $output;
?>
It should work this way.
I don't like the table you told because I don't see any possibility to strip off those subdomain entries there.
till
14th March 2007, 16:14
The domains in the isp_isp_domain table are not nescessarily identical with the domains where a primary DNS record exists in ISPConfig. This table contains just the alis domains of the apache configuration.
Better use the dns_isp_dns table as I described above.
DOCK
14th March 2007, 16:17
And how should I strip off the subdomains there? RegExp?
And… in the isp_isp_domain table… there's the field "domain_dns" - shouldn't it refer to 0 if there's no DNS entry?
till
14th March 2007, 16:27
And how should I strip off the subdomains there? RegExp?
There are no subdomains in this table.
the field dns_soa contains always the SOE (Start Of Authority) tha you will have to use for the slave records as domain.
And… in the isp_isp_domain table… there's the field "domain_dns" - shouldn't it refer to 0 if there's no DNS entry?
No, this field indicates if the dns_record in the dns_isp_dns table is created by the autodns feature of the co-domain or not.
DOCK
14th March 2007, 16:33
There are no subdomains in this table.
the field dns_soa contains always the SOE (Start Of Authority) tha you will have to use for the slave records as domain.
I have four rows in this table.
dns_soa:
1. domain-A.tld
2. domain-B.tld
3. sub.domain-A.tld
4. sub.domain-C.tld
How could this be?
I've activated DNS for the toplevel domain and also checked this feature for the subdomains.
But… a subdomain is configured in the zonefile of an existing toplevel domain... there's no need to create an own zonefile as far as I know.
till
14th March 2007, 16:40
ISPConfig does not create dns_soa records for subdomains. Maybe you creted them in the dns manager manually.
DOCK
14th March 2007, 17:01
OK, you're (of course) right.
Another user of the server created those records.
I removed them manually and told him not do so anymore ;)
So now I can use the table you recommended.
Here's the code… maybe someone would like to use it too:
<?php
header("Content-type: text/plain");
define('DB_HOST','localhost');
define('DB_USER','username');
define('DB_PASSWD','*****');
mysql_connect(DB_HOST, DB_USER, DB_PASSWD);
$output = '';
$SQL = "SELECT
dns_soa AS domain,
dns_soa_ip AS ip
FROM
ispconfig.dns_isp_dns
ORDER BY
dns_soa ASC";
$query = mysql_query($SQL);
while($row = mysql_fetch_assoc($query)) {
$output .= "zone \"".$row['domain']."\" IN {\n".
"\ttype slave;\n".
"\tfile \"/var/cache/bind/".$row['domain'].".db\";\n".
"\tmasters {".$row['ip'].";};\n".
"};\n\n";
}
echo $output;
?>
You can protect the directory in which the script is via mod_auth, so that nobody except the secondary ns can get your domainlist:
AuthName "Bind"
AuthType Basic
<Limit GET POST>
order deny,allow
deny from all
allow from 123.456.789.009
</Limit>
And on the secondary nameserver you can drop a script in /etc/cron.daily
logger "Updating secondary nameserver configuration...";
wget -q -O /etc/bind/named.conf.slave http://11.11.11.11/SDNS/index.php;
/etc/init.d/bind9 reload;
or for a couple or primarys to serve for:
#!/bin/sh
logger "Updating secondary nameserver configuration...";
rm /etc/bind/named.conf.slave && touch /etc/bind/named.conf.slave;
wget -q -O /tmp/bind http://11.11.11.11/SDNS/index.php && cat /tmp/bind >> /etc/bind/named.conf.slave && rm /tmp/bind;
wget -q -O /tmp/bind http://22.22.22.22/SDNS/index.php && cat /tmp/bind >> /etc/bind/named.conf.slave && rm /tmp/bind;
/etc/init.d/bind9 reload;
vBulletin® v3.8.7, Copyright ©2000-2012, vBulletin Solutions, Inc.