]> gitweb.fluxo.info Git - puppet-stdlib.git/commitdiff
(#8628) Add append_line native type
authorDan Bode <dan@puppetlabs.com>
Tue, 26 Jul 2011 22:27:42 +0000 (15:27 -0700)
committerDan Bode <dan@puppetlabs.com>
Tue, 26 Jul 2011 22:30:28 +0000 (15:30 -0700)
This commit adds a native type that can check if
a line exists and append it to a file.

This use case seems common enough to warrant its
inclusion into stdlib.

Reviewed-by: Jeff McCune
lib/puppet/provider/append_line/ruby.rb [new file with mode: 0644]
lib/puppet/type/append_line.rb [new file with mode: 0644]
spec/unit/puppet/provider/append_line/ruby_spec.rb [new file with mode: 0644]
spec/unit/puppet/type/append_line_spec.rb [new file with mode: 0644]
tests/append_line.pp [new file with mode: 0644]

diff --git a/lib/puppet/provider/append_line/ruby.rb b/lib/puppet/provider/append_line/ruby.rb
new file mode 100644 (file)
index 0000000..5e78659
--- /dev/null
@@ -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 (file)
index 0000000..b3f926c
--- /dev/null
@@ -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 (file)
index 0000000..ea28c31
--- /dev/null
@@ -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 (file)
index 0000000..d0564c3
--- /dev/null
@@ -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 (file)
index 0000000..f50a833
--- /dev/null
@@ -0,0 +1,7 @@
+file { '/tmp/dansfile':
+  ensure => present
+}->
+append_line { 'dans_line':
+  line => 'dan is awesome',
+  #path => '/tmp/dansfile',
+}