Puppet::Type.newtype(:whole_line) do desc <<-EOT Type that can append whole a line to a file if it does not already contain it. Example: whole_line { 'sudo_rule': path => '/etc/sudoers', line => '%admin ALL=(ALL) ALL', } EOT ensurable do defaultto :present newvalue(:present) do provider.create end end newparam(:name, :namevar => true) do desc 'arbitrary name used as identity' end newparam(:line) do desc 'The line to be appended to the path.' end newparam(:path) do desc 'File to possibly append a line to.' validate do |value| unless (Puppet.features.posix? and value =~ /^\//) or (Puppet.features.microsoft_windows? and (value =~ /^.:\// or value =~ /^\/\/[^\/]+\/[^\/]+/)) raise(Puppet::Error, "File paths must be fully qualified, not '#{value}'") end end end validate do unless self[:line] and self[:path] raise(Puppet::Error, "Both line and path are required attributes") end end end