--- /dev/null
+require 'puppet/util/filetype'
+Puppet::Type.type(:a2mod).provide(:gentoo, :parent => Puppet::Provider) do
+ desc "Manage Apache 2 modules on Gentoo"
+
+ confine :operatingsystem => :gentoo
+ defaultfor :operatingsystem => :gentoo
+
+ attr_accessor :property_hash
+
+ def create
+ @property_hash[:ensure] = :present
+ end
+
+ def exists?
+ (!(@property_hash[:ensure].nil?) and @property_hash[:ensure] == :present)
+ end
+
+ def destroy
+ @property_hash[:ensure] = :absent
+ end
+
+ def flush
+ self.class.flush
+ end
+
+ class << self
+ attr_reader :conf_file
+ end
+
+ def self.clear
+ @mod_resources = []
+ @modules = []
+ @other_args = ""
+ end
+
+ def self.initvars
+ @conf_file = "/etc/conf.d/apache2"
+ @filetype = Puppet::Util::FileType.filetype(:flat).new(conf_file)
+ @mod_resources = []
+ @modules = []
+ @other_args = ""
+ end
+
+ self.initvars
+
+ # Retrieve an array of all existing modules
+ def self.modules
+ if @modules.length <= 0
+ # Locate the APACHE_OPTS variable
+ records = filetype.read.split(/\n/)
+ apache2_opts = records.grep(/^\s*APACHE2_OPTS=/).first
+
+ # Extract all defines
+ while apache2_opts.sub!(/-D\s+(\w+)/, '')
+ @modules << $1.downcase
+ end
+
+ # Hang on to any remaining options.
+ if apache2_opts.match(/APACHE2_OPTS="(.+)"/)
+ @other_args = $1.strip
+ end
+
+ @modules.sort!.uniq!
+ end
+
+ @modules
+ end
+
+ def self.prefetch(resources={})
+ # Match resources with existing providers
+ instances.each do |provider|
+ if resource = resources[provider.name]
+ resource.provider = provider
+ end
+ end
+
+ # Store all resources using this provider for flushing
+ resources.each do |name, resource|
+ @mod_resources << resource
+ end
+ end
+
+ def self.instances
+ modules.map {|mod| new(:name => mod, :provider => :gentoo, :ensure => :present)}
+ end
+
+ def self.flush
+
+ mod_list = modules
+ mods_to_remove = @mod_resources.select {|mod| mod.should(:ensure) == :absent}.map {|mod| mod[:name]}
+ mods_to_add = @mod_resources.select {|mod| mod.should(:ensure) == :present}.map {|mod| mod[:name]}
+
+ mod_list -= mods_to_remove
+ mod_list += mods_to_add
+ mod_list.sort!.uniq!
+
+ if modules != mod_list
+ opts = @other_args + " "
+ opts << mod_list.map {|mod| "-D #{mod.upcase}"}.join(" ")
+ opts.strip!
+ opts.gsub!(/\s+/, ' ')
+
+ apache2_opts = %Q{APACHE2_OPTS="#{opts}"}
+ Puppet.debug("Writing back \"#{apache2_opts}\" to #{conf_file}")
+
+ records = filetype.read.split(/\n/)
+
+ opts_index = records.find_index {|i| i.match(/^\s*APACHE2_OPTS/)}
+ records[opts_index] = apache2_opts
+
+ filetype.backup
+ filetype.write(records.join("\n"))
+ @modules = mod_list
+ end
+ end
+end