--- /dev/null
+# Define resource to extract files from staging directories to target directories.
+define staging::extract (
+ $target, #: the target extraction directory
+ $source = undef, #: the source compression file, supports tar, tar.gz, zip, war
+ $creates = undef, #: the file created after extraction. if unspecified defaults ${staging::path}/${caller_module_name}/${name} ${target}/${name}
+ $unless = undef, #: alternative way to conditionally check whether to extract file.
+ $onlyif = undef, #: alternative way to conditionally check whether to extract file.
+ $user = undef, #: extract file as this user.
+ $group = undef, #: extract file as this group.
+ $environment = undef, #: environment variables.
+ $strip = undef, #: extract file with the --strip=X option. Only works with GNU tar.
+ $subdir = $caller_module_name #: subdir per module in staging directory.
+) {
+
+ include staging
+
+ if $source {
+ $source_path = $source
+ } else {
+ $source_path = "${staging::path}/${subdir}/${name}"
+ }
+
+ # Use user supplied creates path, set default value if creates, unless or
+ # onlyif is not supplied.
+ if $creates {
+ $creates_path = $creates
+ } elsif ! ($unless or $onlyif) {
+ if $name =~ /.tar.gz$/ {
+ $folder = staging_parse($name, 'basename', '.tar.gz')
+ } elsif $name =~ /.tar.bz2$/ {
+ $folder = staging_parse($name, 'basename', '.tar.bz2')
+ } else {
+ $folder = staging_parse($name, 'basename')
+ }
+ $creates_path = "${target}/${folder}"
+ } else {
+ $creates_path = undef
+ }
+
+ if scope_defaults('Exec','path') {
+ Exec{
+ cwd => $target,
+ user => $user,
+ group => $group,
+ environment => $environment,
+ creates => $creates_path,
+ unless => $unless,
+ onlyif => $onlyif,
+ logoutput => on_failure,
+ }
+ } else {
+ Exec{
+ path => $::path,
+ cwd => $target,
+ user => $user,
+ group => $group,
+ environment => $environment,
+ creates => $creates_path,
+ unless => $unless,
+ onlyif => $onlyif,
+ logoutput => on_failure,
+ }
+ }
+
+ if $strip {
+ if $::osfamily == 'Solaris' or $name !~ /(.tar|.tgz|.tar.gz|.tar.bz2)$/ {
+ warning('strip is only supported with GNU tar, ignoring the parameter')
+ $strip_opt = ''
+ } else {
+ $strip_opt = " --strip=${strip}"
+ }
+ } else {
+ $strip_opt = ''
+ }
+
+ case $name {
+ /.tar$/: {
+ $command = "tar xf ${source_path}${strip_opt}"
+ }
+
+ /(.tgz|.tar.gz)$/: {
+ if $::osfamily == 'Solaris' {
+ $command = "gunzip -dc < ${source_path} | tar xf - "
+ } else {
+ $command = "tar xzf ${source_path}${strip_opt}"
+ }
+ }
+
+ /.tar.bz2$/: {
+ $command = "tar xjf ${source_path}${strip_opt}"
+ }
+
+ /.zip$/: {
+ $command = "unzip ${source_path}"
+ }
+
+ /(.war|.jar)$/: {
+ $command = "jar xf ${source_path}"
+ }
+
+ default: {
+ fail("staging::extract: unsupported file format ${name}.")
+ }
+ }
+
+ exec { "extract ${name}":
+ command => $command,
+ }
+}