dev/provisioning/modules/concat/manifests/init.pp
changeset 28 b0b56e0f8c7f
equal deleted inserted replaced
27:a2342f26c9de 28:b0b56e0f8c7f
       
     1 # == Define: concat
       
     2 #
       
     3 # Sets up so that you can use fragments to build a final config file,
       
     4 #
       
     5 # === Options:
       
     6 #
       
     7 # [*ensure*]
       
     8 #   Present/Absent
       
     9 # [*path*]
       
    10 #   The path to the final file. Use this in case you want to differentiate
       
    11 #   between the name of a resource and the file path.  Note: Use the name you
       
    12 #   provided in the target of your fragments.
       
    13 # [*owner*]
       
    14 #   Who will own the file
       
    15 # [*group*]
       
    16 #   Who will own the file
       
    17 # [*mode*]
       
    18 #   The mode of the final file
       
    19 # [*force*]
       
    20 #   Enables creating empty files if no fragments are present
       
    21 # [*warn*]
       
    22 #   Adds a normal shell style comment top of the file indicating that it is
       
    23 #   built by puppet
       
    24 # [*force*]
       
    25 # [*backup*]
       
    26 #   Controls the filebucketing behavior of the final file and see File type
       
    27 #   reference for its use.  Defaults to 'puppet'
       
    28 # [*replace*]
       
    29 #   Whether to replace a file that already exists on the local system
       
    30 # [*order*]
       
    31 # [*ensure_newline*]
       
    32 # [*gnu*]
       
    33 #   Deprecated
       
    34 #
       
    35 # === Actions:
       
    36 # * Creates fragment directories if it didn't exist already
       
    37 # * Executes the concatfragments.rb script to build the final file, this
       
    38 #   script will create directory/fragments.concat.   Execution happens only
       
    39 #   when:
       
    40 #   * The directory changes
       
    41 #   * fragments.concat != final destination, this means rebuilds will happen
       
    42 #     whenever someone changes or deletes the final file.  Checking is done
       
    43 #     using /usr/bin/cmp.
       
    44 #   * The Exec gets notified by something else - like the concat::fragment
       
    45 #     define
       
    46 # * Copies the file over to the final destination using a file resource
       
    47 #
       
    48 # === Aliases:
       
    49 #
       
    50 # * The exec can notified using Exec["concat_/path/to/file"] or
       
    51 #   Exec["concat_/path/to/directory"]
       
    52 # * The final file can be referenced as File["/path/to/file"] or
       
    53 #   File["concat_/path/to/file"]
       
    54 #
       
    55 define concat(
       
    56   $ensure         = 'present',
       
    57   $path           = $name,
       
    58   $owner          = undef,
       
    59   $group          = undef,
       
    60   $mode           = '0644',
       
    61   $warn           = false,
       
    62   $force          = false,
       
    63   $backup         = 'puppet',
       
    64   $replace        = true,
       
    65   $order          = 'alpha',
       
    66   $ensure_newline = false,
       
    67   $validate_cmd   = undef,
       
    68   $gnu            = undef
       
    69 ) {
       
    70   validate_re($ensure, '^present$|^absent$')
       
    71   validate_absolute_path($path)
       
    72   validate_string($owner)
       
    73   validate_string($group)
       
    74   validate_string($mode)
       
    75   if ! (is_string($warn) or $warn == true or $warn == false) {
       
    76     fail('$warn is not a string or boolean')
       
    77   }
       
    78   validate_bool($force)
       
    79   if ! concat_is_bool($backup) and ! is_string($backup) {
       
    80     fail('$backup must be string or bool!')
       
    81   }
       
    82   validate_bool($replace)
       
    83   validate_re($order, '^alpha$|^numeric$')
       
    84   validate_bool($ensure_newline)
       
    85   if $validate_cmd and ! is_string($validate_cmd) {
       
    86     fail('$validate_cmd must be a string')
       
    87   }
       
    88   if $gnu {
       
    89     warning('The $gnu parameter to concat is deprecated and has no effect')
       
    90   }
       
    91 
       
    92   include concat::setup
       
    93 
       
    94   $safe_name            = regsubst($name, '[/:]', '_', 'G')
       
    95   $concatdir            = $concat::setup::concatdir
       
    96   $fragdir              = "${concatdir}/${safe_name}"
       
    97   $concat_name          = 'fragments.concat.out'
       
    98   $script_command       = $concat::setup::script_command
       
    99   $default_warn_message = '# This file is managed by Puppet. DO NOT EDIT.'
       
   100   $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'
       
   101 
       
   102   # lint:ignore:quoted_booleans
       
   103   case $warn {
       
   104     true: {
       
   105       $warn_message = $default_warn_message
       
   106     }
       
   107     # lint:ignore:quoted_booleans
       
   108     'true', 'yes', 'on': {
       
   109     # lint:endignore
       
   110       warning($bool_warn_message)
       
   111       $warn_message = $default_warn_message
       
   112     }
       
   113     false: {
       
   114       $warn_message = ''
       
   115     }
       
   116     # lint:ignore:quoted_booleans
       
   117     'false', 'no', 'off': {
       
   118     # lint:endignore
       
   119       warning($bool_warn_message)
       
   120       $warn_message = ''
       
   121     }
       
   122     default: {
       
   123       $warn_message = $warn
       
   124     }
       
   125   }
       
   126   # lint:endignore
       
   127 
       
   128   $warnmsg_escaped = regsubst($warn_message, '\'', '\'\\\'\'', 'G')
       
   129   $warnflag = $warnmsg_escaped ? {
       
   130     ''      => '',
       
   131     default => "-w '${warnmsg_escaped}'"
       
   132   }
       
   133 
       
   134   $forceflag = $force ? {
       
   135     true  => '-f',
       
   136     false => '',
       
   137   }
       
   138 
       
   139   $orderflag = $order ? {
       
   140     'numeric' => '-n',
       
   141     'alpha'   => '',
       
   142   }
       
   143 
       
   144   $newlineflag = $ensure_newline ? {
       
   145     true  => '-l',
       
   146     false => '',
       
   147   }
       
   148 
       
   149   File {
       
   150     backup  => $backup,
       
   151   }
       
   152 
       
   153   # reset poisoned Exec defaults
       
   154   Exec {
       
   155     user  => undef,
       
   156     group => undef,
       
   157   }
       
   158 
       
   159   if $ensure == 'present' {
       
   160     file { $fragdir:
       
   161       ensure => directory,
       
   162       mode   => '0750',
       
   163     }
       
   164 
       
   165     file { "${fragdir}/fragments":
       
   166       ensure  => directory,
       
   167       mode    => '0750',
       
   168       force   => true,
       
   169       ignore  => ['.svn', '.git', '.gitignore'],
       
   170       notify  => Exec["concat_${name}"],
       
   171       purge   => true,
       
   172       recurse => true,
       
   173     }
       
   174 
       
   175     file { "${fragdir}/fragments.concat":
       
   176       ensure => present,
       
   177       mode   => '0640',
       
   178     }
       
   179 
       
   180     file { "${fragdir}/${concat_name}":
       
   181       ensure => present,
       
   182       mode   => '0640',
       
   183     }
       
   184 
       
   185     file { $name:
       
   186       ensure  => present,
       
   187       owner   => $owner,
       
   188       group   => $group,
       
   189       mode    => $mode,
       
   190       replace => $replace,
       
   191       path    => $path,
       
   192       alias   => "concat_${name}",
       
   193       source  => "${fragdir}/${concat_name}",
       
   194       backup  => $backup,
       
   195     }
       
   196 
       
   197     # Only newer versions of puppet 3.x support the validate_cmd parameter
       
   198     if $validate_cmd {
       
   199       File[$name] {
       
   200         validate_cmd => $validate_cmd,
       
   201       }
       
   202     }
       
   203 
       
   204     # remove extra whitespace from string interpolation to make testing easier
       
   205     $command = strip(regsubst("${script_command} -o \"${fragdir}/${concat_name}\" -d \"${fragdir}\" ${warnflag} ${forceflag} ${orderflag} ${newlineflag}", '\s+', ' ', 'G'))
       
   206 
       
   207     # make sure ruby is in the path for PE
       
   208     if defined('$is_pe') and str2bool("${::is_pe}") { # lint:ignore:only_variable_string
       
   209       if $::kernel == 'windows' {
       
   210         $command_path = "${::env_windows_installdir}/bin:${::path}"
       
   211       } else {
       
   212         $command_path = "/opt/puppetlabs/puppet/bin:/opt/puppet/bin:${::path}"
       
   213       }
       
   214     } elsif $::kernel == 'windows' {
       
   215       $command_path = $::path
       
   216     } else {
       
   217       $command_path = "/opt/puppetlabs/puppet/bin:${::path}"
       
   218     }
       
   219 
       
   220     # if puppet is running as root, this exec should also run as root to allow
       
   221     # the concatfragments.rb script to potentially be installed in path that
       
   222     # may not be accessible by a target non-root owner.
       
   223     exec { "concat_${name}":
       
   224       alias     => "concat_${fragdir}",
       
   225       command   => $command,
       
   226       notify    => File[$name],
       
   227       subscribe => File[$fragdir],
       
   228       unless    => "${command} -t",
       
   229       path      => $command_path,
       
   230       require   => [
       
   231         File[$fragdir],
       
   232         File["${fragdir}/fragments"],
       
   233         File["${fragdir}/fragments.concat"],
       
   234       ],
       
   235     }
       
   236   } else {
       
   237     file { [
       
   238       $fragdir,
       
   239       "${fragdir}/fragments",
       
   240       "${fragdir}/fragments.concat",
       
   241       "${fragdir}/${concat_name}"
       
   242     ]:
       
   243       ensure => absent,
       
   244       force  => true,
       
   245     }
       
   246 
       
   247     file { $path:
       
   248       ensure => absent,
       
   249       backup => $backup,
       
   250     }
       
   251 
       
   252     # lint:ignore:quoted_booleans
       
   253     $absent_exec_command = $::kernel ? {
       
   254       'windows' => 'cmd.exe /c exit 0',
       
   255     # lint:ignore:quoted_booleans
       
   256       default   => 'true',
       
   257     # lint:endignore
       
   258     }
       
   259     # lint:endignore
       
   260 
       
   261     $absent_exec_path = $::kernel ? {
       
   262       'windows' => $::path,
       
   263       default   => '/bin:/usr/bin',
       
   264     }
       
   265 
       
   266     # Need to have an unless here for idempotency.
       
   267     exec { "concat_${name}":
       
   268       alias   => "concat_${fragdir}",
       
   269       command => $absent_exec_command,
       
   270       unless  => $absent_exec_command,
       
   271       path    => $absent_exec_path,
       
   272     }
       
   273   }
       
   274 }
       
   275 
       
   276 # vim:sw=2:ts=2:expandtab:textwidth=79