Signed-off-by: Udo Waechter <udo.wa...@uni-osnabrueck.de>
Signed-off-by: James Turnbull <ja...@lovedthanlost.net>
---
lib/puppet/provider/package/appdmg.rb | 190 +++++++++++++++++++--------------
1 files changed, 111 insertions(+), 79 deletions(-)
diff --git a/lib/puppet/provider/package/appdmg.rb b/lib/puppet/provider/package/appdmg.rb
index 352f873..20035b8 100644
--- a/lib/puppet/provider/package/appdmg.rb
+++ b/lib/puppet/provider/package/appdmg.rb
@@ -1,5 +1,5 @@
# Jeff McCune <mccun...@gmail.com>
-# Changed to app.dmg by: Udo Waechter <ro...@zoide.net>
+# Changed to app.dmg by: Udo Waechter <udo.wa...@uni-osnabrueck.de>
# Mac OS X Package Installer which handles application (.app)
# bundles inside an Apple Disk Image.
#
@@ -13,102 +13,134 @@
# in /var/db/.puppet_appdmg_installed_<name>
require 'puppet/provider/package'
+require 'yaml'
+require "FileUtils"
+
Puppet::Type.type(:package).provide(:appdmg, :parent => Puppet::Provider::Package) do
- desc "Package management which copies application bundles to a target."
+ desc "Package management which copies application bundles to a target."
+ $appdmg_target = "/Applications"
+ confine :operatingsystem => :darwin
- confine :operatingsystem => :darwin
-
- commands :hdiutil => "/usr/bin/hdiutil"
- commands :curl => "/usr/bin/curl"
- commands :ditto => "/usr/bin/ditto"
+ commands :hdiutil => "/usr/bin/hdiutil"
+ commands :curl => "/usr/bin/curl"
+ commands :ditto => "/usr/bin/ditto"
+ # JJM We store a cookie for each installed .app.dmg in /var/db
+ def self.instances_by_name
+ Dir.entries("/var/db").find_all { |f|
+ f =~ /^\.puppet_appdmg_installed_/
+ }.collect do |f|
+ name = f.sub(/^\.puppet_appdmg_installed_/, '')
+ yield name if block_given?
+ name
+ end
+ end
- # JJM We store a cookie for each installed .app.dmg in /var/db
- def self.instances_by_name
- Dir.entries("/var/db").find_all { |f|
- f =~ /^\.puppet_appdmg_installed_/
- }.collect do |f|
- name = f.sub(/^\.puppet_appdmg_installed_/, '')
- yield name if block_given?
- name
- end
+ def self.instances
+ instances_by_name.collect do |name|
+ new(:name => name, :provider => :appdmg, :ensure => :installed)
end
+ end
- def self.instances
- instances_by_name.collect do |name|
- new(:name => name, :provider => :appdmg, :ensure => :installed)
- end
+ def self.installapp(source, name, orig_source)
+ appname = File.basename(source);
+ ditto "--rsrc", source, "#{$appdmg_target}/#{appname}"
+ dbfile = "/var/db/.puppet_appdmg_installed_#{name}"
+ receipthash = {}
+ receipthash["files"] = []
+ if File.exist?(dbfile)
+ receipthash = YAML::load_file(dbfile)
end
+ receipthash["name"] = name
+ receipthash["source"] = orig_source
+ receipthash["files"].include?(appname) or receipthash["files"].push(appname)
+ f = File.open(dbfile,"w")
+ f.print receipthash.to_yaml
+ f.close
+ end
- def self.installapp(source, name, orig_source)
- appname = File.basename(source);
- ditto "--rsrc", source, "/Applications/#{appname}"
- File.open("/var/db/.puppet_appdmg_installed_#{name}", "w") do |t|
- t.print "name: '#{name}'\n"
- t.print "source: '#{orig_source}'\n"
+ def self.uninstallappdmg(name)
+ dbfile = "/var/db/.puppet_appdmg_installed_#{name}"
+ unless File.exist?(dbfile)
+ raise Puppet::Error.new("App DMG Package #{name} not installed.")
+ end
+ receipthash = YAML::load_file(dbfile)
+ receipthash["files"].each do |appname|
+ FileUtils.remove_entry_secure("#{$appdmg_target}/#{appname}")
+ unless $? == 0
+ raise Puppet::Error.new("App DMG could not remove \"#{$appdmg_target}/#{appname}\"")
end
end
+ File.unlink(dbfile)
+ end
- def self.installpkgdmg(source, name)
- unless source =~ /\.dmg$/i
- self.fail "Mac OS X PKG DMG's must specificy a source string ending in .dmg"
- end
- require 'open-uri'
- require 'facter/util/plist'
+ def self.installappdmg(source, name)
+ unless source =~ /\.dmg$/i
+ raise Puppet::Error.new("Mac OS X app DMG's must specificy a source string ending in .dmg")
+ end
+ require 'open-uri'
+ require 'facter/util/plist'
+ cached_source = source
+ if %r{\A[A-Za-z][A-Za-z0-9+\-\.]*://} =~ cached_source
+ cached_source = "/tmp/#{name}"
+ begin
+ curl "-o", cached_source, "-C", "-", "-k", "-s", "--url", source
+ Puppet.debug "Success: curl transfered [#{name}]"
+ rescue Puppet::ExecutionFailure
+ Puppet.debug "curl did not transfer [#{name}]. Falling back to slower open-uri transfer methods."
cached_source = source
- if %r{\A[A-Za-z][A-Za-z0-9+\-\.]*://} =~ cached_source
- cached_source = "/tmp/#{name}"
- begin
- curl "-o", cached_source, "-C", "-", "-k", "-s", "--url", source
- Puppet.debug "Success: curl transfered [#{name}]"
- rescue Puppet::ExecutionFailure
- Puppet.debug "curl did not transfer [#{name}]. Falling back to slower open-uri transfer methods."
- cached_source = source
- end
- end
+ end
+ end
+ begin
+ open(cached_source) do |dmg|
+ xml_str = hdiutil "mount", "-plist", "-nobrowse", "-readonly", "-mountrandom", "/tmp", dmg.path
+ ptable = Plist::parse_xml xml_str
+ # JJM Filter out all mount-paths into a single array, discard the rest.
+ mounts = ptable['system-entities'].collect { |entity|
+ entity['mount-point']
+ }.select { |mountloc|; mountloc }
begin
- open(cached_source) do |dmg|
- xml_str = hdiutil "mount", "-plist", "-nobrowse", "-readonly", "-mountrandom", "/tmp", dmg.path
- ptable = Plist::parse_xml xml_str
- # JJM Filter out all mount-paths into a single array, discard the rest.
- mounts = ptable['system-entities'].collect { |entity|
- entity['mount-point']
- }.select { |mountloc|; mountloc }
- begin
- mounts.each do |fspath|
- Dir.entries(fspath).select { |f|
- f =~ /\.app$/i
- }.each do |pkg|
- installapp("#{fspath}/#{pkg}", name, source)
- end
- end # mounts.each do
- ensure
- hdiutil "eject", mounts[0]
- end # begin
- end # open() do
+ mounts.each do |fspath|
+ Dir.entries(fspath).select { |f|
+ f =~ /\.app$/i
+ }.each do |app|
+ installapp("#{fspath}/#{app}", name, source)
+ end
+ end # mounts.each do
ensure
- # JJM Remove the file if open-uri didn't already do so.
- File.unlink(cached_source) if File.exist?(cached_source)
+ hdiutil "eject", mounts[0]
end # begin
- end # def self.installpkgdmg
+ end # open() do
+ ensure
+ # JJM Remove the file if open-uri didn't already do so.
+ File.unlink(cached_source) if File.exist?(cached_source)
+ end # begin
+ end # def self.installappdmg
- def query
- if FileTest.exists?("/var/db/.puppet_appdmg_installed_#{@resource[:name]}")
- return {:name => @resource[:name], :ensure => :present}
- else
- return nil
- end
+ def query
+ if FileTest.exists?("/var/db/.puppet_appdmg_installed_#{@resource[:name]}")
+ return {:name => @resource[:name], :ensure => :present}
+ else
+ return nil
+ end
+ end
+
+ def install
+ source = nil
+ unless source = @resource[:source]
+ raise Puppet::Error.new("Mac OS X app DMG's must specify a package source.")
+ end
+ unless name = @resource[:name]
+ raise Puppet::Error.new("Mac OS X app DMG's must specify a package name.")
end
+ self.class.installappdmg(source,name)
+ end
- def install
- source = nil
- unless source = @resource[:source]
- self.fail "Mac OS X PKG DMG's must specify a package source."
- end
- unless name = @resource[:name]
- self.fail "Mac OS X PKG DMG's must specify a package name."
- end
- self.class.installpkgdmg(source,name)
+ def uninstall
+ unless name = @resource[:name]
+ raise Puppet::Error.new("Mac OS X app DMG's must specify a package name.")
end
+ self.class.uninstallappdmg(name)
+ end
end
--
1.6.0.6