[![Build Status](https://travis-ci.org/puppetlabs/puppetlabs-inifile.png?branch=master)](https://travis-ci.org/cprice-puppet/puppetlabs-inifile)

# INI-file module #

This module provides resource types for use in managing INI-style configuration
files.  The main resource type is `ini_setting`, which is used to manage an
individual setting in an INI file.  Here's an example usage:

    ini_setting { "sample setting":
      path    => '/tmp/foo.ini',
      section => 'foo',
      setting => 'foosetting',
      value   => 'FOO!',
      ensure  => present,
    }

A supplementary resource type is `ini_subsetting`, which is used to manage
settings that consist of several arguments such as

    JAVA_ARGS="-Xmx192m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/log/pe-puppetdb/puppetdb-oom.hprof "

    ini_subsetting {'sample subsetting':
      ensure  => present,
      section => '',
      key_val_separator => '=',
      path => '/etc/default/pe-puppetdb',
      setting => 'JAVA_ARGS',
      subsetting => '-Xmx',
      value   => '512m',
    }

## implementing child providers:


The ini_setting class can be overridden by child providers in order to implement the management of ini settings for a specific configuration file.

In order to implement this, you will need to specify your own Type (as shown below). This type needs to implement a namevar (name), and a property called value:


  example:

    #my_module/lib/puppet/type/glance_api_config.rb
    Puppet::Type.newtype(:glance_api_config) do
      ensurable
      newparam(:name, :namevar => true) do
        desc 'Section/setting name to manage from glance-api.conf'
        # namevar should be of the form section/setting
        newvalues(/\S+\/\S+/)
      end
      newproperty(:value) do
        desc 'The value of the setting to be defined.'
        munge do |v|
          v.to_s.strip
        end
      end
    end

This type also must have a provider that utilizes the ini_setting provider as its parent:

  example:

    # my_module/lib/puppet/provider/glance_api_config/ini_setting.rb
    Puppet::Type.type(:glance_api_config).provide(
      :ini_setting,
      # set ini_setting as the parent provider
      :parent => Puppet::Type.type(:ini_setting).provider(:ruby)
    ) do
      # implement section as the first part of the namevar
      def section
        resource[:name].split('/', 2).first
      end
      def setting
        # implement setting as the second part of the namevar
        resource[:name].split('/', 2).last
      end
      # hard code the file path (this allows purging)
      def self.file_path
        '/etc/glance/glance-api.conf'
      end
    end


Now, the individual settings of the /etc/glance/glance-api.conf file can be managed as individual resources:

    glance_api_config { 'HEADER/important_config':
      value => 'secret_value',
    }

Provided that self.file_path has been implemented, you can purge with the following puppet syntax:

    resources { 'glance_api_config'
      purge => true,
    }

If the above code is added, then the resulting configured file will only contain lines implemented as Puppet resources


## A few noteworthy features:

 * The module tries *hard* not to manipulate your file any more than it needs to.
   In most cases, it should leave the original whitespace, comments, ordering,
   etc. perfectly intact.
 * Supports comments starting with either '#' or ';'.
 * Will add missing sections if they don't exist.
 * Supports a "global" section (settings that go at the beginning of the file,
   before any named sections) by specifying a section name of "".

