use Net::DHCP::Packet;
use Net::DHCP::Constants 0.67;
+use CouchDB;
+
use server;
my $debug = server::debug;
my $ip;
- if ( -e "$conf/mac/$mac" ) {
- $ip = read_file "$conf/mac/$mac";
+ if ( $ip = client::ip_from_mac( $mac ) ) {
print "RENEW $mac $ip\n";
return $ip;
} else {
- $ip = client::next_ip;
+ $ip = client::next_ip( $mac );
print "NEW $mac $ip\n";
- write_file "$conf/mac/$mac", $ip;
}
- my $ip_path = "$conf/ip/$ip";
- mkdir $ip_path unless -e $ip_path;
-
- if ( -l "$ip_path/mac" && readlink "$ip_path/mac" ne "$conf/mac/$mac" ) {
- warn "$mac IP changed from ", readlink "$ip_path/mac", " to $ip";
- unlink "$ip_path/mac";
- };
-
- symlink "$conf/mac/$mac", "$ip_path/mac";
-
return $ip;
}
my $mac = substr($dhcp->chaddr(),0,$dhcp->hlen()*2);
my $ip = client_ip($mac);
+ my $hostname = $dhcp->getOptionValue(DHO_HOST_NAME);
+ print "$ip ", client::conf( $ip => 'hostname', default => $hostname ), " >> /etc/hosts\n";
+
+ my $audit = { mac => $mac, ip => $ip, hostname => $hostname };
+ CouchDB::audit( 'request', $audit );
+
=for later
my $user_class = $dhcp->getOptionValue(DHO_USER_CLASS());
}
warn "W: options requested but missing: ",dump( @missing ),$/;
+ $audit->{requested} = [ @requested ];
+ $audit->{missing} = [ @missing ];
foreach my $opt ( 'magic', 'config_file', 'path_prefix', 'reboot_time' ) {
my $DH0 = eval 'DHO_PXELINUX_' . uc $opt;
my $messagetype = $dhcp->getOptionValue(DHO_DHCP_MESSAGE_TYPE());
if ($messagetype eq DHCPDISCOVER()) {
- log::mac $mac, "DHCP DISCOVER";
+ $audit->{type} = 'discover';
$packet->{Comment} = $dhcp->comment();
$packet->{DHO_DHCP_MESSAGE_TYPE()} = DHCPOFFER();
} elsif ($messagetype eq DHCPREQUEST()) {
my $requested_ip = $dhcp->getOptionValue(DHO_DHCP_REQUESTED_ADDRESS());
- log::mac $mac, "DHCP REQUEST $requested_ip $ip $file";
+ $audit->{type} = 'request';
if ( $ip eq $requested_ip ) {
$packet->{DHO_DHCP_MESSAGE_TYPE()} = DHCPACK();
$packet->{DHO_DHCP_LEASE_TIME()} = 5 * 60; # 5 min
$packet->{DHO_DHCP_MESSAGE()} = "Bad request, expected $ip";
}
} elsif ($messagetype eq DHCPINFORM()) {
- log::mac $mac, "DHCP INFORM ignored";
+ $audit->{type} = 'inform';
} else {
- log::mac $mac, "$messagetype igored (bootp?)";
+ $audit->{type} = sprintf('ignored %x', $messagetype);
}
warn ">> $mac == $ip server: $server::ip", $file ? " file: $file\n" : "\n" if $debug;
+ $audit->{response} = $packet;
$packet = new Net::DHCP::Packet( %$packet );
warn "send ",$packet->toString() if $debug;
+ CouchDB::audit( 'response', $audit );
+
my $reply = IO::Socket::INET->new(
LocalAddr => $server::ip,
LocalPort => 67,
print "DHCP listen on ",$sock->sockhost,":",$sock->sockport,"\n";
+ CouchDB::audit( 'start', { 'listen' => { addr => $sock->sockhost, port => $sock->sockport } } );
+
while (1) {
process_packet $sock;
}