Merge branch 'feature/master/8628_append_line'

This commit is contained in:
Dan Bode 2011-07-26 15:35:52 -07:00
commit 436c925e8a
5 changed files with 120 additions and 0 deletions

View file

@ -0,0 +1,15 @@
Puppet::Type.type(:append_line).provide(:ruby) do
def exists?
File.readlines(resource[:path]).find do |line|
line.chomp == resource[:line].chomp
end
end
def create
File.open(resource[:path], 'a') do |fh|
fh.puts resource[:line]
end
end
end

View file

@ -0,0 +1,44 @@
Puppet::Type.newtype(:append_line) do
desc <<-EOT
Type that can append a line to a file if it does not already contain it.
Example:
append_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

View file

@ -0,0 +1,30 @@
require 'puppet'
require 'tempfile'
provider_class = Puppet::Type.type(:append_line).provider(:ruby)
describe provider_class do
before :each do
tmp = Tempfile.new('tmp')
@tmpfile = tmp.path
tmp.close!
@resource = Puppet::Type::Append_line.new(
{:name => 'foo', :path => @tmpfile, :line => 'foo'}
)
@provider = provider_class.new(@resource)
end
it 'should detect if the line exists in the file' do
File.open(@tmpfile, 'w') do |fh|
fh.write('foo')
end
@provider.exists?.should be_true
end
it 'should detect if the line does not exist in the file' do
File.open(@tmpfile, 'w') do |fh|
fh.write('foo1')
end
@provider.exists?.should be_nil
end
it 'should append to an existing file when creating' do
@provider.create
File.read(@tmpfile).chomp.should == 'foo'
end
end

View file

@ -0,0 +1,24 @@
require 'puppet'
require 'tempfile'
describe Puppet::Type.type(:append_line) do
before :each do
@append_line = Puppet::Type.type(:append_line).new(:name => 'foo', :line => 'line', :path => '/tmp/path')
end
it 'should accept a line and path' do
@append_line[:line] = 'my_line'
@append_line[:line].should == 'my_line'
end
it 'should accept posix filenames' do
@append_line[:path] = '/tmp/path'
@append_line[:path].should == '/tmp/path'
end
it 'should not accept unqualified path' do
expect { @append_line[:path] = 'file' }.should raise_error(Puppet::Error, /File paths must be fully qualified/)
end
it 'should require that a line is specified' do
expect { Puppet::Type.type(:append_line).new(:name => 'foo', :path => '/tmp/file') }.should raise_error(Puppet::Error, /Both line and path are required attributes/)
end
it 'should require that a file is specified' do
expect { Puppet::Type.type(:append_line).new(:name => 'foo', :line => 'path') }.should raise_error(Puppet::Error, /Both line and path are required attributes/)
end
end

7
tests/append_line.pp Normal file
View file

@ -0,0 +1,7 @@
file { '/tmp/dansfile':
ensure => present
}->
append_line { 'dans_line':
line => 'dan is awesome',
#path => '/tmp/dansfile',
}