--- /dev/null
+require File.expand_path('../../../util/ini_file', __FILE__)
+
+Puppet::Type.type(:ini_setting).provide(:ruby) do
+
+ def self.instances
+ # this code is here to support purging and the query-all functionality of the
+ # 'puppet resource' command, on a per-file basis. Users
+ # can create a type for a specific config file with a provider that uses
+ # this as its parent and implements the method
+ # 'self.file_path', and that will provide the value for the path to the
+ # ini file (rather than needing to specify it on each ini setting
+ # declaration). This allows 'purging' to be used to clear out
+ # all settings from a particular ini file except those included in
+ # the catalog.
+ if self.respond_to?(:file_path)
+ # figure out what to do about the seperator
+ ini_file = Puppet::Util::IniFile.new(file_path, '=')
+ resources = []
+ ini_file.section_names.each do |section_name|
+ ini_file.get_settings(section_name).each do |setting, value|
+ resources.push(
+ new(
+ :name => namevar(section_name, setting),
+ :value => value,
+ :ensure => :present
+ )
+ )
+ end
+ end
+ resources
+ else
+ raise(Puppet::Error, 'Ini_settings only support collecting instances when a file path is hard coded')
+ end
+ end
+
+ def self.namevar(section_name, setting)
+ "#{section_name}/#{setting}"
+ end
+
+ def exists?
+ !ini_file.get_value(section, setting).nil?
+ end
+
+ def create
+ ini_file.set_value(section, setting, resource[:value])
+ ini_file.save
+ @ini_file = nil
+ end
+
+ def destroy
+ ini_file.remove_setting(section, setting)
+ ini_file.save
+ @ini_file = nil
+ end
+
+ def value
+ ini_file.get_value(section, setting)
+ end
+
+ def value=(value)
+ ini_file.set_value(section, setting, resource[:value])
+ ini_file.save
+ end
+
+ def section
+ # this method is here so that it can be overridden by a child provider
+ resource[:section]
+ end
+
+ def setting
+ # this method is here so that it can be overridden by a child provider
+ resource[:setting]
+ end
+
+ def file_path
+ # this method is here to support purging and sub-classing.
+ # if a user creates a type and subclasses our provider and provides a
+ # 'file_path' method, then they don't have to specify the
+ # path as a parameter for every ini_setting declaration.
+ # This implementation allows us to support that while still
+ # falling back to the parameter value when necessary.
+ if self.class.respond_to?(:file_path)
+ self.class.file_path
+ else
+ resource[:path]
+ end
+ end
+
+ def separator
+ if resource.class.validattr?(:key_val_separator)
+ resource[:key_val_separator] || '='
+ else
+ '='
+ end
+ end
+
+ def section_prefix
+ if resource.class.validattr?(:section_prefix)
+ resource[:section_prefix] || '['
+ else
+ '['
+ end
+ end
+
+ def section_suffix
+ if resource.class.validattr?(:section_suffix)
+ resource[:section_suffix] || ']'
+ else
+ ']'
+ end
+ end
+
+ private
+ def ini_file
+ @ini_file ||= Puppet::Util::IniFile.new(file_path, separator, section_prefix, section_suffix)
+ end
+
+end