summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.fixtures.yml3
-rw-r--r--.gemfile7
-rw-r--r--.gitignore1
-rw-r--r--.travis.yml12
-rw-r--r--CHANGELOG23
-rw-r--r--Modulefile4
-rw-r--r--README.markdown56
-rw-r--r--Rakefile15
-rw-r--r--manifests/fragment.pp9
-rw-r--r--manifests/init.pp185
-rw-r--r--manifests/setup.pp9
-rw-r--r--spec/defines/init_spec.rb115
-rw-r--r--spec/fixtures/manifests/site.pp0
-rw-r--r--spec/spec_helper.rb10
14 files changed, 342 insertions, 107 deletions
diff --git a/.fixtures.yml b/.fixtures.yml
new file mode 100644
index 0000000..2d6fee0
--- /dev/null
+++ b/.fixtures.yml
@@ -0,0 +1,3 @@
+fixtures:
+ symlinks:
+ 'concat': '#{source_dir}'
diff --git a/.gemfile b/.gemfile
new file mode 100644
index 0000000..d4241e8
--- /dev/null
+++ b/.gemfile
@@ -0,0 +1,7 @@
+source :rubygems
+
+puppetversion = ENV.key?('PUPPET_VERSION') ? "= #{ENV['PUPPET_VERSION']}" : ['>= 2.7']
+gem 'puppet', puppetversion
+gem 'puppet-lint'
+gem 'rspec-puppet'
+gem 'puppetlabs_spec_helper', '>= 0.1.0'
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..5fff1d9
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+pkg
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000..9d1c0cc
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,12 @@
+language: ruby
+rvm:
+ - 1.8.7
+script:
+ - "rake lint"
+ - "rake spec"
+branches:
+ only:
+ - master
+env:
+ - PUPPET_VERSION=2.7.11
+gemfile: .gemfile
diff --git a/CHANGELOG b/CHANGELOG
index c506cf1..139a638 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,9 +1,3 @@
-KNOWN ISSUES:
-- In 0.24.8 you will see inintended notifies, if you build a file
- in a run, the next run will also see it as changed. This is due
- to how 0.24.8 does the purging of unhandled files, this is improved
- in 0.25.x and we cannot work around it in our code.
-
CHANGELOG:
- 2010/02/19 - initial release
- 2010/03/12 - add support for 0.24.8 and newer
@@ -27,3 +21,20 @@ CHANGELOG:
- 2010/10/04 - Make the warning message configurable
- 2010/12/03 - Add flags to make concat work better on Solaris - thanks Jonathan Boyett
- 2011/02/03 - Make the shell script more portable and add a config option for root group
+- 2011/06/21 - Make base dir root readable only for security
+- 2011/06/23 - Set base directory using a fact instead of hardcoding it
+- 2011/06/23 - Support operating as non privileged user
+- 2011/06/23 - Support dash instead of bash or sh
+- 2011/07/11 - Better solaris support
+- 2011/12/05 - Use fully qualified variables
+- 2011/12/13 - Improve Nexenta support
+- 2012/04/11 - Do not use any GNU specific extensions in the shell script
+- 2012/03/24 - Comply to community style guides
+- 2012/05/23 - Better errors when basedir isnt set
+- 2012/05/31 - Add spec tests
+- 2012/07/11 - Include concat::setup in concat improving UX
+- 2012/08/14 - Puppet Lint improvements
+- 2012/08/30 - The target path can be different from the $name
+- 2012/08/30 - More Puppet Lint cleanup
+- 2012/09/04 - RELEASE 0.2.0
+- 2012/12/12 - Added (file) $replace parameter to concat
diff --git a/Modulefile b/Modulefile
index d6ab2bb..3815edd 100644
--- a/Modulefile
+++ b/Modulefile
@@ -1,5 +1,5 @@
-name 'puppet-concat'
-version '0.1.0'
+name 'ripienaar-concat'
+version '0.2.0'
source 'git://github.com/ripienaar/puppet-concat.git'
author 'R.I.Pienaar'
license 'Apache'
diff --git a/README.markdown b/README.markdown
index 8736d57..ac5ee56 100644
--- a/README.markdown
+++ b/README.markdown
@@ -32,7 +32,6 @@ their changes will be incorporated into the puppet managed motd.
<pre>
# class to setup basic motd, include on all nodes
class motd {
- include concat::setup
$motd = "/etc/motd"
concat{$motd:
@@ -78,12 +77,11 @@ class apache {
}
</pre>
+Detailed documentation of the class options can be found in the
+manifest files.
+
Known Issues:
-------------
-* In 0.24.8 you will see inintended notifies, if you build a file
- in a run, the next run will also see it as changed. This is due
- to how 0.24.8 does the purging of unhandled files, this is improved
- in 0.25.x and we cannot work around it in our code.
* Since puppet-concat now relies on a fact for the concat directory,
you will need to set up pluginsync = true for at least the first run.
You have this issue if puppet fails to run on the client and you have
@@ -107,6 +105,52 @@ Contributors:
* Patch to remove hard coded paths relying on OS path
* Patch to use file{} to copy the resulting file to the final destination. This means Puppet client will show diffs and that hopefully we can change file ownerships now
+**Peter Meier**
+
+ * Basedir as a fact
+ * Unprivileged user support
+
+**Sharif Nassar**
+
+ * Solaris/Nexenta support
+ * Better error reporting
+
+**Christian G. Warden**
+
+ * Style improvements
+
+**Reid Vandewiele**
+
+ * Support non GNU systems by default
+
+**Erik Dalén**
+
+ * Style improvements
+
+**Gildas Le Nadan**
+
+ * Documentation improvements
+
+**Paul Belanger**
+
+ * Testing improvements and Travis support
+
+**Branan Purvine-Riley**
+
+ * Support Puppet Module Tool better
+
+**Dustin J. Mitchell**
+
+ * Always include setup when using the concat define
+
+**Andreas Jaggi**
+
+ * Puppet Lint support
+
+**Jan Vansteenkiste**
+
+ * Configurable paths
+
Contact:
--------
-You can contact me on rip@devco.net or follow my blog at http://www.devco.net I am also on twitter as ripienaar
+R.I.Pienaar / rip@devco.net / @ripienaar / http://devco.net
diff --git a/Rakefile b/Rakefile
index 764aebd..14f1c24 100644
--- a/Rakefile
+++ b/Rakefile
@@ -1,13 +1,2 @@
-require 'rake'
-require 'rspec/core/rake_task'
-
-task :default => [:spec]
-
-desc "Run all module spec tests (Requires rspec-puppet gem)"
-RSpec::Core::RakeTask.new(:spec)
-
-desc "Build package"
-task :build do
- system("puppet-module build")
-end
-
+require 'rubygems'
+require 'puppetlabs_spec_helper/rake_tasks'
diff --git a/manifests/fragment.pp b/manifests/fragment.pp
index 943bf67..cf55f8b 100644
--- a/manifests/fragment.pp
+++ b/manifests/fragment.pp
@@ -1,5 +1,5 @@
# Puts a file fragment into a directory previous setup using concat
-#
+#
# OPTIONS:
# - target The file that these fragments belong to
# - content If present puts the content into the file
@@ -14,8 +14,8 @@
# - backup Controls the filebucketing behavior of the final file and
# see File type reference for its use. Defaults to 'puppet'
define concat::fragment($target, $content='', $source='', $order=10, $ensure = 'present', $mode = '0644', $owner = $::id, $group = $concat::setup::root_group, $backup = 'puppet') {
- $safe_name = regsubst($name, '/', '_', 'G')
- $safe_target_name = regsubst($target, '/', '_', 'G')
+ $safe_name = regsubst($name, '[/\n]', '_', 'GM')
+ $safe_target_name = regsubst($target, '[/\n]', '_', 'GM')
$concatdir = $concat::setup::concatdir
$fragdir = "${concatdir}/${safe_target_name}"
@@ -29,6 +29,9 @@ define concat::fragment($target, $content='', $source='', $order=10, $ensure = '
'', 'absent', 'present', 'file', 'directory': {
crit('No content, source or symlink specified')
}
+ default: {
+ #do nothing, make puppet-lint happy.
+ }
}
}
default: { File{ source => $source } }
diff --git a/manifests/init.pp b/manifests/init.pp
index 0b3ed56..b309059 100644
--- a/manifests/init.pp
+++ b/manifests/init.pp
@@ -30,6 +30,30 @@
# will have an number prefix of 10, you can use the order option
# to control that and thus control the order the final file gets built in.
#
+# You can also specify a path and use a different name for your resources:
+#
+# # You can make this something dynamic, based on whatever parameters your
+# # module/class for example.
+# $vhost_file = '/etc/httpd/vhosts/01-my-vhost.conf'
+#
+# concat{'apache-vhost-myvhost':
+# path => $vhost_file,
+# }
+#
+# # We don't care where the file is located, just what to put in it.
+# concat::fragment {'apache-vhost-myvhost-main':
+# target => 'apache-vhost-myvhost',
+# content => '<virtualhost *:80>',
+# order => 01,
+# }
+#
+# concat::fragment {'apache-vhost-myvhost-close':
+# target => 'apache-vhost-myvhost',
+# content => '</virtualhost>',
+# order => 99,
+# }
+#
+#
# SETUP:
# The class concat::setup uses the fact concat_basedir to define the variable
# $concatdir, where all the temporary files and fragments will be
@@ -43,9 +67,6 @@
# There's some regular expression magic to figure out the puppet version but
# if you're on an older 0.24 version just set $puppetversion = 24
#
-# Before you can use any of the concat features you should include the
-# class concat::setup somewhere on your node first.
-#
# DETAIL:
# We use a helper shell script called concatfragments.sh that gets placed
# in <Puppet[:vardir]>/concat/bin to do the concatenation. While this might
@@ -69,6 +90,10 @@
# Sets up so that you can use fragments to build a final config file,
#
# OPTIONS:
+# - path The path to the final file. Use this in case you want to
+# differentiate between the name of a resource and the file path.
+# Note: Use the name you provided in the target of your
+# fragments.
# - mode The mode of the final file
# - owner Who will own the file
# - group Who will own the file
@@ -77,21 +102,41 @@
# that it is built by puppet
# - backup Controls the filebucketing behavior of the final file and
# see File type reference for its use. Defaults to 'puppet'
+# - replace Whether to replace a file that already exists on the local
+# system
#
# ACTIONS:
# - Creates fragment directories if it didn't exist already
-# - Executes the concatfragments.sh script to build the final file, this script will create
-# directory/fragments.concat. Execution happens only when:
+# - Executes the concatfragments.sh script to build the final file, this
+# script will create directory/fragments.concat. Execution happens only
+# when:
# * The directory changes
-# * fragments.concat != final destination, this means rebuilds will happen whenever
-# someone changes or deletes the final file. Checking is done using /usr/bin/cmp.
-# * The Exec gets notified by something else - like the concat::fragment define
+# * fragments.concat != final destination, this means rebuilds will happen
+# whenever someone changes or deletes the final file. Checking is done
+# using /usr/bin/cmp.
+# * The Exec gets notified by something else - like the concat::fragment
+# define
# - Copies the file over to the final destination using a file resource
#
# ALIASES:
-# - The exec can notified using Exec["concat_/path/to/file"] or Exec["concat_/path/to/directory"]
-# - The final file can be referened as File["/path/to/file"] or File["concat_/path/to/file"]
-define concat($mode = '0644', $owner = $::id, $group = $concat::setup::root_group, $warn = false, $force = false, $backup = 'puppet', $gnu = undef, $order='alpha') {
+# - The exec can notified using Exec["concat_/path/to/file"] or
+# Exec["concat_/path/to/directory"]
+# - The final file can be referened as File["/path/to/file"] or
+# File["concat_/path/to/file"]
+define concat(
+ $path = $name,
+ $owner = $::id,
+ $group = $concat::setup::root_group,
+ $mode = '0644',
+ $warn = false,
+ $force = false,
+ $backup = 'puppet',
+ $replace = true,
+ $gnu = undef,
+ $order='alpha'
+) {
+ include concat::setup
+
$safe_name = regsubst($name, '/', '_', 'G')
$concatdir = $concat::setup::concatdir
$version = $concat::setup::majorversion
@@ -100,9 +145,15 @@ define concat($mode = '0644', $owner = $::id, $group = $concat::setup::root_grou
$default_warn_message = '# This file is managed by Puppet. DO NOT EDIT.'
case $warn {
- 'true',true,yes,on: { $warnmsg = $default_warn_message }
- 'false',false,no,off: { $warnmsg = '' }
- default: { $warnmsg = $warn }
+ 'true', true, yes, on: {
+ $warnmsg = $default_warn_message
+ }
+ 'false', false, no, off: {
+ $warnmsg = ''
+ }
+ default: {
+ $warnmsg = $warn
+ }
}
$warnmsg_escaped = regsubst($warnmsg, "'", "'\\\\''", 'G')
@@ -112,67 +163,93 @@ define concat($mode = '0644', $owner = $::id, $group = $concat::setup::root_grou
}
case $force {
- 'true',true,yes,on: { $forceflag = '-f' }
- 'false',false,no,off: { $forceflag = '' }
- default: { fail("Improper 'force' value given to concat: ${force}") }
+ 'true', true, yes, on: {
+ $forceflag = '-f'
+ }
+ 'false', false, no, off: {
+ $forceflag = ''
+ }
+ default: {
+ fail("Improper 'force' value given to concat: ${force}")
+ }
}
case $order {
- numeric: { $orderflag = '-n' }
- alpha: { $orderflag = '' }
- default: { fail("Improper 'order' value given to concat: ${order}") }
+ numeric: {
+ $orderflag = '-n'
+ }
+ alpha: {
+ $orderflag = ''
+ }
+ default: {
+ fail("Improper 'order' value given to concat: ${order}")
+ }
}
- File{
- owner => $::id,
- group => $group,
- mode => $mode,
- backup => $backup
+ File {
+ owner => $::id,
+ group => $group,
+ mode => $mode,
+ backup => $backup,
+ replace => $replace
}
- file{$fragdir:
- ensure => directory;
+ file { $fragdir:
+ ensure => directory,
+ }
- "${fragdir}/fragments":
+ $source_real = $version ? {
+ 24 => 'puppet:///concat/null',
+ default => undef,
+ }
+
+ file { "${fragdir}/fragments":
ensure => directory,
- recurse => true,
- purge => true,
force => true,
ignore => ['.svn', '.git', '.gitignore'],
- source => $version ? {
- 24 => 'puppet:///concat/null',
- default => undef,
- },
- notify => Exec["concat_${name}"];
+ notify => Exec["concat_${name}"],
+ purge => true,
+ recurse => true,
+ source => $source_real,
+ }
- "${fragdir}/fragments.concat":
- ensure => present;
+ file { "${fragdir}/fragments.concat":
+ ensure => present,
+ }
- "${fragdir}/${concat_name}":
- ensure => present;
+ file { "${fragdir}/${concat_name}":
+ ensure => present,
+ }
- $name:
+ file { $name:
ensure => present,
- source => "${fragdir}/${concat_name}",
- owner => $owner,
+ path => $path,
+ alias => "concat_${name}",
group => $group,
- checksum => md5,
mode => $mode,
- alias => "concat_${name}";
+ owner => $owner,
+ source => "${fragdir}/${concat_name}",
}
- exec{"concat_${name}":
- notify => File[$name],
- subscribe => File[$fragdir],
- alias => "concat_${fragdir}",
- require => [ File[$fragdir], File["${fragdir}/fragments"], File["${fragdir}/fragments.concat"] ],
- unless => "${concat::setup::concatdir}/bin/concatfragments.sh -o ${fragdir}/${concat_name} -d ${fragdir} -t ${warnflag} ${forceflag} ${orderflag}",
- command => "${concat::setup::concatdir}/bin/concatfragments.sh -o ${fragdir}/${concat_name} -d ${fragdir} ${warnflag} ${forceflag} ${orderflag}",
+ exec { "concat_${name}":
+ alias => "concat_${fragdir}",
+ command => "${concat::setup::concatdir}/bin/concatfragments.sh -o ${fragdir}/${concat_name} -d ${fragdir} ${warnflag} ${forceflag} ${orderflag}",
+ notify => File[$name],
+ require => [
+ File[$fragdir],
+ File["${fragdir}/fragments"],
+ File["${fragdir}/fragments.concat"],
+ ],
+ subscribe => File[$fragdir],
+ unless => "${concat::setup::concatdir}/bin/concatfragments.sh -o ${fragdir}/${concat_name} -d ${fragdir} -t ${warnflag} ${forceflag} ${orderflag}",
}
+
if $::id == 'root' {
- Exec["concat_${name}"]{
- user => root,
- group => $group,
+ Exec["concat_${name}"] {
+ user => root,
+ group => $group,
}
}
}
+
+# vim:sw=2:ts=2:expandtab:textwidth=79
diff --git a/manifests/setup.pp b/manifests/setup.pp
index 38aeb96..fc6cb93 100644
--- a/manifests/setup.pp
+++ b/manifests/setup.pp
@@ -26,15 +26,16 @@ class concat::setup {
}
$majorversion = regsubst($::puppetversion, '^[0-9]+[.]([0-9]+)[.][0-9]+$', '\1')
+ $fragments_source = $majorversion ? {
+ 24 => 'puppet:///concat/concatfragments.sh',
+ default => 'puppet:///modules/concat/concatfragments.sh'
+ }
file{"${concatdir}/bin/concatfragments.sh":
owner => $id,
group => $root_group,
mode => '0755',
- source => $majorversion ? {
- 24 => 'puppet:///concat/concatfragments.sh',
- default => 'puppet:///modules/concat/concatfragments.sh'
- };
+ source => $fragments_source;
[ $concatdir, "${concatdir}/bin" ]:
ensure => directory,
diff --git a/spec/defines/init_spec.rb b/spec/defines/init_spec.rb
index d968a26..172929a 100644
--- a/spec/defines/init_spec.rb
+++ b/spec/defines/init_spec.rb
@@ -3,18 +3,113 @@ require 'spec_helper'
describe 'concat' do
basedir = '/var/lib/puppet/concat'
let(:title) { '/etc/foo.bar' }
- let(:facts) { { :concat_basedir => '/var/lib/puppet/concat' } }
+ let(:facts) { {
+ :concat_basedir => '/var/lib/puppet/concat',
+ :id => 'root',
+ } }
let :pre_condition do
'include concat::setup'
end
- it { should contain_file("#{basedir}/_etc_foo.bar").with('ensure' => 'directory') }
- it { should contain_file("#{basedir}/_etc_foo.bar/fragments").with('ensure' => 'directory') }
- it { should contain_file("#{basedir}/_etc_foo.bar/fragments.concat").with('ensure' => 'present') }
- it { should contain_file("/etc/foo.bar").with('ensure' => 'present') }
- it { should contain_exec("concat_/etc/foo.bar").with_command(
- "#{basedir}/bin/concatfragments.sh "+
- "-o #{basedir}/_etc_foo.bar/fragments.concat.out "+
- "-d #{basedir}/_etc_foo.bar ")
- }
+ directories = [
+ "#{basedir}/_etc_foo.bar",
+ "#{basedir}/_etc_foo.bar/fragments",
+ ]
+
+ directories.each do |dirs|
+ it do
+ should contain_file(dirs).with({
+ 'ensure' => 'directory',
+ 'backup' => 'puppet',
+ 'group' => 0,
+ 'mode' => '0644',
+ 'owner' => 'root',
+ })
+ end
+ end
+
+ files = [
+ "/etc/foo.bar",
+ "#{basedir}/_etc_foo.bar/fragments.concat",
+ ]
+
+ files.each do |file|
+ it do
+ should contain_file(file).with({
+ 'ensure' => 'present',
+ 'backup' => 'puppet',
+ 'group' => 0,
+ 'mode' => '0644',
+ 'owner' => 'root',
+ })
+ end
+ end
+
+ it do
+ should contain_exec("concat_/etc/foo.bar").with_command(
+ "#{basedir}/bin/concatfragments.sh " +
+ "-o #{basedir}/_etc_foo.bar/fragments.concat.out " +
+ "-d #{basedir}/_etc_foo.bar "
+ )
+ end
+end
+
+describe 'concat' do
+
+ basedir = '/var/lib/puppet/concat'
+ let(:title) { 'foobar' }
+ let(:target) { '/etc/foo.bar' }
+ let(:facts) { {
+ :concat_basedir => '/var/lib/puppet/concat',
+ :id => 'root',
+ } }
+ let :pre_condition do
+ 'include concat::setup'
+ end
+
+ directories = [
+ "#{basedir}/foobar",
+ "#{basedir}/foobar/fragments",
+ ]
+
+ directories.each do |dirs|
+ it do
+ should contain_file(dirs).with({
+ 'ensure' => 'directory',
+ 'backup' => 'puppet',
+ 'group' => 0,
+ 'mode' => '0644',
+ 'owner' => 'root',
+ })
+ end
+ end
+
+ files = [
+ "foobar",
+ "#{basedir}/foobar/fragments.concat",
+ ]
+
+ files.each do |file|
+ it do
+ should contain_file(file).with({
+ 'ensure' => 'present',
+ 'backup' => 'puppet',
+ 'group' => 0,
+ 'mode' => '0644',
+ 'owner' => 'root',
+ })
+ end
+ end
+
+ it do
+ should contain_exec("concat_foobar").with_command(
+ "#{basedir}/bin/concatfragments.sh " +
+ "-o #{basedir}/foobar/fragments.concat.out " +
+ "-d #{basedir}/foobar "
+ )
+ end
+
+
end
+
+# vim:sw=2:ts=2:expandtab:textwidth=79
diff --git a/spec/fixtures/manifests/site.pp b/spec/fixtures/manifests/site.pp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/spec/fixtures/manifests/site.pp
diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb
index e6e9309..2c6f566 100644
--- a/spec/spec_helper.rb
+++ b/spec/spec_helper.rb
@@ -1,9 +1 @@
-require 'puppet'
-require 'rspec'
-require 'rspec-puppet'
-
-RSpec.configure do |c|
- c.module_path = File.expand_path(File.join(File.dirname(__FILE__), 'fixtures/modules/'))
- # Using an empty site.pp file to avoid: https://github.com/rodjek/rspec-puppet/issues/15
- c.manifest_dir = File.expand_path(File.join(File.dirname(__FILE__), 'fixtures/manifests'))
-end
+require 'puppetlabs_spec_helper/module_spec_helper'