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
26 defaultto { :present }
30 self[:ensure] == :present
33 newparam(:name, :namevar => true) do
38 desc "Tag reference to collect all concat_fragment's with the same tag"
42 desc "The output file"
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 alphabetical or numeric."
66 desc "Controls the filebucketing behavior of the final file and see File type reference for its use."
71 desc "Whether to replace a file that already exists on the local system."
75 newparam(:validate_cmd) do
76 desc "Validates file."
79 newparam(:ensure_newline) do
80 desc "Whether to ensure there is a newline after each fragment."
84 autorequire(:concat_fragment) do
85 catalog.resources.collect do |r|
86 if r.is_a?(Puppet::Type.type(:concat_fragment)) && r[:tag] == self[:tag]
93 return @generated_content if @generated_content
94 @generated_content = ""
95 content_fragments = []
97 resources = catalog.resources.select do |r|
98 r.is_a?(Puppet::Type.type(:concat_fragment)) && r[:tag] == self[:tag]
101 resources.each do |r|
102 content_fragments << ["#{r[:order]}___#{r[:name]}", fragment_content(r)]
105 if self[:order] == 'numeric'
106 sorted = content_fragments.sort do |a, b|
108 d.split('___').map { |v| v =~ /^\d+$/ ? v.to_i : v }
111 decompound(a[0]) <=> decompound(b[0])
114 sorted = content_fragments.sort do |a, b|
119 decompound(a[0]) <=> decompound(b[0])
123 @generated_content = sorted.map { |cf| cf[1] }.join
128 def fragment_content(r)
129 if r[:content].nil? == false
130 fragment_content = r[:content]
131 elsif r[:source].nil? == false
133 Array(r[:source]).each do |source|
134 if Puppet::FileServing::Metadata.indirection.find(source)
139 self.fail "Could not retrieve source(s) #{r[:source].join(", ")}" unless @source
140 tmp = Puppet::FileServing::Content.indirection.find(@source, :environment => catalog.environment)
141 fragment_content = tmp.content unless tmp.nil?
144 if self[:ensure_newline]
145 fragment_content<<"\n" unless fragment_content =~ /\n$/
153 :ensure => self[:ensure] == :absent ? :absent : :file,
154 :content => self.should_content,
157 [:path, :owner, :group, :mode, :replace, :backup].each do |param|
158 unless self[param].nil?
159 file_opts[param] = self[param]
163 [Puppet::Type.type(:file).new(file_opts)]