class Chef::Provider::Package::Apt
Attributes
is_virtual_package[RW]
Public Instance Methods
check_package_state(package)
click to toggle source
# File lib/chef/provider/package/apt.rb, line 54 def check_package_state(package) Chef::Log.debug("#{@new_resource} checking package status for #{package}") installed = false shell_out!("apt-cache#{expand_options(default_release_options)} policy #{package}", :timeout => @new_resource.timeout).stdout.each_line do |line| case line when /^\s{2}Installed: (.+)$/ installed_version = $1 if installed_version == '(none)' Chef::Log.debug("#{@new_resource} current version is nil") @current_resource.version(nil) else Chef::Log.debug("#{@new_resource} current version is #{installed_version}") @current_resource.version(installed_version) installed = true end when /^\s{2}Candidate: (.+)$/ candidate_version = $1 if candidate_version == '(none)' # This may not be an appropriate assumption, but it shouldn't break anything that already worked -- btm @is_virtual_package = true showpkg = shell_out!("apt-cache showpkg #{package}", :timeout => @new_resource.timeout).stdout providers = Hash.new # Returns all lines after 'Reverse Provides:' showpkg.rpartition(/Reverse Provides:\s*#{$/}/)[2].each_line do |line| provider, version = line.split providers[provider] = version end # Check if the package providing this virtual package is installed num_providers = providers.length raise Chef::Exceptions::Package, "#{@new_resource.package_name} has no candidate in the apt-cache" if num_providers == 0 # apt will only install a virtual package if there is a single providing package raise Chef::Exceptions::Package, "#{@new_resource.package_name} is a virtual package provided by #{num_providers} packages, you must explicitly select one to install" if num_providers > 1 # Check if the package providing this virtual package is installed Chef::Log.info("#{@new_resource} is a virtual package, actually acting on package[#{providers.keys.first}]") installed = check_package_state(providers.keys.first) else Chef::Log.debug("#{@new_resource} candidate version is #{$1}") @candidate_version = $1 end end end return installed end
default_release_options()
click to toggle source
# File lib/chef/provider/package/apt.rb, line 49 def default_release_options # Use apt::Default-Release option only if provider was explicitly defined "-o APT::Default-Release=#{@new_resource.default_release}" if @new_resource.provider && @new_resource.default_release end
define_resource_requirements()
click to toggle source
Calls superclass method
Chef::Provider::Package#define_resource_requirements
# File lib/chef/provider/package/apt.rb, line 40 def define_resource_requirements super requirements.assert(:all_actions) do |a| a.assertion { !@new_resource.source } a.failure_message(Chef::Exceptions::Package, 'apt package provider cannot handle source attribute. Use dpkg provider instead') end end
install_package(name, version)
click to toggle source
# File lib/chef/provider/package/apt.rb, line 100 def install_package(name, version) package_name = "#{name}=#{version}" package_name = name if @is_virtual_package run_noninteractive("apt-get -q -y#{expand_options(default_release_options)}#{expand_options(@new_resource.options)} install #{package_name}") end
load_current_resource()
click to toggle source
# File lib/chef/provider/package/apt.rb, line 33 def load_current_resource @current_resource = Chef::Resource::Package.new(@new_resource.name) @current_resource.package_name(@new_resource.package_name) check_package_state(@new_resource.package_name) @current_resource end
preseed_package(preseed_file)
click to toggle source
# File lib/chef/provider/package/apt.rb, line 119 def preseed_package(preseed_file) Chef::Log.info("#{@new_resource} pre-seeding package installation instructions") run_noninteractive("debconf-set-selections #{preseed_file}") end
purge_package(name, version)
click to toggle source
# File lib/chef/provider/package/apt.rb, line 115 def purge_package(name, version) run_noninteractive("apt-get -q -y#{expand_options(@new_resource.options)} purge #{@new_resource.package_name}") end
reconfig_package(name, version)
click to toggle source
# File lib/chef/provider/package/apt.rb, line 124 def reconfig_package(name, version) Chef::Log.info("#{@new_resource} reconfiguring") run_noninteractive("dpkg-reconfigure #{name}") end
remove_package(name, version)
click to toggle source
# File lib/chef/provider/package/apt.rb, line 110 def remove_package(name, version) package_name = "#{name}" run_noninteractive("apt-get -q -y#{expand_options(@new_resource.options)} remove #{package_name}") end
upgrade_package(name, version)
click to toggle source
# File lib/chef/provider/package/apt.rb, line 106 def upgrade_package(name, version) install_package(name, version) end
Private Instance Methods
run_noninteractive(command)
click to toggle source
Runs command via shell_out with magic environment to disable interactive prompts. Command is run with default localization rather than forcing locale to āCā, so command output may not be stable.
# File lib/chef/provider/package/apt.rb, line 134 def run_noninteractive(command) shell_out!(command, :env => { "DEBIAN_FRONTEND" => "noninteractive", "LC_ALL" => nil }, :timeout => @new_resource.timeout) end