Class: Inspec::Cache

Inherits:
Object
  • Object
show all
Defined in:
lib/inspec/dependencies/cache.rb

Overview

Inspec::Cache manages an on-disk cache of inspec profiles. The cache can contain:

- .tar.gz profile archives
- .zip profile archives
- unpacked profiles

Cache entries names include a hash of their source to prevent conflicts between depenedencies with the same name from different sources.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(path = nil) ⇒ Cache

Returns a new instance of Cache.



19
20
21
22
23
24
# File 'lib/inspec/dependencies/cache.rb', line 19

def initialize(path = nil)
  @path = path || File.join(Inspec.config_dir, "cache")
  FileUtils.mkdir_p(@path) unless File.directory?(@path)
rescue Errno::EACCES
  # ignore
end

Instance Attribute Details

#pathObject (readonly)

Returns the value of attribute path.



18
19
20
# File 'lib/inspec/dependencies/cache.rb', line 18

def path
  @path
end

Instance Method Details

#archive_entry_for(key) ⇒ Object



35
36
37
38
39
40
41
42
# File 'lib/inspec/dependencies/cache.rb', line 35

def archive_entry_for(key)
  path = base_path_for(key)
  if File.exist?("#{path}.tar.gz")
    "#{path}.tar.gz"
  elsif File.exist?("#{path}.zip")
    "#{path}.zip"
  end
end

#base_path_for(cache_key) ⇒ String

Return the path to given profile in the cache.

The ‘source_url` parameter should be a URI-like string that fully specifies the source of the exact version we want to pull down.

Parameters:

  • name (String)
  • source_url (String)

Returns:

  • (String)


70
71
72
# File 'lib/inspec/dependencies/cache.rb', line 70

def base_path_for(cache_key)
  File.join(@path, cache_key)
end

#exists?(key) ⇒ Boolean

For a given name and source_url, return true if the profile exists in the Cache.

Parameters:

  • name (String)
  • source_url (String)

Returns:

  • (Boolean)


52
53
54
55
56
57
# File 'lib/inspec/dependencies/cache.rb', line 52

def exists?(key)
  return false if key.nil? || key.empty?

  path = base_path_for(key)
  File.directory?(path) || File.exist?("#{path}.tar.gz") || File.exist?("#{path}.zip")
end

#lock(cache_path) ⇒ Object



87
88
89
90
91
92
93
94
95
96
# File 'lib/inspec/dependencies/cache.rb', line 87

def lock(cache_path)
  lock_file_path = File.join(cache_path, ".lock")
  begin
    FileUtils.mkdir_p(cache_path)
    Inspec::Log.debug("Locking cache ..... #{cache_path}")
    FileUtils.touch(lock_file_path)
  rescue Errno::EACCES
    raise "Permission denied while creating cache lock #{cache_path}/.lock."
  end
end

#locked?(key) ⇒ Boolean

For given cache key, return true if the cache path is locked

Returns:

  • (Boolean)


77
78
79
80
81
82
83
84
85
# File 'lib/inspec/dependencies/cache.rb', line 77

def locked?(key)
  locked = false
  path = base_path_for(key)
  # For archive there is no need to lock the directory so we skip those and return false for archive formatted cache
  if File.directory?(path)
    locked = File.exist?("#{path}/.lock")
  end
  locked
end

#prefered_entry_for(key) ⇒ Object



26
27
28
29
30
31
32
33
# File 'lib/inspec/dependencies/cache.rb', line 26

def prefered_entry_for(key)
  path = base_path_for(key)
  if File.directory?(path)
    path
  else
    archive_entry_for(key)
  end
end

#unlock(cache_path) ⇒ Object



98
99
100
101
102
103
104
105
# File 'lib/inspec/dependencies/cache.rb', line 98

def unlock(cache_path)
  Inspec::Log.debug("Unlocking cache..... #{cache_path}")
  begin
    FileUtils.rm("#{cache_path}/.lock") if File.exist?("#{cache_path}/.lock")
  rescue Errno::EACCES
    raise "Permission denied while removing cache lock #{cache_path}/.lock"
  end
end