Add puppet/archive module
[mirror/dsa-puppet.git] / 3rdparty / modules / archive / README.md
diff --git a/3rdparty/modules/archive/README.md b/3rdparty/modules/archive/README.md
new file mode 100644 (file)
index 0000000..d90725e
--- /dev/null
@@ -0,0 +1,517 @@
+# Puppet Archive
+
+[![License](https://img.shields.io/github/license/voxpupuli/puppet-archive.svg)](https://github.com/voxpupuli/puppet-archive/blob/master/LICENSE)
+[![Build Status](https://travis-ci.org/voxpupuli/puppet-archive.png?branch=master)](https://travis-ci.org/voxpupuli/puppet-archive)
+[![Code Coverage](https://coveralls.io/repos/github/voxpupuli/puppet-archive/badge.svg?branch=master)](https://coveralls.io/github/voxpupuli/puppet-archive)
+[![Puppet Forge](https://img.shields.io/puppetforge/v/puppet/archive.svg)](https://forge.puppetlabs.com/puppet/archive)
+[![Puppet Forge - downloads](https://img.shields.io/puppetforge/dt/puppet/archive.svg)](https://forge.puppetlabs.com/puppet/archive)
+[![Puppet Forge - endorsement](https://img.shields.io/puppetforge/e/puppet/archive.svg)](https://forge.puppetlabs.com/puppet/archive)
+[![Puppet Forge - scores](https://img.shields.io/puppetforge/f/puppet/archive.svg)](https://forge.puppetlabs.com/puppet/archive)
+[![Camptocamp compatible](https://img.shields.io/badge/camptocamp-compatible-orange.svg)](https://forge.puppet.com/camptocamp/archive)
+
+#### Table of Contents
+
+1. [Overview](#overview)
+2. [Module Description](#module-description)
+3. [Setup](#setup)
+4. [Usage](#usage)
+   * [Example](#usage-example)
+   * [Puppet URL](#puppet-url)
+   * [File permission](#file-permission)
+   * [Network files](#network-files)
+   * [Extract customization](#extract-customization)
+   * [S3 Bucket](#s3-bucket)
+   * [Migrating from puppet-staging](#migrating-from-puppet-staging)
+5. [Reference](#reference)
+6. [Development](#development)
+
+## Overview
+
+This module manages download, deployment, and cleanup of archive files.
+
+## Module Description
+
+This module uses types and providers to download and manage compress files,
+with optional lifecycle functionality such as checksum, extraction, and
+cleanup. The benefits over existing modules such as
+[puppet-staging](https://github.com/voxpupuli/puppet-staging):
+
+* Implemented via types and provider instead of exec resource.
+* Follows 302 redirect and propagate download failure.
+* Optional checksum verification of archive files.
+* Automatic dependency to parent directory.
+* Support Windows file extraction via 7zip or PowerShell (Zip file only).
+* Able to cleanup archive files after extraction.
+
+This module is compatible with [camptocamp/archive](https://forge.puppet.com/camptocamp/archive).
+For this it provides compatibility shims.
+
+## Setup
+
+On Windows 7zip is required to extract all archives except zip files which will
+be extracted with PowerShell if 7zip is not available (requires 
+`System.IO.Compression.FileSystem`/Windows 2012+). Windows clients can install
+7zip via `include '::archive'`. On posix systems, curl is the default provider. 
+The default provider can be overwritten by configuring resource defaults in 
+site.pp:
+
+```puppet
+Archive {
+  provider => 'ruby',
+}
+```
+
+Users of the module is responsbile for archive package dependencies for
+alternative providers and all extraction utilities such as tar, gunzip, bunzip:
+
+```puppet
+if $::facts['osfamily'] != 'windows' {
+  package { 'wget':
+    ensure => present,
+  }
+
+  package { 'bunzip':
+    ensure => present,
+  }
+
+  Archive {
+    provider => 'wget',
+    require  => Package['wget', 'bunzip'],
+  }
+}
+```
+
+## Usage
+
+Archive module dependency is managed by the archive class. This is only
+required for windows platform. By default 7zip is installed via chocolatey, but
+can be adjusted to use the msi package instead:
+
+```puppet
+class { 'archive':
+  seven_zip_name     => '7-Zip 9.20 (x64 edition)',
+  seven_zip_source   => 'C:/Windows/Temp/7z920-x64.msi',
+  seven_zip_provider => 'windows',
+}
+```
+
+### Usage Example
+
+```puppet
+include '::archive' # NOTE: optional for posix platforms
+
+archive { '/tmp/jta-1.1.jar':
+  ensure        => present,
+  extract       => true,
+  extract_path  => '/tmp',
+  source        => 'http://central.maven.org/maven2/javax/transaction/jta/1.1/jta-1.1.jar',
+  checksum      => '2ca09f0b36ca7d71b762e14ea2ff09d5eac57558',
+  checksum_type => 'sha1',
+  creates       => '/tmp/javax',
+  cleanup       => true,
+}
+
+archive { '/tmp/test100k.db':
+  source   => 'ftp://ftp.otenet.gr/test100k.db',
+  username => 'speedtest',
+  password => 'speedtest',
+}
+```
+
+If you want to extract a `.tar.gz` file:
+
+```puppet
+$install_path        = '/opt/wso2'
+$package_name        = 'wso2esb'
+$package_ensure      = '4.9.0'
+$repository_url      = 'http://company.com/repository/wso2'
+$archive_name        = "${package_name}-${package_ensure}.tgz"
+$wso2_package_source = "${repository_url}/${archive_name}"
+
+archive { $archive_name:
+  path         => "/tmp/${archive_name}",
+  source       => $wso2_package_source,
+  extract      => true,
+  extract_path => $install_path,
+  creates      => "${install_path}/${package_name}-${package_ensure}",
+  cleanup      => true,
+  require      => File['wso2_appdir'],
+}
+```
+
+### Puppet URL
+
+Since march 2017, the Archive type also supports puppet URLs. Here is an example
+of how to use this:
+
+```puppet
+
+archive { '/home/myuser/help':
+  source        => 'puppet:///modules/profile/help.tar.gz',
+  extract       => true,
+  extract_path  => $homedir,
+  creates       => "${homedir}/help" #directory inside tgz
+}
+```
+
+### File permission
+
+When extracting files as non-root user, either ensure the target directory
+exists with the appropriate permission (see [tomcat.pp](tests/tomcat.pp) for
+full working example):
+
+```puppet
+$dirname = 'apache-tomcat-9.0.0.M3'
+$filename = "${dirname}.zip"
+$install_path = "/opt/${dirname}"
+
+file { $install_path:
+  ensure => directory,
+  owner  => 'tomcat',
+  group  => 'tomcat',
+  mode   => '0755',
+}
+
+archive { $filename:
+  path          => "/tmp/${filename}",
+  source        => 'http://www-eu.apache.org/dist/tomcat/tomcat-9/v9.0.0.M3/bin/apache-tomcat-9.0.0.M3.zip',
+  checksum      => 'f2aaf16f5e421b97513c502c03c117fab6569076',
+  checksum_type => 'sha1',
+  extract       => true,
+  extract_path  => '/opt',
+  creates       => "${install_path}/bin",
+  cleanup       => true,
+  user          => 'tomcat',
+  group         => 'tomcat',
+  require       => File[$install_path],
+}
+```
+
+or use an subscribing exec to chmod the directory afterwards:
+
+```puppet
+$dirname = 'apache-tomcat-9.0.0.M3'
+$filename = "${dirname}.zip"
+$install_path = "/opt/${dirname}"
+
+file { '/opt/tomcat':
+  ensure => 'link',
+  target => $install_path
+}
+
+archive { $filename:
+  path          => "/tmp/${filename}",
+  source        => "http://www-eu.apache.org/dist/tomcat/tomcat-9/v9.0.0.M3/bin/apache-tomcat-9.0.0.M3.zip",
+  checksum      => 'f2aaf16f5e421b97513c502c03c117fab6569076',
+  checksum_type => 'sha1',
+  extract       => true,
+  extract_path  => '/opt',
+  creates       => $install_path,
+  cleanup       => 'true',
+  require       => File[$install_path],
+}
+
+exec { 'tomcat permission':
+  command   => "chown tomcat:tomcat $install_path",
+  path      => $::path,
+  subscribe => Archive[$filename],
+}
+```
+
+### Network files
+
+For large binary files that needs to be extracted locally, instead of copying
+the file from the network fileshare, simply set the file path to be the same as
+the source and archive will use the network file location:
+
+```puppet
+archive { '/nfs/repo/software.zip':
+  source        => '/nfs/repo/software.zip'
+  extract       => true,
+  extract_path  => '/opt',
+  checksum_type => 'none', # typically unecessary
+  cleanup       => false,  # keep the file on the server
+}
+```
+
+### Extract Customization
+
+The `extract_flags` or `extract_command` parameters can be used to override the
+default extraction command/flag (defaults are specified in
+[achive.rb](lib/puppet_x/bodeco/archive.rb)).
+
+```puppet
+# tar striping directories:
+archive { '/var/lib/kafka/kafka_2.10-0.8.2.1.tgz':
+  ensure          => present,
+  extract         => true,
+  extract_command => 'tar xfz %s --strip-components=1',
+  extract_path    => '/opt/kafka_2.10-0.8.2.1',
+  cleanup         => true,
+  creates         => '/opt/kafka_2.10-0.8.2.1/config',
+}
+
+# zip freshen existing files (zip -of %s instead of zip -o %s):
+archive { '/var/lib/example.zip':
+  extract       => true,
+  extract_path  => '/opt',
+  extract_flags => '-of',
+  cleanup       => true,
+  subscribe     => ...,
+}
+```
+
+### S3 bucket
+
+S3 support is implemented via the [AWS
+CLI](http://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html).
+By default this dependency is only installed for Linux VMs running on AWS, or
+enabled via `aws_cli_install` option:
+
+```puppet
+class { '::archive':
+  aws_cli_install => true,
+}
+
+# See AWS cli guide for credential and configuration settings:
+# http://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html
+file { '/root/.aws/credentials':
+  ensure => file,
+  ...
+}
+file { '/root/.aws/config':
+  ensure => file,
+  ...
+}
+
+archive { '/tmp/gravatar.png':
+  ensure => present,
+  source => 's3://bodecoio/gravatar.png',
+}
+```
+
+NOTE: Alternative s3 provider support can be implemented by overriding the
+[s3_download method](lib/puppet/provider/archive/ruby.rb):
+
+### Download customizations
+
+In some cases you may need custom flags for curl/wget/s3 which can be
+supplied via `download_options`. Since this parameter is provider specific,
+beware of the order of defaults:
+
+* s3:// files accepts aws cli options
+  ```puppet
+  archive { '/tmp/gravatar.png':
+    ensure           => present,
+    source           => 's3://bodecoio/gravatar.png',
+    download_options => ['--region', 'eu-central-1'],
+  }
+  ```
+* puppet `provider` override:
+  ```puppet
+  archive { '/tmp/jta-1.1.jar':
+    ensure           => present,
+    source           => 'http://central.maven.org/maven2/javax/transaction/jta/1.1/jta-1.1.jar',
+    provider         => 'wget',
+    download_options => '--continue',
+  }
+  ```
+* Linux default provider is `curl`, and Windows default is `ruby` (no effect).
+
+This option can also be applied globally to address issues for specific OS:
+```puppet
+if $::facts['osfamily'] != 'RedHat' {
+  Archive {
+    download_options => '--tlsv1',
+  }
+}
+```
+
+### Migrating from puppet-staging
+
+It is recommended to use puppet-archive instead of puppet-staging.
+Users wishing to migrate may find the following examples useful.
+
+#### Simple example without extraction
+
+##### puppet-staging
+
+```puppet
+class { 'staging':
+  path  => '/tmp/staging',
+}
+
+staging::file { 'master.zip':
+  source => 'https://github.com/voxpupuli/puppet-archive/archive/master.zip',
+}
+```
+
+##### puppet-archive
+
+```puppet
+archive { '/tmp/staging/master.zip':
+  source => 'https://github.com/voxpupuli/puppet-archive/archive/master.zip',
+}
+```
+
+#### Example with zip file extraction
+
+##### puppet-staging
+
+```puppet
+class { 'staging':
+  path  => '/tmp/staging',
+}
+
+staging::file { 'master.zip':
+  source  => 'https://github.com/voxpupuli/puppet-archive/archive/master.zip',
+} ->
+staging::extract { 'master.zip':
+  target  => '/tmp/staging/master.zip',
+  creates => '/tmp/staging/puppet-archive-master',
+}
+```
+
+##### puppet-archive
+
+```puppet
+archive { '/tmp/staging/master.zip':
+  source       => 'https://github.com/voxpupuli/puppet-archive/archive/master.zip',
+  extract      => true,
+  extract_path => '/tmp/staging',
+  creates      => '/tmp/staging/puppet-archive-master',
+  cleanup      => false,
+}
+```
+
+## Reference
+
+### Classes
+
+* `archive`: install 7zip package (Windows only) and aws cli for s3 support.
+* `archive::staging`: install package dependencies and creates staging directory
+  for backwards compatibility. Use the archive class instead if you do not need
+  the staging directory.
+
+### Define Resources
+
+* `archive::artifactory`: archive wrapper for [JFrog Artifactory](http://www.jfrog.com/open-source/#os-arti)
+  files with checksum.
+* `archive::go`: archive wrapper for [GO Continuous Delivery](http://www.go.cd/)
+  files with checksum.
+* `archive::nexus`: archive wrapper for [Sonatype Nexus](http://www.sonatype.org/nexus/)
+  files with checksum.
+* `archive::download`: archive wrapper and compatibility shim for [camptocamp/archive](https://forge.puppet.com/camptocamp/archive).
+  This is considered private API, as it has to change with camptocamp/archive.
+  For this reason it will remain undocumented, and removed when no longer needed
+  . We suggest not using it directly. Instead please consider migrating to
+  archive itself where possible.
+
+### Resources
+
+#### Archive
+
+* `ensure`: whether archive file should be present/absent (default: present)
+* `path`: namevar, archive file fully qualified file path.
+* `filename`: archive file name (derived from path).
+* `source`: archive file source, supports http|https|ftp|file|s3 uri.
+* `username`: username to download source file.
+* `password`: password to download source file.
+* `allow_insecure`: Ignore HTTPS certificate errors (true|false). (default: false)
+* `cookie`: archive file download cookie.
+* `checksum_type`: archive file checksum type (none|md5|sha1|sha2|sha256|sha384|
+  sha512). (default: none)
+* `checksum`: archive file checksum (match checksum_type)
+* `checksum_url`: archive file checksum source (instead of specify checksum)
+* `checksum_verify`: whether checksum will be verified (true|false). (default: true)
+* `extract`: whether archive will be extracted after download (true|false).
+  (default: false)
+* `extract_path`: target folder path to extract archive.
+* `extract_command`: custom extraction command ('tar xvf example.tar.gz'), also
+* `temp_dir`: specify an alternative temporary directory to use for file downloads, if unset the OS default is used
+  support sprintf format ('tar xvf %s') which will be processed with the
+  filename: sprintf('tar xvf %s', filename)
+* `extract_flags`: custom extraction options, this replaces the default flags.
+  A string such as 'xvf' for a tar file would replace the default xf flag. A
+  hash is useful when custom flags are needed for different platforms. {'tar'
+  => 'xzf', '7z' => 'x -aot'}.
+* `user`: extract command user (using this option will configure the archive
+  file permission to 0644 so the user can read the file).
+* `group`: extract command group (using this option will configure the archive
+  file permission to 0644 so the user can read the file).
+* `cleanup`: whether archive file will be removed after extraction (true|false).
+  (default: true)
+* `creates`: if file/directory exists, will not download/extract archive.
+* `proxy_server`: specify a proxy server, with port number if needed. ie:
+  `https://example.com:8080`.
+* `proxy_type`: proxy server type (none|http|https|ftp)
+
+#### Archive::Artifactory
+
+* `path`: fully qualified filepath for the download the file or use
+  archive_path and only supply filename. (namevar).
+* `ensure`: ensure the file is present/absent.
+* `url`: artifactory download url filepath. NOTE: replaces server, port,
+  url_path parameters.
+* `server`: artifactory server name (deprecated).
+* `port`: artifactory server port (deprecated).
+* `url_path`: artifactory file path
+  `http:://{server}:{port}/artifactory/{url_path}` (deprecated).
+* `owner`: file owner (see archive params for defaults).
+* `group`: file group (see archive params for defaults).
+* `mode`: file mode (see archive params for defaults).
+* `archive_path`: the parent directory of local filepath.
+* `extract`: whether to extract the files (true/false).
+* `creates`: the file created when the archive is extracted (true/false).
+* `cleanup`: remove archive file after file extraction (true/false).
+
+#### Archive::Artifactory Example
+
+```puppet
+$dirname = 'gradle-1.0-milestone-4-20110723151213+0300'
+$filename = "${dirname}-bin.zip"
+
+archive::artifactory { $filename:
+  archive_path => '/tmp',
+  url          => "http://repo.jfrog.org/artifactory/distributions/org/gradle/${filename}",
+  extract      => true,
+  extract_path => '/opt',
+  creates      => "/opt/${dirname}",
+  cleanup      => true,
+}
+
+file { '/opt/gradle':
+  ensure => link,
+  target => "/opt/${dirname}",
+}
+```
+
+#### Archive::Nexus
+
+#### Archive::Nexus Example
+
+```puppet
+archive::nexus { '/tmp/jtstand-ui-0.98.jar':
+  url        => 'https://oss.sonatype.org',
+  gav        => 'org.codehaus.jtstand:jtstand-ui:0.98',
+  repository => 'codehaus-releases',
+  packaging  => 'jar',
+  extract    => false,
+}
+```
+
+## Development
+
+We highly welcome new contributions to this module, especially those that
+include documentation, and rspec tests ;) but will happily guide you through
+the process, so, yes, please submit that pull request!
+
+Note: If you are writing a dependent module that include specs in it, you will
+need to set the puppetversion fact in your puppet-rspec tests. You can do that
+by adding it to the default facts of your spec/spec_helper.rb:
+
+```ruby
+RSpec.configure do |c|
+  c.default_facts = { :puppetversion => Puppet.version }
+end
+```