--- foreman-proxy/usr/share/foreman-proxy/modules/dhcp_isc/dhcp_isc_main.rb 2016-10-06 17:04:34.182495025 +0200 +++ foreman-proxy__patched/usr/share/foreman-proxy/modules/dhcp_isc/dhcp_isc_main.rb 2016-10-06 21:12:22.874460014 +0200 @@ -160,7 +160,7 @@ initialize_memory_store_with_dhcp_records(parse_config_and_leases_for_records) end - SUBNET_BLOCK_REGEX = /subnet\s+([\d\.]+)\s+netmask\s+([\d\.]+)\s*\{\s*([\w-]+\s*\{[^{}]*\}\s*|[\w-][^{}]*;\s*)*\}/ + SUBNET_BLOCK_REGEX = /subnet\s+([\d\.]+)\s+netmask\s+([\d\.]+)\s+<<(.*?)>>/ def parse_config_for_subnets ret_val = [] # Extract subnets config block @@ -177,13 +177,13 @@ return {} unless subnet_config_lines options = {} - subnet_config_lines.split(';').each do |option| + subnet_config_lines.split(/;|\{/).each do |option| case option when /^option\s+routers\s+[\d\.]+/ options[:routers] = get_ip_list_from_config_line(option) when /^option\s+domain\-name\-servers\s+[\d\.]+/ options[:domain_name_servers] = get_ip_list_from_config_line(option) - when /^range\s+[\d\.]+\s+[\d\.]+/ + when /^range\s+(|dynamic\-bootp\s+)[\d\.]+\s+[\d\.]+/ # get IP addr range used for this subnet options[:range] = get_range_from_config_line(option) end @@ -321,6 +321,7 @@ def read_config file, ignore_includes=false logger.debug "Reading config file #{file}" to_return = [] + o_bracket = {subnet: 0} File.readlines(file).each do |line| line = line.split('#').first.strip # remove comments, left and right whitespace next if line.empty? # remove blank lines @@ -335,6 +336,25 @@ # and does not create a multidimensional array to_return.concat(read_config(conf, ignore_includes)) else + # subnet statement 'subnet subnet-number netmask netmask {' + if /^(subnet.+?netmask.+?)\{$/ =~ line + o_bracket[:subnet] = 1 + line = $1 + "<<" + end + if o_bracket[:subnet] > 0 + new_line = "" + line.split(/({|})/).each do |word| + case word + when /^\}$/ + o_bracket[:subnet] -= 1 + word = ">>" if o_bracket[:subnet] == 0 + when /^\{$/ + o_bracket[:subnet] += 1 + end + new_line += word + end + line = new_line + end to_return << line end end