create log files, reattach existing session
[pxelator] / bin / dhcpd.pl
index 9c40878..bba1085 100755 (executable)
@@ -10,6 +10,7 @@ use autodie;
 use IO::Socket::INET;
 use File::Slurp;
 use Data::Dump qw/dump/;
+use Net::Ping;
 
 use lib 'lib';
 use Net::DHCP::Packet;
@@ -60,17 +61,22 @@ sub client_ip {
 
        mkdir $_ foreach grep { ! -e $_ } map { "$conf/$_" } ( 'ip', 'mac' );
 
+       my $p = Net::Ping->new;
+
        my $prefix = $server_ip;
        $prefix =~ s{\.\d+$}{.};
        my $ip = $prefix . $addr;
-       while ( -e "conf/ip/$ip" ) {
+       while ( -e "conf/ip/$ip" || $p->ping( $ip ) ) {
                $ip = $prefix . $addr++;
                die "all addresses allocated!" if $addr == $ip_to;
        }
 
        write_file "$conf/mac/$mac", $ip;
-       unlink     "$conf/ip/$ip" if -e "$conf/ip/$ip";
-       symlink    "$conf/mac/$mac", "$conf/ip/$ip";
+       if ( -l "$conf/ip/$ip" && readlink "$conf/ip/$ip" ne "$conf/mac/$mac") {
+               unlink     "$conf/ip/$ip";
+               symlink    "$conf/mac/$mac", "$conf/ip/$ip";
+               warn "$mac IP changed to $ip";
+       }
 
        print "$mac NEW $ip\n";
 
@@ -117,8 +123,6 @@ while (1) {
                        Giaddr  => $dhcp->giaddr(),
                        Chaddr  => $dhcp->chaddr(),
                        File    => $file,
-#                      DHO_DHCP_MESSAGE_TYPE() => DHCPACK(),
-#                      DHO_SUBNET_MASK() => '255.255.255.0',
                };
 
                my $messagetype = $dhcp->getOptionValue(DHO_DHCP_MESSAGE_TYPE());
@@ -131,8 +135,14 @@ while (1) {
                        my $requested_ip = $dhcp->getOptionValue(DHO_DHCP_REQUESTED_ADDRESS());
                        warn "DHCP REQUEST $requested_ip";
                        if ( $ip eq $requested_ip ) {
-                               $packet->{DHO_DHCP_MESSAGE_TYPE()} = DHCPACK();
-                               $packet->{DHO_DHCP_LEASE_TIME()}   = 100;
+                               $packet->{DHO_DHCP_MESSAGE_TYPE()}      = DHCPACK();
+                               $packet->{DHO_DHCP_LEASE_TIME()}        = 5 * 60; # 5 min
+#                              $packet->{DHO_DHCP_SERVER_IDENTIFIER()} = $server_ip;           # FIXME
+                               $packet->{DHO_SUBNET_MASK()}            = '255.255.255.0';
+                               $packet->{DHO_ROUTERS()}                = $server_ip;
+#                              $packet->{DHO_DOMAIN_NAME()}            = 'pxelator.lan';
+#                              $packet->{DHO_NAME_SERVERS()}           = $server_ip;
+#                              $packet->{DHO_ROOT_PATH()}              = '/exports/foobar';
                        } else {
                                $packet->{DHO_DHCP_MESSAGE_TYPE()} = DHCPNAK();
                                $packet->{DHO_DHCP_MESSAGE()} = "Bad request, expected $ip";