Project

General

Profile

Bug #436 » 0001-rewrite-tinydns_add_active_leases.patch

znerol znerol, 03/19/2010 12:41 PM

View differences:

config/tinydns/tinydns.inc
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
?>
(1-1/2)