]> git.donarmstrong.com Git - dsa-puppet.git/blobdiff - 3rdparty/modules/inifile/lib/puppet/provider/ini_setting/ruby.rb
add puppetlabs/inifile to 3rdparty
[dsa-puppet.git] / 3rdparty / modules / inifile / lib / puppet / provider / ini_setting / ruby.rb
diff --git a/3rdparty/modules/inifile/lib/puppet/provider/ini_setting/ruby.rb b/3rdparty/modules/inifile/lib/puppet/provider/ini_setting/ruby.rb
new file mode 100644 (file)
index 0000000..2455541
--- /dev/null
@@ -0,0 +1,118 @@
+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