diff options
| -rw-r--r-- | lib/puppet/provider/append_line/ruby.rb | 15 | ||||
| -rw-r--r-- | lib/puppet/type/append_line.rb | 44 | ||||
| -rw-r--r-- | spec/unit/puppet/provider/append_line/ruby_spec.rb | 30 | ||||
| -rw-r--r-- | spec/unit/puppet/type/append_line_spec.rb | 24 | ||||
| -rw-r--r-- | tests/append_line.pp | 7 | 
5 files changed, 120 insertions, 0 deletions
diff --git a/lib/puppet/provider/append_line/ruby.rb b/lib/puppet/provider/append_line/ruby.rb new file mode 100644 index 0000000..5e78659 --- /dev/null +++ b/lib/puppet/provider/append_line/ruby.rb @@ -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 diff --git a/lib/puppet/type/append_line.rb b/lib/puppet/type/append_line.rb new file mode 100644 index 0000000..b3f926c --- /dev/null +++ b/lib/puppet/type/append_line.rb @@ -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 diff --git a/spec/unit/puppet/provider/append_line/ruby_spec.rb b/spec/unit/puppet/provider/append_line/ruby_spec.rb new file mode 100644 index 0000000..ea28c31 --- /dev/null +++ b/spec/unit/puppet/provider/append_line/ruby_spec.rb @@ -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 diff --git a/spec/unit/puppet/type/append_line_spec.rb b/spec/unit/puppet/type/append_line_spec.rb new file mode 100644 index 0000000..d0564c3 --- /dev/null +++ b/spec/unit/puppet/type/append_line_spec.rb @@ -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 diff --git a/tests/append_line.pp b/tests/append_line.pp new file mode 100644 index 0000000..f50a833 --- /dev/null +++ b/tests/append_line.pp @@ -0,0 +1,7 @@ +file { '/tmp/dansfile': +  ensure => present +}-> +append_line { 'dans_line': +  line => 'dan is awesome', +  #path => '/tmp/dansfile', +}  | 
