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.

Reply via email to