module Inspec::Utils::XinetdParser
This parser for xinetd (extended Internet daemon) configuration files
Public Instance Methods
parse_xinetd(raw)
click to toggle source
# File lib/inspec/utils/parser.rb, line 229 def parse_xinetd(raw) # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity return {} if raw.nil? require "inspec/utils/simpleconfig" res = {} cur_group = nil simple_conf = [] rest = raw + "\n" until rest.empty? # extract content line nl = rest.index("\n") || (rest.length - 1) comment = rest.index("#") || (rest.length - 1) dst_idx = comment < nl ? comment : nl inner_line = dst_idx == 0 ? "" : rest[0..dst_idx - 1].strip # update unparsed content rest = rest[nl + 1..-1] next if inner_line.empty? if inner_line == "}" if cur_group == "defaults" res[cur_group] = SimpleConfig.new(simple_conf.join("\n")) else res[cur_group] ||= [] res[cur_group].push(SimpleConfig.new(simple_conf.join("\n"))) end cur_group = nil elsif rest.lstrip[0] == "{" cur_group = inner_line simple_conf = [] rest = rest[rest.index("\n") + 1..-1] elsif cur_group.nil? # parse all included files others = xinetd_include_dir(inner_line[/includedir (.+)/, 1]) # complex merging of included configurations, as multiple services # may be defined with the same name but different configuration others.each do |ores| ores.each do |k, v| res[k] ||= [] res[k].concat(v) end end else simple_conf.push(inner_line) end end res end
xinetd_include_dir(dir)
click to toggle source
# File lib/inspec/utils/parser.rb, line 218 def xinetd_include_dir(dir) return [] if dir.nil? unless inspec.file(dir).directory? raise Inspec::Exceptions::ResourceSkipped, "Can't find folder: #{dir}" end files = inspec.command("find #{dir} -type f").stdout.split("\n") files.map { |file| parse_xinetd(read_content(file)) } end