171 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			171 lines
		
	
	
		
			6.1 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 'poise_languages/system/resource'
 | |
| 
 | |
| 
 | |
| module PoiseLanguages
 | |
|   module System
 | |
|     module Mixin
 | |
| 
 | |
|       private
 | |
| 
 | |
|       # Install a language using system packages.
 | |
|       #
 | |
|       # @api public
 | |
|       # @return [PoiseLanguages::System::Resource]
 | |
|       def install_system_packages(&block)
 | |
|         dev_package_overrides = system_dev_package_overrides
 | |
|         poise_languages_system system_package_name do
 | |
|           # Otherwise use the default install action.
 | |
|           action(:upgrade) if options['package_upgrade']
 | |
|           parent new_resource
 | |
|           # Don't pass true because we want the default computed behavior for that.
 | |
|           dev_package options['dev_package'] unless options['dev_package'] == true
 | |
|           dev_package_overrides dev_package_overrides
 | |
|           package_version options['package_version'] if options['package_version']
 | |
|           version options['version']
 | |
|           instance_exec(&block) if block
 | |
|         end
 | |
|       end
 | |
| 
 | |
|       # Uninstall a language using system packages.
 | |
|       #
 | |
|       # @api public
 | |
|       # @return [PoiseLanguages::System::Resource]
 | |
|       def uninstall_system_packages(&block)
 | |
|         install_system_packages.tap do |r|
 | |
|           r.action(:uninstall)
 | |
|           r.instance_exec(&block) if block
 | |
|         end
 | |
|       end
 | |
| 
 | |
|       # Compute all possible package names for a given language version. Must be
 | |
|       # implemented by mixin users. Versions are expressed as prefixes so ''
 | |
|       # matches all versions, '2' matches 2.x.
 | |
|       #
 | |
|       # @abstract
 | |
|       # @api public
 | |
|       # @param version [String] Language version prefix.
 | |
|       # @return [Array<String>]
 | |
|       def system_package_candidates(version)
 | |
|         raise NotImplementedError
 | |
|       end
 | |
| 
 | |
|       # Compute the default package name for the base package for this language.
 | |
|       #
 | |
|       # @api public
 | |
|       # @return [String]
 | |
|       def system_package_name
 | |
|         # If we have an override, just use that.
 | |
|         return options['package_name'] if options['package_name']
 | |
|         # Look up all packages for this language on this platform.
 | |
|         system_packages = self.class.packages && node.value_for_platform(self.class.packages)
 | |
|         if !system_packages && self.class.default_package
 | |
|           Chef::Log.debug("[#{new_resource}] No known packages for #{node['platform']} #{node['platform_version']}, defaulting to '#{self.class.default_package}'.") if self.class.packages
 | |
|           system_packages = Array(self.class.default_package)
 | |
|         end
 | |
| 
 | |
|         # Find the first value on system_package_candidates that is in system_packages.
 | |
|         system_package_candidates(options['version'].to_s).each do |name|
 | |
|           return name if system_packages.include?(name)
 | |
|         end
 | |
|         # No valid candidate. Sad trombone.
 | |
|         raise PoiseLanguages::Error.new("Unable to find a candidate package for version #{options['version'].to_s.inspect}. Please set package_name provider option for #{new_resource}.")
 | |
|       end
 | |
| 
 | |
|       # A hash mapping package names to their override dev package name.
 | |
|       #
 | |
|       # @api public
 | |
|       # @return [Hash<String, String>]
 | |
|       def system_dev_package_overrides
 | |
|         {}
 | |
|       end
 | |
| 
 | |
|       module ClassMethods
 | |
|         # Install this as a default provider if nothing else matched. Might not
 | |
|         # work, but worth a try at least for unknown platforms. Windows is a
 | |
|         # whole different story, and OS X might work sometimes so at least try.
 | |
|         #
 | |
|         # @api private
 | |
|         def provides_auto?(node, resource)
 | |
|           !node.platform_family?('windows')
 | |
|         end
 | |
| 
 | |
|         # Set some default inversion provider options. Package name can't get
 | |
|         # a default value here because that would complicate the handling of
 | |
|         # {system_package_candidates}.
 | |
|         #
 | |
|         # @api private
 | |
|         def default_inversion_options(node, resource)
 | |
|           super.merge({
 | |
|             # Install dev headers?
 | |
|             dev_package: true,
 | |
|             # Manual overrides for package name and/or version.
 | |
|             package_name: nil,
 | |
|             package_version: nil,
 | |
|             # Set to true to use action :upgrade on system packages.
 | |
|             package_upgrade: false,
 | |
|           })
 | |
|         end
 | |
| 
 | |
|         # @overload packages()
 | |
|         #   Return a hash formatted for value_for_platform returning an Array
 | |
|         #   of package names.
 | |
|         #   @return [Hash]
 | |
|         # @overload packages(default_package, packages)
 | |
|         #   Define what system packages are available for this language on each
 | |
|         #   platform.
 | |
|         #   @param default_package [String] Default package name for platforms
 | |
|         #     not otherwise defined.
 | |
|         #   @param [Hash] Hash formatted for value_for_platform returning an
 | |
|         #     Array of package names.
 | |
|         #   @return [Hash]
 | |
|         def packages(default_package=nil, packages=nil)
 | |
|           self.default_package(default_package) if default_package
 | |
|           if packages
 | |
|             @packages = packages
 | |
|           end
 | |
|           @packages
 | |
|         end
 | |
| 
 | |
|         # @overload default_package()
 | |
|         #   Return the default package name for platforms not otherwise defined.
 | |
|         #   @return [String]
 | |
|         # @overload default_package(name)
 | |
|         #   Set the default package name for platforms not defined in {packages}.
 | |
|         #   @param name [String] Package name.
 | |
|         #   @return [String]
 | |
|         def default_package(name=nil)
 | |
|           if name
 | |
|             @default_package = name
 | |
|           end
 | |
|           @default_package
 | |
|         end
 | |
| 
 | |
|         # @api private
 | |
|         def included(klass)
 | |
|           super
 | |
|           klass.extend(ClassMethods)
 | |
|         end
 | |
|       end
 | |
| 
 | |
|       extend ClassMethods
 | |
| 
 | |
|     end
 | |
|   end
 | |
| end
 |