Class: Chef::Provider::Package::Yum::YumCache
- Includes:
- Mixin::Command, Singleton
- Defined in:
- lib/chef/provider/package/yum.rb
Overview
Cache for our installed and available packages, pulled in from yum-dump.py
Instance Method Summary collapse
- #allow_multi_install ⇒ Object
- #available_version(package_name, arch = nil) ⇒ Object (also: #candidate_version)
-
#initialize ⇒ YumCache
constructor
A new instance of YumCache.
- #installed_version(package_name, arch = nil) ⇒ Object
-
#package_available?(package_name) ⇒ Boolean
Check for package by name or name+arch.
-
#packages_from_require(rpmdep) ⇒ Object
Returns a array of packages satisfying an RPMDependency.
-
#refresh ⇒ Object
Cache management.
- #reload ⇒ Object
- #reload_installed ⇒ Object
- #reload_provides ⇒ Object
- #reset ⇒ Object
- #reset_installed ⇒ Object
- #version_available?(package_name, desired_version, arch = nil) ⇒ Boolean
Methods included from Mixin::Command
#chdir_or_tmpdir, #handle_command_failures, #output_of_command, #run_command, #run_command_with_systems_locale
Methods included from Mixin::Command::Windows
Methods included from Mixin::Command::Unix
Constructor Details
#initialize ⇒ YumCache
Returns a new instance of YumCache.
649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 |
# File 'lib/chef/provider/package/yum.rb', line 649 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 = [] # these are for subsequent runs if we are on an interval Chef::Client.when_run_starts do YumCache.instance.reload end end |
Instance Method Details
#allow_multi_install ⇒ Object
831 832 833 834 |
# File 'lib/chef/provider/package/yum.rb', line 831 def allow_multi_install refresh @allow_multi_install end |
#available_version(package_name, arch = nil) ⇒ Object Also known as: candidate_version
822 823 824 |
# File 'lib/chef/provider/package/yum.rb', line 822 def available_version(package_name, arch=nil) version(package_name, arch, true, false) end |
#installed_version(package_name, arch = nil) ⇒ Object
827 828 829 |
# File 'lib/chef/provider/package/yum.rb', line 827 def installed_version(package_name, arch=nil) version(package_name, arch, false, true) end |
#package_available?(package_name) ⇒ Boolean
Check for package by name or name+arch
787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 |
# File 'lib/chef/provider/package/yum.rb', line 787 def package_available?(package_name) refresh if @rpmdb.lookup(package_name) return true else if package_name =~ %r{^(.*)\.(.*)$} 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 |
#packages_from_require(rpmdep) ⇒ Object
Returns a array of packages satisfying an RPMDependency
809 810 811 812 |
# File 'lib/chef/provider/package/yum.rb', line 809 def packages_from_require(rpmdep) refresh @rpmdb.whatprovides(rpmdep) end |
#refresh ⇒ Object
Cache management
675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 |
# File 'lib/chef/provider/package/yum.rb', line 675 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 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 =~ %r{\[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 =~ %r{^(\S+) ([0-9]+) (\S+) (\S+) (\S+) \[(.*)\] ([i,a,r])$} name = $1 epoch = $2 version = $3 release = $4 arch = $5 provides = parse_provides($6) type = $7 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) @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 |
#reload ⇒ Object
763 764 765 |
# File 'lib/chef/provider/package/yum.rb', line 763 def reload @next_refresh = :all end |
#reload_installed ⇒ Object
767 768 769 |
# File 'lib/chef/provider/package/yum.rb', line 767 def reload_installed @next_refresh = :installed end |
#reload_provides ⇒ Object
771 772 773 |
# File 'lib/chef/provider/package/yum.rb', line 771 def reload_provides @next_refresh = :provides end |
#reset ⇒ Object
775 776 777 |
# File 'lib/chef/provider/package/yum.rb', line 775 def reset @rpmdb.clear end |
#reset_installed ⇒ Object
779 780 781 |
# File 'lib/chef/provider/package/yum.rb', line 779 def reset_installed @rpmdb.clear_installed end |
#version_available?(package_name, desired_version, arch = nil) ⇒ Boolean
814 815 816 817 818 819 820 |
# File 'lib/chef/provider/package/yum.rb', line 814 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 |