config::for_ip( $ip );
+ my $server;
+ map { $server->{ $_ } = eval '$server::' . $_ } ( 'ip', 'netmask', 'bcast', 'domain' );
+
+ if ( my $force = client::conf( $ip => 'dhcpd.pl' ) ) {
+ eval $force;
+ die "$force\n$@" if $@;
+ warn "force server ", dump $server;
+ }
+
my $packet = {
Op => BOOTREPLY(),
Hops => $dhcp->hops(),
Flags => $dhcp->flags(),
Ciaddr => $dhcp->ciaddr(),
Yiaddr => $ip,
- Siaddr => $server::ip,
+ Siaddr => $server->{ip},
Giaddr => $dhcp->giaddr(),
Chaddr => $dhcp->chaddr(),
File => $file,
- DHO_DHCP_SERVER_IDENTIFIER() => $server::ip, # busybox/udhcpc needs it but doesn't request
+ DHO_DHCP_SERVER_IDENTIFIER() => $server->{ip}, # busybox/udhcpc needs it but doesn't request
};
my $options = {
- DHO_SUBNET_MASK() => $server::netmask,
- DHO_ROUTERS() => $server::ip,
- DHO_DOMAIN_NAME() => $server::domain,
- DHO_NAME_SERVERS() => $server::ip,
- DHO_DOMAIN_NAME_SERVERS() => $server::ip,
+ DHO_SUBNET_MASK() => $server->{netmask},
+ DHO_ROUTERS() => $server->{ip},
+ DHO_DOMAIN_NAME() => $server->{domain},
+ DHO_NAME_SERVERS() => $server->{ip},
+ DHO_DOMAIN_NAME_SERVERS() => $server->{ip},
DHO_HOST_NAME() => client::conf( $ip, 'hostname' ),
- DHO_BROADCAST_ADDRESS() => $server::bcast,
+ DHO_BROADCAST_ADDRESS() => $server->{bcast},
# DHO_NTP_SERVERS() => '',
};
my $buff = $packet->serialize();
my $reply = IO::Socket::INET->new(
- LocalAddr => $server::ip,
+ LocalAddr => $server->{ip},
LocalPort => 67,
Proto => "udp",
Broadcast => 1,
# PeerAddr => '255.255.255.255',
- PeerAddr => $server::bcast,
+ PeerAddr => $server->{bcast},
PeerPort => 68,
Reuse => 1,
) or die "socket: $@";
$reply->send( $buff, 0 ) or die "Error sending: $!\n";
- warn ">> $mac == $ip server: $server::ip", $file ? " file: $file\n" : "\n";
+ warn ">> $mac == $ip server: $server->{ip}", $file ? " file: $file\n" : "\n";
} else {
$audit->{error} = "$ip not in server range $server::ip $server::netmask - no packet sent";
warn $audit->{error};