Update file_line resource to support 'after'.

When adding new lines to a file the 'after' option can be useful
when you need to insert file lines into the middle of a file.

This is particularly helpful when using file_line with sectioned
config files.

NOTE: the after option only works when adding new lines. If you are
updating an existing (matched) line it will simply modify it in place.
This assumes it was in the right place to begin with.
This commit is contained in:
Dan Prince 2013-08-29 12:19:16 -04:00 committed by Jeff McCune
parent 806430224a
commit 221277e852
3 changed files with 47 additions and 3 deletions

View file

@ -49,10 +49,32 @@ Puppet::Type.type(:file_line).provide(:ruby) do
end
def handle_create_without_match
File.open(resource[:path], 'a') do |fh|
fh.puts resource[:line]
regex = resource[:after] ? Regexp.new(resource[:after]) : nil
after_count = File.exists?(resource[:path]) ? lines.select { |l| regex.match(l) }.size : 0
if after_count > 1 then
raise Puppet::Error, "More than one line in file '#{resource[:path]}' matches after pattern '#{resource[:after]}'"
end
if (after_count == 0)
File.open(resource[:path], 'a') do |fh|
fh.puts resource[:line]
end
else
File.open(resource[:path], 'w') do |fh|
lines.each do |l|
fh.puts(l)
if regex.match(l) then
fh.puts(resource[:line])
end
end
end
end
end
end

View file

@ -42,6 +42,10 @@ Puppet::Type.newtype(:file_line) do
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)'
end
newparam(:line) do
desc 'The line to be appended to the file located by the path parameter.'
end

View file

@ -80,6 +80,24 @@ describe provider_class do
File.read(@tmpfile).chomp.should eql("foo1\nfoo = bar\nfoo2\nfoo = bar")
end
it 'should replace all lines that matches with after' do
@resource = Puppet::Type::File_line.new(
{
:name => 'foo',
:path => @tmpfile,
:line => 'inserted = line',
:after => '^foo1',
}
)
@provider = provider_class.new(@resource)
File.open(@tmpfile, 'w') do |fh|
fh.write("foo1\nfoo = blah\nfoo2\nfoo = baz")
end
@provider.exists?.should be_nil
@provider.create
File.read(@tmpfile).chomp.should eql("foo1\ninserted = line\nfoo = blah\nfoo2\nfoo = baz")
end
it 'should raise an error with invalid values' do
expect {
@resource = Puppet::Type::File_line.new(