Cache for our installed and available packages, pulled in from yum-dump.py
# File lib/chef/provider/package/yum.rb, line 650 def initialize @rpmdb = RPMDb.new # Next time @rpmdb is accessed: # :all - Trigger a run of "yum-dump.py --options --installed-provides", updates # yum's cache and parses options from /etc/yum.conf. Pulls in Provides # dependency data for installed packages only - this data is slow to # gather. # :provides - Same as :all but pulls in Provides data for available packages as well. # Used as a last resort when we can't find a Provides match. # :installed - Trigger a run of "yum-dump.py --installed", only reads the local rpm # db. Used between client runs for a quick refresh. # :none - Do nothing, a call to one of the reload methods is required. @next_refresh = :all @allow_multi_install = [] @extra_repo_control = nil # these are for subsequent runs if we are on an interval Chef::Client.when_run_starts do YumCache.instance.reload end end
Return an array of packages allowed to be installed multiple times, such as the kernel
# File lib/chef/provider/package/yum.rb, line 854 def allow_multi_install refresh @allow_multi_install end
Return the latest available version for a package.arch
# File lib/chef/provider/package/yum.rb, line 843 def available_version(package_name, arch=nil) version(package_name, arch, true, false) end
# File lib/chef/provider/package/yum.rb, line 867 def disable_extra_repo_control # Only force reload when set if @extra_repo_control @extra_repo_control = nil reload end end
# File lib/chef/provider/package/yum.rb, line 859 def enable_extra_repo_control(arg) # Don't touch cache if it's the same repos as the last load unless @extra_repo_control == arg @extra_repo_control = arg reload end end
Return the currently installed version for a package.arch
# File lib/chef/provider/package/yum.rb, line 849 def installed_version(package_name, arch=nil) version(package_name, arch, false, true) end
Check for package by name or name+arch
# File lib/chef/provider/package/yum.rb, line 797 def package_available?(package_name) refresh if @rpmdb.lookup(package_name) return true else if package_name =~ %{^(.*)\.(.*)$} pkg_name = $1 pkg_arch = $2 if matches = @rpmdb.lookup(pkg_name) matches.each do |m| return true if m.arch == pkg_arch end end end end return false end
Return the source repository for a package-version.arch
# File lib/chef/provider/package/yum.rb, line 834 def package_repository(package_name, desired_version, arch=nil) package(package_name, arch, true, false) do |pkg| return pkg.repoid if desired_version == pkg.version.to_s end return nil end
Returns a array of packages satisfying an RPMDependency
# File lib/chef/provider/package/yum.rb, line 819 def packages_from_require(rpmdep) refresh @rpmdb.whatprovides(rpmdep) end
Cache management
# File lib/chef/provider/package/yum.rb, line 680 def refresh case @next_refresh when :none return nil when :installed reset_installed # fast opts=" --installed" when :all reset # medium opts=" --options --installed-provides" when :provides reset # slow! opts=" --options --all-provides" else raise ArgumentError, "Unexpected value in next_refresh: #{@next_refresh}" end if @extra_repo_control opts << " #{@extra_repo_control}" end one_line = false error = nil helper = ::File.join(::File.dirname(__FILE__), 'yum-dump.py') status = popen4("/usr/bin/python #{helper}#{opts}", :waitlast => true) do |pid, stdin, stdout, stderr| stdout.each do |line| one_line = true line.chomp! if line =~ %{\[option (.*)\] (.*)} if $1 == "installonlypkgs" @allow_multi_install = $2.split else raise Chef::Exceptions::Package, "Strange, unknown option line '#{line}' from yum-dump.py" end next end if line =~ %{^(\S+) ([0-9]+) (\S+) (\S+) (\S+) \[(.*)\] ([i,a,r]) (\S+)$} name = $1 epoch = $2 version = $3 release = $4 arch = $5 provides = parse_provides($6) type = $7 repoid = $8 else Chef::Log.warn("Problem parsing line '#{line}' from yum-dump.py! " + "Please check your yum configuration.") next end case type when "i" # if yum-dump was called with --installed this may not be true, but it's okay # since we don't touch the @available Set in reload_installed available = false installed = true when "a" available = true installed = false when "r" available = true installed = true end pkg = RPMDbPackage.new(name, epoch, version, release, arch, provides, installed, available, repoid) @rpmdb << pkg end error = stderr.readlines end if status.exitstatus != 0 raise Chef::Exceptions::Package, "Yum failed - #{status.inspect} - returns: #{error}" else unless one_line Chef::Log.warn("Odd, no output from yum-dump.py. Please check " + "your yum configuration.") end end # A reload method must be called before the cache is altered @next_refresh = :none end
# File lib/chef/provider/package/yum.rb, line 773 def reload @next_refresh = :all end
# File lib/chef/provider/package/yum.rb, line 777 def reload_installed @next_refresh = :installed end
# File lib/chef/provider/package/yum.rb, line 781 def reload_provides @next_refresh = :provides end
# File lib/chef/provider/package/yum.rb, line 785 def reset @rpmdb.clear end
# File lib/chef/provider/package/yum.rb, line 789 def reset_installed @rpmdb.clear_installed end
Check if a package-version.arch is available to install
# File lib/chef/provider/package/yum.rb, line 825 def version_available?(package_name, desired_version, arch=nil) version(package_name, arch, true, false) do |v| return true if desired_version == v end return false end
Generated with the Darkfish Rdoc Generator 2.