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
 |