| 425 |
425 |
return;
|
| 426 |
426 |
}
|
| 427 |
427 |
tinydns_add_active_leases($fl,$fd, $dhcpddomain);
|
|
428 |
fclose($fl);
|
| 428 |
429 |
}
|
| 429 |
430 |
}
|
| 430 |
431 |
|
| ... | ... | |
| 762 |
763 |
/* Search for active leases in the dhcpd.leases file and add them to tinyDNS */
|
| 763 |
764 |
/* Currently it will add duplicate leases that are ignored by thee tinyDNS server*/
|
| 764 |
765 |
/* Should duplicate leases be purged by DCHCP server in a remove stale records operation? */
|
| 765 |
|
function tinydns_add_active_leases($fl,$fd, $leasedomain) {
|
| 766 |
|
$i = 0;
|
| 767 |
|
$lip = strlen("lease") + 1;
|
| 768 |
|
$lis = strlen("binding state active");
|
| 769 |
|
$lic = strlen("client-hostname");
|
| 770 |
|
$leaseip = "";
|
| 771 |
|
$leasestatus = "";
|
| 772 |
|
$leasehostname = "";
|
|
766 |
|
|
767 |
|
|
768 |
function tinydns_parse_leases($fl,
|
|
769 |
$datekeys = array('starts', 'ends'),
|
|
770 |
$stringkeys = array('binding state', 'client-hostname', 'hardware ethernet'))
|
|
771 |
{
|
|
772 |
$entry = NULL;
|
|
773 |
$result = array();
|
|
774 |
|
| 773 |
775 |
while (!feof($fl)) {
|
| 774 |
|
$leases = fgets($fl, 4096);
|
| 775 |
|
$discard = ($leases[0] == "#") OR ($leases[0] == "\n");
|
| 776 |
|
if(!$discard) {
|
| 777 |
|
if($leaseip == "") {
|
| 778 |
|
if ($leaseip = strstr($leases,"lease")) {
|
| 779 |
|
$leaseip = substr($leaseip,$lip,strpos($leases,"{") - $lip - 1);
|
| 780 |
|
}
|
| 781 |
|
}
|
| 782 |
|
elseif($leasestatus == FALSE) {
|
| 783 |
|
if (stristr($leases,"binding state active")) {
|
| 784 |
|
$leasestatus = TRUE;
|
| 785 |
|
}
|
| 786 |
|
}
|
| 787 |
|
elseif($leasestatus == TRUE AND $leasehostname == "") {
|
| 788 |
|
if($leasehostname = stristr($leases,"client-hostname")) {
|
| 789 |
|
$qstrt = strpos($leasehostname,'"') + 1;
|
| 790 |
|
$qlen = strrpos($leasehostname,'"') - $qstrt;
|
| 791 |
|
$leasehostname = substr($leasehostname,$qstrt,$qlen);
|
| 792 |
|
}
|
| 793 |
|
}
|
| 794 |
|
if($leases[0] == "}") {
|
| 795 |
|
$leasefqdn = "{$leasehostname}.{$leasedomain}";
|
| 796 |
|
$leasea = "={$leasefqdn}:{$leaseip}";
|
| 797 |
|
if($leasehostname AND $leasestatus)fwrite($fd, $leasea . "\n");
|
| 798 |
|
$leaseip = "";
|
| 799 |
|
$leasehostname = "";
|
| 800 |
|
$leasestatus = FALSE;
|
| 801 |
|
}
|
| 802 |
|
$i = $i + 1;
|
|
776 |
$line = fgets($fl, 4096);
|
|
777 |
|
|
778 |
/* skip comments and empty lines */
|
|
779 |
if (($line[0] == "#") OR ($line[0] == "\n"))
|
|
780 |
continue;
|
|
781 |
|
|
782 |
/* parse beginning of lease entry */
|
|
783 |
if (1 == sscanf($line, "lease %[0-9.] {", $ip)) {
|
|
784 |
$entry = array('ip' => $ip);
|
|
785 |
continue;
|
| 803 |
786 |
}
|
|
787 |
|
|
788 |
/* parse end of lease entry */
|
|
789 |
if($line[0] == "}") {
|
|
790 |
$result[] = $entry;
|
|
791 |
$entry = NULL;
|
|
792 |
continue;
|
|
793 |
}
|
|
794 |
|
|
795 |
/* parse row with date value. dates are always in gmt! */
|
|
796 |
foreach ($datekeys as $datekey) {
|
|
797 |
if(7 == sscanf($line, " ${datekey} %d %d/%d/%d %d:%d:%d;",
|
|
798 |
$wd, $year, $month, $day, $hour, $minute, $sec))
|
|
799 |
{
|
|
800 |
$entry[$datekey] =
|
|
801 |
gmmktime($hour, $minute, $sec, $month, $day, $year);
|
|
802 |
continue 2;
|
|
803 |
}
|
|
804 |
}
|
|
805 |
|
|
806 |
/* parse standard row value */
|
|
807 |
foreach ($stringkeys as $stringkey) {
|
|
808 |
if(1 == sscanf($line, " ${stringkey} %[^;];", $value)) {
|
|
809 |
$entry[$stringkey] = trim($value, "\"");
|
|
810 |
continue 2;
|
|
811 |
}
|
|
812 |
}
|
| 804 |
813 |
}
|
| 805 |
|
fclose($fl);
|
| 806 |
|
$leaselines = $i;
|
|
814 |
return $result;
|
|
815 |
}
|
|
816 |
|
|
817 |
/**
|
|
818 |
* Filter out inactive and expired dhcpd leases
|
|
819 |
*
|
|
820 |
* Loop thru a sorted list of dhcp leases parsed using tinydns_parse_leases and
|
|
821 |
* remove inactive and expired entries. Returns an unsorted subset of the
|
|
822 |
* original leases array.
|
|
823 |
*/
|
|
824 |
function tinydns_filter_active_leases($leases, $now = NULL) {
|
|
825 |
if ($now == NULL)
|
|
826 |
$now = time();
|
|
827 |
|
|
828 |
$result = array();
|
|
829 |
foreach ($leases as $lease) {
|
|
830 |
if ($lease['binding state'] == 'active' AND $lease['ends'] > $now)
|
|
831 |
$result[$lease['ip']] = $lease;
|
|
832 |
elseif ($lease['binding state'] == 'free')
|
|
833 |
unset($result[$lease['ip']]);
|
|
834 |
}
|
|
835 |
return $result;
|
|
836 |
}
|
|
837 |
|
|
838 |
/**
|
|
839 |
* Add active dhcp leases as tinydns host entries
|
|
840 |
*/
|
|
841 |
function tinydns_add_active_leases($fl, $fd, $leasedomain) {
|
|
842 |
$leases = tinydns_parse_leases($fl);
|
|
843 |
|
|
844 |
$leases = tinydns_filter_active_leases($leases);
|
|
845 |
foreach ($leases as $lease) {
|
|
846 |
if ($lease['binding state'] != 'active')
|
|
847 |
continue;
|
|
848 |
|
|
849 |
/*
|
|
850 |
* write tinydns host entry using 0 as ttl and the lease end as the
|
|
851 |
* timestamp in tai64 format. See tinydns-data and djbs tai64 site:
|
|
852 |
* http://cr.yp.to/libtai/tai64.html
|
|
853 |
*/
|
|
854 |
fprintf($fd, "=%s.%s:%s:0:4%015x\n", $lease['client-hostname'],
|
|
855 |
$leasedomain, $lease['ip'], $lease['ends'] + 10);
|
|
856 |
}
|
| 807 |
857 |
}
|
| 808 |
858 |
|
| 809 |
859 |
function tinydns_get_dns_record_type($tinydnsrecord) {
|
| ... | ... | |
| 1032 |
1082 |
}
|
| 1033 |
1083 |
}
|
| 1034 |
1084 |
|
| 1035 |
|
?>
|
|
1085 |
?>
|