summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/puppet/provider/package/pkgdmg.rb49
-rwxr-xr-xspec/unit/provider/package/pkgdmg.rb21
2 files changed, 44 insertions, 26 deletions
diff --git a/lib/puppet/provider/package/pkgdmg.rb b/lib/puppet/provider/package/pkgdmg.rb
index 8a916d5c4..25edc9109 100644
--- a/lib/puppet/provider/package/pkgdmg.rb
+++ b/lib/puppet/provider/package/pkgdmg.rb
@@ -68,8 +68,8 @@ Puppet::Type.type(:package).provide :pkgdmg, :parent => Puppet::Provider::Packag
end
def self.installpkgdmg(source, name)
- unless source =~ /\.dmg$/i
- raise Puppet::Error.new("Mac OS X PKG DMG's must specificy a source string ending in .dmg")
+ unless source =~ /\.dmg$/i || source =~ /\.pkg$/i
+ raise Puppet::Error.new("Mac OS X PKG DMG's must specificy a source string ending in .dmg or flat .pkg file")
end
require 'open-uri'
cached_source = source
@@ -85,28 +85,34 @@ Puppet::Type.type(:package).provide :pkgdmg, :parent => Puppet::Provider::Packag
end
begin
- File.open(cached_source) do |dmg|
- xml_str = hdiutil "mount", "-plist", "-nobrowse", "-readonly", "-noidme", "-mountrandom", "/tmp", dmg.path
- hdiutil_info = Plist::parse_xml(xml_str)
- unless hdiutil_info.has_key?("system-entities")
- raise Puppet::Error.new("No disk entities returned by mount at %s" % dmg.path)
- end
- mounts = hdiutil_info["system-entities"].collect { |entity|
- entity["mount-point"]
- }.compact
- begin
- mounts.each do |mountpoint|
- Dir.entries(mountpoint).select { |f|
- f =~ /\.m{0,1}pkg$/i
- }.each do |pkg|
- installpkg("#{mountpoint}/#{pkg}", name, source)
- end
+ if source =~ /\.dmg$/i
+ File.open(cached_source) do |dmg|
+ xml_str = hdiutil "mount", "-plist", "-nobrowse", "-readonly", "-noidme", "-mountrandom", "/tmp", dmg.path
+ hdiutil_info = Plist::parse_xml(xml_str)
+ unless hdiutil_info.has_key?("system-entities")
+ raise Puppet::Error.new("No disk entities returned by mount at %s" % dmg.path)
end
- ensure
- mounts.each do |mountpoint|
- hdiutil "eject", mountpoint
+ mounts = hdiutil_info["system-entities"].collect { |entity|
+ entity["mount-point"]
+ }.compact
+ begin
+ mounts.each do |mountpoint|
+ Dir.entries(mountpoint).select { |f|
+ f =~ /\.m{0,1}pkg$/i
+ }.each do |pkg|
+ installpkg("#{mountpoint}/#{pkg}", name, source)
+ end
+ end
+ ensure
+ mounts.each do |mountpoint|
+ hdiutil "eject", mountpoint
+ end
end
end
+ elsif source =~ /\.pkg$/i
+ installpkg(cached_source, name, source)
+ else
+ raise Puppet::Error.new("Mac OS X PKG DMG's must specificy a source string ending in .dmg or flat .pkg file")
end
ensure
# JJM Remove the file if open-uri didn't already do so.
@@ -116,6 +122,7 @@ Puppet::Type.type(:package).provide :pkgdmg, :parent => Puppet::Provider::Packag
def query
if FileTest.exists?("/var/db/.puppet_pkgdmg_installed_#{@resource[:name]}")
+ Puppet.debug "/var/db/.puppet_pkgdmg_installed_#{@resource[:name]} found"
return {:name => @resource[:name], :ensure => :present}
else
return nil
diff --git a/spec/unit/provider/package/pkgdmg.rb b/spec/unit/provider/package/pkgdmg.rb
index d43757401..3f007e01b 100755
--- a/spec/unit/provider/package/pkgdmg.rb
+++ b/spec/unit/provider/package/pkgdmg.rb
@@ -9,8 +9,9 @@ describe provider do
@resource = stub 'resource', :[] => "dummypkgdmg"
@provider = provider.new(@resource)
- @fakemountpoint = "/tmp/dmg.foo"
- @fakehdiutilinfo = {"system-entities" => [{"mount-point" => @fakemountpoint}] }
+ @fakemountpoint = "/tmp/dmg.foo"
+ @fakepkgfile = "/tmp/test.pkg"
+ @fakehdiutilinfo = {"system-entities" => [{"mount-point" => @fakemountpoint}] }
@fakehdiutilplist = Plist::Emit.dump(@fakehdiutilinfo)
@hdiutilmountargs = ["mount", "-plist", "-nobrowse", "-readonly",
@@ -36,8 +37,8 @@ describe provider do
lambda { @provider.install }.should raise_error(Puppet::Error)
end
- it "the source does not end in .dmg" do
- @resource.stubs(:[]).with(:source).returns "notendingindotdmg"
+ it "the source does not end in .dmg or .pkg" do
+ @resource.stubs(:[]).with(:source).returns "notendingindotdmgorpkg"
lambda { @provider.install }.should raise_error(Puppet::Error)
end
@@ -48,7 +49,7 @@ describe provider do
end
# These tests shouldn't be this messy. The pkgdmg provider needs work...
- describe "when installing" do
+ describe "when installing a pkgdmg" do
before do
fh = mock 'filehandle'
fh.stubs(:path).yields "/tmp/foo"
@@ -70,4 +71,14 @@ describe provider do
@provider.install
end
end
+
+ describe "when installing flat pkg file" do
+ it "should call installpkg if a flat pkg file is found instead of a .dmg image" do
+ @resource.stubs(:[]).with(:source).returns "/tmp/test.pkg"
+ @resource.stubs(:[]).with(:name).returns "testpkg"
+ @provider.class.expects(:installpkgdmg).with("#{@fakepkgfile}", "testpkg").returns ""
+ @provider.install
+ end
+ end
+
end