concatenated_file: update define to latest from David Schmitt's common module
authorJerome Charaoui <jcharaoui@cmaisonneuve.qc.ca>
Wed, 7 Apr 2010 18:25:08 +0000 (14:25 -0400)
committerMicah Anderson <micah@riseup.net>
Thu, 2 Sep 2010 22:17:13 +0000 (18:17 -0400)
manifests/defines/concatenated_file.pp

index b6f8fb8..d605219 100644 (file)
@@ -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
+#  concatenated_file { "/etc/some.conf":
+#      dir => "/etc/some.conf.d",
+#  }
 define concatenated_file (
        # where the snippets are located
        $dir = '',
@@ -19,18 +36,22 @@ 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 {
                file {
                        $dir_real:
-                               source => "puppet://$server/modules/common/empty",
+                               source => "puppet:///modules/common/empty",
                                checksum => mtime,
                                ignore => '.ignore',
                                recurse => true, purge => true, force => true,
@@ -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,11 +89,11 @@ 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}",
-               refreshonly => true,
+               command => "/usr/bin/find ${dir_real} -maxdepth 1 -type f ! -name '*puppettmp' -print0 | sort -z | xargs -0 cat ${additional_cmd} >| ${tmp_file}",
                subscribe => [ File[$dir_real] ],
-               before => File[$name],
-               alias => [ "concat_${dir_real}"] ,
+               before => File[$tmp_file],
+               alias => [ "concat_${dir_real}"],
+               loglevel => info
        }
        #case $header {
                #'': {}
@@ -94,3 +124,4 @@ define concatenated_file_part (
        }
 
 }
+