Project

General

Profile

« Previous | Next » 

Revision 0a806f31

Added by Dmitri Dolguikh over 7 years ago

Fixes #18072 - removed load_* methods from core dhcp providers

View differences:

modules/dhcp_libvirt/dhcp_libvirt_main.rb
require 'rexml/document'
require 'ipaddr'
module Proxy::DHCP::Libvirt
class Provider < ::Proxy::DHCP::Server
attr_reader :libvirt_network, :network
......
super(@network, nil, subnet_service)
end
def load_subnets
super
service.add_subnets(*parse_config_for_subnets)
end
def parse_config_for_subnets
ret_val = []
doc = REXML::Document.new xml = libvirt_network.dump_xml
doc.elements.each("network/ip") do |e|
next if e.attributes["family"] == "ipv6"
gateway = e.attributes["address"]
if e.attributes["netmask"].nil? then
# converts a prefix/cidr notation to octets
netmask = IPAddr.new(gateway).mask(e.attributes["prefix"]).to_mask
else
netmask = e.attributes["netmask"]
end
a_network = IPAddr.new(gateway).mask(netmask).to_s
ret_val << Proxy::DHCP::Subnet.new(a_network, netmask)
end
raise Proxy::DHCP::Error("Only one subnet is supported") if ret_val.size > 1
ret_val
rescue Exception => e
logger.error msg = "Unable to parse subnets XML: #{e}"
logger.debug xml if defined?(xml)
raise Proxy::DHCP::Error, msg
end
def parse_config_for_dhcp_reservations(subnet)
to_ret = []
doc = REXML::Document.new xml = libvirt_network.dump_xml
REXML::XPath.each(doc, "//network/ip[not(@family) or @family='ipv4']/dhcp/host") do |e|
to_ret << Proxy::DHCP::Reservation.new(
e.attributes["name"],
e.attributes["ip"],
e.attributes["mac"],
subnet,
:hostname => e.attributes["name"])
end
to_ret
rescue Exception => e
logger.error msg = "Unable to parse reservations XML: #{e}"
logger.debug xml if defined?(xml)
raise Proxy::DHCP::Error, msg
end
def load_subnet_data(subnet)
super(subnet)
reservations = parse_config_for_dhcp_reservations(subnet)
reservations.each { |record| service.add_host(record.subnet_address, record) }
leases = libvirt_network.dhcp_leases
leases.each do |element|
lease = Proxy::DHCP::Lease.new(
nil,
element['ipaddr'],
element['mac'],
subnet,
Time.now.utc,
Time.at(element['expirytime'] || 0).utc,
'active'
)
service.add_lease(lease.subnet_address, lease)
end
end
def add_record(options={})
record = super(options)
libvirt_network.add_dhcp_record record
......
raise Proxy::DHCP::Error, msg
end
def del_record(_, record)
def del_record(record)
# libvirt only supports one subnet per network
libvirt_network.del_dhcp_record record
rescue ::Libvirt::Error => e

Also available in: Unified diff