Knife-Zero doesn't include Berkshelf support, so vendoring everything in the repo is convenient again
		
			
				
	
	
		
			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
 |