140 lines
3.9 KiB
Ruby
140 lines
3.9 KiB
Ruby
#
|
|
# Copyright 2015-2017, Noah Kantrowitz
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
#
|
|
|
|
require 'chef/resource'
|
|
require 'chef/provider'
|
|
require 'poise'
|
|
|
|
|
|
module PoiseLanguages
|
|
module Static
|
|
# A `poise_languages_static` resource to manage installing a language from
|
|
# static binary archives. This is an internal implementation detail of
|
|
# poise-languages.
|
|
#
|
|
# @api private
|
|
# @since 1.1.0
|
|
# @provides poise_languages_static
|
|
# @action install
|
|
# @action uninstall
|
|
class Resource < Chef::Resource
|
|
include Poise
|
|
provides(:poise_languages_static)
|
|
actions(:install, :uninstall)
|
|
|
|
# @!attribute path
|
|
# Directory to install to.
|
|
# @return [String]
|
|
attribute(:path, kind_of: String, name_attribute: true)
|
|
# @!attribute download_retries
|
|
# Number of times to retry failed downloads. Defaults to 5.
|
|
# @return [Integer]
|
|
attribute(:download_retries, kind_of: Integer, default: 5)
|
|
# @!attribute source
|
|
# URL to download from.
|
|
# @return [String]
|
|
attribute(:source, kind_of: String, required: true)
|
|
# @!attribute strip_components
|
|
# Value to pass to tar --strip-components.
|
|
# @return [String, Integer, nil]
|
|
attribute(:strip_components, kind_of: [String, Integer, NilClass], default: 1)
|
|
|
|
def cache_path
|
|
@cache_path ||= ::File.join(Chef::Config[:file_cache_path], source.split(/\//).last)
|
|
end
|
|
end
|
|
|
|
# The default provider for `poise_languages_static`.
|
|
#
|
|
# @api private
|
|
# @since 1.0
|
|
# @see Resource
|
|
# @provides poise_languages_static
|
|
class Provider < Chef::Provider
|
|
include Poise
|
|
provides(:poise_languages_static)
|
|
|
|
# The `install` action for the `poise_languages_static` resource.
|
|
#
|
|
# @return [void]
|
|
def action_install
|
|
notifying_block do
|
|
download_archive
|
|
create_directory
|
|
# Unpack is handled as a notification from download_archive.
|
|
end
|
|
end
|
|
|
|
# The `uninstall` action for the `poise_languages_static` resource.
|
|
#
|
|
# @return [void]
|
|
def action_uninstall
|
|
notifying_block do
|
|
delete_archive
|
|
delete_directory
|
|
end
|
|
end
|
|
|
|
private
|
|
|
|
def create_directory
|
|
unpack_resource = unpack_archive
|
|
directory new_resource.path do
|
|
user 0
|
|
group 0
|
|
mode '755'
|
|
notifies :unpack, unpack_resource, :immediately
|
|
end
|
|
end
|
|
|
|
def download_archive
|
|
unpack_resource = unpack_archive
|
|
remote_file new_resource.cache_path do
|
|
source new_resource.source
|
|
owner 0
|
|
group 0
|
|
mode '644'
|
|
notifies :unpack, unpack_resource, :immediately if ::File.exist?(new_resource.path)
|
|
retries new_resource.download_retries
|
|
end
|
|
end
|
|
|
|
def unpack_archive
|
|
@unpack_archive ||= poise_archive new_resource.cache_path do
|
|
# Run via notification from #download_archive and #create_directory.
|
|
action :nothing
|
|
destination new_resource.path
|
|
strip_components new_resource.strip_components
|
|
end
|
|
end
|
|
|
|
def delete_archive
|
|
file new_resource.cache_path do
|
|
action :delete
|
|
end
|
|
end
|
|
|
|
def delete_directory
|
|
directory new_resource.path do
|
|
action :delete
|
|
recursive true
|
|
end
|
|
end
|
|
|
|
end
|
|
end
|
|
end
|