class PoiseArchive::ArchiveProviders::Zip

The `zip` provider class for `poise_archive` to install from ZIP archives.

@see PoiseArchive::Resources::PoiseArchive::Resource @provides poise_archive

Private Instance Methods

check_rubyzip() click to toggle source
# File lib/poise_archive/archive_providers/zip.rb, line 37
def check_rubyzip
  require 'zip'
rescue LoadError
  notifying_block do
    install_rubyzip
  end
  require 'zip'
end
chown_entries() click to toggle source
# File lib/poise_archive/archive_providers/zip.rb, line 83
def chown_entries
  paths = @zip_entry_paths
  notifying_block do
    paths.each do |type, path|
      send(type, path) do
        group new_resource.group
        owner new_resource.user
      end
    end
  end
end
ensure_directory(path) click to toggle source

Make sure all enclosing directories exist before writing a path.

@param oath [String] Path to check.

# File lib/poise_archive/archive_providers/zip.rb, line 74
def ensure_directory(path)
  base = ::File.dirname(path)
  unless ::File.exist?(base)
    ensure_directory(base)
    Dir.mkdir(base)
    @zip_entry_paths << [:directory, base]
  end
end
install_rubyzip() click to toggle source
# File lib/poise_archive/archive_providers/zip.rb, line 46
def install_rubyzip
  chef_gem 'rubyzip'
end
unpack_archive() click to toggle source
# File lib/poise_archive/archive_providers/zip.rb, line 31
def unpack_archive
  check_rubyzip
  unpack_zip
  chown_entries if new_resource.user || new_resource.group
end
unpack_zip() click to toggle source
# File lib/poise_archive/archive_providers/zip.rb, line 50
def unpack_zip
  @zip_entry_paths = []
  ::Zip::File.open(new_resource.absolute_path) do |zip_file|
    zip_file.each do |entry|
      entry_name = entry.name.split(/\//).drop(new_resource.strip_components).join('/')
      # If strip_components wiped out the name, don't process this entry.
      next if entry_name.empty?
      entry_path = ::File.join(new_resource.destination, entry_name)
      # Ensure parent directories exist because some ZIP files don't
      # include those for some reason.
      ensure_directory(entry_path)
      entry.extract(entry_path)
      # Make sure we restore file permissions. RubyZip won't do this
      # unless we also turn on UID/GID restoration, which we don't want.
      # Mask filters out setuid and setgid bits because no.
      ::File.chmod(entry.unix_perms & 01777, entry_path) if !node.platform_family?('windows') && entry.unix_perms
      @zip_entry_paths << [entry.directory? ? :directory : entry.file? ? :file : :link, entry_path]
    end
  end
end