Class: Supermarket::API

Inherits:
Object
  • Object
show all
Defined in:
lib/bundles/inspec-supermarket/api.rb

Constant Summary collapse

SUPERMARKET_URL =
'https://supermarket.chef.io'.freeze

Class Method Summary collapse

Class Method Details

.exist?(profile) ⇒ Boolean

verifies that a profile exists

Returns:

  • (Boolean)


65
66
67
# File 'lib/bundles/inspec-supermarket/api.rb', line 65

def self.exist?(profile)
  !find(profile).nil?
end

.find(profile) ⇒ Object



55
56
57
58
59
60
61
62
# File 'lib/bundles/inspec-supermarket/api.rb', line 55

def self.find(profile)
  profiles = Supermarket::API.profiles
  if !profiles.empty?
    index = profiles.index { |t| same?(profile, t) }
    # return profile or nil
    profiles[index] if !index.nil? && index >= 0
  end
end

.get(url, params) ⇒ Object



69
70
71
72
73
74
# File 'lib/bundles/inspec-supermarket/api.rb', line 69

def self.get(url, params)
  uri = URI.parse(url)
  uri.query = URI.encode_www_form(params)
  req = Net::HTTP::Get.new(uri)
  send_request(uri, req)
end

.info(profile) ⇒ Object

displays profile infos



35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/bundles/inspec-supermarket/api.rb', line 35

def self.info(profile)
  _tool_owner, tool_name = profile_name("supermarket://#{profile}")
  url = "#{SUPERMARKET_URL}/api/v1/tools/#{tool_name}"
  _success, data = get(url, {})
  if !data.nil?
    JSON.parse(data)
  else
    {}
  end
rescue JSON::ParserError
  {}
end

.profile_name(profile) ⇒ Object



27
28
29
30
31
32
# File 'lib/bundles/inspec-supermarket/api.rb', line 27

def self.profile_name(profile)
  uri = URI(profile)
  [uri.host, uri.path[1..-1]]
rescue URI::Error => _e
  nil
end

.profilesObject

displays a list of profiles



16
17
18
19
20
21
22
23
24
25
# File 'lib/bundles/inspec-supermarket/api.rb', line 16

def self.profiles
  url = "#{SUPERMARKET_URL}/api/v1/tools-search"
  _success, data = get(url, { q: 'compliance_profile' })
  if !data.nil?
    profiles = JSON.parse(data)
    profiles['items']
  else
    []
  end
end

.same?(profile, supermarket_tool) ⇒ Boolean

compares a profile with the supermarket tool info

Returns:

  • (Boolean)


49
50
51
52
53
# File 'lib/bundles/inspec-supermarket/api.rb', line 49

def self.same?(profile, supermarket_tool)
  tool_owner, tool_name = profile_name(profile)
  tool = "#{SUPERMARKET_URL}/api/v1/tools/#{tool_name}"
  supermarket_tool['tool_owner'] == tool_owner && supermarket_tool['tool'] == tool
end

.send_request(uri, req) ⇒ Object



76
77
78
79
80
81
82
# File 'lib/bundles/inspec-supermarket/api.rb', line 76

def self.send_request(uri, req)
  # send request
  res = Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == 'https') {|http|
    http.request(req)
  }
  [res.is_a?(Net::HTTPSuccess), res.body]
end

.supermarket_urlObject



11
12
13
# File 'lib/bundles/inspec-supermarket/api.rb', line 11

def self.supermarket_url
  SUPERMARKET_URL
end