cleanup escaping stuff
[puppet_common.git] / manifests / defines / concatenated_file.pp
1 # common/manifests/defines/concatenated_file.pp -- create a file from snippets
2 # stored in a directory
3 #
4 # Copyright (C) 2007 David Schmitt <david@schmitt.edv-bus.at>
5 # See LICENSE for the full license granted to you.
6
7 # TODO:
8 # * create the directory in _part too
9
10 # This resource collects file snippets from a directory ($dir) and concatenates
11 # them in lexical order of their names into a new file ($name). This can be
12 # used to collect information from disparate sources, when the target file
13 # format doesn't allow includes.
14 #
15 # concatenated_file_part can be used to easily configure content for this.
16 #
17 # If no $dir is specified, the target name with '.d' appended will be used.
18 #
19 # The $dir is purged by puppet and will only contain explicitely configured
20 # files. This can be overridden by defining the directory before the
21 # concatenated_file.
22 #
23 # Depend on File[$name] to change if and only if its contents change. Notify
24 # Exec["concat_${name}"] if you want to force an update.
25 #
26 # Usage:
27 #  concatenated_file { "/etc/some.conf":
28 #      dir => "/etc/some.conf.d",
29 #  }
30 define concatenated_file (
31     # where the snippets are located
32     $dir = '',
33     # a file with content to prepend
34     $header = '',
35     # a file with content to append
36     $footer = '',
37     # default permissions for the target file
38     $mode = 0644, $owner = root, $group = 0
39     )
40 {
41     include common::moduledir::common::cf
42
43     $dir_real = $dir ? { '' => "${name}.d", default => $dir }
44
45     $tmp_file_name = regsubst($dir_real, '/', '_', 'G')
46     $tmp_file = "${common::moduledir::module_dir_path}/${tmp_file_name}"
47
48     if defined(File[$dir_real]) {
49         debug("${dir_real} already defined")
50     } else {
51         file {
52             $dir_real:
53                 source => "puppet:///modules/common/empty",
54                 checksum => mtime,
55                 ignore => '\.ignore',
56                 recurse => true, purge => true, force => true,
57                 mode => $mode, owner => $owner, group => $group,
58                 notify => Exec["concat_${name}"];
59         }
60     }
61
62     file {
63         $tmp_file:
64             ensure => present, checksum => md5,
65             mode => $mode, owner => $owner, group => $group;
66         # decouple the actual file from the generation process by using a
67         # temporary file and puppet's source mechanism. This ensures that events
68         # for notify/subscribe will only be generated when there is an actual
69         # change.
70         $name:
71             ensure => present, checksum => md5,
72             source => $tmp_file,
73             mode => $mode, owner => $owner, group => $group,
74             require => File[$tmp_file];
75     }
76
77     # if there is a header or footer file, add it
78     $additional_cmd = $header ? {
79         '' => $footer ? {
80             '' => '',
81             default => "| cat - '${footer}' "
82         },
83         default => $footer ? {
84             '' => "| cat '${header}' - ",
85             default => "| cat '${header}' - '${footer}' "
86         }
87     }
88
89     # use >| to force clobbering the target file
90     exec { "concat_${name}":
91         command => "/usr/bin/find ${dir_real} -maxdepth 1 -type f ! -name '*puppettmp' -print0 | sort -z | xargs -0 cat ${additional_cmd} >| ${tmp_file}",
92         subscribe => [ File[$dir_real] ],
93         before => File[$tmp_file],
94         alias => [ "concat_${dir_real}"],
95         loglevel => info
96     }
97
98 }
99
100
101 # Add a snippet called $name to the concatenated_file at $dir.
102 # The file can be referenced as File["cf_part_${name}"]
103 define concatenated_file_part (
104     $dir, $content = '', $ensure = present,
105     $mode = 0644, $owner = root, $group = 0
106     )
107 {
108
109     file { "${dir}/${name}":
110         ensure => $ensure, content => $content,
111         mode => $mode, owner => $owner, group => $group,
112         alias => "cf_part_${name}",
113         notify => Exec["concat_${dir}"],
114     }
115
116 }
117