inspec/lib/utils/parseconfig.rb

187 lines
5.2 KiB
Ruby
Raw Normal View History

#
# Author:: BJ Dierkes <derks@datafolklabs.com>
# Copyright:: Copyright (c) 2006,2013 BJ Dierkes
# License:: MIT
# URL:: https://github.com/datafolklabs/ruby-parseconfig
#
# This class was written to simplify the parsing of configuration
# files in the format of "param = value". Please review the
# demo files included with this package.
#
# For further information please refer to the './doc' directory
# as well as the ChangeLog and README files included.
#
# Note: A group is a set of parameters defined for a subpart of a
# config file
class ParseConfig
Version = '1.0.6'
attr_accessor :conf, :params, :groups
# Initialize the class with raw config data 'conf'
# The class objects are dynamically generated by the
# name of the 'param' in the config file. Therefore, if
# the config file is 'param = value' then the itializer
# will eval "@param = value"
#
def initialize(conf=nil, separator = '=')
@params = {}
@groups = []
@splitRegex = '\s*' + separator + '\s*'
self.import_config(conf)
end
# Import data from the config to our config object.
def import_config(raw)
# The config is top down.. anything after a [group] gets added as part
# of that group until a new [group] is found.
group = nil
raw.split("\n").each_with_index do |line, i|
line.strip!
# force_encoding not available in all versions of ruby
begin
if i.eql? 0 and line.include?("\xef\xbb\xbf".force_encoding("UTF-8"))
line.delete!("\xef\xbb\xbf".force_encoding("UTF-8"))
end
rescue NoMethodError
end
unless (/^\#/.match(line))
if(/#{@splitRegex}/.match(line))
param, value = line.split(/#{@splitRegex}/, 2)
var_name = "#{param}".chomp.strip
value = value.chomp.strip
new_value = ''
if (value)
if value =~ /^['"](.*)['"]$/
new_value = $1
else
new_value = value
end
else
new_value = ''
end
if group
self.add_to_group(group, var_name, new_value)
else
self.add(var_name, new_value)
end
elsif(/^\[(.+)\]$/.match(line).to_a != [])
group = /^\[(.+)\]$/.match(line).to_a[1]
self.add(group, {})
else
rest = line.strip
self.add(rest, true) unless rest.empty?
end
end
end
end
# This method will provide the value held by the object "@param"
# where "@param" is actually the name of the param in the config
# file.
#
# DEPRECATED - will be removed in future versions
#
def get_value(param)
puts "ParseConfig Deprecation Warning: get_value() is deprecated. Use " + \
"config['param'] or config['group']['param'] instead."
return self.params[param]
end
# This method is a shortcut to accessing the @params variable
def [](param)
return self.params[param]
end
# This method returns all parameters/groups defined in a config file.
def get_params()
return self.params.keys
end
# List available sub-groups of the config.
def get_groups()
return self.groups
end
# This method adds an element to the config object (not the config file)
# By adding a Hash, you create a new group
def add(param_name, value)
if value.class == Hash
if self.params.has_key?(param_name)
if self.params[param_name].class == Hash
self.params[param_name].merge!(value)
elsif self.params.has_key?(param_name)
if self.params[param_name].class != value.class
raise ArgumentError, "#{param_name} already exists, and is of different type!"
end
end
else
self.params[param_name] = value
end
if ! self.groups.include?(param_name)
self.groups.push(param_name)
end
else
self.params[param_name] = value
end
end
# Add parameters to a group. Note that parameters with the same name
# could be placed in different groups
def add_to_group(group, param_name, value)
if ! self.groups.include?(group)
self.add(group, {})
end
self.params[group][param_name] = value
end
# Writes out the config file to output_stream
def write(output_stream=STDOUT, quoted=true)
self.params.each do |name,value|
if value.class.to_s != 'Hash'
if quoted == true
output_stream.puts "#{name} = \"#{value}\""
else
output_stream.puts "#{name} = #{value}"
end
end
end
output_stream.puts "\n"
self.groups.each do |group|
output_stream.puts "[#{group}]"
self.params[group].each do |param, value|
if quoted == true
output_stream.puts "#{param} = \"#{value}\""
else
output_stream.puts "#{param} = #{value}"
end
end
output_stream.puts "\n"
end
end
# Public: Compare this ParseConfig to some other ParseConfig. For two config to
# be equivalent, they must have the same sections with the same parameters
#
# other - The other ParseConfig.
#
# Returns true if ParseConfig are equivalent and false if they differ.
def eql?(other)
self.params == other.params && self.groups == other.groups
end
alias == eql?
end