92 lines
3.5 KiB
Ruby
92 lines
3.5 KiB
Ruby
# Encoding: utf-8
|
|
# Cookbook Name:: dmg
|
|
# Provider:: package
|
|
#
|
|
# Copyright 2011, Joshua Timberman
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
#
|
|
|
|
include Chef::Mixin::ShellOut
|
|
|
|
use_inline_resources if defined?(use_inline_resources)
|
|
|
|
def load_current_resource
|
|
@dmgpkg = Chef::Resource::DmgPackage.new(new_resource.name)
|
|
@dmgpkg.app(new_resource.app)
|
|
Chef::Log.debug("Checking for application #{new_resource.app}")
|
|
@dmgpkg.installed(installed?)
|
|
end
|
|
|
|
action :install do
|
|
unless @dmgpkg.installed
|
|
|
|
volumes_dir = new_resource.volumes_dir ? new_resource.volumes_dir : new_resource.app
|
|
dmg_name = new_resource.dmg_name ? new_resource.dmg_name : new_resource.app
|
|
dmg_file = "#{Chef::Config[:file_cache_path]}/#{dmg_name}.dmg"
|
|
|
|
if new_resource.source
|
|
remote_file "#{dmg_file} - #{@dmgpkg.name}" do
|
|
path dmg_file
|
|
source new_resource.source
|
|
checksum new_resource.checksum if new_resource.checksum
|
|
end
|
|
end
|
|
|
|
passphrase_cmd = new_resource.dmg_passphrase ? "-passphrase #{new_resource.dmg_passphrase}" : ''
|
|
ruby_block "attach #{dmg_file}" do
|
|
block do
|
|
cmd = shell_out("hdiutil imageinfo #{passphrase_cmd} '#{dmg_file}' | grep -q 'Software License Agreement: true'")
|
|
software_license_agreement = (cmd.exitstatus == 0)
|
|
fail "Requires EULA Acceptance; add 'accept_eula true' to package resource" if software_license_agreement && !new_resource.accept_eula
|
|
accept_eula_cmd = new_resource.accept_eula ? 'echo Y | PAGER=true' : ''
|
|
shell_out!("#{accept_eula_cmd} hdiutil attach #{passphrase_cmd} '#{dmg_file}' -quiet")
|
|
end
|
|
not_if "hdiutil info #{passphrase_cmd} | grep -q 'image-path.*#{dmg_file}'"
|
|
end
|
|
|
|
case new_resource.type
|
|
when 'app'
|
|
execute "rsync --force --recursive --links --perms --executability --owner --group --times '/Volumes/#{volumes_dir}/#{new_resource.app}.app' '#{new_resource.destination}'" do
|
|
user new_resource.owner if new_resource.owner
|
|
end
|
|
|
|
file "#{new_resource.destination}/#{new_resource.app}.app/Contents/MacOS/#{new_resource.app}" do
|
|
mode 0755
|
|
ignore_failure true
|
|
end
|
|
when 'mpkg', 'pkg'
|
|
execute "sudo installer -pkg '/Volumes/#{volumes_dir}/#{new_resource.app}.#{new_resource.type}' -target /" do
|
|
# Prevent cfprefsd from holding up hdiutil detach for certain disk images
|
|
environment('__CFPREFERENCES_AVOID_DAEMON' => '1') if Gem::Version.new(node['platform_version']) >= Gem::Version.new('10.8')
|
|
end
|
|
end
|
|
|
|
execute "hdiutil detach '/Volumes/#{volumes_dir}' || hdiutil detach '/Volumes/#{volumes_dir}' -force"
|
|
end
|
|
end
|
|
|
|
private
|
|
|
|
def installed?
|
|
if ::File.directory?("#{new_resource.destination}/#{new_resource.app}.app")
|
|
Chef::Log.info "Already installed; to upgrade, remove \"#{new_resource.destination}/#{new_resource.app}.app\""
|
|
true
|
|
elsif shell_out("pkgutil --pkgs='#{new_resource.package_id}'").exitstatus == 0
|
|
Chef::Log.info "Already installed; to upgrade, try \"sudo pkgutil --forget '#{new_resource.package_id}'\""
|
|
true
|
|
else
|
|
false
|
|
end
|
|
end
|