start script
[pxelator] / bin / dhcpd.pl
index 2f62670..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,10 +61,12 @@ 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;
        }
@@ -120,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());
@@ -134,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";