Class: Inspec::Fetcher::Local
- Inherits:
-
Object
- Object
- Inspec::Fetcher::Local
- Defined in:
- lib/inspec/fetcher/local.rb
Class Method Summary collapse
Instance Method Summary collapse
- #archive_path ⇒ Object
- #cache_key ⇒ Object
- #fetch(path) ⇒ Object
-
#initialize(target, opts = {}) ⇒ Local
constructor
A new instance of Local.
- #perform_shasum(target) ⇒ Object
- #resolved_source ⇒ Object
- #sha256 ⇒ Object
- #writable? ⇒ Boolean
Constructor Details
#initialize(target, opts = {}) ⇒ Local
Returns a new instance of Local.
40 41 42 43 44 |
# File 'lib/inspec/fetcher/local.rb', line 40 def initialize(target, opts = {}) @target = target @backend = opts[:backend] @archive_shasum = nil end |
Class Method Details
.resolve(target) ⇒ Object
8 9 10 11 12 13 14 15 16 |
# File 'lib/inspec/fetcher/local.rb', line 8 def self.resolve(target) if target.is_a?(String) local_path = resolve_from_string(target) new(local_path) if local_path elsif target.is_a?(Hash) local_path = resolve_from_hash(target) new(local_path, target) if local_path end end |
.resolve_from_hash(target) ⇒ Object
18 19 20 21 22 23 24 25 26 |
# File 'lib/inspec/fetcher/local.rb', line 18 def self.resolve_from_hash(target) return unless target.key?(:path) if target.key?(:cwd) File.(target[:path], target[:cwd]) else target[:path] end end |
.resolve_from_string(target) ⇒ Object
28 29 30 31 32 33 34 35 36 37 38 |
# File 'lib/inspec/fetcher/local.rb', line 28 def self.resolve_from_string(target) # Support "urls" in the form of file:// if target.start_with?("file://") target = target.gsub(%r{^file://}, "") else # support for windows paths target = target.tr('\\', "/") end target if File.exist?(File.(target)) end |
Instance Method Details
#archive_path ⇒ Object
81 82 83 |
# File 'lib/inspec/fetcher/local.rb', line 81 def archive_path @target end |
#cache_key ⇒ Object
89 90 91 |
# File 'lib/inspec/fetcher/local.rb', line 89 def cache_key sha256.to_s end |
#fetch(path) ⇒ Object
46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
# File 'lib/inspec/fetcher/local.rb', line 46 def fetch(path) # If `inspec exec` is used then we should not vendor/fetch. This makes # local development easier and more predictable. return @target if Inspec::BaseCLI.inspec_cli_command == :exec # Skip vendoring if @backend is not set (example: ad hoc runners) return @target unless @backend if File.directory?(@target) # Create an archive, checksum, and move to the vendor directory Dir.mktmpdir do |tmpdir| temp_archive = File.join(tmpdir, "#{File.basename(@target)}.tar.gz") opts = { backend: @backend, output: temp_archive, } # Create a temporary archive at `opts[:output]` Inspec::Profile.for_target(@target, opts).archive(opts) checksum = perform_shasum(temp_archive) final_path = File.join(path, checksum) FileUtils.mkdir_p(final_path) Inspec::FileProvider.for_path(temp_archive).extract(final_path) end else # Verify profile (archive) is valid and extract to vendor directory opts = { backend: @backend } Inspec::Profile.for_target(@target, opts).check Inspec::FileProvider.for_path(@target).extract(path) end @target end |
#perform_shasum(target) ⇒ Object
103 104 105 106 107 108 |
# File 'lib/inspec/fetcher/local.rb', line 103 def perform_shasum(target) return @archive_shasum if @archive_shasum raise(Inspec::FetcherFailure, "Profile dependency local path '#{target}' does not exist") unless File.exist?(target) @archive_shasum = OpenSSL::Digest.digest("SHA256", File.read(target)).unpack("H*")[0] end |
#resolved_source ⇒ Object
110 111 112 113 114 |
# File 'lib/inspec/fetcher/local.rb', line 110 def resolved_source h = { path: @target } h[:sha256] = sha256 if sha256 h end |
#sha256 ⇒ Object
93 94 95 96 97 98 99 100 101 |
# File 'lib/inspec/fetcher/local.rb', line 93 def sha256 if !@archive_shasum.nil? @archive_shasum elsif File.directory?(@target) nil else perform_shasum(@target) end end |
#writable? ⇒ Boolean
85 86 87 |
# File 'lib/inspec/fetcher/local.rb', line 85 def writable? File.directory?(@target) end |