Class: Chef::Provider::Package::Yum::YumCache
- Inherits:
-
Object
- Object
- Chef::Provider::Package::Yum::YumCache
- Includes:
- Mixin::ShellOut, Mixin::Which, Singleton
- Defined in:
- lib/chef/provider/package/yum.rb
Overview
Cache for our installed and available packages, pulled in from yum-dump.py
Constant Summary
Constants included from Mixin::ShellOut
Mixin::ShellOut::DEPRECATED_OPTIONS
Instance Attribute Summary collapse
-
#extra_repo_control ⇒ Object
readonly
Returns the value of attribute extra_repo_control.
-
#yum_binary ⇒ Object
Returns the value of attribute yum_binary.
Instance Method Summary collapse
-
#allow_multi_install ⇒ Object
Return an array of packages allowed to be installed multiple times, such as the kernel.
-
#available_version(package_name, arch = nil) ⇒ Object
(also: #candidate_version)
Return the latest available version for a package.arch.
- #disable_extra_repo_control ⇒ Object
- #enable_extra_repo_control(arg) ⇒ Object
- #extract_interpreter(file) ⇒ Object
-
#initialize ⇒ YumCache
constructor
A new instance of YumCache.
-
#installed_version(package_name, arch = nil) ⇒ Object
Return the currently installed version for a package.arch.
-
#package_available?(package_name) ⇒ Boolean
Check for package by name or name+arch.
-
#package_repository(package_name, desired_version, arch = nil) ⇒ Object
Return the source repository for a package-version.arch.
-
#packages_from_require(rpmdep) ⇒ Object
Returns a array of packages satisfying an RPMDependency.
- #python_bin ⇒ Object
-
#refresh ⇒ Object
Cache management.
- #reload ⇒ Object
- #reload_installed ⇒ Object
- #reload_provides ⇒ Object
- #reset ⇒ Object
- #reset_installed ⇒ Object
- #shabang?(file) ⇒ Boolean
-
#shabang_or_fallback(interpreter) ⇒ Object
dnf based systems have a yum shim that has /bin/bash as the interpreter.
-
#version_available?(package_name, desired_version, arch = nil) ⇒ Boolean
Check if a package-version.arch is available to install.
Methods included from Mixin::ShellOut
#run_command_compatible_options, #shell_out, #shell_out!, #shell_out_with_systems_locale, #shell_out_with_systems_locale!
Methods included from Mixin::Which
Constructor Details
#initialize ⇒ YumCache
Returns a new instance of YumCache.
656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 |
# File 'lib/chef/provider/package/yum.rb', line 656 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 |
Instance Attribute Details
#extra_repo_control ⇒ Object (readonly)
Returns the value of attribute extra_repo_control.
681 682 683 |
# File 'lib/chef/provider/package/yum.rb', line 681 def extra_repo_control @extra_repo_control end |
#yum_binary ⇒ Object
Returns the value of attribute yum_binary.
654 655 656 |
# File 'lib/chef/provider/package/yum.rb', line 654 def yum_binary @yum_binary end |
Instance Method Details
#allow_multi_install ⇒ Object
Return an array of packages allowed to be installed multiple times, such as the kernel
902 903 904 905 |
# File 'lib/chef/provider/package/yum.rb', line 902 def allow_multi_install refresh @allow_multi_install end |
#available_version(package_name, arch = nil) ⇒ Object Also known as: candidate_version
Return the latest available version for a package.arch
891 892 893 |
# File 'lib/chef/provider/package/yum.rb', line 891 def available_version(package_name, arch = nil) version(package_name, arch, true, false) end |
#disable_extra_repo_control ⇒ Object
915 916 917 918 919 920 921 |
# File 'lib/chef/provider/package/yum.rb', line 915 def disable_extra_repo_control # Only force reload when set if @extra_repo_control @extra_repo_control = nil reload end end |
#enable_extra_repo_control(arg) ⇒ Object
907 908 909 910 911 912 913 |
# File 'lib/chef/provider/package/yum.rb', line 907 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 |
#extract_interpreter(file) ⇒ Object
799 800 801 |
# File 'lib/chef/provider/package/yum.rb', line 799 def extract_interpreter(file) ::File.open(file, "r", &:readline)[2..-1].strip end |
#installed_version(package_name, arch = nil) ⇒ Object
Return the currently installed version for a package.arch
897 898 899 |
# File 'lib/chef/provider/package/yum.rb', line 897 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
845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 |
# File 'lib/chef/provider/package/yum.rb', line 845 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 |
#package_repository(package_name, desired_version, arch = nil) ⇒ Object
Return the source repository for a package-version.arch
882 883 884 885 886 887 888 |
# File 'lib/chef/provider/package/yum.rb', line 882 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 |
#packages_from_require(rpmdep) ⇒ Object
Returns a array of packages satisfying an RPMDependency
867 868 869 870 |
# File 'lib/chef/provider/package/yum.rb', line 867 def packages_from_require(rpmdep) refresh @rpmdb.whatprovides(rpmdep) end |
#python_bin ⇒ Object
785 786 787 788 789 790 791 792 793 794 795 796 797 |
# File 'lib/chef/provider/package/yum.rb', line 785 def python_bin yum_executable = which(yum_binary) if yum_executable && shabang?(yum_executable) shabang_or_fallback(extract_interpreter(yum_executable)) else Chef::Log.warn("Yum executable not found or doesn't start with #!. Using default python.") "/usr/bin/python" end rescue StandardError => e Chef::Log.warn("An error occurred attempting to determine correct python executable. Using default.") Chef::Log.debug(e) "/usr/bin/python" end |
#refresh ⇒ Object
Cache management
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 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 |
# File 'lib/chef/provider/package/yum.rb', line 686 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 opts << " --yum-lock-timeout #{Chef::Config[:yum_lock_timeout]}" one_line = false error = nil helper = ::File.join(::File.dirname(__FILE__), "yum-dump.py") status = nil begin status = shell_out!("#{python_bin} #{helper}#{opts}", :timeout => Chef::Config[:yum_timeout]) status.stdout.each_line 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]) (\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 = status.stderr rescue Mixlib::ShellOut::CommandTimeout => e Chef::Log.error("#{helper} exceeded timeout #{Chef::Config[:yum_timeout]}") raise(e) 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
821 822 823 |
# File 'lib/chef/provider/package/yum.rb', line 821 def reload @next_refresh = :all end |
#reload_installed ⇒ Object
825 826 827 |
# File 'lib/chef/provider/package/yum.rb', line 825 def reload_installed @next_refresh = :installed end |
#reload_provides ⇒ Object
829 830 831 |
# File 'lib/chef/provider/package/yum.rb', line 829 def reload_provides @next_refresh = :provides end |
#reset ⇒ Object
833 834 835 |
# File 'lib/chef/provider/package/yum.rb', line 833 def reset @rpmdb.clear end |
#reset_installed ⇒ Object
837 838 839 |
# File 'lib/chef/provider/package/yum.rb', line 837 def reset_installed @rpmdb.clear_installed end |
#shabang?(file) ⇒ Boolean
813 814 815 816 817 818 819 |
# File 'lib/chef/provider/package/yum.rb', line 813 def shabang?(file) ::File.open(file, "r") do |f| f.read(2) == '#!' end rescue Errno::ENOENT false end |
#shabang_or_fallback(interpreter) ⇒ Object
dnf based systems have a yum shim that has /bin/bash as the interpreter. Don’t use this.
804 805 806 807 808 809 810 811 |
# File 'lib/chef/provider/package/yum.rb', line 804 def shabang_or_fallback(interpreter) if interpreter == "/bin/bash" Chef::Log.warn("Yum executable interpreter is /bin/bash. Falling back to default python.") "/usr/bin/python" else interpreter end end |
#version_available?(package_name, desired_version, arch = nil) ⇒ Boolean
Check if a package-version.arch is available to install
873 874 875 876 877 878 879 |
# File 'lib/chef/provider/package/yum.rb', line 873 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 |