[csw-devel] SF.net SVN: gar:[14863] csw/mgar/pkg/puppet/trunk

phipsy at users.sourceforge.net phipsy at users.sourceforge.net
Thu Jun 23 16:52:05 CEST 2011


Revision: 14863
          http://gar.svn.sourceforge.net/gar/?rev=14863&view=rev
Author:   phipsy
Date:     2011-06-23 14:52:05 +0000 (Thu, 23 Jun 2011)

Log Message:
-----------
Puppet 2.6.9

Modified Paths:
--------------
    csw/mgar/pkg/puppet/trunk/Makefile
    csw/mgar/pkg/puppet/trunk/checksums
    csw/mgar/pkg/puppet/trunk/files/pkgutil.rb

Modified: csw/mgar/pkg/puppet/trunk/Makefile
===================================================================
--- csw/mgar/pkg/puppet/trunk/Makefile	2011-06-23 14:33:04 UTC (rev 14862)
+++ csw/mgar/pkg/puppet/trunk/Makefile	2011-06-23 14:52:05 UTC (rev 14863)
@@ -7,7 +7,7 @@
 # [1] http://garylaw.net/packages/puppet-build.sh
 
 NAME = puppet
-VERSION = 2.7.1
+VERSION = 2.6.9
 CATEGORIES = apps
 
 define BLURB
@@ -26,9 +26,9 @@
 DISTFILES += cswpuppetmasterd
 DISTFILES += cswusergroup
 DISTFILES += CSWpuppet.postinstall
-# pkgutil.rb is from https://github.com/gw42/puppet/blob/tickets%2Fmaster%2F4258-dev/lib/puppet/provider/package/pkgutil.rb
-# Dom Cleal of RedHat has advised this is a good working version
-# DISTFILES += pkgutil.rb
+# pkgutil.rb is from https://raw.github.com/domcleal/puppet/tickets/master/8011/lib/puppet/provider/package/pkgutil.rb
+# Should be headed into 2.7 code - supports -t REPO
+DISTFILES += pkgutil.rb
 DISTFILES += README.CSW
 DISTFILES += puppet.conf.example-CSW
 SPKG_SOURCEURL = http://puppetlabs.com/
@@ -71,7 +71,10 @@
 INSTALL_SCRIPTS   = puppet
 
 PATCHFILES = 0003-Use-opt-csw-share-puppet-modules-as-default.patch
+# https://projects.puppetlabs.com/issues/6324
+PATCHFILES += 0004-patch-to-smf-provider-6324.patch
 
+
 CHECKPKG_OVERRIDES_CSWpuppetmaster  = surplus-dependency|CSWruby18
 CHECKPKG_OVERRIDES_CSWpuppet        = surplus-dependency|CSWfacter
 CHECKPKG_OVERRIDES_CSWpuppet	   += surplus-dependency|CSWrubyaugeas
@@ -103,6 +106,7 @@
 		--bindir=$(bindir) \
 		--sbindir=$(sbindir) \
 		--full
+	ginstall -m 755 $(FILEDIR)/pkgutil.rb $(DESTDIR)$(rubysitelibdir)/puppet/provider/package
 	cd $(DESTDIR)$(mandir)/man8 && gunzip *
 	(cd $(WORKSRC)/examples/etc/puppet && \
 	for f in *; do \

Modified: csw/mgar/pkg/puppet/trunk/checksums
===================================================================
--- csw/mgar/pkg/puppet/trunk/checksums	2011-06-23 14:33:04 UTC (rev 14862)
+++ csw/mgar/pkg/puppet/trunk/checksums	2011-06-23 14:52:05 UTC (rev 14863)
@@ -2,4 +2,5 @@
 645543a18050f1d991796d865c53f9a4  puppet-2.6.5.tar.gz
 58315e94ff00aedc4a19177877c3e865  puppet-2.6.6.tar.gz
 588dc3343ea66983010e8c4eb58af6af  puppet-2.6.8.tar.gz
+b41bee893aea4624b441a3c29e760c31  puppet-2.6.9.tar.gz
 7a0346758af0222dc5e2b2b1a99c44ec  puppet-2.7.1.tar.gz

Modified: csw/mgar/pkg/puppet/trunk/files/pkgutil.rb
===================================================================
--- csw/mgar/pkg/puppet/trunk/files/pkgutil.rb	2011-06-23 14:33:04 UTC (rev 14862)
+++ csw/mgar/pkg/puppet/trunk/files/pkgutil.rb	2011-06-23 14:52:05 UTC (rev 14863)
@@ -1,76 +1,127 @@
 # Packaging using Peter Bonivart's pkgutil program.
 Puppet::Type.type(:package).provide :pkgutil, :parent => :sun, :source => :sun do
   desc "Package management using Peter Bonivart's ``pkgutil`` command on Solaris."
-  pkguti = "pkgutil"
+
+  pkgutil_bin = "pkgutil"
   if FileTest.executable?("/opt/csw/bin/pkgutil")
-    pkguti = "/opt/csw/bin/pkgutil"
+    pkgutil_bin = "/opt/csw/bin/pkgutil"
   end
 
   confine :operatingsystem => :solaris
 
-  commands :pkguti => pkguti
+  commands :pkguti => pkgutil_bin
 
-  def self.extended(mod)
-    unless command(:pkguti) != "pkgutil"
-      raise Puppet::Error,
-        "The pkgutil command is missing; pkgutil packaging unavailable"
-    end
-
+  def self.healthcheck()
     unless FileTest.exists?("/var/opt/csw/pkgutil/admin")
       Puppet.notice "It is highly recommended you create '/var/opt/csw/pkgutil/admin'."
       Puppet.notice "See /var/opt/csw/pkgutil"
     end
+
+    correct_wgetopts = false
+    [ "/opt/csw/etc/pkgutil.conf", "/etc/opt/csw/pkgutil.conf" ].each do |confpath|
+      File.open(confpath) do |conf|
+        conf.each {|line| correct_wgetopts = true if line =~ /^\s*wgetopts\s*=.*(-nv|-q|--no-verbose|--quiet)/ }
+      end
+    end
+    if ! correct_wgetopts
+      Puppet.notice "It is highly recommended that you set 'wgetopts=-nv' in your pkgutil.conf."
+    end
   end
 
   def self.instances(hash = {})
-    pkglist(hash).collect do |bhash|
-      bhash.delete(:avail)
-      new(bhash)
+    healthcheck
+
+    # Use the available pkg list (-a) to work out aliases
+    aliases = {}
+    availlist.each do |pkg|
+      aliases[pkg[:name]] = pkg[:alias]
     end
+
+    # The -c pkglist lists installed packages
+    pkginsts = []
+    output = pkguti(["-c"])
+    parse_pkglist(output).each do |pkg|
+      pkg.delete(:avail)
+      pkginsts << new(pkg)
+
+      # Create a second instance with the alias if it's different
+      pkgalias = aliases[pkg[:name]]
+      if pkgalias and pkg[:name] != pkgalias
+        apkg = pkg.dup
+        apkg[:name] = pkgalias
+        pkginsts << new(apkg)
+      end
+    end
+
+    pkginsts
   end
 
+  # Turns a pkgutil -a listing into hashes with the common alias, full
+  # package name and available version
+  def self.availlist
+    output = pkguti ["-a"]
+
+    list = output.split("\n").collect do |line|
+      next if line =~ /^common\s+package/  # header of package list
+      next if noise?(line)
+
+      if line =~ /\s*(\S+)\s+(\S+)\s+(.*)/
+        { :alias => $1, :name => $2, :avail => $3 }
+      else
+        Puppet.warning "Cannot match %s" % line
+      end
+    end.reject { |h| h.nil? }
+  end
+
+  # Turn our pkgutil -c listing into a hash for a single package.
+  def pkgsingle(resource)
+    # The --single option speeds up the execution, because it queries
+    # the package managament system for one package only.
+    command = ["-c", "--single", resource[:name]]
+    self.class.parse_pkglist(run_pkgutil(resource, command), { :justme => resource[:name] })
+  end
+
   # Turn our pkgutil -c listing into a bunch of hashes.
-  # Supports :justme => packagename, which uses the optimised --single arg
-  def self.pkglist(hash)
-    command = ["-c"]
+  def self.parse_pkglist(output, hash = {})
+    output = output.split("\n")
 
-    if hash[:justme]
-      # The --single option speeds up the execution, because it queries
-      # the package managament system for one package only.
-      command << "--single"
-      command << hash[:justme]
+    if output[-1] == "Not in catalog"
+      Puppet.warning "Package not in pkgutil catalog: %s" % hash[:justme]
+      return nil
     end
 
-    output = pkguti command
-
-    list = output.split("\n").collect do |line|
-      next if line =~ /^#/
+    list = output.collect do |line|
       next if line =~ /installed\s+catalog/  # header of package list
-      next if line =~ /^Checking integrity / # use_gpg
-      next if line =~ /^gpg: /               # gpg verification
-      next if line =~ /^=+> /                # catalog fetch
-      next if line =~ /\d+:\d+:\d+ URL:/     # wget without -q
+      next if noise?(line)
 
-      pkgsplit(line, hash[:justme])
+      pkgsplit(line)
     end.reject { |h| h.nil? }
 
     if hash[:justme]
-      # Ensure we picked up the package line, not any pkgutil noise.
-      list.reject! { |h| h[:name] != hash[:justme] }
-      return list[-1]
+      # Single queries may have been for an alias so return the name requested
+      if list.any?
+        list[-1][:name] = hash[:justme]
+        return list[-1]
+      end
     else
       list.reject! { |h| h[:ensure] == :absent }
       return list
     end
+  end
 
+  # Identify common types of pkgutil noise as it downloads catalogs etc
+  def self.noise?(line)
+    true if line =~ /^#/
+    true if line =~ /^Checking integrity / # use_gpg
+    true if line =~ /^gpg: /               # gpg verification
+    true if line =~ /^=+> /                # catalog fetch
+    true if line =~ /\d+:\d+:\d+ URL:/     # wget without -q
+    false
   end
 
   # Split the different lines into hashes.
-  def self.pkgsplit(line, justme)
-    if line == "Not in catalog"
-      Puppet.warning "Package not in pkgutil catalog: %s" % justme
-      return nil
-    elsif line =~ /\s*(\S+)\s+(\S+)\s+(.*)/
+  def self.pkgsplit(line)
+    if line =~ /\s*(\S+)\s+(\S+)\s+(.*)/
       hash = {}
       hash[:name] = $1
       hash[:ensure] = if $2 == "notinst"
@@ -80,10 +131,6 @@
       end
       hash[:avail] = $3
 
-      if justme
-        hash[:name] = justme
-      end
-
       if hash[:avail] =~ /^SAME\s*$/
         hash[:avail] = hash[:ensure]
       end
@@ -98,18 +145,28 @@
     end
   end
 
+  def run_pkgutil(resource, *args)
+    # Allow source to be one or more URLs pointing to a repository that all
+    # get passed to pkgutil via one or more -t options
+    if resource[:source]
+      pkguti *[resource[:source].map{|src| [ "-t", src ]}, *args].flatten
+    else
+      pkguti *args.flatten
+    end
+  end
+
   def install
-    pkguti "-y", "-i", @resource[:name]
+    run_pkgutil @resource, "-y", "-i", @resource[:name]
   end
 
   # Retrieve the version from the current package file.
   def latest
-    hash = self.class.pkglist(:justme => @resource[:name])
+    hash = pkgsingle(@resource)
     hash[:avail] if hash
   end
 
   def query
-    if hash = self.class.pkglist(:justme => @resource[:name])
+    if hash = pkgsingle(@resource)
       hash
     else
       {:ensure => :absent}
@@ -117,11 +174,11 @@
   end
 
   def update
-    pkguti "-y", "-u", @resource[:name]
+    run_pkgutil @resource, "-y", "-u", @resource[:name]
   end
 
   def uninstall
-    pkguti "-y", "-r", @resource[:name]
+    run_pkgutil @resource, "-y", "-r", @resource[:name]
   end
 end
 


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.


More information about the devel mailing list