diff options
author | Lamont Granquist <lamont@scriptkiddie.org> | 2014-10-24 10:45:43 -0700 |
---|---|---|
committer | Lamont Granquist <lamont@scriptkiddie.org> | 2014-10-24 10:45:43 -0700 |
commit | 97aaf5bbcdfd0810722b123bdc67e883a7ca8077 (patch) | |
tree | 25663bf1d4f53664b96844251091b51273ad84c7 /lib/chef/provider | |
parent | cb1bcb1f08816f551f96e713624718f58da3c9b3 (diff) | |
download | chef-97aaf5bbcdfd0810722b123bdc67e883a7ca8077.tar.gz |
Chef-12 RC Provider Resolver
makes resource and provider class resolution more dynamic.
begins deprecation of Chef::Platform static mapping.
Diffstat (limited to 'lib/chef/provider')
51 files changed, 180 insertions, 204 deletions
diff --git a/lib/chef/provider/breakpoint.rb b/lib/chef/provider/breakpoint.rb index 224e2758eb..663d558f66 100644 --- a/lib/chef/provider/breakpoint.rb +++ b/lib/chef/provider/breakpoint.rb @@ -20,6 +20,8 @@ class Chef class Provider class Breakpoint < Chef::Provider + provides :breakpoint + def load_current_resource end diff --git a/lib/chef/provider/cookbook_file.rb b/lib/chef/provider/cookbook_file.rb index 26d6ebf1d9..b501a9b41d 100644 --- a/lib/chef/provider/cookbook_file.rb +++ b/lib/chef/provider/cookbook_file.rb @@ -24,6 +24,8 @@ class Chef class Provider class CookbookFile < Chef::Provider::File + provides :cookbook_file + extend Chef::Deprecation::Warnings include Chef::Deprecation::Provider::CookbookFile add_deprecation_warnings_for(Chef::Deprecation::Provider::CookbookFile.instance_methods) diff --git a/lib/chef/provider/deploy/revision.rb b/lib/chef/provider/deploy/revision.rb index c98c1e5c75..62aa0e87f6 100644 --- a/lib/chef/provider/deploy/revision.rb +++ b/lib/chef/provider/deploy/revision.rb @@ -27,6 +27,8 @@ class Chef class Provider class Deploy class Revision < Chef::Provider::Deploy + provides :deploy_revision + provides :deploy_branch def all_releases sorted_releases diff --git a/lib/chef/provider/deploy/timestamped.rb b/lib/chef/provider/deploy/timestamped.rb index ce921161e0..ba3f6683f0 100644 --- a/lib/chef/provider/deploy/timestamped.rb +++ b/lib/chef/provider/deploy/timestamped.rb @@ -20,6 +20,8 @@ class Chef class Provider class Deploy class Timestamped < Chef::Provider::Deploy + provides :timestamped_deploy + provides :deploy protected diff --git a/lib/chef/provider/directory.rb b/lib/chef/provider/directory.rb index 067737b9d4..c9c3d466b9 100644 --- a/lib/chef/provider/directory.rb +++ b/lib/chef/provider/directory.rb @@ -27,6 +27,8 @@ class Chef class Provider class Directory < Chef::Provider::File + provides :directory + def whyrun_supported? true end diff --git a/lib/chef/provider/dsc_script.rb b/lib/chef/provider/dsc_script.rb index a70f4b5048..5db50e74b3 100644 --- a/lib/chef/provider/dsc_script.rb +++ b/lib/chef/provider/dsc_script.rb @@ -24,6 +24,9 @@ require 'chef/util/path_helper' class Chef class Provider class DscScript < Chef::Provider + + provides :dsc_script, os: "windows" + def initialize(dsc_resource, run_context) super(dsc_resource, run_context) @dsc_resource = dsc_resource diff --git a/lib/chef/provider/erl_call.rb b/lib/chef/provider/erl_call.rb index cdd494a243..f5855bcce6 100644 --- a/lib/chef/provider/erl_call.rb +++ b/lib/chef/provider/erl_call.rb @@ -25,6 +25,8 @@ class Chef class ErlCall < Chef::Provider include Chef::Mixin::Command + provides :erl_call + def initialize(node, new_resource) super(node, new_resource) end diff --git a/lib/chef/provider/execute.rb b/lib/chef/provider/execute.rb index 54632c0684..48b2a344d1 100644 --- a/lib/chef/provider/execute.rb +++ b/lib/chef/provider/execute.rb @@ -23,6 +23,8 @@ class Chef class Provider class Execute < Chef::Provider + provides :execute + def load_current_resource true end diff --git a/lib/chef/provider/file.rb b/lib/chef/provider/file.rb index 256248f240..a9390cc45c 100644 --- a/lib/chef/provider/file.rb +++ b/lib/chef/provider/file.rb @@ -54,6 +54,8 @@ class Chef include Chef::Deprecation::Provider::File add_deprecation_warnings_for(Chef::Deprecation::Provider::File.instance_methods) + provides :file + attr_reader :deployment_strategy attr_accessor :needs_creating diff --git a/lib/chef/provider/git.rb b/lib/chef/provider/git.rb index 2ef119e839..8418f22933 100644 --- a/lib/chef/provider/git.rb +++ b/lib/chef/provider/git.rb @@ -25,6 +25,8 @@ class Chef class Provider class Git < Chef::Provider + provides :git + def whyrun_supported? true end diff --git a/lib/chef/provider/group/pw.rb b/lib/chef/provider/group/pw.rb index 79a4160807..c39c20da67 100644 --- a/lib/chef/provider/group/pw.rb +++ b/lib/chef/provider/group/pw.rb @@ -21,9 +21,6 @@ class Chef class Group class Pw < Chef::Provider::Group - implements :group, - :on_platforms => :freebsd - def load_current_resource super end diff --git a/lib/chef/provider/http_request.rb b/lib/chef/provider/http_request.rb index ba54b10195..61aff434ed 100644 --- a/lib/chef/provider/http_request.rb +++ b/lib/chef/provider/http_request.rb @@ -23,6 +23,8 @@ class Chef class Provider class HttpRequest < Chef::Provider + provides :http_request + attr_accessor :http def whyrun_supported? diff --git a/lib/chef/provider/link.rb b/lib/chef/provider/link.rb index 639dc4f3ff..417d6a21b0 100644 --- a/lib/chef/provider/link.rb +++ b/lib/chef/provider/link.rb @@ -28,6 +28,8 @@ class Chef class Provider class Link < Chef::Provider + provides :link + include Chef::Mixin::EnforceOwnershipAndPermissions include Chef::Mixin::FileClass diff --git a/lib/chef/provider/log.rb b/lib/chef/provider/log.rb index 9379ceeefa..40eaf0aa28 100644 --- a/lib/chef/provider/log.rb +++ b/lib/chef/provider/log.rb @@ -25,6 +25,8 @@ class Chef # Chef log provider, allows logging to chef's logs from recipes class ChefLog < Chef::Provider + provides :log + def whyrun_supported? true end diff --git a/lib/chef/provider/package/aix.rb b/lib/chef/provider/package/aix.rb index da3e6d1684..88de4679ba 100644 --- a/lib/chef/provider/package/aix.rb +++ b/lib/chef/provider/package/aix.rb @@ -26,6 +26,8 @@ class Chef class Package class Aix < Chef::Provider::Package + provides :bff_package, os: "aix" + include Chef::Mixin::GetSourceFromPackage def define_resource_requirements diff --git a/lib/chef/provider/package/apt.rb b/lib/chef/provider/package/apt.rb index 0d91d0d1f0..eb2c038eaa 100644 --- a/lib/chef/provider/package/apt.rb +++ b/lib/chef/provider/package/apt.rb @@ -25,6 +25,8 @@ class Chef class Package class Apt < Chef::Provider::Package + provides :apt_package, os: "linux" + attr_accessor :is_virtual_package def load_current_resource diff --git a/lib/chef/provider/package/dpkg.rb b/lib/chef/provider/package/dpkg.rb index a1f1c797b1..3a9cecc660 100644 --- a/lib/chef/provider/package/dpkg.rb +++ b/lib/chef/provider/package/dpkg.rb @@ -30,6 +30,8 @@ class Chef DPKG_INSTALLED = /^Status: install ok installed/ DPKG_VERSION = /^Version: (.+)$/ + provides :dpkg_package, os: "linux" + include Chef::Mixin::GetSourceFromPackage def define_resource_requirements diff --git a/lib/chef/provider/package/easy_install.rb b/lib/chef/provider/package/easy_install.rb index 2af8a72e61..90727b738d 100644 --- a/lib/chef/provider/package/easy_install.rb +++ b/lib/chef/provider/package/easy_install.rb @@ -25,6 +25,8 @@ class Chef class Package class EasyInstall < Chef::Provider::Package + provides :easy_install_package + def install_check(name) check = false diff --git a/lib/chef/provider/package/freebsd.rb b/lib/chef/provider/package/freebsd.rb deleted file mode 100644 index f5ec0cec47..0000000000 --- a/lib/chef/provider/package/freebsd.rb +++ /dev/null @@ -1,154 +0,0 @@ -# -# Authors:: Bryan McLellan (btm@loftninjas.org) -# Matthew Landauer (matthew@openaustralia.org) -# Copyright:: Copyright (c) 2009 Bryan McLellan, Matthew Landauer -# License:: Apache License, Version 2.0 -# -# 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/provider/package' -require 'chef/mixin/shell_out' -require 'chef/resource/package' -require 'chef/mixin/get_source_from_package' - -class Chef - class Provider - class Package - class Freebsd < Chef::Provider::Package - include Chef::Mixin::ShellOut - - include Chef::Mixin::GetSourceFromPackage - - implements :package, - :freebsd_package, - :on_platforms => :freebsd - - - def initialize(*args) - super - @current_resource = Chef::Resource::Package.new(@new_resource.name) - end - - def current_installed_version - pkg_info = shell_out!("pkg_info -E \"#{package_name}*\"", :env => nil, :returns => [0,1]) - pkg_info.stdout[/^#{Regexp.escape(package_name)}-(.+)/, 1] - end - - def port_path - case @new_resource.package_name - # When the package name starts with a '/' treat it as the full path to the ports directory - when /^\// - @new_resource.package_name - # Otherwise if the package name contains a '/' not at the start (like 'www/wordpress') treat as a relative - # path from /usr/ports - when /\// - "/usr/ports/#{@new_resource.package_name}" - # Otherwise look up the path to the ports directory using 'whereis' - else - whereis = shell_out!("whereis -s #{@new_resource.package_name}", :env => nil) - unless path = whereis.stdout[/^#{Regexp.escape(@new_resource.package_name)}:\s+(.+)$/, 1] - raise Chef::Exceptions::Package, "Could not find port with the name #{@new_resource.package_name}" - end - path - end - end - - def ports_makefile_variable_value(variable) - make_v = shell_out!("make -V #{variable}", :cwd => port_path, :env => nil, :returns => [0,1]) - make_v.stdout.strip.split($\).first # $\ is the line separator, i.e., newline - end - - def ports_candidate_version - ports_makefile_variable_value("PORTVERSION") - end - - def file_candidate_version_path - Dir["#{@new_resource.source}/#{@current_resource.package_name}*"][-1].to_s - end - - def file_candidate_version - file_candidate_version_path.split(/-/).last.split(/.tbz/).first - end - - def load_current_resource - @current_resource.package_name(@new_resource.package_name) - - @current_resource.version(current_installed_version) - Chef::Log.debug("#{@new_resource} current version is #{@current_resource.version}") if @current_resource.version - - case @new_resource.source - when /^http/, /^ftp/ - @candidate_version = "0.0.0" - when /^\// - @candidate_version = file_candidate_version - else - @candidate_version = ports_candidate_version - end - - Chef::Log.debug("#{@new_resource} ports candidate version is #{@candidate_version}") if @candidate_version - - @current_resource - end - - def latest_link_name - ports_makefile_variable_value("LATEST_LINK") - end - - # The name of the package (without the version number) as understood by pkg_add and pkg_info - def package_name - if ::File.exist?("/usr/ports/Makefile") - if ports_makefile_variable_value("PKGNAME") =~ /^(.+)-[^-]+$/ - $1 - else - raise Chef::Exceptions::Package, "Unexpected form for PKGNAME variable in #{port_path}/Makefile" - end - else - @new_resource.package_name - end - end - - def install_package(name, version) - unless @current_resource.version - case @new_resource.source - when /^ports$/ - shell_out!("make -DBATCH install", :timeout => 1200, :env => nil, :cwd => port_path).status - when /^http/, /^ftp/ - if @new_resource.source =~ /\/$/ - shell_out!("pkg_add -r #{package_name}", :env => { "PACKAGESITE" => @new_resource.source, 'LC_ALL' => nil }).status - else - shell_out!("pkg_add -r #{package_name}", :env => { "PACKAGEROOT" => @new_resource.source, 'LC_ALL' => nil }).status - end - Chef::Log.debug("#{@new_resource} installed from: #{@new_resource.source}") - when /^\// - shell_out!("pkg_add #{file_candidate_version_path}", :env => { "PKG_PATH" => @new_resource.source , 'LC_ALL'=>nil}).status - Chef::Log.debug("#{@new_resource} installed from: #{@new_resource.source}") - else - shell_out!("pkg_add -r #{latest_link_name}", :env => nil).status - end - end - end - - def remove_package(name, version) - # a version is mandatory - if version - shell_out!("pkg_delete #{package_name}-#{version}", :env => nil).status - else - shell_out!("pkg_delete #{package_name}-#{@current_resource.version}", :env => nil).status - end - end - - end - end - end -end diff --git a/lib/chef/provider/package/homebrew.rb b/lib/chef/provider/package/homebrew.rb index a9aeea1415..822f4c8a42 100644 --- a/lib/chef/provider/package/homebrew.rb +++ b/lib/chef/provider/package/homebrew.rb @@ -25,7 +25,11 @@ class Chef class Provider class Package class Homebrew < Chef::Provider::Package + + provides :homebrew_package, os: "mac_os_x" + include Chef::Mixin::HomebrewUser + def load_current_resource self.current_resource = Chef::Resource::Package.new(new_resource.name) current_resource.package_name(new_resource.package_name) diff --git a/lib/chef/provider/package/ips.rb b/lib/chef/provider/package/ips.rb index 4090507303..87022d770a 100644 --- a/lib/chef/provider/package/ips.rb +++ b/lib/chef/provider/package/ips.rb @@ -27,6 +27,8 @@ class Chef class Package class Ips < Chef::Provider::Package + provides :ips_package, os: "solaris2" + attr_accessor :virtual def define_resource_requirements diff --git a/lib/chef/provider/package/macports.rb b/lib/chef/provider/package/macports.rb index 05247e6d31..cd142eca42 100644 --- a/lib/chef/provider/package/macports.rb +++ b/lib/chef/provider/package/macports.rb @@ -2,6 +2,9 @@ class Chef class Provider class Package class Macports < Chef::Provider::Package + + provides :macports_package, os: "mac_os_x" + def load_current_resource @current_resource = Chef::Resource::Package.new(@new_resource.name) @current_resource.package_name(@new_resource.package_name) diff --git a/lib/chef/provider/package/pacman.rb b/lib/chef/provider/package/pacman.rb index a9ff0edf7f..85c0208d76 100644 --- a/lib/chef/provider/package/pacman.rb +++ b/lib/chef/provider/package/pacman.rb @@ -25,6 +25,8 @@ class Chef class Package class Pacman < Chef::Provider::Package + provides :pacman_package, os: "linux" + def load_current_resource @current_resource = Chef::Resource::Package.new(@new_resource.name) @current_resource.package_name(@new_resource.package_name) diff --git a/lib/chef/provider/package/paludis.rb b/lib/chef/provider/package/paludis.rb index f363b38e50..407e0d0110 100644 --- a/lib/chef/provider/package/paludis.rb +++ b/lib/chef/provider/package/paludis.rb @@ -24,6 +24,8 @@ class Chef class Package class Paludis < Chef::Provider::Package + provides :paludis_package, os: "linux" + def load_current_resource @current_resource = Chef::Resource::Package.new(@new_resource.package_name) @current_resource.package_name(@new_resource.package_name) @@ -45,7 +47,7 @@ class Chef @current_resource.version(res[2]) else @candidate_version = res[2] - @current_resource.version(nil) + @current_resource.version(nil) end end end diff --git a/lib/chef/provider/package/rpm.rb b/lib/chef/provider/package/rpm.rb index c0a6444252..131587e066 100644 --- a/lib/chef/provider/package/rpm.rb +++ b/lib/chef/provider/package/rpm.rb @@ -25,6 +25,8 @@ class Chef class Package class Rpm < Chef::Provider::Package + provides :rpm_package, os: [ "linux", "aix" ] + include Chef::Mixin::GetSourceFromPackage def define_resource_requirements diff --git a/lib/chef/provider/package/rubygems.rb b/lib/chef/provider/package/rubygems.rb index 6c7e1c066e..3c0ca40693 100644 --- a/lib/chef/provider/package/rubygems.rb +++ b/lib/chef/provider/package/rubygems.rb @@ -359,6 +359,9 @@ class Chef Chef::Log.logger end + provides :chef_gem + provides :gem_package + include Chef::Mixin::GetSourceFromPackage def initialize(new_resource, run_context=nil) diff --git a/lib/chef/provider/package/smartos.rb b/lib/chef/provider/package/smartos.rb index 19a6b9efef..7cef91953a 100644 --- a/lib/chef/provider/package/smartos.rb +++ b/lib/chef/provider/package/smartos.rb @@ -29,6 +29,8 @@ class Chef class SmartOS < Chef::Provider::Package attr_accessor :is_virtual_package + provides :smartos_package, os: "solaris2", platform_family: "smartos" + def load_current_resource Chef::Log.debug("#{@new_resource} loading current resource") @current_resource = Chef::Resource::Package.new(@new_resource.name) diff --git a/lib/chef/provider/package/solaris.rb b/lib/chef/provider/package/solaris.rb index 19f844b66a..53dd00dd07 100644 --- a/lib/chef/provider/package/solaris.rb +++ b/lib/chef/provider/package/solaris.rb @@ -27,6 +27,8 @@ class Chef include Chef::Mixin::GetSourceFromPackage + provides :solaris_package, os: "solaris2" + # def initialize(*args) # super # @current_resource = Chef::Resource::Package.new(@new_resource.name) diff --git a/lib/chef/provider/package/yum.rb b/lib/chef/provider/package/yum.rb index e77319c254..505f5fd6a3 100644 --- a/lib/chef/provider/package/yum.rb +++ b/lib/chef/provider/package/yum.rb @@ -29,6 +29,8 @@ class Chef class Package class Yum < Chef::Provider::Package + provides :yum_package, os: "linux" + class RPMUtils class << self diff --git a/lib/chef/provider/remote_directory.rb b/lib/chef/provider/remote_directory.rb index 5bd1cb5493..9a7416e318 100644 --- a/lib/chef/provider/remote_directory.rb +++ b/lib/chef/provider/remote_directory.rb @@ -32,6 +32,8 @@ class Chef class Provider class RemoteDirectory < Chef::Provider::Directory + provides :remote_directory + include Chef::Mixin::FileClass def action_create @@ -63,7 +65,7 @@ class Chef def ls(path) files = Dir.glob(::File.join(Chef::Util::PathHelper.escape_glob(path), '**', '*'), ::File::FNM_DOTMATCH) - + # Remove current directory and previous directory files.reject! do |name| basename = Pathname.new(name).basename().to_s diff --git a/lib/chef/provider/route.rb b/lib/chef/provider/route.rb index 208a4f4139..72a5029a94 100644 --- a/lib/chef/provider/route.rb +++ b/lib/chef/provider/route.rb @@ -24,6 +24,8 @@ require 'ipaddr' class Chef::Provider::Route < Chef::Provider include Chef::Mixin::Command + provides :route + attr_accessor :is_running MASK = {'0.0.0.0' => '0', diff --git a/lib/chef/provider/ruby_block.rb b/lib/chef/provider/ruby_block.rb index b0d94a3f8d..eb93fd5708 100644 --- a/lib/chef/provider/ruby_block.rb +++ b/lib/chef/provider/ruby_block.rb @@ -20,6 +20,8 @@ class Chef class Provider class RubyBlock < Chef::Provider + provides :ruby_block + def whyrun_supported? true end diff --git a/lib/chef/provider/script.rb b/lib/chef/provider/script.rb index 4aacf4f524..1615517553 100644 --- a/lib/chef/provider/script.rb +++ b/lib/chef/provider/script.rb @@ -22,6 +22,12 @@ require 'chef/provider/execute' class Chef class Provider class Script < Chef::Provider::Execute + provides :bash + provides :csh + provides :perl + provides :python + provides :ruby + provides :script def initialize(new_resource, run_context) super diff --git a/lib/chef/provider/service/arch.rb b/lib/chef/provider/service/arch.rb index 9be5fb6fe3..888fb3fdf5 100644 --- a/lib/chef/provider/service/arch.rb +++ b/lib/chef/provider/service/arch.rb @@ -20,6 +20,12 @@ require 'chef/provider/service/init' class Chef::Provider::Service::Arch < Chef::Provider::Service::Init + provides :service, platform_family: "arch" + + def self.supports?(resource, action) + ::File.exist?("/etc/rc.d/#{resource.service_name}") + end + def initialize(new_resource, run_context) super @init_command = "/etc/rc.d/#{@new_resource.service_name}" diff --git a/lib/chef/provider/service/debian.rb b/lib/chef/provider/service/debian.rb index 1ebef90349..25b1960b26 100644 --- a/lib/chef/provider/service/debian.rb +++ b/lib/chef/provider/service/debian.rb @@ -25,13 +25,19 @@ class Chef UPDATE_RC_D_ENABLED_MATCHES = /\/rc[\dS].d\/S|not installed/i UPDATE_RC_D_PRIORITIES = /\/rc([\dS]).d\/([SK])(\d\d)/i + provides :service, platform_family: "debian" + + def self.supports?(resource, action) + Chef::Platform::ServiceHelpers.service_resource_providers.include?(:debian) + end + def load_current_resource super @priority_success = true @rcd_status = nil - @current_resource.priority(get_priority) - @current_resource.enabled(service_currently_enabled?(@current_resource.priority)) - @current_resource + current_resource.priority(get_priority) + current_resource.enabled(service_currently_enabled?(current_resource.priority)) + current_resource end def define_resource_requirements @@ -47,7 +53,7 @@ class Chef requirements.assert(:all_actions) do |a| a.assertion { @priority_success } - a.failure_message Chef::Exceptions::Service, "/usr/sbin/update-rc.d -n -f #{@current_resource.service_name} failed - #{@rcd_status.inspect}" + a.failure_message Chef::Exceptions::Service, "/usr/sbin/update-rc.d -n -f #{current_resource.service_name} failed - #{@rcd_status.inspect}" # This can happen if the service is not yet installed,so we'll fake it. a.whyrun ["Unable to determine priority of service, assuming service would have been correctly installed earlier in the run.", "Assigning temporary priorities to continue.", @@ -59,7 +65,7 @@ class Chef "3"=>[:start, "20"], "4"=>[:start, "20"], "5"=>[:start, "20"]} - @current_resource.priority(temp_priorities) + current_resource.priority(temp_priorities) end end end @@ -67,7 +73,7 @@ class Chef def get_priority priority = {} - @rcd_status = popen4("/usr/sbin/update-rc.d -n -f #{@current_resource.service_name} remove") do |pid, stdin, stdout, stderr| + @rcd_status = popen4("/usr/sbin/update-rc.d -n -f #{current_resource.service_name} remove") do |pid, stdin, stdout, stderr| [stdout, stderr].each do |iop| iop.each_line do |line| @@ -99,7 +105,7 @@ class Chef def service_currently_enabled?(priority) enabled = false priority.each { |runlevel, arguments| - Chef::Log.debug("#{@new_resource} runlevel #{runlevel}, action #{arguments[0]}, priority #{arguments[1]}") + Chef::Log.debug("#{new_resource} runlevel #{runlevel}, action #{arguments[0]}, priority #{arguments[1]}") # if we are in a update-rc.d default startup runlevel && we start in this runlevel if %w[ 1 2 3 4 5 S ].include?(runlevel) && arguments[0] == :start enabled = true @@ -111,63 +117,63 @@ class Chef # Override method from parent to ensure priority is up-to-date def action_enable - if @new_resource.priority.nil? + if new_resource.priority.nil? priority_ok = true else - priority_ok = @current_resource.priority == @new_resource.priority + priority_ok = @current_resource.priority == new_resource.priority end - if @current_resource.enabled and priority_ok - Chef::Log.debug("#{@new_resource} already enabled - nothing to do") + if current_resource.enabled and priority_ok + Chef::Log.debug("#{new_resource} already enabled - nothing to do") else - converge_by("enable service #{@new_resource}") do + converge_by("enable service #{new_resource}") do enable_service - Chef::Log.info("#{@new_resource} enabled") + Chef::Log.info("#{new_resource} enabled") end end load_new_resource_state - @new_resource.enabled(true) + new_resource.enabled(true) end def enable_service - if @new_resource.priority.is_a? Integer - shell_out!("/usr/sbin/update-rc.d -f #{@new_resource.service_name} remove") - shell_out!("/usr/sbin/update-rc.d #{@new_resource.service_name} defaults #{@new_resource.priority} #{100 - @new_resource.priority}") - elsif @new_resource.priority.is_a? Hash + if new_resource.priority.is_a? Integer + shell_out!("/usr/sbin/update-rc.d -f #{new_resource.service_name} remove") + shell_out!("/usr/sbin/update-rc.d #{new_resource.service_name} defaults #{new_resource.priority} #{100 - new_resource.priority}") + elsif new_resource.priority.is_a? Hash # we call the same command regardless of we're enabling or disabling # users passing a Hash are responsible for setting their own start priorities set_priority else # No priority, go with update-rc.d defaults - shell_out!("/usr/sbin/update-rc.d -f #{@new_resource.service_name} remove") - shell_out!("/usr/sbin/update-rc.d #{@new_resource.service_name} defaults") + shell_out!("/usr/sbin/update-rc.d -f #{new_resource.service_name} remove") + shell_out!("/usr/sbin/update-rc.d #{new_resource.service_name} defaults") end end def disable_service - if @new_resource.priority.is_a? Integer + if new_resource.priority.is_a? Integer # Stop processes in reverse order of start using '100 - start_priority' - shell_out!("/usr/sbin/update-rc.d -f #{@new_resource.service_name} remove") - shell_out!("/usr/sbin/update-rc.d -f #{@new_resource.service_name} stop #{100 - @new_resource.priority} 2 3 4 5 .") - elsif @new_resource.priority.is_a? Hash + shell_out!("/usr/sbin/update-rc.d -f #{new_resource.service_name} remove") + shell_out!("/usr/sbin/update-rc.d -f #{new_resource.service_name} stop #{100 - new_resource.priority} 2 3 4 5 .") + elsif new_resource.priority.is_a? Hash # we call the same command regardless of we're enabling or disabling # users passing a Hash are responsible for setting their own stop priorities set_priority else # no priority, using '100 - 20 (update-rc.d default)' to stop in reverse order of start - shell_out!("/usr/sbin/update-rc.d -f #{@new_resource.service_name} remove") - shell_out!("/usr/sbin/update-rc.d -f #{@new_resource.service_name} stop 80 2 3 4 5 .") + shell_out!("/usr/sbin/update-rc.d -f #{new_resource.service_name} remove") + shell_out!("/usr/sbin/update-rc.d -f #{new_resource.service_name} stop 80 2 3 4 5 .") end end def set_priority args = "" - @new_resource.priority.each do |level, o| + new_resource.priority.each do |level, o| action = o[0] priority = o[1] args += "#{action} #{priority} #{level} . " end - shell_out!("/usr/sbin/update-rc.d -f #{@new_resource.service_name} remove") - shell_out!("/usr/sbin/update-rc.d #{@new_resource.service_name} #{args}") + shell_out!("/usr/sbin/update-rc.d -f #{new_resource.service_name} remove") + shell_out!("/usr/sbin/update-rc.d #{new_resource.service_name} #{args}") end end end diff --git a/lib/chef/provider/service/freebsd.rb b/lib/chef/provider/service/freebsd.rb index e0d9696f61..e4a456ac25 100644 --- a/lib/chef/provider/service/freebsd.rb +++ b/lib/chef/provider/service/freebsd.rb @@ -27,8 +27,9 @@ class Chef attr_reader :enabled_state_found - implements :service, - :on_platforms => [:freebsd, :netbsd] + provides :service, os: [ "freebsd", "netbsd" ] + + include Chef::Mixin::ShellOut def initialize(new_resource, run_context) super diff --git a/lib/chef/provider/service/gentoo.rb b/lib/chef/provider/service/gentoo.rb index e2dff10994..3dab920f06 100644 --- a/lib/chef/provider/service/gentoo.rb +++ b/lib/chef/provider/service/gentoo.rb @@ -22,6 +22,9 @@ require 'chef/mixin/command' require 'chef/util/path_helper' class Chef::Provider::Service::Gentoo < Chef::Provider::Service::Init + + provides :service, platform_family: "gentoo" + def load_current_resource @new_resource.supports[:status] = true diff --git a/lib/chef/provider/service/init.rb b/lib/chef/provider/service/init.rb index 5d8bb5bb38..ab40a720f6 100644 --- a/lib/chef/provider/service/init.rb +++ b/lib/chef/provider/service/init.rb @@ -26,6 +26,8 @@ class Chef attr_accessor :init_command + provides :service, os: "!windows" + def initialize(new_resource, run_context) super @init_command = "/etc/init.d/#{@new_resource.service_name}" diff --git a/lib/chef/provider/service/insserv.rb b/lib/chef/provider/service/insserv.rb index 1ee817707a..df5a162a45 100644 --- a/lib/chef/provider/service/insserv.rb +++ b/lib/chef/provider/service/insserv.rb @@ -24,26 +24,32 @@ class Chef class Service class Insserv < Chef::Provider::Service::Init + provides :service, os: "linux" + + def self.supports?(resource, action) + Chef::Platform::ServiceHelpers.service_resource_providers.include?(:insserv) + end + def load_current_resource super - # Look for a /etc/rc.*/SnnSERVICE link to signifiy that the service would be started in a runlevel - if Dir.glob("/etc/rc**/S*#{Chef::Util::PathHelper.escape_glob(@current_resource.service_name)}").empty? - @current_resource.enabled false + # Look for a /etc/rc.*/SnnSERVICE link to signify that the service would be started in a runlevel + if Dir.glob("/etc/rc**/S*#{Chef::Util::PathHelper.escape_glob(current_resource.service_name)}").empty? + current_resource.enabled false else - @current_resource.enabled true + current_resource.enabled true end - @current_resource + current_resource end def enable_service() - shell_out!("/sbin/insserv -r -f #{@new_resource.service_name}") - shell_out!("/sbin/insserv -d -f #{@new_resource.service_name}") + shell_out!("/sbin/insserv -r -f #{new_resource.service_name}") + shell_out!("/sbin/insserv -d -f #{new_resource.service_name}") end def disable_service() - shell_out!("/sbin/insserv -r -f #{@new_resource.service_name}") + shell_out!("/sbin/insserv -r -f #{new_resource.service_name}") end end end diff --git a/lib/chef/provider/service/invokercd.rb b/lib/chef/provider/service/invokercd.rb index e6afa7272a..c7472211bc 100644 --- a/lib/chef/provider/service/invokercd.rb +++ b/lib/chef/provider/service/invokercd.rb @@ -23,6 +23,12 @@ class Chef class Service class Invokercd < Chef::Provider::Service::Init + provides :service, platform_family: "debian" + + def self.supports?(resource, action) + Chef::Platform::ServiceHelpers.service_resource_providers.include?(:invokerc) + end + def initialize(new_resource, run_context) super @init_command = "/usr/sbin/invoke-rc.d #{@new_resource.service_name}" diff --git a/lib/chef/provider/service/macosx.rb b/lib/chef/provider/service/macosx.rb index ad1535327b..10ad1aa29d 100644 --- a/lib/chef/provider/service/macosx.rb +++ b/lib/chef/provider/service/macosx.rb @@ -26,6 +26,8 @@ class Chef class Service class Macosx < Chef::Provider::Service::Simple + provides :service, os: "darwin" + def self.gather_plist_dirs locations = %w{/Library/LaunchAgents /Library/LaunchDaemons diff --git a/lib/chef/provider/service/redhat.rb b/lib/chef/provider/service/redhat.rb index 7a7b2a1c40..90744ae268 100644 --- a/lib/chef/provider/service/redhat.rb +++ b/lib/chef/provider/service/redhat.rb @@ -26,11 +26,17 @@ class Chef CHKCONFIG_ON = /\d:on/ CHKCONFIG_MISSING = /No such/ + provides :service, platform_family: [ "rhel", "fedora", "suse" ] + + def self.supports?(resource, action) + Chef::Platform::ServiceHelpers.service_resource_providers.include?(:redhat) + end + def initialize(new_resource, run_context) super - @init_command = "/sbin/service #{@new_resource.service_name}" - @new_resource.supports[:status] = true - @service_missing = false + @init_command = "/sbin/service #{@new_resource.service_name}" + @new_resource.supports[:status] = true + @service_missing = false end def define_resource_requirements diff --git a/lib/chef/provider/service/simple.rb b/lib/chef/provider/service/simple.rb index bd51d15f84..ee403ee163 100644 --- a/lib/chef/provider/service/simple.rb +++ b/lib/chef/provider/service/simple.rb @@ -25,6 +25,8 @@ class Chef class Service class Simple < Chef::Provider::Service + # this must be subclassed to be useful so does not directly implement :service + attr_reader :status_load_success def load_current_resource diff --git a/lib/chef/provider/service/solaris.rb b/lib/chef/provider/service/solaris.rb index f0584dcf6d..eaea6bb1ab 100644 --- a/lib/chef/provider/service/solaris.rb +++ b/lib/chef/provider/service/solaris.rb @@ -26,6 +26,8 @@ class Chef class Solaris < Chef::Provider::Service attr_reader :maintenance + provides :service, os: "solaris2" + def initialize(new_resource, run_context=nil) super @init_command = "/usr/sbin/svcadm" diff --git a/lib/chef/provider/service/systemd.rb b/lib/chef/provider/service/systemd.rb index 31feee65d4..311751ab9a 100644 --- a/lib/chef/provider/service/systemd.rb +++ b/lib/chef/provider/service/systemd.rb @@ -20,6 +20,13 @@ require 'chef/resource/service' require 'chef/provider/service/simple' class Chef::Provider::Service::Systemd < Chef::Provider::Service::Simple + + provides :service, os: "linux" + + def self.supports?(resource, action) + Chef::Platform::ServiceHelpers.service_resource_providers.include?(:systemd) + end + def load_current_resource @current_resource = Chef::Resource::Service.new(@new_resource.name) @current_resource.service_name(@new_resource.service_name) diff --git a/lib/chef/provider/service/upstart.rb b/lib/chef/provider/service/upstart.rb index 670bf9e5f8..41bd850d6a 100644 --- a/lib/chef/provider/service/upstart.rb +++ b/lib/chef/provider/service/upstart.rb @@ -27,6 +27,13 @@ class Chef class Upstart < Chef::Provider::Service::Simple UPSTART_STATE_FORMAT = /\w+ \(?(\w+)\)?[\/ ](\w+)/ + provides :service, os: "linux" + + def self.supports?(resource, action) + Chef::Platform::ServiceHelpers.service_resource_providers.include?(:upstart) && + Chef::Platform::ServiceHelpers.config_for_service(resource.service_name).include?(:upstart) + end + # Upstart does more than start or stop a service, creating multiple 'states' [1] that a service can be in. # In chef, when we ask a service to start, we expect it to have started before performing the next step # since we have top down dependencies. Which is to say we may follow witha resource next that requires diff --git a/lib/chef/provider/service/windows.rb b/lib/chef/provider/service/windows.rb index d31aad4c9d..4b1d2079ec 100644 --- a/lib/chef/provider/service/windows.rb +++ b/lib/chef/provider/service/windows.rb @@ -25,6 +25,10 @@ end class Chef::Provider::Service::Windows < Chef::Provider::Service + provides :service, os: "windows" + + include Chef::Mixin::ShellOut + #Win32::Service.get_start_type AUTO_START = 'auto start' MANUAL = 'demand start' diff --git a/lib/chef/provider/subversion.rb b/lib/chef/provider/subversion.rb index 6cf31c8ec8..f4a0e6fc13 100644 --- a/lib/chef/provider/subversion.rb +++ b/lib/chef/provider/subversion.rb @@ -27,6 +27,8 @@ class Chef class Provider class Subversion < Chef::Provider + provides :subversion + SVN_INFO_PATTERN = /^([\w\s]+): (.+)$/ include Chef::Mixin::Command diff --git a/lib/chef/provider/template.rb b/lib/chef/provider/template.rb index 48cc45f3a8..1e759074b9 100644 --- a/lib/chef/provider/template.rb +++ b/lib/chef/provider/template.rb @@ -25,6 +25,7 @@ require 'chef/deprecation/warnings' class Chef class Provider class Template < Chef::Provider::File + provides :template extend Chef::Deprecation::Warnings include Chef::Deprecation::Provider::Template diff --git a/lib/chef/provider/user/pw.rb b/lib/chef/provider/user/pw.rb index 0dc80103da..fe71e93561 100644 --- a/lib/chef/provider/user/pw.rb +++ b/lib/chef/provider/user/pw.rb @@ -23,9 +23,6 @@ class Chef class User class Pw < Chef::Provider::User - implements :user, - :on_platforms => :freebsd - def load_current_resource super raise Chef::Exceptions::User, "Could not find binary /usr/sbin/pw for #{@new_resource}" unless ::File.exists?("/usr/sbin/pw") diff --git a/lib/chef/provider/whyrun_safe_ruby_block.rb b/lib/chef/provider/whyrun_safe_ruby_block.rb index e5f35debd7..3b95752cc4 100644 --- a/lib/chef/provider/whyrun_safe_ruby_block.rb +++ b/lib/chef/provider/whyrun_safe_ruby_block.rb @@ -19,6 +19,8 @@ class Chef class Provider class WhyrunSafeRubyBlock < Chef::Provider::RubyBlock + provides :whyrun_safe_ruby_block + def action_run @new_resource.block.call @new_resource.updated_by_last_action(true) |