123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- 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
|