aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--packages/tinydns/tinydns.inc122
1 files changed, 96 insertions, 26 deletions
diff --git a/packages/tinydns/tinydns.inc b/packages/tinydns/tinydns.inc
index 0b80da75..a20ae38a 100644
--- a/packages/tinydns/tinydns.inc
+++ b/packages/tinydns/tinydns.inc
@@ -40,10 +40,6 @@ function tinydns_custom_php_install_command() {
log_error("Could not open /usr/local/etc/rc.d/svscan.sh for writing.");
return;
}
-
- if($config['installedpackages']['tinydns']['config'][0]['bind2lan'])
- $ip = $config['interfaces']['lan']['ipaddr'];
- else
$ip = $config['installedpackages']['tinydns']['config'][0]['ipaddress'];
$minsegment = "10240";
@@ -114,6 +110,7 @@ EOD;
fwrite($fd, $svscan);
fclose($fd);
conf_mount_ro();
+ tinydns_custom_php_changeip_command();
filter_configure();
}
@@ -123,8 +120,10 @@ function tinydns_custom_php_deinstall_command() {
conf_mount_rw();
/* destroy all daemontools items */
exec("/usr/sbin/pw groupdel Gtinydns");
+ exec("/usr/sbin/pw groupdel Gdnscache");
exec("/usr/sbin/pw groupdel Gdnslog");
exec("/usr/sbin/pw userdel Gtinydns");
+ exec("/usr/sbin/pw userdel Gdnscache");
exec("/usr/sbin/pw userdel Gdnslog");
exec("rm /usr/local/www/*tinydns*");
exec("rm /usr/local/pkg/*tinydns*");
@@ -136,22 +135,45 @@ function tinydns_custom_php_deinstall_command() {
function tinydns_custom_php_changeip_command() {
global $g, $config;
conf_mount_rw();
- if($config['installedpackages']['tinydns']['config'][0]['bind2lan'])
- {
- $ip = $config['interfaces']['lan']['ipaddr'];
-/* Does not work?? $config['installedpackages']['tinydns']['config'][0]['ipaddress'] = $ip; */
- }
- else
- $ip = $config['installedpackages']['tinydns']['config'][0]['ipaddress'];
+ if($config['installedpackages']['tinydns']['config'][0]['bind2lan']){
+ if($config['installedpackages']['tinydns']['config'][0]['enableforwarding']){
+ $ip = $config['interfaces']['lan']['ipaddr'];
+ $ipmask = $config['interfaces']['lan']['subnet'];
+ $arr = tinydns_get_ip_subnet_arpa($ip, $ipmask);
+ $dnscacheip = $ip;
+ $dnsuserip = $arr[0];
+ }
+ }
+ $dnsserverip = $config['installedpackages']['tinydns']['config'][0]['ipaddress'];
$updatecron = $config['installedpackages']['tinydns']['config'][0]['updatecron'];
+
/* setup daemon tools service area */
- exec("/usr/sbin/pw useradd Gtinydns");
- exec("/usr/sbin/pw useradd Gdnslog");
- exec("/usr/local/bin/tinydns-conf Gtinydns Gdnslog /etc/tinydns {$ip}");
- exec("/bin/mkdir /service");
- exec("/bin/ln -s /etc/tinydns /service/");
- exec("echo $ip > /service/tinydns/env/IP");
+ if(!is_dir("/service")) exec("/bin/mkdir /service");
+ if(!is_dir("/service/tinydns")){
+ exec("/usr/sbin/pw useradd Gtinydns");
+ exec("/usr/sbin/pw useradd Gdnslog");
+ exec("/usr/local/bin/tinydns-conf Gtinydns Gdnslog /etc/tinydns {$dnsserverip}");
+ exec("/bin/ln -s /etc/tinydns /service/");
+ }
+ exec("echo {$dnsserverip} > /etc/tinydns/env/IP");
exec("/usr/bin/killall -9 tinydns");
+
+ if($config['installedpackages']['tinydns']['config'][0]['enableforwarding']){
+ if(!is_dir("/service/dnscache")){
+ exec("/usr/sbin/pw useradd Gdnscache");
+ exec("/usr/local/bin/dnscache-conf Gdnscache Gdnslog /etc/dnscache {$dnscacheip}");
+ exec("/bin/ln -s /etc/dnscache /service/");
+ exec("/usr/bin/cp /var/etc/resolv.conf /var/etc/resolv.conf.original");
+ exec("/usr/bin/cp /var/etc/resolv.conf /var/etc/resolv.conf.dnscache");
+ }
+ exec("echo {$dnscacheip} > /etc/dnscache/env/IP");
+ exec("echo 1 > /etc/dnscache/env/FORWARDONLY");
+ tinydns_dnscache_forwarding_servers();
+ exec("touch /etc/dnscache/root/ip/{$dnsuserip}");
+ exec("echo domain {$config['system']['domain']} > /var/etc/resolv.conf");
+ exec("echo nameserver {$dnscacheip} >> /var/etc/resolv.conf");
+ exec("/usr/bin/killall -9 dnscache");
+ }
conf_mount_ro();
filter_configure();
}
@@ -277,13 +299,19 @@ function tinydns_create_zone_file() {
log_error("Could not open /service/tinydns/root/data for writing.");
return;
}
-
+
/* Load the root servers if Forwarding is enabled */
if($config['installedpackages']['tinydns']['config'][0]['enableforwarding']) {
- if($config['system']['hostname']['domain']) {
- $forwardingservers = tinydns_register_forwarding_servers();
- $forwardingservers .= tinydns_register_root_servers();
- if($forwardingservers)fwrite($fd, $forwardingservers);
+ if($config['system']['domain']) {
+ $localdomain = $config['system']['domain'];
+// $localdomain = "";
+// $localhostmask = 8;
+// $localhostip = "127.0.0.1";
+// $localname = "localhost";
+// tinydns_complete_soa_record($fd, $localhostip, $localhostmask, $localname, $localdomain);
+// $forwardingservers = tinydns_register_forwarding_servers();
+// $forwardingservers .= tinydns_register_root_servers();
+// if($forwardingservers)fwrite($fd, $forwardingservers);
}
}
@@ -481,6 +509,7 @@ function tinydns_get_rowline_data($recordip, $recordtype, $ttl, $hostname, $rdns
}
return $record_data;
}
+
/* Returns the last IP byte and the Trimmed IP*/
function tinydns_get_lastip_byte($ipsub){
$len= strlen($ipsub);
@@ -493,7 +522,8 @@ function tinydns_get_lastip_byte($ipsub){
}
/* in-add.arpa IP calculated from D.C.B.A and Mask to A.B.C.D.in-addr.arpa */
-function tinydns_get_arpa_ip($ip, $ipmask){
+/* subnet IP calculated from A.B.C.D and Mask */
+function tinydns_get_ip_subnet_arpa($ip, $ipmask){
$ipsub = $ip;
$arpaip = "";
$array = tinydns_get_lastip_byte($ipsub);
@@ -513,32 +543,36 @@ function tinydns_get_arpa_ip($ip, $ipmask){
$s = 32 - $ipmask;
$a >> $s;
$arpaip = "{$a}.{$b}.{$c}.{$d}.in-addr.arpa";
+ $subnet = "{$d}.{$c}.{$b}.{$a}";
break;
case ($ipmask <= 24 AND $ipmask > 16):
$s = 24 - $ipmask;
$b >> $s;
$arpaip = "{$b}.{$c}.{$d}.in-addr.arpa";
+ $subnet = "{$d}.{$c}.{$b}";
break;
case ($ipmask <= 16 AND $ipmask > 8):
$s = 16 - $ipmask;
$c >> $s;
$arpaip = "{$c}.{$d}.in-addr.arpa";
+ $subnet = "{$d}.{$c}";
break;
case ($ipmask <= 8 AND $ipmask > 0):
$s = 8 - $ipmask;
$d >> $s;
$arpaip = "{$d}.in-addr.arpa";
+ $subnet = "{$d}";
break;
}
- return $arpaip;
+ return array($subnet,$arpaip);
}
/* Create a Forward and a Reverse DNS (SOA, A, PTR) records for Fully Qualififed Domain Name*/
function tinydns_complete_soa_record($fd, $ip, $ipmask, $nsname, $domain){
$fqdn = "{$nsname}.{$domain}";
- $rip = tinydns_get_arpa_ip($ip, $ipmask);
+ $rip = tinydns_get_ip_subnet_arpa($ip, $ipmask);
$soa = ".{$domain}::{$fqdn}";
- $rsoa = ".{$rip}::{$fqdn}";
+ $rsoa = ".{$rip[1]}::{$fqdn}";
$a = "={$fqdn}:{$ip}";
if($fqdn)fwrite($fd, $soa . "\n");
if($rip)fwrite($fd, $rsoa . "\n");
@@ -628,6 +662,42 @@ function tinydns_get_dns_record_type($tinydnsrecord){
/* This function will be replaced by an auto detect DNS cache servers routine */
/* At the moment ther is no tagging of DNSroute to a WAN port. It needs to be added */
+function tinydns_dnscache_forwarding_servers() {
+ $fr = fopen("/var/etc/resolv.conf.dnscache", "r");
+ if (! $fr) {
+ printf("Error: cannot open resolv.conf in tinydns_register_forwarding_servers().\n");
+ return 1;
+ }
+
+ $lip = strlen("nameserver") + 1;
+ $j = 0;
+ $iprecords = "";
+ while (!feof($fr)) {
+ $routers = fgets($fr, 4096);
+ $discard = ($routers[0] == "\n");
+ if(!$discard){
+ if ($routerip = strstr($routers,"nameserver")){
+ $routerip = substr($routerip,$lip);
+ if($routerip){
+ $j += 1;
+ $routera = "{$routerip}";
+ $iprecords .= $routera;
+ }
+ }
+ }
+ }
+ fclose($fr);
+ $fr = fopen("/etc/dnscache/root/servers/@", "w");
+ if (! $fr) {
+ printf("Error: cannot open resolv.conf in tinydns_dnscahe_forwarding_servers().\n");
+ return 1;
+ }
+ if($iprecords)fwrite($fr, $iprecords);
+ fclose($fr);
+}
+
+/* This function will be replaced by an auto detect DNS cache servers routine */
+/* At the moment ther is no tagging of DNSroute to a WAN port. It needs to be added */
function tinydns_register_forwarding_servers() {
$fr = fopen("/var/etc/resolv.conf", "r");
if (! $fr) {