1 require 'puppet/type/file/owner'
2 require 'puppet/type/file/group'
3 require 'puppet/type/file/mode'
4 require 'puppet/util/checksums'
6 Puppet::Type.newtype(:concat_file) do
7 @doc = "Gets all the file fragments and puts these into the target file.
8 This will mostly be used with exported resources.
11 Concat_fragment <<| tag == 'unique_tag' |>>
13 concat_file { '/tmp/file':
14 tag => 'unique_tag', # Mandatory
15 path => '/tmp/file', # Optional. If given it overrides the resource name
16 owner => 'root', # Optional. Default to undef
17 group => 'root', # Optional. Default to undef
18 mode => '0644' # Optional. Default to undef
19 order => 'numeric' # Optional, Default to 'numeric'
20 ensure_newline => false # Optional, Defaults to false
27 defaultto { :present }
31 self[:ensure] == :present
35 desc "Tag reference to collect all concat_fragment's with the same tag"
38 newparam(:path, :namevar => true) do
39 desc "The output file"
42 unless (Puppet::Util.absolute_path?(value, :posix) or Puppet::Util.absolute_path?(value, :windows))
43 raise ArgumentError, "File paths must be fully qualified, not '#{value}'"
48 newparam(:owner, :parent => Puppet::Type::File::Owner) do
49 desc "Desired file owner."
52 newparam(:group, :parent => Puppet::Type::File::Group) do
53 desc "Desired file group."
56 newparam(:mode, :parent => Puppet::Type::File::Mode) do
57 desc "Desired file mode."
61 desc "Controls the ordering of fragments. Can be set to alpha or numeric."
63 newvalues(:alpha, :numeric)
69 desc "Controls the filebucketing behavior of the final file and see File type reference for its use."
73 newparam(:replace, :boolean => true, :parent => Puppet::Parameter::Boolean) do
74 desc "Whether to replace a file that already exists on the local system."
78 newparam(:validate_cmd) do
79 desc "Validates file."
82 newparam(:ensure_newline, :boolean => true, :parent => Puppet::Parameter::Boolean) do
83 desc "Whether to ensure there is a newline after each fragment."
87 # Inherit File parameters
88 newparam(:selinux_ignore_defaults) do
91 newparam(:selrange) do
100 newparam(:seluser) do
103 newparam(:show_diff) do
105 # End file parameters
107 # Autorequire the file we are generating below
108 autorequire(:file) do
113 return @generated_content if @generated_content
114 @generated_content = ""
115 content_fragments = []
117 resources = catalog.resources.select do |r|
118 r.is_a?(Puppet::Type.type(:concat_fragment)) && r[:tag] == self[:tag]
121 resources.each do |r|
122 content_fragments << ["#{r[:order]}___#{r[:name]}", fragment_content(r)]
125 if self[:order] == :numeric
126 sorted = content_fragments.sort do |a, b|
128 d.split('___', 2).map { |v| v =~ /^\d+$/ ? v.to_i : v }
131 decompound(a[0]) <=> decompound(b[0])
134 sorted = content_fragments.sort_by do |a|
135 a_order, a_name = a[0].split('__', 2)
140 @generated_content = sorted.map { |cf| cf[1] }.join
145 def fragment_content(r)
146 if r[:content].nil? == false
147 fragment_content = r[:content]
148 elsif r[:source].nil? == false
150 Array(r[:source]).each do |source|
151 if Puppet::FileServing::Metadata.indirection.find(source)
156 self.fail "Could not retrieve source(s) #{r[:source].join(", ")}" unless @source
157 tmp = Puppet::FileServing::Content.indirection.find(@source)
158 fragment_content = tmp.content unless tmp.nil?
161 if self[:ensure_newline]
162 fragment_content<<"\n" unless fragment_content =~ /\n$/
170 :ensure => self[:ensure] == :absent ? :absent : :file,
179 :selinux_ignore_defaults,
185 :show_diff].each do |param|
186 unless self[param].nil?
187 file_opts[param] = self[param]
191 metaparams = Puppet::Type.metaparams
192 excluded_metaparams = [ :before, :notify, :require, :subscribe, :tag ]
194 metaparams.reject! { |param| excluded_metaparams.include? param }
196 metaparams.each do |metaparam|
197 file_opts[metaparam] = self[metaparam] if self[metaparam]
200 [Puppet::Type.type(:file).new(file_opts)]
204 content = should_content
206 if !content.nil? and !content.empty?
207 catalog.resource("File[#{self[:path]}]")[:content] = content
210 [ catalog.resource("File[#{self[:path]}]") ]