From 55eddd7accf2c5f9b0f52b22a010c4c4b7c130d1 Mon Sep 17 00:00:00 2001 From: Bill Marquette Date: Fri, 6 Feb 2009 19:18:00 -0600 Subject: mv packages to config dir to match web layout --- config/tinydns/new_zone_wizard.xml | 226 ++++++++ config/tinydns/tinydns.inc | 964 +++++++++++++++++++++++++++++++++ config/tinydns/tinydns.xml | 309 +++++++++++ config/tinydns/tinydns_dhcp_filter.php | 129 +++++ config/tinydns/tinydns_domains.xml | 234 ++++++++ config/tinydns/tinydns_down.php | 42 ++ config/tinydns/tinydns_filter.php | 38 ++ config/tinydns/tinydns_parse_logs.php | 96 ++++ config/tinydns/tinydns_status.php | 188 +++++++ config/tinydns/tinydns_sync.xml | 146 +++++ config/tinydns/tinydns_up.php | 42 ++ config/tinydns/tinydns_view_logs.php | 122 +++++ config/tinydns/tinydns_xmlrpc_sync.php | 59 ++ 13 files changed, 2595 insertions(+) create mode 100644 config/tinydns/new_zone_wizard.xml create mode 100644 config/tinydns/tinydns.inc create mode 100644 config/tinydns/tinydns.xml create mode 100644 config/tinydns/tinydns_dhcp_filter.php create mode 100644 config/tinydns/tinydns_domains.xml create mode 100644 config/tinydns/tinydns_down.php create mode 100644 config/tinydns/tinydns_filter.php create mode 100644 config/tinydns/tinydns_parse_logs.php create mode 100644 config/tinydns/tinydns_status.php create mode 100644 config/tinydns/tinydns_sync.xml create mode 100644 config/tinydns/tinydns_up.php create mode 100644 config/tinydns/tinydns_view_logs.php create mode 100644 config/tinydns/tinydns_xmlrpc_sync.php (limited to 'config/tinydns') diff --git a/config/tinydns/new_zone_wizard.xml b/config/tinydns/new_zone_wizard.xml new file mode 100644 index 00000000..82d8d62b --- /dev/null +++ b/config/tinydns/new_zone_wizard.xml @@ -0,0 +1,226 @@ + + + +/* $Id$ */ +/* + new_zone_wizard.xml + part of pfSense (http://www.pfsense.org/) + Copyright (C) 2008 Scott Ullrich + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, + OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. +*/ + +2 + + 1 + pfSense New Zone Wizard + true + This wizard will guide you through the adding a new domain name service zone to TinyDNS. + + + Next + submit + + + + + + + 2 + Domain Name + On this screen you will define various options for your new DNS Zone + + + Domain Name + input + yes + 0 + Enter the domain name for this zone (example: pfsense.org) + + + Primary Nameserver + listtopic + + + Primary Nameserver + input + yes + 0 + Enter the primary nameserver for this domain (example: ns.pfsense.org) + + + Secondary Nameserver + listtopic + + + Secondary Nameserver + input + 1 + Enter the secondary nameserver for this domain (example: ns2.pfsense.org) + + + Mail Exchanger (optional) + listtopic + + + Mail exchanger record hostname + input + 1 + Enter the hostname of your Mail exchanger (MX) - (example: exchange.pfsense.org) + + + Mail exchanger record IP address + input + 1 + Enter the IP address of your Mail exchanger (MX) - (example: 9.10.11.12) + + + First A record (optional) + listtopic + + + First A record hostname + input + 1 + Enter the first A records hostname (example: www.pfsense.org) + + + First A record IP address + input + 1 + Enter the first A records IP address (example: 1.2.3.4) + + + Secondary A record (optional) + listtopic + + + Second A record IP hostname + input + 1 + Enter the second A records hostname (example: pfsense.org) + + + Second A record IP address + input + 1 + Enter the second A records IP address (example: 5.6.7.8) + + + Third A record (optional) + listtopic + + + Third A record IP hostname + input + 1 + Enter the third A records hostname (example: www2.pfsense.org) + + + Third A record IP address + input + 1 + Enter the third A records IP address (example: 9.10.11.12) + + + Next + submit + + + + + + + diff --git a/config/tinydns/tinydns.inc b/config/tinydns/tinydns.inc new file mode 100644 index 00000000..24de1cab --- /dev/null +++ b/config/tinydns/tinydns.inc @@ -0,0 +1,964 @@ +&1 | /usr/local/bin/readproctitle service errors: ................................................................................................................................................................................................................................................................................................................................................................................................................ &" > /dev/null + minicron {$refreshinterval} /var/run/ping_hosts.pid "/etc/ping_hosts.sh; cd /etc/tinydns/root && /usr/local/bin/tinydns-data" +} + +svscan_stop_post () { + echo "Stopping svscan." + find -L "\$svscan_servicedir" -mindepth 1 -maxdepth 2 -type d \( \! -path "\$svscan_servicedir/*/*" -or -name 'log' \) -print0 | xargs -0 /usr/local/bin/svc -dx + PIDTOKILL=`cat /var/run/ping_hosts.pid` + kill $PIDTOKILL +} + +run_rc_command "\$1" + +EOD; + + fwrite($fd, $svscan); + fclose($fd); + conf_mount_ro(); + filter_configure(); + + tinydns_custom_php_changeip_command(); + + exec("/usr/local/etc/rc.d/svscan.sh start"); +} + +function tinydns_custom_php_deinstall_command() { + global $g, $config; + 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("/usr/sbin/pw groupdel Gaxfrdns"); + exec("rm /usr/local/www/*tinydns*"); + exec("rm /usr/local/pkg/*tinydns*"); + exec("rm /usr/local/pkg/pf/*tinydns*"); + conf_mount_ro(); + filter_configure(); +} + +function tinydns_custom_php_changeip_command() { + global $g, $config; + conf_mount_rw(); + + $ip = $config['interfaces']['lan']['ipaddr']; + $ipmask = $config['interfaces']['lan']['subnet']; + $arr = tinydns_get_ip_subnet_arpa($ip, $ipmask); + $dnscacheip = $ip; + $dnsuserip = $arr[0]; + + /* For now force $dnsserverip to to 127.0.0.1 unless a separate IP is specified */ + $localhost = "127.0.0.1"; + $dnsserverip = $localhost; + if($config['installedpackages']['tinydns']['config'][0]['ipaddress'] != $localhost AND $config['installedpackages']['tinydns']['config'][0]['ipaddress'] != "") + $dnsserverip = $config['installedpackages']['tinydns']['config'][0]['ipaddress']; + if($config['installedpackages']['tinydns']['config'][0]['regdhcpstatic'] OR $config['installedpackages']['tinydns']['config'][0]['regdhcp']) + $dnsserverip = $localhost; + $config['installedpackages']['tinydns']['config'][0]['ipaddress'] = $dnsserverip; + + $updatecron = $config['installedpackages']['tinydns']['config'][0]['updatecron']; + + /* Populate Zone Transfer array */ + $ztipaddress = populate_zt_array(); + + /* setup daemon tools service area */ + if(!is_dir("/service")) + exec("/bin/mkdir /service"); + + exec("/usr/sbin/pw useradd Gtinydns"); + exec("/usr/sbin/pw useradd Gdnslog"); + exec("/usr/sbin/pw useradd Gdnscache"); + exec("/usr/sbin/pw useradd Gaxfrdns"); + + /* TinyDNS Server */ + exec("/usr/local/bin/tinydns-conf Gtinydns Gdnslog /etc/tinydns {$dnsserverip}"); + exec("/bin/ln -s /etc/tinydns /service/"); + + /* AXFRDNS - Zone transfers */ + if(is_array($ztipaddress)) + exec("/usr/local/bin/axfrdns-conf Gaxfrdns Gdnslog /etc/axfrdns /etc/tinydns {$dnsserverip}"); + exec("/bin/ln -s /etc/axfrdns /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("/bin/cp /var/etc/resolv.conf /var/etc/resolv.conf.original"); + exec("/bin/cp /var/etc/resolv.conf /var/etc/resolv.conf.dnscache"); + } + exec("echo {$dnscacheip} > /etc/dnscache/env/IP"); + tinydns_dnscache_forwarding_servers(); + exec("touch /etc/dnscache/root/ip/{$dnsuserip}"); + tinydns_create_soa_domain_list($dnsserverip); + exec("echo domain {$config['system']['domain']} > /var/etc/resolv.conf"); + exec("echo nameserver {$dnscacheip} >> /var/etc/resolv.conf"); + exec("/usr/bin/killall -9 dnscache"); + } else { + if(file_exists("/var/etc/resolv.conf.original")) + exec("/bin/cp /var/etc/resolv.conf.original /var/etc/resolv.conf"); + if(is_dir("/etc/dnscache")) { + dnscache_use_root_servers(); + exec("/usr/bin/killall -9 dnscache"); + } + } + conf_mount_ro(); + filter_configure(); +} + +function populate_zt_array() { + global $g, $config; + /* Populate Zone Transfer array */ + if($config['installedpackages']['tinydns']['config'][0]['row']) { + $ztipaddress = array(); + foreach($config['installedpackages']['tinydns']['config'][0]['row'] as $zt) { + $tmp = array(); + $tmp['ztipaddress'] = $zt['ztipaddress']; + $tmp['dnszone'] = $zt['dnszone']; + $ztipaddress[] = $tmp; + } + } + return $ztipaddress; +} + +function tinydns_setup_axfrdns() { + global $g, $config; + /* Populate Zone Transfer array */ + $ztipaddress = populate_zt_array(); + if(!is_array($ztipaddress)) + return; + $fd = fopen("/etc/axfrdns/tcp","w"); + if(!$fd) { + log_error("Could not open /etc/axfrdns/tcp for writing"); + return; + } + foreach($ztipaddress as $zt) { + if($zt['ztipaddress'] && $zt['dnszone']) + $zonet = "{$zt['ztipaddress']}:allow"; + if($zt['dnszone'] <> "*") + $zonet .= ",AXFR=\"{$zt['dnszone']}\""; + fwrite($fd, $zone . "\n"); + } + fclose($fd); + // Recompile database + exec("cd /service/axfrdns && /usr/local/bin/tinydns-data"); +} + +function tinydns_get_record_status($record, $pingthreshold = "", $wanpingthreshold = "") { + global $g, $config; + if(file_exists("/var/db/pingstatus/{$record}")) { + $status = ""; + $status = file_get_contents("/var/db/pingstatus/{$record}"); + if(stristr($status,"DOWN")) + return "DOWN"; + } + if($pingthreshold) { + $current_ms = ""; + if(file_exists("var/db/pingmsstatus/$record")) + $current_ms = file_get_contents("/var/db/pingmsstatus/$record"); + if($pingthreshold > $current_ms) + return "DOWN"; + } + if($wanpingthreshold) { + $current_avg = ""; + if(file_exists("/var/db/wanaverage")) + $current_avg = file_get_contents("/var/db/wanaverage"); + if($wanpingthreshold > $current_avg) + return "DOWN"; + } + return "UP"; +} + +function tinydns_get_backup_record($record) { + global $g, $config; + if($config['installedpackages']['tinydnsdomains']) { + foreach($config['installedpackages']['tinydnsdomains']['config'] as $domain) { + if($domain['ipaddress'] == $record) { + /* if no failover host exists, simply return original record */ + if(!$domain['row']) + return $record; + foreach($domain['row'] as $row) { + $status = tinydns_get_record_status($row['failoverip']); + if($status == "UP") + return $row['failoverip']; + } + } + } + } + return $record; +} + +function tinydns_setup_ping_items() { + global $g, $config; + if(!$config['installedpackages']['tinydnsdomains']) + return; + $wanif = get_real_wan_interface(); + $ip = find_interface_ip($wanif); + conf_mount_rw(); + $processed = array(); + /* XXX: make this work with other packages */ + $fd = fopen("/var/db/pkgpinghosts", "w"); + if(!$fd) { + log_error("Could not open /var/db/pkgpinghosts for writing."); + return; + } + config_lock(); + /* write out each ip address so ping_hosts.sh can begin monitoring ip + * status and create a database of the status information that we can use. + */ + foreach($config['installedpackages']['tinydnsdomains']['config'] as $domain) { + if(!in_array($domain['ipaddress'], $processed)) { + fwrite($fd, $ip . "|" . $domain['ipaddress'] . "|1|/usr/local/pkg/tinydns_down.php|/usr/local/pkg/tinydns_up.php\n"); + $processed[] = $domain['ipaddress']; + } + if($domain['monitorip'] <> "") + $monitorip = $domain['monitorip']; + if($domain['row']) { + foreach($domain['row'] as $row) { + if($row['pingthreshold']) + $pingthreshold = $row['pingthreshold']; + else + $row['pingthreshold'] = ""; + if($row['monitorip']) { + if(!in_array($row['monitorip'], $processed)) { + fwrite($fd, $ip . "|" . $row['monitorip'] . "|1|/usr/local/pkg/tinydns_down.php|/usr/local/pkg/tinydns_up.php|{$pingthreshold}\n"); + $processed[] = $row['monitorip']; + } + } else { + if(!in_array($monitorip, $processed)) { + fwrite($fd, $ip . "|" . $monitorip . "|1|/usr/local/pkg/tinydns_down.php|/usr/local/pkg/tinydns_up.php|{$pingthreshold}\n"); + $processed[] = $monitorip; + } + } + } + } + if($domain['monitorip']) { + if(!in_array($domain['monitorip'], $processed)) { + fwrite($fd, $ip . "|" . $domain['monitorip'] . "|1|/usr/local/pkg/tinydns_down.php|/usr/local/pkg/tinydns_up.php|{$pingthreshold}\n"); + $processed[] = $domain['monitorip']; + } + } else { + if(!in_array($row['failoverip'], $processed)) { + fwrite($fd, $ip . "|" . $row['failoverip'] . "|1|/usr/local/pkg/tinydns_down.php|/usr/local/pkg/tinydns_up.php|{$pingthreshold}\n"); + $processed[] = $row['failoverip']; + } + } + } + fclose($fd); + config_unlock(); + conf_mount_ro(); +} + +function tinydns_create_zone_file() { + global $g, $config; + conf_mount_rw(); + if(file_exists("/tmp/config.cache")) + unlink("/tmp/config.cache"); + parse_config(true); + config_lock(); + if(file_exists("/service/tinydns/root/data")) + exec("rm -f /service/tinydns/root/data"); + if(!is_dir("/service/tinydns/root")) + return; + $fd = fopen("/service/tinydns/root/data", "w"); + if(!$fd) { + log_error("Could not open /service/tinydns/root/data for writing."); + return; + } + + /* For now do not allow registration of 'local' DNS data if tinyDNS not bound to 127.0.0.1 */ + if($config['installedpackages']['tinydns']['config'][0]['ipaddress'] == "127.0.0.1") { + /* Load the root servers if Forwarding is enabled */ + /* Register LAN IP and SOA Forward and Reverse DNS recors in TinyDNS Server*/ + if($config['installedpackages']['tinydns']['config'][0]['enableforwarding']) { + $forwardingservers = tinydns_register_root_servers(); + if($forwardingservers) + fwrite($fd, $forwardingservers); + if($config['system']['hostname']['domain']) { + $dhcpdhostname = $config['system']['hostname']; + if($config['dhcpd']['lan']) + $dhcpddomain = $config['system']['domain']; + $dhcpdlanip = $config['interfaces']['lan']['ipaddr']; + $dhcpdipmask = $config['interfaces']['lan']['subnet']; + $dhcpdfqdn = "{$dhcpdhostname}.{$dhcpddomain}"; + tinydns_complete_soa_record($fd, $dhcpdlanip, $dhcpdipmask, $dhcpdhostname, $dhcpddomain); + } + } + + /* Register Static IPs */ + if($config['installedpackages']['tinydns']['config'][0]['regdhcpstatic']) { + foreach($config['dhcpd'] as $zone_key => $zone ) { + $dhcpdhostname = $config['system']['hostname']; + if ($zone['ddnsdomain']) + $dhcpddomain = $zone['ddnsdomain']; + else + $dhcpddomain = $config['system']['domain']; + $dhcpdlanip = $config['interfaces'][$zone_key]['ipaddr']; + $dhcpdipmask = $config['interfaces'][$zone_key]['subnet']; + $dhcpdfqdn = "{$dhcpdhostname}.{$dhcpddomain}"; + tinydns_complete_soa_record($fd, $dhcpdlanip, $dhcpdipmask, $dhcpdhostname, $dhcpddomain); + + if(is_array($zone['staticmap'])) { + foreach($zone['staticmap'] as $dhcpdstatic) { + $dhcpdhostname = $dhcpdstatic['hostname']; + $dhcpdfqdn = "{$dhcpdhostname}.{$dhcpddomain}"; + $dhcpdlanip = $dhcpdstatic['ipaddr']; + $dhcpda = "={$dhcpdfqdn}:{$dhcpdlanip}"; + if($dhcpdhostname) + fwrite($fd, $dhcpda . "\n"); + } + } + } + } + + /* Register Dynamic IPs */ + if($config['installedpackages']['tinydns']['config'][0]['regdhcp']) { + $leasesfile = "{$g['dhcpd_chroot_path']}/var/db/dhcpd.leases"; + $fl = fopen($leasesfile, "r"); + if(!$fl) { + log_error("Could not open {$leasesfile} for reading."); + return; + } + tinydns_add_active_leases($fl,$fd, $dhcpddomain); + } + } + + if($config['installedpackages']['tinydnsdomains']) { + for($x=0; $x< count($config['installedpackages']['tinydnsdomains']['config']); $x++) { + $domain = $config['installedpackages']['tinydnsdomains']['config'][$x]; + $record_data = ""; + $hostname = $domain['hostname']; + $ipaddress = $domain['ipaddress']; + $ttl = $domain['ttl']; + /* check record status, if it is down request + * backup server if defined. + */ + if($domain['monitorip']) + $monitorip = $domain['monitorip']; + if($monitorip) { + $status = tinydns_get_record_status($monitorip); + if($status == "DOWN") { + if($debug) + log_error("$ipaddress monitor ip $monitorip is offline."); + $ipaddress = tinydns_get_backup_record($ipaddress); + if($debug) + log_error("tinydns_get_backup_record returned $ipaddress "); + } + } + $record_data = tinydns_get_rowline_data($ipaddress, $domain['recordtype'], $ttl, $hostname, $domain['rdns']); + if($record_data) + fwrite($fd, $record_data . "\n"); + /* process load balanced items */ + if($domain['row']) { + foreach($domain['row'] as $row) { + if($row['loadbalance']) { + if($row['pingthreshold']) + $pingthreshold = $row['pingthreshold']; + else + $pingthreshold = ""; + if($row['wanpingthreshold']) + $wanpingthreshold = $row['wanpingthreshold']; + else + $wanpingthreshold = ""; + $status = tinydns_get_record_status($row['failoverip'], $pingthreshold, $wanpingthreshold); + if($status == "DOWN") { + $record_data = tinydns_get_rowline_data($row['failoverip'], $domain['recordtype'], $ttl, $hostname, ""); + fwrite($fd, $record_data . "\n"); + } + } + } + } + } + } + fclose($fd); + /* tell tinydns to reload zone file */ + exec("cd /service/tinydns/root && /usr/local/bin/tinydns-data"); + config_unlock(); + conf_mount_ro(); +} + +function tinydns_sync_on_changes() { + global $g, $config; + $synconchanges = $config['installedpackages']['tinydnssync']['config'][0]['synconchanges']; + if(!$synconchanges) + return; + $sync_hosts = $config['installedpackages']['tinydnssync']['config']; + foreach($sync_hosts as $sh) { + $sync_to_ip = $sh['ipaddress']; + $password = $sh['password']; + if($password and $sync_to_ip) + tinydns_do_xmlrpc_sync($sync_to_ip, $password); + } +} + +function tinydns_do_xmlrpc_sync($sync_to_ip, $password) { + global $config, $g; + + if(!$password) + return; + + if(!$sync_to_ip) + return; + + $xmlrpc_sync_neighbor = $sync_to_ip; + if($config['system']['webgui']['protocol'] != "") { + $synchronizetoip = $config['system']['webgui']['protocol']; + $synchronizetoip .= "://"; + } + $port = $config['system']['webgui']['port']; + /* if port is empty lets rely on the protocol selection */ + if($port == "") { + if($config['system']['webgui']['protocol'] == "http") + $port = "80"; + else + $port = "443"; + } + $synchronizetoip .= $sync_to_ip; + + /* xml will hold the sections to sync */ + $xml = array(); + $xml['tinydnsdomains'] = $config['installedpackages']['tinydnsdomains']; + + /* assemble xmlrpc payload */ + $params = array( + XML_RPC_encode($password), + XML_RPC_encode($xml) + ); + + /* set a few variables needed for sync code borrowed from filter.inc */ + $url = $synchronizetoip; + log_error("Beginning TinyDNS XMLRPC sync to {$url}:{$port}."); + $method = 'pfsense.merge_installedpackages_section_xmlrpc'; + $msg = new XML_RPC_Message($method, $params); + $cli = new XML_RPC_Client('/xmlrpc.php', $url, $port); + $cli->setCredentials('admin', $password); + if($g['debug']) + $cli->setDebug(1); + /* send our XMLRPC message and timeout after 250 seconds */ + $resp = $cli->send($msg, "250"); + if(!$resp) { + $error = "A communications error occured while attempting tinydns XMLRPC sync with {$url}:{$port}."; + log_error($error); + file_notice("sync_settings", $error, "tinydns Settings Sync", ""); + } elseif($resp->faultCode()) { + $cli->setDebug(1); + $resp = $cli->send($msg, "250"); + $error = "An error code was received while attempting tinydns XMLRPC sync with {$url}:{$port} - Code " . $resp->faultCode() . ": " . $resp->faultString(); + log_error($error); + file_notice("sync_settings", $error, "tinydns Settings Sync", ""); + } else { + log_error("tinydns XMLRPC sync successfully completed with {$url}:{$port}."); + } + + /* tell tinydns to reload our settings on the destionation sync host. */ + $method = 'pfsense.exec_php'; + $execcmd = "require('/usr/local/pkg/tinydns.inc');\n"; + $execcmd .= "tinydns_custom_php_changeip_command();\n"; + $execcmd .= "tinydns_custom_php_install_command();\n"; + $execcmd .= "tinydns_create_zone_file();\n"; + $execcmd .= "tinydns_setup_ping_items();\n"; + + /* assemble xmlrpc payload */ + $params = array( + XML_RPC_encode($password), + XML_RPC_encode($execcmd) + ); + + $msg = new XML_RPC_Message($method, $params); + $cli = new XML_RPC_Client('/xmlrpc.php', $url, $port); + $cli->setCredentials('admin', $password); + $resp = $cli->send($msg, "250"); + if(!$resp) { + $error = "A communications error occured while attempting tinydns XMLRPC sync with {$url}:{$port} (pfsense.exec_php)."; + log_error($error); + file_notice("sync_settings", $error, "tinydns Settings Sync", ""); + } elseif($resp->faultCode()) { + $cli->setDebug(1); + $resp = $cli->send($msg, "250"); + $error = "An error code was received while attempting tinydns XMLRPC sync with {$url}:{$port} - Code " . $resp->faultCode() . ": " . $resp->faultString(); + log_error($error); + file_notice("sync_settings", $error, "tinydns Settings Sync", ""); + } else { + log_error("tinydns XMLRPC sync successfully completed with {$url}:{$port} (pfsense.exec_php)."); + } + + log_error("[tinydns] tinydns_xmlrpc_sync.php is ending."); +} + +/* formats data as a tinydns data row item */ +/* A full description of the data format is available at 'man tinydns-data' */ +function tinydns_get_rowline_data($recordip, $recordtype, $ttl, $hostname, $rdns) { + if($ttl) + $ttl_string = ":{$ttl}"; + else + $ttl_string = ""; + switch ($recordtype) { + case "SOA": + $record_data = ".{$hostname}::{$recordip}{$ttl_string}"; + break; + case "NS": + $record_data = "&{$hostname}:{$recordip}{$ttl_string}"; + break; + case "MX": + $record_data = "@{$hostname}:{$recordip}::{$ttl_string}"; + break; + case "PTR": + /* "^" creates "PTR" record only to allow reverse DNS */ + $record_data = "^{$hostname}:{$recordip}{$ttl_string}"; + break; + case "A": + /* "=" creates both "A" and "PTR" records to allow both forward and reverse DNS */ + if($rdns) + $record_data = "={$hostname}:{$recordip}{$ttl_string}"; + else + /* "+" creates "A" records only to allow forward DNS */ + $record_data = "+{$hostname}:{$recordip}{$ttl_string}"; + break; + case "CNAME": + $record_data = "C{$hostname}:{$recordip}{$ttl_string}"; + break; + case "TXT": + /* "'" creates "TXT" record that can be used for SPF */ + $record_data = "'{$hostname}:{$recordip}{$ttl_string}"; + break; + } + return $record_data; +} + +/* Returns the last IP byte and the Trimmed IP*/ +function tinydns_get_lastip_byte($ipsub) { + $len= strlen($ipsub); + $pos = strrpos($ipsub, "."); + $last_byte = ""; + if ($pos === false) { + $last_byte = $ipsub; + return array ($last_byte,$ipsub); + } + $last_byte = substr($ipsub,$pos + 1); + $ipsub = substr($ipsub,0,$pos); + return array ($last_byte,$ipsub); +} + +/* in-add.arpa IP calculated from D.C.B.A and Mask to A.B.C.D.in-addr.arpa */ +/* 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); + $a = $array[0]; + $ipsub = $array[1]; + $array = tinydns_get_lastip_byte($ipsub); + $b = $array[0]; + $ipsub = $array[1]; + $array = tinydns_get_lastip_byte($ipsub); + $c = $array[0]; + $ipsub = $array[1]; + $array = tinydns_get_lastip_byte($ipsub); + $d = $array[0]; + $ipsub = $array[1]; + switch ($ipmask) { + case ($ipmask <= 32 AND $ipmask > 24): + $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 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_ip_subnet_arpa($ip, $ipmask); + $soa = ".{$domain}::{$fqdn}"; + $rsoa = ".{$rip[1]}::{$fqdn}"; + $a = "={$fqdn}:{$ip}"; + if($fqdn) + fwrite($fd, $soa . "\n"); + if($rip) + fwrite($fd, $rsoa . "\n"); + if($nsname) + fwrite($fd, $a . "\n"); +} + +/* Search for active leases in the dhcpd.leases file and add them to tinyDNS */ +/* Currently it will add duplicate leases that are ignored by thee tinyDNS server*/ +/* Should duplicate leases be purged by DCHCP server in a remove stale records operation? */ +function tinydns_add_active_leases($fl,$fd, $leasedomain) { + $i = 0; + $lip = strlen("lease") + 1; + $lis = strlen("binding state active"); + $lic = strlen("client-hostname"); + $leaseip = ""; + $leasestatus = ""; + $leasehostname = ""; + while (!feof($fl)) { + $leases = fgets($fl, 4096); + $discard = ($leases[0] == "#") OR ($leases[0] == "\n"); + if(!$discard) { + if($leaseip == "") { + if ($leaseip = strstr($leases,"lease")) { + $leaseip = substr($leaseip,$lip,strpos($leases,"{") - $lip - 1); + } + } + elseif($leasestatus == FALSE) { + if (stristr($leases,"binding state active")) { + $leasestatus = TRUE; + } + } + elseif($leasestatus == TRUE AND $leasehostname == "") { + if($leasehostname = stristr($leases,"client-hostname")) { + $qstrt = strpos($leasehostname,'"') + 1; + $qlen = strrpos($leasehostname,'"') - $qstrt; + $leasehostname = substr($leasehostname,$qstrt,$qlen); + } + } + if($leases[0] == "}") { + $leasefqdn = "{$leasehostname}.{$leasedomain}"; + $leasea = "={$leasefqdn}:{$leaseip}"; + if($leasehostname AND $leasestatus)fwrite($fd, $leasea . "\n"); + $leaseip = ""; + $leasehostname = ""; + $leasestatus = FALSE; + } + $i = $i + 1; + } + } + fclose($fl); + $leaselines = $i; +} + +function tinydns_get_dns_record_type($tinydnsrecord) { + $rtype = ""; + $rtype2 = ""; + $rdns = ""; + switch ($tinydnsrecord) { + case($tinydnsrecord[0] == "."): + $rtype = "SOA"; + $rtype2 = "NS"; + break; + case($tinydnsrecord[0] == "="): + $rtype = "A"; + $rtype2 = "PTR"; + $rdns = "on"; + break; + case($tinydnsrecord[0] == "+"): + $rtype = "A"; + break; + case($tinydnsrecord[0] == "@"): + $rtype = "MX"; + break; + case($tinydnsrecord[0] == "^"): + $rtype = "PTR"; + $rdns = "on"; + break; + case($tinydnsrecord[0] == "&"): + $rtype = "NS"; + break; + case($tinydnsrecord[0] == "'"): + $rtype = "TXT"; + break; + case($tinydnsrecord[0] == "C"): + $rtype = "CNAME"; + break; + case($tinydnsrecord[0] == "Z"): + $rtype = "SOA"; + break; + default: + $rtype = ""; + } + return array ($rtype, $rtype2, $rdns); +} + +/* This function will be replaced by an auto detect DNS cache servers routine */ +/* At the moment there 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.dnscache 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); + exec("echo 1 > /etc/dnscache/env/FORWARDONLY"); + if(is_dir("/etc/dnscache/root/servers/")) + exec("rm -R /etc/dnscache/root/servers/"); + exec("mkdir /etc/dnscache/root/servers/"); + $fr = fopen("/etc/dnscache/root/servers/@", "w"); + if (! $fr) { + printf("Error: cannot write to /etc/dnscache/root/servers/@ in tinydns_dnscache_forwarding_servers().\n"); + return 1; + } + if($iprecords) + fwrite($fr, $iprecords); + fclose($fr); +} + +/* This routine adds filenames to /etc/dnscache/root/servers/ with the contents pointing to the tinyDNS server */ +function tinydns_create_soa_domain_list($dnsserverip) { + if(file_exists("/service/tinydns/root/data")) + $tinydns_data = file_get_contents("/service/tinydns/root/data"); + else + $tinydns_data = ""; + + $datalen = strlen($tinydns_data); + $startofrecord = 0; + while ($startofrecord < $datalen ) { + $endofrecord = strpos($tinydns_data,"\n",$startofrecord); + $dnsrecord = substr($tinydns_data,$startofrecord,$endofrecord-$startofrecord); + $startofrecord = $endofrecord + 1; + + $col1 = strpos($dnsrecord,":"); + $fqdn = substr($dnsrecord,1,$col1-1); + if($fqdn) { + $rtypes = tinydns_get_dns_record_type($dnsrecord); + if($rtypes[0] == "SOA") { + $fr = fopen("/etc/dnscache/root/servers/{$fqdn}", "w"); + if (! $fr) { + printf("Error: cannot open /etc/dnscache/root/servers/{$fqdn} in tinydns_create_soa_domain_list().\n"); + return 1; + } + if($fqdn)fwrite($fr, $dnsserverip); + fclose($fr); + } + } + } +} + +/* This function is not called */ +/* At the moment there 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) { + printf("Error: cannot open resolv.conf in tinydns_register_forwarding_servers().\n"); + return 1; + } + + $lip = strlen("nameserver") + 1; + $j = 0; + $nsrecords = ""; + $arecords = ""; + 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; + $routerfqdn = "DNSroute-{$j}.wan{$j}"; + $routerns = "&::{$routerfqdn}"; + $routera = "={$routerfqdn}:{$routerip}"; + $nsrecords .= $routerns . "\n"; + $arecords .= $routera; + } + } + } + } + fclose($fr); + $dnsroutes ="{$nsrecords}{$arecords}"; + return $dnsroutes; +} + +function tinydns_register_root_servers() { + $rootservers =<< /etc/dnscache/env/FORWARDONLY"); + if(is_dir("/etc/dnscache/root/servers/")) + exec("rm -R /etc/dnscache/root/servers/"); + exec("mkdir /etc/dnscache/root/servers/"); + $fr = fopen("/etc/dnscache/root/servers/@", "w"); + if (! $fr) { + printf("Error: cannot write to /etc/dnscache/root/servers/@ in dnscache_use_root_servers().\n"); + return 1; + } + fwrite($fr, $rootservers); + fclose($fr); +} + +?> \ No newline at end of file diff --git a/config/tinydns/tinydns.xml b/config/tinydns/tinydns.xml new file mode 100644 index 00000000..fc1c3482 --- /dev/null +++ b/config/tinydns/tinydns.xml @@ -0,0 +1,309 @@ + + + + + + . + All rights reserved. + */ +/* ========================================================================== */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, + OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + */ +/* ========================================================================== */ + ]]> + + Describe your package here + Describe your package requirements here + Currently there are no FAQ items provided. + tinydns + 1.0 + DNS Server: Settings + /pkg_edit.php?xml=tinydns.xml&id=0 + /usr/local/pkg/tinydns.inc + + DNS Servers + +
Services
+ /tinydns_status.php +
+ + DNS Server + svscan.sh + tinydns + TinyDNS DNS Server + + + + Settings + /pkg_edit.php?xml=tinydns.xml&id=0 + + + + Add/Edit Record + /tinydns_filter.php + + + Failover Status + /tinydns_status.php + + + Logs + /tinydns_view_logs.php + + + Zone Sync + /pkg_edit.php?xml=tinydns_sync.xml&id=0 + + + New domain wizard + /wizard.php?xml=new_zone_wizard.xml + + + installedpackages->package->tinydns + + /usr/local/pkg/ + 077 + http://www.pfsense.com/packages/config/tinydns/tinydns.inc + + + /usr/local/pkg/pf/ + 077 + http://www.pfsense.com/packages/config/tinydns/tinydns_xmlrpc_sync.php + + + /usr/local/pkg/ + 077 + http://www.pfsense.com/packages/config/tinydns/tinydns_domains.xml + + + /usr/local/www/ + 077 + http://www.pfsense.com/packages/config/tinydns/tinydns_status.php + + + /usr/local/www/ + 077 + http://www.pfsense.com/packages/config/tinydns/tinydns_dhcp_filter.php + + + /usr/local/www/ + 077 + http://www.pfsense.com/packages/config/tinydns/tinydns_filter.php + + + /usr/local/pkg/ + 077 + http://www.pfsense.com/packages/config/tinydns/tinydns_down.php + + + /usr/local/pkg/ + 077 + http://www.pfsense.com/packages/config/tinydns/tinydns_up.php + + + /usr/local/pkg/ + 077 + http://www.pfsense.com/packages/config/tinydns/tinydns_parse_logs.php + + + /usr/local/www/ + 077 + http://www.pfsense.com/packages/config/tinydns/tinydns_view_logs.php + + + /usr/local/pkg/ + 077 + http://www.pfsense.com/packages/config/tinydns/tinydns_sync.xml + + + /usr/local/www/wizards/ + 077 + http://www.pfsense.com/packages/config/tinydns/new_zone_wizard.xml + + + + listtopic + Binding IP Address + temp + + + IP Address + ipaddress + Bind TinyDNS to this IP address. Enable DNS Forwarders bind TinyDNS to the LAN IP. + input + + + listtopic + DNS-Cache server + temp + + + Enable DNS Forwarders + enableforwarding + Enable DNScache forwarder on LAN IP and register LAN's SOA, NS, A, and PTR Records with TinyDNS Server. + checkbox + + + Register DHCP static mappings with server + regdhcpstatic + Register static DHCP leases with TinyDNS server using the Fully Qualified Domain Name specified in System: General. + checkbox + + + Register DHCP leases with server + regdhcp + Register active DHCP leases with TinyDNS server using the Fully Qualified Domain Name specified in System: General. + checkbox + + + listtopic + Monitoring address refresh interval + temp + + + Refresh Interval + refreshinterval + Controls how often the monitoring ip adresses are polled + input + + + listtopic + Sync TinyDNS settings via XMLRPC + temp + + + XMLRPC Sync + syncxmlrpc + Sync TinyDNS configuration to backup firewalls + checkbox + + + listtopic + Zone transfers + temp + + + Hosts allowed to perform DNS Zone Transfers - Note: this requires TCP port 53 firewall permit rule! + none + rowhelper + + + IP Address + ztipaddress + Enter the IP Address that is allowed to transfer zone records (ex: 4.2.2.1) + input + 20 + + + DNS Zone - Use * for all Zones + dnszone + Enter the DNS zone that this IP address is allowed to transfer (ex: domain.com) + input + 20 + + + + + listtopic + Advanced tunables (OPTIONAL) + temp + + + Minimum segment size + minsegment + Recommended size: 10240 or larger. + input + 10240 + + + Maximum file size + maxfilesize + Recommended size: 10240 or larger. + input + 10240 + + + Max Segment size + maxsegment + Recommended size: 20480 or larger. + input + 20480 + + + Maximum file descriptors + maxfd + Recommended size: 100 or larger. + input + 100 + + + Maximum children processes + maxchild + Recommended size: 40 or larger. + input + 40 + + + + tinydns_custom_php_changeip_command(); + tinydns_custom_php_install_command(); + tinydns_create_zone_file(); + tinydns_setup_ping_items(); + tinydns_sync_on_changes(); + + + tinydns_custom_php_changeip_command(); + tinydns_custom_php_install_command(); + tinydns_create_zone_file(); + tinydns_setup_ping_items(); + tinydns_sync_on_changes(); + + + tinydns_custom_php_changeip_command(); + tinydns_custom_php_install_command(); + tinydns_create_zone_file(); + tinydns_setup_ping_items(); + tinydns_sync_on_changes(); + + + tinydns_custom_php_install_command(); + tinydns_sync_on_changes(); + + + tinydns_custom_php_deinstall_command(); + tinydns_sync_on_changes(); + + + unset($_POST['temp']); + +
\ No newline at end of file diff --git a/config/tinydns/tinydns_dhcp_filter.php b/config/tinydns/tinydns_dhcp_filter.php new file mode 100644 index 00000000..c92abcf8 --- /dev/null +++ b/config/tinydns/tinydns_dhcp_filter.php @@ -0,0 +1,129 @@ + + part of pfSense + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, + OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. +*/ + +##|+PRIV +##|*IDENT=page-tinydns-dhcp-filter +##|*NAME=TinyDNS: DHCP Domains +##|*DESCR=Allow access to the TinyDNS View Domains page +##|*MATCH=tinydns_dhcp_filter* +##|-PRIV + +require("/usr/local/pkg/tinydns.inc"); +require("guiconfig.inc"); + +$pgtitle = "TinyDNS: DHCP Domains"; +include("head.inc"); + +$pfSversion = str_replace("\n", "", file_get_contents("/etc/version")); +if(strstr($pfSversion, "1.2")) + $one_two = true; + +?> + + + + +

+ + + + +
+ + +
+ + + + + + + +
+
+
+
+ + + + + + + + +"; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; +} +?> +
Fully Qualified Domain Name (Hostname)Record typesrDNSIP Address or FQDN
$fqdn$rtypes[0] $rtypes[1]$rtypes[2]$ip
+
+
+ + + + diff --git a/config/tinydns/tinydns_domains.xml b/config/tinydns/tinydns_domains.xml new file mode 100644 index 00000000..3e313511 --- /dev/null +++ b/config/tinydns/tinydns_domains.xml @@ -0,0 +1,234 @@ + + + + + + + + Describe your package here + Describe your package requirements here + Currently there are no FAQ items provided. + tinydnsdomains + none + TinyDNS: Domains + /usr/local/pkg/tinydns.inc + + + Settings + /pkg_edit.php?xml=tinydns.xml&id=0 + + + Add/Edit Record + /tinydns_filter.php + + + + Failover Status + /tinydns_status.php + + + Logs + /tinydns_view_logs.php + + + Sync + /pkg_edit.php?xml=tinydns_sync.xml&id=0 + + + New domain wizard + /wizard.php?xml=new_zone_wizard.xml + + + installedpackages->package->tinydnsdomains + + + Fully Qualified Domain Name (Hostname) + hostname + + + Record type + recordtype + + + rDNS + rdns + + + IP Address + ipaddress + + + + + listtopic + General + temp + + + Hostname or FQDN www.exampledomain.com + hostname + The DNS server will supply Records for the Fully Qualified Domain Name that is entered + input + 35 + + + + Record type + recordtype + DNS Record types. A, PTR, MX, NS, SOA, TXT, CNAME + select + 1 + + + + + + + + + + + + + + FQDN or IP Address + ipaddress + IP Address for A Records. FQDN or Hostname for SOA, PTR, CNAME Records. For NS Records an IP:FQDN + input + 40 + + + + DNS record time to live + ttl + input + 35 + + + listtopic + Reverse lookup + temp + + + Automatic PTR entry + rdns + Create a reverse DNS (PTR) entry for this A Record? + checkbox + + + listtopic + Failover + temp + + + IP to ping to ensure service is up + monitorip + input + 35 + + + Time in minutes before DNS switches to backup host + threshhold + input + 35 + + + none + none + rowhelper + + + Failover IP + failoverip + Failover IP when host is not responding to ICMP/PING traffic + input + 25 + + + Load balance + loadbalance + Adds this member to active group when host is alive. + checkbox + + + Ping threshold + pingthreshold + When the MS time is surpassed, item will failover to next host + input + 7 + + + Wan ping threshold + wanpingthreshold + When the WAN MS ping time is surpassed, item will failover to next host + input + 7 + + + IP to ping to ensure service is up + monitorip + When the WAN MS ping time is surpassed, item will failover to next host + input + 15 + + + + + + tinydns_create_zone_file(); + tinydns_setup_ping_items(); + tinydns_sync_on_changes(); + + + log_error("Begin tinydns add"); + tinydns_create_zone_file(); + log_error("Zone file done."); + tinydns_setup_ping_items(); + log_error("Ping items done."); + tinydns_sync_on_changes(); + + + log_error("Begin tinydns resync"); + tinydns_create_zone_file(); + log_error("Zone file done."); + tinydns_setup_ping_items(); + log_error("Ping items done."); + tinydns_sync_on_changes(); + + + unset($_POST['temp']); + + diff --git a/config/tinydns/tinydns_down.php b/config/tinydns/tinydns_down.php new file mode 100644 index 00000000..19eaa4ae --- /dev/null +++ b/config/tinydns/tinydns_down.php @@ -0,0 +1,42 @@ +#!/usr/local/bin/php -f + \ No newline at end of file diff --git a/config/tinydns/tinydns_filter.php b/config/tinydns/tinydns_filter.php new file mode 100644 index 00000000..88819932 --- /dev/null +++ b/config/tinydns/tinydns_filter.php @@ -0,0 +1,38 @@ + \ No newline at end of file diff --git a/config/tinydns/tinydns_parse_logs.php b/config/tinydns/tinydns_parse_logs.php new file mode 100644 index 00000000..2b316d4c --- /dev/null +++ b/config/tinydns/tinydns_parse_logs.php @@ -0,0 +1,96 @@ +#!/usr/local/bin/php + "A", + "0002" => "NS", + "0005" => "CNAME", + "0006" => "SOA", + "000c" => "PTR", + "000f" => "MX", + "0010" => "TXT", + "001c" => "AAAA", + "0021" => "RT", + "0026" => "A6", + "00fb" => "IXFR", + "00fc" => "AXFR", + "00ff" => "*" + ); + +$results = array( + "+" => "responded", + "-" => "not_authority", + "I" => "not_implemented/invalid", + "C" => "wrong_class", + "/" => "not_parsed" + ); + +$fp = fopen('php://stdin', 'r'); + +/* loop through stdin and process text */ +while (!feof($fp)) { + $stdintext = chop(fgets($fp)); + preg_match('/^(\S+ \S+) ([^:]+):([^:]+):([^:]+) (\S+) (\S+) (\S+)$/', $stdintext, $items); + $stamp = $items[1]; + $rawip = $items[2]; + $port = $items[3]; + $id = $items[4]; + $result = $items[5]; + $type = $items[6]; + $name = $items[7]; + if (isset($query_type[$type])) + $qtype = $query_type[$type]; + else + $qtype = $type; + $desc = $results[$result]; + $ip = decodeipaddress($rawip); + //echo "RAWIP: $rawip $ip"; + printf("%s %15.15s:%-4.4s %-8.8s %-24.24s %s\n",$stamp,$ip,hexdec($port),$qtype,$desc,$name); +} + +function decodeipaddress($text) { + preg_match('/(..)(..)(..)(..)/', $text, $hexitems); + $ipaddr = ""; + unset($hexitems[0]); + $isfirst = true; + foreach($hexitems as $hexitem) { + if(!$isfirst) + $ipaddr .= "."; + $ipaddr .= hexdec($hexitem); + $isfirst = false; + } + return $ipaddr; +} + +fclose($fp); + +?> \ No newline at end of file diff --git a/config/tinydns/tinydns_status.php b/config/tinydns/tinydns_status.php new file mode 100644 index 00000000..147001af --- /dev/null +++ b/config/tinydns/tinydns_status.php @@ -0,0 +1,188 @@ + + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, + OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. +*/ + +require("guiconfig.inc"); + +/* Defaults to this page but if no settings are present, redirect to setup page */ +if(!$config['installedpackages']['tinydnsdomains']['config']) + Header("Location: /wizard.php?xml=new_zone_wizard.xml"); + +if(!$config['installedpackages']['tinydns']['config'][0]['ipaddress']) + Header("Location: /pkg_edit.php?xml=tinydns.xml&id=0&savemsg=Please+set+the+binding+ip+address+for+server+operation"); + +$pgtitle = "TinyDNS: Status"; +include("head.inc"); + +$pfSversion = str_replace("\n", "", file_get_contents("/etc/version")); +if(strstr($pfSversion, "1.2")) + $one_two = true; + +?> + + + + +

+ + + + +
+ + +
+ + + + + + + +
+
+
+
+ + + + + + + + +YES"; + else + $inservice = "NO"; + echo ""; + echo ""; + echo ""; + + echo ""; + + echo ""; + echo ""; + + foreach($ping['row'] as $row) { + $ipaddress = $row['failoverip']; + $monitorip = $row['monitorip']; + if(file_exists("/var/db/pingstatus/$monitorip")) + $status = file_get_contents("/var/db/pingstatus/$monitorip"); + else + $status = "N/A"; + echo ""; + echo ""; + echo ""; + + echo ""; + + echo ""; + echo ""; + } + echo ""; +} +?> +
IPStatusIn ServiceResponse time
"; + echo "$hostname
   |-> $ipaddress"; + echo "
"; + if(stristr($status,"DOWN")) + echo "DOWN"; + else + echo "UP"; + echo ""; + echo $inservice; + echo ""; + if(!$monitorip) + $monitorip = $ipaddress; + if(file_exists("/var/db/pingmsstatus/$monitorip")) + $msstatus = file_get_contents("/var/db/pingmsstatus/$monitorip"); + else + $msstatus = "N/A"; + echo "" . $msstatus; + echo "
          |->  "; + echo $ipaddress; + if($row['loadbalance']) + echo " (LB)"; + if(stristr($tinydns_data, "+{$hostname}:{$row['monitorip']}")) + $inservice = "YES"; + else + $inservice = "NO"; + echo ""; + if(stristr($status,"DOWN")) + echo "DOWN"; + else + echo "UP"; + echo ""; + echo $inservice; + echo ""; + if(!$monitorip) + $monitorip = $ipaddress; + if(file_exists("/var/db/pingmsstatus/$monitorip")) + $msstatus = file_get_contents("/var/db/pingmsstatus/$monitorip"); + else + $msstatus = "N/A"; + + echo "" . $msstatus; + echo "
 
+
+
+ + + + diff --git a/config/tinydns/tinydns_sync.xml b/config/tinydns/tinydns_sync.xml new file mode 100644 index 00000000..091ae90a --- /dev/null +++ b/config/tinydns/tinydns_sync.xml @@ -0,0 +1,146 @@ + + + + + + + + Describe your package here + Describe your package requirements here + Currently there are no FAQ items provided. + tinydnssync + 1.0 + TinyDNS: Manual Sync + /usr/local/pkg/tinydns.inc + + + Settings + /pkg_edit.php?xml=tinydns.xml&id=0 + + + Add/Edit Record + /tinydns_filter.php + + + Failover Status + /tinydns_status.php + + + Logs + /tinydns_view_logs.php + + + Zone Sync + /pkg_edit.php?xml=tinydns_sync.xml&id=0 + + + + New domain wizard + /wizard.php?xml=new_zone_wizard.xml + + + installedpackages->package->tinydns + + + listtopic + temp + Enbable DNS zone sync + + + Automatically sync DNS zone changes + synconchanges + pfSense will automatically sync changes to the hosts defined below. + checkbox + + + listtopic + Sync host #1 + temp + + + IP Address + ipaddress + The IP address of the first host that TinyDNS will Sync its DNS zone data to. + input + + + Password + password + Admin password of the first host that TinyDNS will Sync its DNS zone data to. + password + + + listtopic + Sync host #2 + temp + + + IP Address 2 + ipaddress2 + OPTIONAL. The IP address of the second host that TinyDNS will Sync its DNS zone data to. + input + + + Password 2 + password2 + Admin password of the second host that TinyDNS will Sync its DNS zone data to. + password + + + listtopic + Sync host #3 + temp + + + IP Address 3 + ipaddress3 + OPTIONAL. The IP address of the third host that TinyDNS will Sync its DNS zone data to. + input + + + Password 3 + password3 + Admin password of the third host that TinyDNS will Sync its DNS zone data to. + password + + + + tinydns_sync_on_changes(); + + + unset($_POST['temp']); + + \ No newline at end of file diff --git a/config/tinydns/tinydns_up.php b/config/tinydns/tinydns_up.php new file mode 100644 index 00000000..c06ad74c --- /dev/null +++ b/config/tinydns/tinydns_up.php @@ -0,0 +1,42 @@ +#!/usr/local/bin/php -f + \ No newline at end of file diff --git a/config/tinydns/tinydns_view_logs.php b/config/tinydns/tinydns_view_logs.php new file mode 100644 index 00000000..d205a630 --- /dev/null +++ b/config/tinydns/tinydns_view_logs.php @@ -0,0 +1,122 @@ + + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, + OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. +*/ + +require("guiconfig.inc"); + +if($_REQUEST['getactivity']) { + $tinydnslogs = `cat /etc/tinydns/log/main/current | /usr/local/bin/tai64nlocal | php -f /usr/local/pkg/tinydns_parse_logs.php | grep -v ":0"`; + echo "TinyDNS Server logs as of " . date("D M j G:i:s T Y") . "\n\n"; + echo $tinydnslogs; + exit; +} + +/* Defaults to this page but if no settings are present, redirect to setup page */ +if(!$config['installedpackages']['tinydns']['config'][0]) + Header("Location: /pkg_edit.php?xml=tinydns.xml&id=0"); + +$pfSversion = str_replace("\n", "", file_get_contents("/etc/version")); +if(strstr($pfSversion, "1.2")) + $one_two = true; + +$pgtitle = "TinyDNS: View Logs"; +include("head.inc"); + +/* NEED TO FIX there are 2 logs /etc/tinydns/log/main/current and /etc/dnscache/log/main/current */ + +/* NEED TO FIX */ +if ($_POST['clear']) { +// exec("rm /etc/tinydns/log/main/current"); +// exec("touch /etc/tinydns/log/main/current"); +} + +?> + + + + + + +

+ + + + +
+ + +
+ + + + +
+
+
+
+
One moment please, loading TinyDNS logs...
+
+
+ + +

+ " /> + + +

+ + + diff --git a/config/tinydns/tinydns_xmlrpc_sync.php b/config/tinydns/tinydns_xmlrpc_sync.php new file mode 100644 index 00000000..0610e286 --- /dev/null +++ b/config/tinydns/tinydns_xmlrpc_sync.php @@ -0,0 +1,59 @@ + \ No newline at end of file -- cgit v1.2.3