diff options
Diffstat (limited to 'manifests/defines/concatenated_file.pp')
-rw-r--r-- | manifests/defines/concatenated_file.pp | 47 |
1 files changed, 34 insertions, 13 deletions
diff --git a/manifests/defines/concatenated_file.pp b/manifests/defines/concatenated_file.pp index 5a5144e..3741eea 100644 --- a/manifests/defines/concatenated_file.pp +++ b/manifests/defines/concatenated_file.pp @@ -4,14 +4,31 @@ # Copyright (C) 2007 David Schmitt <david@schmitt.edv-bus.at> # See LICENSE for the full license granted to you. +module_dir { "common/cf": } + # TODO: # * create the directory in _part too +# This resource collects file snippets from a directory ($dir) and concatenates +# them in lexical order of their names into a new file ($name). This can be +# used to collect information from disparate sources, when the target file +# format doesn't allow includes. +# +# concatenated_file_part can be used to easily configure content for this. +# +# If no $dir is specified, the target name with '.d' appended will be used. +# +# The $dir is purged by puppet and will only contain explicitely configured +# files. This can be overridden by defining the directory before the +# concatenated_file. +# +# Depend on File[$name] to change if and only if its contents change. Notify +# Exec["concat_${name}"] if you want to force an update. +# # Usage: # concatenated_file { "/etc/some.conf": # dir => "/etc/some.conf.d", # } -# Use Exec["concat_$name"] as Semaphor define concatenated_file ( # where the snippets are located $dir = '', @@ -19,12 +36,16 @@ define concatenated_file ( $header = '', # a file with content to append $footer = '', + # default permissions for the target file $mode = 0644, $owner = root, $group = 0 ) { $dir_real = $dir ? { '' => "${name}.d", default => $dir } + $tmp_file_name = regsubst($dir_real, '/', '_', 'G') + $tmp_file = "${module_dir_path}/${tmp_file_name}" + if defined(File[$dir_real]) { debug("${dir_real} already defined") } else { @@ -40,9 +61,18 @@ define concatenated_file ( } file { - $name: + $tmp_file: ensure => present, checksum => md5, mode => $mode, owner => $owner, group => $group; + # decouple the actual file from the generation process by using a + # temporary file and puppet's source mechanism. This ensures that events + # for notify/subscribe will only be generated when there is an actual + # change. + $name: + ensure => present, checksum => md5, + source => $tmp_file, + mode => $mode, owner => $owner, group => $group, + require => File[$tmp_file]; } # if there is a header or footer file, add it @@ -59,21 +89,12 @@ define concatenated_file ( # use >| to force clobbering the target file exec { "concat_${name}": - command => "/usr/bin/find ${dir_real} -maxdepth 1 -type f ! -name '*puppettmp' -print0 | sort -z | xargs -0 cat ${additional_cmd} >| ${name}", + command => "/usr/bin/find ${dir_real} -maxdepth 1 -type f ! -name '*puppettmp' -print0 | sort -z | xargs -0 cat ${additional_cmd} >| ${tmp_file}", refreshonly => true, subscribe => [ File[$dir_real] ], - before => File[$name], + before => File[$tmp_file], alias => [ "concat_${dir_real}"] , } - #case $header { - #'': {} - #default: { Exec["concat_${name}"] { subscribe +> File[$header] } } - #} - - #case $footer { - #'': {} - #default: { Exec["concat_${name}"] { subscribe +> File[$footer] } } - #} } |