diff options
-rw-r--r-- | .fixtures.yml | 3 | ||||
-rw-r--r-- | .gemfile | 7 | ||||
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | .travis.yml | 12 | ||||
-rw-r--r-- | CHANGELOG | 23 | ||||
-rw-r--r-- | Modulefile | 4 | ||||
-rw-r--r-- | README.markdown | 56 | ||||
-rw-r--r-- | Rakefile | 15 | ||||
-rw-r--r-- | manifests/fragment.pp | 9 | ||||
-rw-r--r-- | manifests/init.pp | 185 | ||||
-rw-r--r-- | manifests/setup.pp | 9 | ||||
-rw-r--r-- | spec/defines/init_spec.rb | 115 | ||||
-rw-r--r-- | spec/fixtures/manifests/site.pp | 0 | ||||
-rw-r--r-- | spec/spec_helper.rb | 10 |
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 @@ -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 @@ -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 @@ -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' |