93 lines
2.5 KiB
Ruby
93 lines
2.5 KiB
Ruby
unified_mode true
|
|
|
|
property :path,
|
|
String,
|
|
name_property: true,
|
|
description: 'Path to extract the archive.'
|
|
|
|
property :source,
|
|
String,
|
|
description: 'Source archive location.'
|
|
|
|
property :overwrite,
|
|
[true, false],
|
|
default: false,
|
|
description: 'Whether to overwrite the destination files.'
|
|
|
|
property :checksum,
|
|
String,
|
|
description: 'The checksum for the downloaded file.'
|
|
|
|
property :timeout,
|
|
Integer,
|
|
default: 600,
|
|
description: 'Extract timeout in seconds.'
|
|
|
|
action :extract do
|
|
directory new_resource.path
|
|
|
|
local_source = cached_file(new_resource.source, new_resource.checksum)
|
|
|
|
overwrite_file = new_resource.overwrite ? ' -y' : ' -aos'
|
|
|
|
cmd = "\"#{seven_zip_exe}\" x"
|
|
cmd << overwrite_file
|
|
cmd << " -o\"#{Chef::Util::PathHelper.cleanpath(new_resource.path)}\""
|
|
cmd << " \"#{local_source}\""
|
|
|
|
Chef::Log.debug(cmd)
|
|
|
|
execute "extracting #{new_resource.source}" do
|
|
command cmd
|
|
timeout new_resource.timeout
|
|
end
|
|
end
|
|
|
|
action_class do
|
|
# require 'chef/mixin/shell_out'
|
|
# include Chef::Mixin::ShellOut
|
|
|
|
def seven_zip_exe
|
|
path = seven_zip_exe_from_registry
|
|
Chef::Log.debug("Using 7-zip home: #{path}")
|
|
Chef::Util::PathHelper.cleanpath(::File.join(path, '7z.exe'))
|
|
end
|
|
|
|
def seven_zip_exe_from_registry
|
|
require 'win32/registry'
|
|
# Read path from recommended Windows App Paths registry location
|
|
# docs: https://msdn.microsoft.com/en-us/library/windows/desktop/ee872121
|
|
::Win32::Registry::HKEY_LOCAL_MACHINE.open(
|
|
'SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\7zFM.exe',
|
|
::Win32::Registry::KEY_READ
|
|
).read_s('Path')
|
|
end
|
|
|
|
# if a file is local it returns a windows friendly path version
|
|
# if a file is remote it caches it locally
|
|
def cached_file(source, checksum = nil)
|
|
if source =~ %r{^(file|ftp|http|https):\/\/}
|
|
uri = as_uri(source)
|
|
cache_file_path = "#{Chef::Config[:file_cache_path]}/#{::File.basename(::CGI.unescape(uri.path))}"
|
|
Chef::Log.debug("Caching a copy of file #{source} at #{cache_file_path}")
|
|
|
|
remote_file cache_file_path do
|
|
source source
|
|
backup false
|
|
checksum checksum unless checksum.nil?
|
|
end
|
|
else
|
|
cache_file_path = source
|
|
end
|
|
|
|
Chef::Util::PathHelper.cleanpath(cache_file_path)
|
|
end
|
|
|
|
def as_uri(source)
|
|
URI.parse(source)
|
|
rescue URI::InvalidURIError
|
|
Chef::Log.warn("#{source} was an invalid URI. Trying to escape invalid characters")
|
|
URI.parse(URI.escape(source))
|
|
end
|
|
end
|