Project

General

Profile

« Previous | Next » 

Revision 2080b2eb

Added by Greg Sutcliffe about 10 years ago

Fixes #5648 - Match the DHCP specification of last-lease-wins

View differences:

lib/proxy/dhcp/subnet.rb
@network = validate_ip network
@netmask = validate_ip netmask
@options = {}
@records = {}
@records = []
@timestamp = Time.now
@loaded = false
raise Proxy::DHCP::Error, "Unable to Add Subnet" unless @server.add_subnet(self)
......
end
def clear
@records = {}
@records = []
@loaded = false
end
......
end
def size
records.size
@records.size
end
def load
......
def records
self.load if not loaded?
@records.values
@records
end
def [] record
......
end
def has_mac? mac
records.each {|r| return r if r.mac == mac.downcase }
r = records.reverse_each {|r| return r if r.mac == mac.downcase}
return false
end
def has_ip? ip
@records[ip] ? @records[ip] : false
r = records.reverse_each {|r| return r if r.ip == ip}
return false
end
# adds a record to a subnet
def add_record record
unless has_mac?(record.mac) or has_ip?(record.ip)
@records[record.ip] = record
logger.debug "Added #{record} to #{to_s}"
return true
end
logger.warn "Record #{record} already exists in #{to_s} - can't add again"
return false
# Record all leases, since the definition of a duplicate depends on whether we
# are searching by ip or mac. Arrays have fixed sort order so we can rely on this
# being the order they were read from the file
@records.push record
logger.debug "Added #{record} to #{to_s}"
return true
end
def get_index_and_lock filename
......
end
def delete record
if @records.delete_if{|k,v| v == record}.nil?
if @records.delete(record).nil?
raise Proxy::DHCP::Error, "Removing a Proxy::DHCP Record which doesn't exist"
end
end
test/server_test.rb
def setup
@server = Proxy::DHCP::Server.new("testcase")
@subnet = Proxy::DHCP::Subnet.new(@server, "192.168.0.0", "255.255.255.0")
@subnet.load
@record = Proxy::DHCP::Record.new(:subnet => @subnet, :ip => "192.168.0.11", :mac => "aa:bb:cc:dd:ee:ff")
end
test/subnet_test.rb
@netmask = "255.255.255.0"
@server = Proxy::DHCP::Server.new("testcase")
@subnet = Proxy::DHCP::Subnet.new @server, @network, @netmask
@subnet.load
end
def test_subnet_should_have_a_server
......
assert_equal @subnet.range, "192.168.0.1-192.168.0.254"
end
def add_record
ip = "192.168.0.50"
mac = "aa:bb:cc:dd:ee:Ff"
@subnet.add_record Proxy::DHCP::Record.new(:subnet =>@subnet, :ip => ip, :mac => mac)
def add_record opts = {}
ip = opts[:ip] || "192.168.0.50"
mac = opts[:mac] || "aa:bb:cc:dd:ee:ff"
Proxy::DHCP::Record.new(:subnet =>@subnet, :ip => ip, :mac => mac)
end
def test_should_add_records
......
assert_equal @subnet.size, counter+1
end
def test_should_not_import_the_same_record_twice
begin
add_record
rescue
nil
end
counter = @subnet.size
add_record
assert_equal @subnet.size, counter
end
def test_should_clear_records
add_record
@subnet.clear
......
assert_kind_of Proxy::DHCP::Record, @subnet["192.168.0.50"]
end
def test_it_should_be_possible_to_find_subnet_record_based_on_mac
add_record
assert_kind_of Proxy::DHCP::Record, @subnet["aa:bb:cc:dd:ee:ff"]
end
def test_should_remove_records
add_record
counter = @subnet.size

Also available in: Unified diff