Merge git://labs.riseup.net/module_common
[puppet_common.git] / manifests / defines / line.pp
1 # common/manifests/defines/line.pp -- a trivial mechanism to ensure a line exists in a file
2 # Copyright (C) 2007 David Schmitt <david@schmitt.edv-bus.at>
3 # See LICENSE for the full license granted to you.
4
5 # Ensures that a specific line is present or absent in a file. This can
6 # be very brittle, since even small changes can throw this off.
7 #
8 # If the line is not present yet, it will be appended to the file.
9
10 # The name of the define is not used. Just keep it (globally) unique and
11 # descriptive.
12 #
13 # Use this only for very trivial stuff. Usually replacing the whole file
14 # is a more stable solution with less maintenance headaches afterwards.
15 #
16 # Usage:
17 # line {
18 #   description:
19 #     file => "filename",
20 #     line => "content",
21 #     ensure => {absent,*present*}
22 # }
23 #
24 # Example:
25 # The following ensures that the line "allow ^$munin_host$" exists in
26 # /etc/munin/munin-node.conf, and if there are any changes notify the
27 # service for a restart
28 #
29 #  line {
30 #       allow_munin_host:
31 #               file => "/etc/munin/munin-node.conf",
32 #               line => "allow ^$munin_host$",
33 #               ensure => present,
34 #               notify => Service[munin-node],
35 #               require => Package[munin-node];
36 #  }
37 #
38 # Code with fixes gathered at
39 # http://reductivelabs.com/trac/puppet/wiki/Recipes/SimpleText
40 define line($file, $line, $ensure = 'present') {
41   case $ensure {
42     default: { err ( "unknown ensure value ${ensure}" ) }
43     present: {
44       exec { "/bin/echo '${line}' >> '${file}'":
45         unless  => "/bin/grep -qFx '${line}' '${file}'",
46         require => File["${file}"],
47       }
48     }
49     absent: {
50       exec { "/usr/bin/perl -ni -e 'print unless /^\\Q${line}\\E\$/' '${file}'":
51         onlyif => "/bin/grep -qFx '${line}' '${file}'",
52       }
53     }
54     uncomment: {
55       exec { "/bin/sed -i -e'/${line}/s/^#\+//' '${file}'":
56         onlyif => "/bin/grep '${line}' '${file}' | /bin/grep '^#' | /usr/bin/wc -l"
57       }
58     }
59     comment: {
60       exec { "/bin/sed -i -e'/${line}/s/^\(.\+\)$/#\1/' '${file}'":
61         onlyif  => "/usr/bin/test `/bin/grep '${line}' '${file}' | /bin/grep -v '^#' | /usr/bin/wc -l` -ne 0",
62         require => File["${file}"],
63       }
64     }
65   }
66 }