dev/provisioning/modules/archive/manifests/extract.pp
changeset 28 b0b56e0f8c7f
child 405 f239c8c5bb94
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dev/provisioning/modules/archive/manifests/extract.pp	Fri Jan 15 15:35:00 2016 +0100
@@ -0,0 +1,93 @@
+# == Definition: archive::extract
+#
+# Archive extractor.
+#
+# Parameters:
+#
+# - *$target: Destination directory
+# - *$src_target: Default value "/usr/src".
+# - *$root_dir: Default value "".
+# - *$extension: Default value ".tar.gz".
+# - *$timeout: Default value 120.
+# - *$strip_components: Default value 0.
+# - *$user: The user used to do the extraction.
+#
+# Example usage:
+#
+#   archive::extract {"apache-tomcat-6.0.26":
+#     ensure => present,
+#     target => "/opt",
+#   }
+#
+# This means we want to extract the local archive
+# (maybe downloaded with archive::download)
+# '/usr/src/apache-tomcat-6.0.26.tar.gz' in '/src/apache-tomcat-6.0.26'
+#
+# Warning:
+#
+# The parameter *$root_dir* must be used if the root directory of the archive
+# is different from the name of the archive *$name*. To extract the name of
+# the root directory use the commands "tar tf archive.tar.gz" or
+# "unzip -l archive.zip"
+#
+define archive::extract (
+  $target,
+  $ensure=present,
+  $src_target='/usr/src',
+  $root_dir=undef,
+  $extension='tar.gz',
+  $timeout=120,
+  $path=$::path,
+  $strip_components=0,
+  $purge=false,
+  $user=undef,
+) {
+
+  if $root_dir {
+    $extract_dir = "${target}/${root_dir}"
+  } else {
+    $extract_dir = "${target}/${name}"
+  }
+
+  case $ensure {
+    'present': {
+
+      $extract_zip    = "unzip -o ${src_target}/${name}.${extension} -d ${target}"
+      $extract_targz  = "tar --no-same-owner --no-same-permissions --strip-components=${strip_components} -xzf ${src_target}/${name}.${extension} -C ${target}"
+      $extract_tarbz2 = "tar --no-same-owner --no-same-permissions --strip-components=${strip_components} -xjf ${src_target}/${name}.${extension} -C ${target}"
+      $extract_tarxz  = "tar --no-same-owner --no-same-permissions --strip-components=${strip_components} -xpf ${src_target}/${name}.${extension} -C ${target}"
+
+      $purge_command = $purge ? {
+        true    => "rm -rf ${target} && ",
+        default => '',
+      }
+
+      $command = $extension ? {
+        'zip'     => "${purge_command}mkdir -p ${target} && ${extract_zip}",
+        'tar.gz'  => "${purge_command}mkdir -p ${target} && ${extract_targz}",
+        'tgz'     => "${purge_command}mkdir -p ${target} && ${extract_targz}",
+        'tar.bz2' => "${purge_command}mkdir -p ${target} && ${extract_tarbz2}",
+        'tgz2'    => "${purge_command}mkdir -p ${target} && ${extract_tarbz2}",
+        'tar.xz'  => "${purge_command}mkdir -p ${target} && ${extract_tarxz}",
+        'txz'     => "${purge_command}mkdir -p ${target} && ${extract_tarxz}",
+        default   => fail ( "Unknown extension value '${extension}'" ),
+      }
+      exec {"${name} unpack":
+        command => $command,
+        creates => $extract_dir,
+        timeout => $timeout,
+        user    => $user,
+        path    => $path,
+      }
+    }
+    'absent': {
+      file {$extract_dir:
+        ensure  => absent,
+        recurse => true,
+        purge   => true,
+        force   => true,
+      }
+    }
+    default: { err ( "Unknown ensure value: '${ensure}'" ) }
+  }
+}