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:
parent
806430224a
commit
221277e852
3 changed files with 47 additions and 3 deletions
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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(
|
||||
|
|
Loading…
Reference in a new issue