From: Nathan Norton <[email protected]>
Signed-off-by: Nathan Norton <[email protected]> --- Local-branch: feature/master/2247-enablerepo lib/puppet/provider/package/yum.rb | 60 ++++++++++++++++++++++++----- lib/puppet/provider/package/yumhelper.py | 32 +++++++++++++++- lib/puppet/type/package.rb | 14 +++++++ 3 files changed, 94 insertions(+), 12 deletions(-) diff --git a/lib/puppet/provider/package/yum.rb b/lib/puppet/provider/package/yum.rb index 6ed966f..d5ec129 100755 --- a/lib/puppet/provider/package/yum.rb +++ b/lib/puppet/provider/package/yum.rb @@ -27,23 +27,55 @@ Puppet::Type.type(:package).provide :yum, :parent => :rpm, :source => :rpm do super return unless packages.detect { |name, package| package.should(:ensure) == :latest } - # collect our 'latest' info + repoconfig = { } + repoconfig[""] = [ ] + packages.each do |name, package| + if package[:enablerepo].respond_to?("length") + if package[:enablerepo].length != 0 + if package[:enablerepo].respond_to?("join") + repoconfig[ package[:enablerepo].join(",") ] = package[:enablerepo] + else + repoconfig[ package[:enablerepo] ] = package[:enablerepo] + end + end + end + end + updates = {} - python(YUMHELPER).each_line do |l| - l.chomp! - next if l.empty? - if l[0,4] == "_pkg" - hash = nevra_to_hash(l[5..-1]) - [hash[:name], "#{hash[:name]}.#{hash[:arch]}"].each do |n| - updates[n] ||= [] - updates[n] << hash + + repoconfig.each do |config, enablerepo| + fullyumhelper = [] + enablerepo.each do |value| + fullyumhelper += [ "-e", value ] + end + + # collect our 'latest' info + python(YUMHELPER, fullyumhelper).each_line do |l| + l.chomp! + next if l.empty? + if l[0,4] == "_pkg" + hash = nevra_to_hash(l[5..-1]) + ["#{hash[:name]}.#{config}", "#{hash[:name]}.#{hash[:arch]}.#{config}"].each do |n| + updates[n] ||= [] + updates[n] << hash + end end end end # Add our 'latest' info to the providers. packages.each do |name, package| - if info = updates[package[:name]] + repocfg = "" + if package[:enablerepo].respond_to?("length") + if package[:enablerepo].length != 0 + if package[:enablerepo].respond_to?("join") + repocfg = package[:enablerepo].join(",") + else + repocfg = package[:enablerepo] + end + end + end + if info = updates["#{package[:name]}.#{repocfg}"] package.provider.latest_info = info[0] end end @@ -54,6 +86,7 @@ Puppet::Type.type(:package).provide :yum, :parent => :rpm, :source => :rpm do self.debug "Ensuring => #{should}" wanted = @resource[:name] operation = :install + enablerepo = @resource[:enablerepo] # XXX: We don't actually deal with epochs here. case should @@ -70,7 +103,12 @@ Puppet::Type.type(:package).provide :yum, :parent => :rpm, :source => :rpm do end end - output = yum "-d", "0", "-e", "0", "-y", operation, wanted + fullenablerepo = [] + enablerepo.each do |value| + fullenablerepo += [ "--enablerepo=" + value ] + end + + output = yum "-d", "0", "-e", "0", "-y", fullenablerepo, operation, wanted is = self.query raise Puppet::Error, "Could not find package #{self.name}" unless is diff --git a/lib/puppet/provider/package/yumhelper.py b/lib/puppet/provider/package/yumhelper.py index e7b5fe1..bb89c01 100644 --- a/lib/puppet/provider/package/yumhelper.py +++ b/lib/puppet/provider/package/yumhelper.py @@ -28,6 +28,24 @@ OVERRIDE_OPTS = { 'logfile': '/dev/null' } +enable = [] +disable = [] +args = list(sys.argv) + +while len(args) > 0: + a = args.pop(0) + + if a == "-d": + if len(args) < 1: + raise ValueError, a + next = args.pop(0) + disable.extend([ next ]) + if a == "-e": + if len(args) < 1: + raise ValueError, a + next = args.pop(0) + enable.extend([ next ]) + def pkg_lists(my): my.doConfigSetup() @@ -52,7 +70,12 @@ def pkg_lists(my): def shell_out(): try: - p = popen("/usr/bin/env yum check-update 2>&1") + repostring = "" + for repo in disable: + repostring += " '--disablerepo=%s'" % repo + for repo in enable: + repostring += " '--enablerepo=%s'" % repo + p = popen("/usr/bin/env yum%s check-update 2>&1" % repostring) output = p.readlines() rc = p.close() @@ -112,6 +135,13 @@ if useyumlib: try: try: my = yum.YumBase() + + for repo in disable: + my.repos.disableRepo(repo) + + for repo in enable: + my.repos.enableRepo(repo) + ypl = pkg_lists(my) for pkg in ypl.updates: print "_pkg %s %s %s %s %s" % (pkg.name, pkg.epoch, pkg.version, pkg.release, pkg.arch) diff --git a/lib/puppet/type/package.rb b/lib/puppet/type/package.rb index 1222a53..673dcd1 100644 --- a/lib/puppet/type/package.rb +++ b/lib/puppet/type/package.rb @@ -263,6 +263,20 @@ module Puppet newvalues(:keep, :replace) end + newparam(:enablerepo) do + desc "This describes whether to enable a repo or multiple. Only + yum providers currently support this, but if selected allows + installation of packages from otherwise disabled repos." + + defaultto [] + + validate do |value| + if value.include?(",") + raise ArgumentError, "Repository names to enable must be provided as an array, not a comma-separated list" + end + end + end + newparam(:category) do desc "A read-only parameter set by the package." end -- 1.7.3.4 -- You received this message because you are subscribed to the Google Groups "Puppet Developers" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/puppet-dev?hl=en.
