Update puppetlabs/stdlib module
[mirror/dsa-puppet.git] / 3rdparty / modules / stdlib / lib / puppet / type / file_line.rb
index b2357b8..14650fe 100644 (file)
@@ -1,6 +1,5 @@
 Puppet::Type.newtype(:file_line) do
-
-  desc <<-EOT
+  desc <<-DOC
     Ensures that a given line is contained within a file.  The implementation
     matches the full line, including whitespace at the beginning and end.  If
     the line is not contained in the given file, Puppet will append the line to
@@ -34,12 +33,16 @@ Puppet::Type.newtype(:file_line) do
     In this code example match will look for a line beginning with export
     followed by HTTP_PROXY and replace it with the value in line.
 
-    Match Example With `ensure => absent`:
+    Examples With `ensure => absent`:
+
+    This type has two behaviors when `ensure => absent` is set.
+
+    One possibility is to set `match => ...` and `match_for_absence => true`,
+    as in the following example:
 
         file_line { 'bashrc_proxy':
           ensure            => absent,
           path              => '/etc/bashrc',
-          line              => 'export HTTP_PROXY=http://squid.puppetlabs.vm:3128',
           match             => '^export\ HTTP_PROXY\=',
           match_for_absence => true,
         }
@@ -48,11 +51,27 @@ Puppet::Type.newtype(:file_line) do
     followed by HTTP_PROXY and delete it.  If multiple lines match, an
     error will be raised unless the `multiple => true` parameter is set.
 
+    Note that the `line => ...` parameter would be accepted BUT IGNORED in
+    the above example.
+
+    The second way of using `ensure => absent` is to specify a `line => ...`,
+    and no match:
+
+        file_line { 'bashrc_proxy':
+          ensure => absent,
+          path   => '/etc/bashrc',
+          line   => 'export HTTP_PROXY=http://squid.puppetlabs.vm:3128',
+        }
+
+    Note that when ensuring lines are absent this way, the default behavior
+    this time is to always remove all lines matching, and this behavior
+    can't be disabled.
+
     Encoding example:
 
         file_line { "XScreenSaver":
           ensure   => present,
-          path     => '/root/XScreenSaver'
+          path     => '/root/XScreenSaver',
           line     => "*lock: 10:00:00",
           match    => '^*lock:',
           encoding => "iso-8859-1",
@@ -66,7 +85,7 @@ Puppet::Type.newtype(:file_line) do
 
     **Autorequires:** If Puppet is managing the file that will contain the line
     being managed, the file_line resource will autorequire that file.
-  EOT
+  DOC
 
   ensurable do
     defaultvalues
@@ -78,29 +97,29 @@ Puppet::Type.newtype(:file_line) do
   end
 
   newparam(:match) do
-    desc 'An optional ruby regular expression to run against existing lines in the file.' +
-         ' If a match is found, we replace that line rather than adding a new line.' +
-         ' A regex comparison is performed against the line value and if it does not' +
+    desc 'An optional ruby regular expression to run against existing lines in the file.' \
+         ' If a match is found, we replace that line rather than adding a new line.' \
+         ' A regex comparison is performed against the line value and if it does not' \
          ' match an exception will be raised.'
   end
 
   newparam(:match_for_absence) do
-    desc 'An optional value to determine if match should be applied when ensure => absent.' +
-         ' If set to true and match is set, the line that matches match will be deleted.' +
-         ' If set to false (the default), match is ignored when ensure => absent.' +
+    desc 'An optional value to determine if match should be applied when ensure => absent.' \
+         ' If set to true and match is set, the line that matches match will be deleted.' \
+         ' If set to false (the default), match is ignored when ensure => absent.' \
          ' When `ensure => present`, match_for_absence is ignored.'
     newvalues(true, false)
     defaultto false
   end
 
   newparam(:multiple) do
-    desc 'An optional value to determine if match can change multiple lines.' +
+    desc 'An optional value to determine if match can change multiple lines.' \
          ' If set to false, an exception will be raised if more than one line matches'
     newvalues(true, false)
   end
 
   newparam(:after) do
-    desc 'An optional value used to specify the line after which we will add any new lines. (Existing lines are added in place)' +
+    desc 'An optional value used to specify the line after which we will add any new lines. (Existing lines are added in place)' \
          ' This is also takes a regex.'
   end
 
@@ -131,6 +150,13 @@ Puppet::Type.newtype(:file_line) do
     defaultto true
   end
 
+  newparam(:replace_all_matches_not_matching_line) do
+    desc 'Configures the behavior of replacing all lines in a file which match the `match` parameter regular expression, regardless of whether the specified line is already present in the file.'
+
+    newvalues(true, false)
+    defaultto false
+  end
+
   newparam(:encoding) do
     desc 'For files that are not UTF-8 encoded, specify encoding such as iso-8859-1'
     defaultto 'UTF-8'
@@ -148,13 +174,19 @@ Puppet::Type.newtype(:file_line) do
   end
 
   validate do
+    if self[:replace_all_matches_not_matching_line].to_s == 'true' && self[:multiple].to_s == 'false'
+      raise(Puppet::Error, 'multiple must be true when replace_all_matches_not_matching_line is true')
+    end
+    if self[:replace_all_matches_not_matching_line].to_s == 'true' && self[:replace].to_s == 'false'
+      raise(Puppet::Error, 'replace must be true when replace_all_matches_not_matching_line is true')
+    end
     unless self[:line]
-      unless (self[:ensure].to_s == 'absent') and (self[:match_for_absence].to_s == 'true') and self[:match]
-        raise(Puppet::Error, "line is a required attribute")
+      unless (self[:ensure].to_s == 'absent') && (self[:match_for_absence].to_s == 'true') && self[:match]
+        raise(Puppet::Error, 'line is a required attribute')
       end
     end
     unless self[:path]
-      raise(Puppet::Error, "path is a required attribute")
+      raise(Puppet::Error, 'path is a required attribute')
     end
   end
 end