require 'set' Puppet::Type.type(:package_manifest).provide(:flat_file) do desc "Write package manifest to a flat file" def exists? # exists? is always run before create, so we can create package list here @packages = resource.catalog.resources.collect { |r| r.name if r.type == :package }.compact.sort exists = File.exist?(resource[:path]) if exists new_content = Set.new @packages old_content = Set.new( File.open(resource[:path], 'r').each_line.collect{ |pkg| pkg.strip() } ) exists = new_content == old_content end exists end def create FileUtils.mkdir_p(File.dirname(resource[:path])) File.open(resource[:path], 'w') do |f| @packages.each do |pkg_name| f.puts(pkg_name) end end end def destroy File.delete(resource[:path]) end end