diff -Nur e-smith-tinydns-2.4.0.old2388/createlinks e-smith-tinydns-2.4.0.bz2388/createlinks --- e-smith-tinydns-2.4.0.old2388/createlinks 2015-01-27 19:31:32.953849658 +0100 +++ e-smith-tinydns-2.4.0.bz2388/createlinks 2015-01-27 20:23:29.080882560 +0100 @@ -26,3 +26,19 @@ service_link_enhanced("tinydns", "K65", "6"); service_link_enhanced("tinydns", "K65", "0"); service_link_enhanced("tinydns", "K65", "1"); + +#link to services2adjust and templates2expand for dhcp-dns event + for my $event (qw( dhcp-dns )) + { + # services to launch on event + safe_symlink("sigusr1", "root/etc/e-smith/events/$event/services2adjust/dnscache"); + safe_symlink("sigusr1", "root/etc/e-smith/events/$event/services2adjust/tinydns"); + } + +#creation of dhcp-dns service + safe_symlink("daemontools", "root/etc/rc.d/init.d/dhcp-dns"); + service_link_enhanced("dhcp-dns", "S85", "7"); + service_link_enhanced("dhcp-dns", "K65", "6"); + service_link_enhanced("dhcp-dns", "K65", "0"); + service_link_enhanced("dhcp-dns", "K65", "1"); + safe_symlink("/var/service/dhcp-dns/", "root/service/dhcp-dns"); diff -Nur e-smith-tinydns-2.4.0.old2388/root/etc/e-smith/db/configuration/defaults/dhcp-dns/status e-smith-tinydns-2.4.0.bz2388/root/etc/e-smith/db/configuration/defaults/dhcp-dns/status --- e-smith-tinydns-2.4.0.old2388/root/etc/e-smith/db/configuration/defaults/dhcp-dns/status 1970-01-01 01:00:00.000000000 +0100 +++ e-smith-tinydns-2.4.0.bz2388/root/etc/e-smith/db/configuration/defaults/dhcp-dns/status 2015-01-27 20:30:30.481143377 +0100 @@ -0,0 +1 @@ +disabled diff -Nur e-smith-tinydns-2.4.0.old2388/root/etc/e-smith/db/configuration/defaults/dhcp-dns/type e-smith-tinydns-2.4.0.bz2388/root/etc/e-smith/db/configuration/defaults/dhcp-dns/type --- e-smith-tinydns-2.4.0.old2388/root/etc/e-smith/db/configuration/defaults/dhcp-dns/type 1970-01-01 01:00:00.000000000 +0100 +++ e-smith-tinydns-2.4.0.bz2388/root/etc/e-smith/db/configuration/defaults/dhcp-dns/type 2015-01-27 20:23:29.075882144 +0100 @@ -0,0 +1 @@ +service diff -Nur e-smith-tinydns-2.4.0.old2388/root/etc/e-smith/templates/var/service/tinydns/root/data/65dhcpARecords e-smith-tinydns-2.4.0.bz2388/root/etc/e-smith/templates/var/service/tinydns/root/data/65dhcpARecords --- e-smith-tinydns-2.4.0.old2388/root/etc/e-smith/templates/var/service/tinydns/root/data/65dhcpARecords 1970-01-01 01:00:00.000000000 +0100 +++ e-smith-tinydns-2.4.0.bz2388/root/etc/e-smith/templates/var/service/tinydns/root/data/65dhcpARecords 2015-01-28 00:28:30.792458726 +0100 @@ -0,0 +1,128 @@ +{ + use strict; + use warnings; + use esmith::Logger; + use esmith::ConfigDB; + use esmith::HostsDB; + # we need perl-Time-TAI64 for timestamp conversion + use Time::TAI64 qw /unixtai64/; + # we need perl-Date-Manip to convert to a unix timestamp + use Date::Manip qw /UnixDate/; + use File::Copy; + + my $DB = esmith::ConfigDB->open_ro or die ("Unable to open configuration database"); + my $hosts = esmith::HostsDB->open_ro or die ("Unable to open Host database"); + + #test if the service is enabled return if not + my $dhcpdns = $DB->get_prop('dhcp-dns','status') || 'disabled'; + return '' if $dhcpdns ne 'enabled'; + + #we start a hash for name & ip + my %allocated_name = (); + my %allocated_ip_dhcplease = (); + + #start a hash of all hosts + my @hosts = $hosts->keys; + my %hostsdb; + @hostsdb{@hosts} = (); + + # copy of dhcpd.leases file to /tmp because working directly on the original + # is not a good idea + copy("/var/lib/dhcpd/dhcpd.leases","/tmp/tmpdhcpd.leases") + or die ("Error dhcp-dns Service : Unable to copy the /var/lib/dhcpd/dhcpd.leases"); + + #we want to write in log + sub log2messages + { + my $message = shift; + tie *FH, 'esmith::Logger'; + print FH "$message"; + close FH; + } + + + #Text::DHCPparse forked because it doesn't allow to retrieve the end of lease + #Only the start is found by the leaseparse of DHCPparse.pm s/starts/ends + sub leaseparse { + my $logfile = shift; + my ( %list, $ip ); + open FILE, $logfile or die; + + while () { + next if /^#|^$/; + if (/^lease (\d+\.\d+\.\d+\.\d+)/) { + $ip = $1; + $list{$ip} = sprintf("%-17s", $ip); + } + /^\s*hardware ethernet (.*);/ && ($list{$ip} .= sprintf("%-19s", $1)); + /^\s*ends \d (.*);/ && ($list{$ip} .= sprintf("%-21s", $1)); + /^\s*(abandoned).*/ && ($list{$ip} .= sprintf("%-19s", $1)); + /^\s*client-hostname "(.*)";/ && ($list{$ip} .= sprintf("%-17s", $1)); + } + + close FILE; + + # make all entries 74 characters long to format properly + foreach (keys %list) { + #$list{$_} = sprintf("%-74s", $list{$_}) if (length$list{$_} < 76); + $list{$_} = sprintf("%-74.74s", $list{$_}); + } + + return \%list; +} + + # now we parse the leases + my $return = leaseparse('/tmp/tmpdhcpd.leases'); + my ($ip,$time,$mac,$name); + + # variable with local domain value (default is mycompamy.local) and retrieve the server name + my $localdomain = $DB->get_value('DomainName') or die ("Unable retrieve the DomainName property"); + my $servername = $DB->get_value('SystemName') or die ("Unable retrieve the SystemName property"); + + $OUT .= "# A records for dhcp hosts in $localdomain\n"; + + foreach (keys %$return) { + ($ip, $time, $mac, $name) = unpack("A17 A21 A19 A30", $return->{$_}); + + # when the dhcp lease is over $name is empty .. we want only non empty one + if ( $name ne "" ) + { + # we skip also ips & names already allocated + unless (exists $allocated_ip_dhcplease{$ip} || exists $allocated_name{$name}) + { + # Convert lease end time to the format expected as + # see: http://cr.yp.to/djbdns/tinydns-data.html + my $ts = UnixDate($time, "%s"); + my $endtai = unixtai64($ts); + $endtai =~ s/@//; + + # Determine TTL + my $ttl = ''; + $ttl = 0 unless ($ts <= time); + + # verify if dhcp client name is not used in host DB + if (! exists $hostsdb{"$name\.$localdomain"}) + { + $OUT .= "=$name.$localdomain:$ip:$ttl:$endtai\n" unless (($name eq $servername) || ($name !~ /^[a-zA-Z0-9][a-zA-Z0-9-]*$/)); + log2messages("The hostname of this server ($servername) is already in use with a different IP address in /var/lib/dhcpd/dhcpd.leases") + if ($name eq $servername); + log2messages("The hostname of the dhcp client ($name) has illegal characters in /var/lib/dhcpd/dhcpd.leases") + if ($name !~ /^[a-zA-Z0-9][a-zA-Z0-9-]*$/); + } + else + { + log2messages("The hostname of the dhcp client ($name) is already used in the hosts database"); + } + } + + $allocated_ip_dhcplease{$ip} = 1; + $allocated_name{$name} ++; + + log2messages("The hostname \"$name\" has already been assigned an IP address in /var/lib/dhcpd/dhcpd.leases") + if ($allocated_name{$name} >1); + } + } + # remove the temp file + unlink "/tmp/tmpdhcpd.leases" + or log2messages("Error dhcp-dns Service : Unable to remove the /tmp/tmpdhcpd.leases"); +} diff -Nur e-smith-tinydns-2.4.0.old2388/root/var/service/dhcp-dns/dhcp-dns e-smith-tinydns-2.4.0.bz2388/root/var/service/dhcp-dns/dhcp-dns --- e-smith-tinydns-2.4.0.old2388/root/var/service/dhcp-dns/dhcp-dns 1970-01-01 01:00:00.000000000 +0100 +++ e-smith-tinydns-2.4.0.bz2388/root/var/service/dhcp-dns/dhcp-dns 2015-01-28 00:24:48.209462754 +0100 @@ -0,0 +1,49 @@ +#!/usr/bin/perl +use strict; +use warnings; +use esmith::ConfigDB; + +my $DB = esmith::ConfigDB->open_ro or die ("Unable to open configuration database"); +my $dhcpdns = $DB->get_prop('dhcp-dns','status') || 'disabled'; + +my $lease_file = "/var/lib/dhcpd/dhcpd.leases"; + +# last modified time +my $modtime = 0; + +# seconds to wait +my $update_freq = 30; + +#we want to write in log +sub log2messages + { + my $message = shift; + tie *FH, 'esmith::Logger'; + print FH "$message"; + close FH; + } + +########################################################################### +# Main Loop +while ($dhcpdns eq 'enabled') { + + # check the file's last updated time, if it's been changed, update + # the DNS and save the modified time. This will ALWAYS run once - on + # startup, since $modtime starts at zero. + + my @stats = stat ($lease_file); + if ($stats[9] > $modtime) { + + $modtime = $stats[9]; + system ("/usr/bin/sv 1 /service/tinydns") ==0 + or log2messages('Error service dhcp-dns : Unable to restart /service/tinydns'); + + system ("/usr/bin/sv 1 /service/dnscache") ==0 + or log2messages('Error service dhcp-dns : Unable to do restart /service/dnscache'); + } + + # wait till next check time + sleep $update_freq; + +} # end main +########################################################################### diff -Nur e-smith-tinydns-2.4.0.old2388/root/var/service/dhcp-dns/run e-smith-tinydns-2.4.0.bz2388/root/var/service/dhcp-dns/run --- e-smith-tinydns-2.4.0.old2388/root/var/service/dhcp-dns/run 1970-01-01 01:00:00.000000000 +0100 +++ e-smith-tinydns-2.4.0.bz2388/root/var/service/dhcp-dns/run 2015-01-27 20:23:29.079882477 +0100 @@ -0,0 +1,4 @@ +#!/bin/sh + +exec 2>&1 +exec /usr/bin/perl dhcp-dns