X-Git-Url: https://git.donarmstrong.com/?p=dsa-puppet.git;a=blobdiff_plain;f=3rdparty%2Fmodules%2Fconcat%2Fmanifests%2Finit.pp;fp=3rdparty%2Fmodules%2Fconcat%2Fmanifests%2Finit.pp;h=c44c0328483d52a98ecfae81ee33aca5acbc3a8f;hp=5bf53fc8354b1be9dc4c7f5b055fa82f8d7e35b6;hb=917f80937c03a7f486d25fa70373f1f4d4b02958;hpb=ad88f67c13ae0f1a08936dad643f1e3509ab5f40 diff --git a/3rdparty/modules/concat/manifests/init.pp b/3rdparty/modules/concat/manifests/init.pp index 5bf53fc8..c44c0328 100644 --- a/3rdparty/modules/concat/manifests/init.pp +++ b/3rdparty/modules/concat/manifests/init.pp @@ -16,26 +16,42 @@ # Who will own the file # [*mode*] # The mode of the final file +# [*force*] +# Enables creating empty files if no fragments are present # [*warn*] # Adds a normal shell style comment top of the file indicating that it is # built by puppet +# [*force*] # [*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 # [*order*] -# Select whether to order associated fragments by 'alpha' or 'numeric'. -# Defaults to 'alpha'. # [*ensure_newline*] -# Specifies whether to ensure there's a new line at the end of each fragment. -# Valid options: 'true' and 'false'. Default value: 'false'. -# [*validate_cmd*] -# Specifies a validation command to apply to the destination file. -# Requires Puppet version 3.5 or newer. Valid options: a string to be passed -# to a file resource. Default value: undefined. +# [*gnu*] +# Deprecated +# +# === Actions: +# * Creates fragment directories if it didn't exist already +# * Executes the concatfragments.rb 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 +# * 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 referenced as File["/path/to/file"] or +# File["concat_/path/to/file"] # - define concat( $ensure = 'present', $path = $name, @@ -43,12 +59,13 @@ define concat( $group = undef, $mode = '0644', $warn = false, - $force = undef, + $force = false, $backup = 'puppet', $replace = true, $order = 'alpha', $ensure_newline = false, $validate_cmd = undef, + $gnu = undef ) { validate_re($ensure, '^present$|^absent$') validate_absolute_path($path) @@ -58,67 +75,190 @@ define concat( if ! (is_string($warn) or $warn == true or $warn == false) { fail('$warn is not a string or boolean') } - if ! is_bool($backup) and ! is_string($backup) { + validate_bool($force) + if ! concat_is_bool($backup) and ! is_string($backup) { fail('$backup must be string or bool!') } validate_bool($replace) validate_re($order, '^alpha$|^numeric$') validate_bool($ensure_newline) - if $validate_cmd and ! is_string($validate_cmd) { fail('$validate_cmd must be a string') } - - if $force != undef { - warning('The $force parameter to concat is deprecated and has no effect.') + if $gnu { + warning('The $gnu parameter to concat is deprecated and has no effect') } - $safe_name = regsubst($name, '[/:\n\s]', '_', 'G') - $default_warn_message = "# This file is managed by Puppet. DO NOT EDIT.\n" + include concat::setup + + $safe_name = regsubst($name, '[/:]', '_', 'G') + $concatdir = $concat::setup::concatdir + $fragdir = "${concatdir}/${safe_name}" + $concat_name = 'fragments.concat.out' + $script_command = $concat::setup::script_command + $default_warn_message = '# This file is managed by Puppet. DO NOT EDIT.' + $bool_warn_message = 'Using stringified boolean values (\'true\', \'yes\', \'on\', \'false\', \'no\', \'off\') to represent boolean true/false as the $warn parameter to concat is deprecated and will be treated as the warning message in a future release' case $warn { true: { $warn_message = $default_warn_message - $_append_header = true + } + 'true', 'yes', 'on': { + warning($bool_warn_message) + $warn_message = $default_warn_message } false: { $warn_message = '' - $_append_header = false + } + 'false', 'no', 'off': { + warning($bool_warn_message) + $warn_message = '' } default: { $warn_message = $warn - $_append_header = true } } + $warnmsg_escaped = regsubst($warn_message, '\'', '\'\\\'\'', 'G') + $warnflag = $warnmsg_escaped ? { + '' => '', + default => "-w '${warnmsg_escaped}'" + } + + $forceflag = $force ? { + true => '-f', + false => '', + } + + $orderflag = $order ? { + 'numeric' => '-n', + 'alpha' => '', + } + + $newlineflag = $ensure_newline ? { + true => '-l', + false => '', + } + + File { + backup => $backup, + } + + # reset poisoned Exec defaults + Exec { + user => undef, + group => undef, + } + if $ensure == 'present' { - concat_file { $name: - tag => $safe_name, - path => $path, - owner => $owner, - group => $group, - mode => $mode, - replace => $replace, - backup => $backup, - order => $order, - ensure_newline => $ensure_newline, - validate_cmd => $validate_cmd, - } - - if $_append_header { - concat_fragment { "${name}_header": - tag => $safe_name, - content => $warn_message, - order => '0', + file { $fragdir: + ensure => directory, + mode => '0750', + } + + file { "${fragdir}/fragments": + ensure => directory, + mode => '0750', + force => true, + ignore => ['.svn', '.git', '.gitignore'], + notify => Exec["concat_${name}"], + purge => true, + recurse => true, + } + + file { "${fragdir}/fragments.concat": + ensure => present, + mode => '0640', + } + + file { "${fragdir}/${concat_name}": + ensure => present, + mode => '0640', + } + + file { $name: + ensure => present, + owner => $owner, + group => $group, + mode => $mode, + replace => $replace, + path => $path, + alias => "concat_${name}", + source => "${fragdir}/${concat_name}", + backup => $backup, + } + + # Only newer versions of puppet 3.x support the validate_cmd parameter + if $validate_cmd { + File[$name] { + validate_cmd => $validate_cmd, } } + + # remove extra whitespace from string interpolation to make testing easier + $command = strip(regsubst("${script_command} -o \"${fragdir}/${concat_name}\" -d \"${fragdir}\" ${warnflag} ${forceflag} ${orderflag} ${newlineflag}", '\s+', ' ', 'G')) + + # make sure ruby is in the path for PE + if defined('$is_pe') and $::is_pe { + if $::kernel == 'windows' { + $command_path = "${::env_windows_installdir}/bin:${::path}" + } else { + $command_path = "/opt/puppet/bin:${::path}" + } + } else { + $command_path = $::path + } + + # if puppet is running as root, this exec should also run as root to allow + # the concatfragments.rb script to potentially be installed in path that + # may not be accessible by a target non-root owner. + exec { "concat_${name}": + alias => "concat_${fragdir}", + command => $command, + notify => File[$name], + subscribe => File[$fragdir], + unless => "${command} -t", + path => $command_path, + require => [ + File[$fragdir], + File["${fragdir}/fragments"], + File["${fragdir}/fragments.concat"], + ], + } } else { - concat_file { $name: - ensure => $ensure, - tag => $safe_name, - path => $path, + file { [ + $fragdir, + "${fragdir}/fragments", + "${fragdir}/fragments.concat", + "${fragdir}/${concat_name}" + ]: + ensure => absent, + force => true, + } + + file { $path: + ensure => absent, backup => $backup, } + + $absent_exec_command = $::kernel ? { + 'windows' => 'cmd.exe /c exit 0', + default => 'true', + } + + $absent_exec_path = $::kernel ? { + 'windows' => $::path, + default => '/bin:/usr/bin', + } + + # Need to have an unless here for idempotency. + exec { "concat_${name}": + alias => "concat_${fragdir}", + command => $absent_exec_command, + unless => $absent_exec_command, + path => $absent_exec_path, + } } } +# vim:sw=2:ts=2:expandtab:textwidth=79