diff -r a2342f26c9de -r b0b56e0f8c7f dev/provisioning/modules/puppi/manifests/netinstall.pp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dev/provisioning/modules/puppi/manifests/netinstall.pp Fri Jan 15 15:35:00 2016 +0100 @@ -0,0 +1,169 @@ +# Define: puppi::netinstall +# +# This defines simplifies the installation of a file +# downloaded from the web. It provides arguments to manage +# different kind of downloads and custom commands. +# It's used, among the others, by NextGen modules of webapps +# when the argument install is set to => source +# +# == Variables +# +# [*url*] +# The Url of the file to retrieve. Required. +# Example: http://www.example42.com/file.tar.gz +# +# [*destination_dir*] +# The final destination where to unpack or copy what has been +# downloaded. Required. +# Example: /var/www/html +# +# [*retrieve_args*] +# A string of arguments to pass to wget. +# +# [*extracted_dir*] +# The name of a directory or file created after the extraction +# Needed only if its name is different from the downloaded file name +# (without suffixes). Optional. +# +# [*owner*] +# The user owner of the directory / file created. Default: root +# +# [*group*] +# The group owner of the directory / file created. Default: root +# +# [*timeout*] +# The timeout in seconds for each command executed +# +# [*work_dir*] +# A temporary work dir where file is downloaded. Default: /var/tmp +# +# [*path*] +# Define the path for the exec commands. +# Default: /bin:/sbin:/usr/bin:/usr/sbin +# +# [*exec_env*] +# Define any additional environment variables to be used with the +# exec commands. Note that if you use this to set PATH, it will +# override the path attribute. Multiple environment variables +# should be specified as an array. +# +# [*extract_command*] +# The command used to extract the downloaded file. +# By default is autocalculated accoring to the file extension +# Set 'rsync' if the file has to be placed in the destination_dir +# as is (for example for war files) +# +# [*preextract_command*] +# An optional custom command to run before extracting the file. +# +# [*postextract_command*] +# An optional custom command to run after having extracted the file. +# +define puppi::netinstall ( + $url, + $destination_dir, + $extracted_dir = '', + $retrieve_command = 'wget', + $retrieve_args = '', + $owner = 'root', + $group = 'root', + $timeout = '3600', + $work_dir = '/var/tmp', + $path = '/bin:/sbin:/usr/bin:/usr/sbin', + $extract_command = '', + $preextract_command = '', + $postextract_command = '', + $postextract_cwd = '', + $exec_env = [] + ) { + + $source_filename = url_parse($url,'filename') + $source_filetype = url_parse($url,'filetype') + $source_dirname = url_parse($url,'filedir') + + $real_extract_command = $extract_command ? { + '' => $source_filetype ? { + '.tgz' => 'tar -zxf', + '.gz' => 'tar -zxf', + '.bz2' => 'tar -jxf', + '.tar' => 'tar -xf', + '.zip' => 'unzip', + default => 'tar -zxf', + }, + default => $extract_command, + } + + $extract_command_second_arg = $real_extract_command ? { + /^cp.*/ => '.', + /^rsync.*/ => '.', + default => '', + } + + $real_extracted_dir = $extracted_dir ? { + '' => $real_extract_command ? { + /(^cp.*|^rsync.*)/ => $source_filename, + /(^tar -zxf*|^tar -jxf*)/ => regsubst($source_dirname,'.tar',''), + default => $source_dirname, + }, + default => $extracted_dir, + } + + $real_postextract_cwd = $postextract_cwd ? { + '' => "${destination_dir}/${real_extracted_dir}", + default => $postextract_cwd, + } + + if $preextract_command { + exec { "PreExtract ${source_filename} in ${destination_dir} - ${title}": + command => $preextract_command, + subscribe => Exec["Retrieve ${url} in ${work_dir} - ${title}"], + refreshonly => true, + path => $path, + environment => $exec_env, + timeout => $timeout, + } + } + + exec { "Retrieve ${url} in ${work_dir} - ${title}": + cwd => $work_dir, + command => "${retrieve_command} ${retrieve_args} ${url}", + creates => "${work_dir}/${source_filename}", + timeout => $timeout, + path => $path, + environment => $exec_env, + } + + exec { "Extract ${source_filename} from ${work_dir} - ${title}": + command => "mkdir -p ${destination_dir} && cd ${destination_dir} && ${real_extract_command} ${work_dir}/${source_filename} ${extract_command_second_arg}", + unless => "ls ${destination_dir}/${real_extracted_dir}", + creates => "${destination_dir}/${real_extracted_dir}", + timeout => $timeout, + require => Exec["Retrieve ${url} in ${work_dir} - ${title}"], + path => $path, + environment => $exec_env, + notify => Exec["Chown ${source_filename} in ${destination_dir} - ${title}"], + } + + exec { "Chown ${source_filename} in ${destination_dir} - ${title}": + command => "chown -R ${owner}:${group} ${destination_dir}/${real_extracted_dir}", + refreshonly => true, + timeout => $timeout, + require => Exec["Extract ${source_filename} from ${work_dir} - ${title}"], + path => $path, + environment => $exec_env, + } + + if $postextract_command { + exec { "PostExtract ${source_filename} in ${destination_dir} - ${title}": + command => $postextract_command, + cwd => $real_postextract_cwd, + subscribe => Exec["Extract ${source_filename} from ${work_dir} - ${title}"], + refreshonly => true, + timeout => $timeout, + require => [Exec["Retrieve ${url} in ${work_dir} - ${title}"],Exec["Chown ${source_filename} in ${destination_dir} - ${title}"]], + path => $path, + environment => $exec_env, + } + } +} +