From: James Turnbull <ja...@lovedthanlost.net>

Signed-off-by: Juerg Walz <jw...@pobox.com>
---
Local-branch: tickets/master/4258-dev
 lib/puppet/provider/package/pkgutil.rb |  117 ++++++++++++++++++++++++++++++++
 1 files changed, 117 insertions(+), 0 deletions(-)
 create mode 100644 lib/puppet/provider/package/pkgutil.rb

diff --git a/lib/puppet/provider/package/pkgutil.rb 
b/lib/puppet/provider/package/pkgutil.rb
new file mode 100644
index 0000000..39c2302
--- /dev/null
+++ b/lib/puppet/provider/package/pkgutil.rb
@@ -0,0 +1,117 @@
+# Packaging using Peter Bonivart's pkgutil program.
+Puppet::Type.type(:package).provide :pkgutil, :parent => :sun, :source => :sun 
do
+    desc "Package management using Peter Bonivartg's ``pkgutil`` command on 
Solaris."
+    pkguti = "pkgutil"
+    if FileTest.executable?("/opt/csw/bin/pkgutil")
+        pkguti = "/opt/csw/bin/pkgutil"
+    end
+
+    confine :operatingsystem => :solaris
+
+    commands :pkguti => pkguti
+
+    # This is so stupid, but then, so is blastwave.
+    ENV["PAGER"] = "/usr/bin/cat"
+
+    def self.extended(mod)
+        unless command(:pkguti) != "pkgutil"
+            raise Puppet::Error,
+                "The pkgutil command is missing; pkgutil packaging unavailable"
+        end
+
+        unless FileTest.exists?("/var/pkg-get/admin")
+            Puppet.notice "It is highly recommended you create 
'/var/pkg-get/admin'."
+            Puppet.notice "See /var/pkg-get/admin-fullauto"
+        end
+    end
+
+    def self.instances(hash = {})
+        blastlist(hash).collect do |bhash|
+            bhash.delete(:avail)
+            new(bhash)
+        end
+    end
+
+    # Turn our blastwave listing into a bunch of hashes.
+    def self.blastlist(hash)
+        command = ["-c"]
+
+        if hash[:justme]
+            command << hash[:justme]
+        end
+
+        output = pkguti command
+
+        list = output.split("\n").collect do |line|
+            next if line =~ /^#/
+            next if line =~ /^WARNING/
+            next if line =~ /localrev\s+remoterev/
+            next if line =~ /installed\s+catalog/
+
+            blastsplit(line)
+        end.reject { |h| h.nil? }
+
+        if hash[:justme]
+            return list[0]
+        else
+            list.reject! { |h|
+                h[:ensure] == :absent
+            }
+            return list
+        end
+
+    end
+
+    # Split the different lines into hashes.
+    def self.blastsplit(line)
+        if line =~ /\s*(\S+)\s+((\[Not installed\])|(\S+))\s+(\S+)/
+            hash = {}
+            hash[:name] = $1
+            hash[:ensure] = if $2 == "[Not installed]"
+                :absent
+            else
+                $2
+            end
+            hash[:avail] = $5
+
+            if hash[:avail] == "SAME"
+                hash[:avail] = hash[:ensure]
+            end
+
+            # Use the name method, so it works with subclasses.
+            hash[:provider] = self.name
+
+            return hash
+        else
+            Puppet.warning "Cannot match %s" % line
+            return nil
+        end
+    end
+
+    def install
+        pkguti "-y", "-i", @resource[:name]
+    end
+
+    # Retrieve the version from the current package file.
+    def latest
+        hash = self.class.blastlist(:justme => @resource[:name])
+        hash[:avail]
+    end
+
+    def query
+        if hash = self.class.blastlist(:justme => @resource[:name])
+            hash
+        else
+            {:ensure => :absent}
+        end
+    end
+
+    # Remove the old package, and install the new one
+    def update
+        pkguti "-y", "-i", @resource[:name]
+    end
+
+    def uninstall
+        pkguti "-y", "-r", @resource[:name]
+    end
+end
-- 
1.7.3.2

-- 
You received this message because you are subscribed to the Google Groups 
"Puppet Developers" group.
To post to this group, send email to puppet-dev@googlegroups.com.
To unsubscribe from this group, send email to 
puppet-dev+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/puppet-dev?hl=en.

Reply via email to