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
 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
     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.
 
     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',
 
         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,
         }
           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.
 
     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,
     Encoding example:
 
         file_line { "XScreenSaver":
           ensure   => present,
-          path     => '/root/XScreenSaver'
+          path     => '/root/XScreenSaver',
           line     => "*lock: 10:00:00",
           match    => '^*lock:',
           encoding => "iso-8859-1",
           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.
 
     **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
 
   ensurable do
     defaultvalues
@@ -78,29 +97,29 @@ Puppet::Type.newtype(:file_line) do
   end
 
   newparam(:match) 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
          ' 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
          ' 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
          ' 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
 
          ' This is also takes a regex.'
   end
 
@@ -131,6 +150,13 @@ Puppet::Type.newtype(:file_line) do
     defaultto true
   end
 
     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'
   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
   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[: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]
       end
     end
     unless self[:path]
-      raise(Puppet::Error, "path is a required attribute")
+      raise(Puppet::Error, 'path is a required attribute')
     end
   end
 end
     end
   end
 end