openfact 5.7.0 → 5.7.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a2436b1bee62f23687acd129998826dd14375cfd0db9805b6b0be6bf94d60658
4
- data.tar.gz: 914cc3673def6ead78853f0b4cf0addece2313c534c15fcc9850e47a37c39e82
3
+ metadata.gz: 4806428dc6f3f5dbe7902f6d23e1e4ceb91233910c1ee347df9ce38969c437d0
4
+ data.tar.gz: 7afa2df9a896fb32a475861fc55b45ff7683ef23f1ff8edd5b824523931f22d3
5
5
  SHA512:
6
- metadata.gz: 80fbe8822e7b0f6bbdfdfb76eee4a6cee2771e7f36fd251b655e264bfcf032e76034217fa5e1477f59d973d3e7b2a9b264f2ee4fe91f402de7a6507b3d1b034c
7
- data.tar.gz: 8adbeb6dad88667ec34f829b830282f3812a3b3e8b54615500b0564b3f2f2d4b911c36c3571207722ee4bc56dba73864d170eeba7cec57423e6c6bd8056e082b
6
+ metadata.gz: 4dae7933728490f20afda516a3386f8be76bbe4cfebeebcaccc1b9e5c6418d95978c6abd3c82d6cd917ac1dfae51bdacd5c359b5e92c684c416b85ce406231c9
7
+ data.tar.gz: ad82e01bae10d3f51b00147f7ef118f85dde83e6e82495c582c63b9e5e2f7c40c20ed721ea17c3416b57525642a7ba60787c3159163308a55fc0ec7be81099c7
@@ -18,15 +18,38 @@ module Facter
18
18
  end
19
19
 
20
20
  def read_facts(fact_name)
21
- @fact_list[:metadata] = {}
22
- query_for_metadata(EC2_METADATA_ROOT_URL, @fact_list[:metadata])
23
- @fact_list[:userdata] = get_data_from(EC2_USERDATA_ROOT_URL).strip.force_encoding('UTF-8')
21
+ if fact_name == :metadata
22
+ @fact_list[:metadata] = read_metadata
23
+ else
24
+ @fact_list[:userdata] = get_data_from(EC2_USERDATA_ROOT_URL).strip.force_encoding('UTF-8')
25
+ end
26
+
24
27
  @fact_list[fact_name]
25
28
  end
26
29
 
30
+ # A failed root listing means no EC2-compatible metadata service is
31
+ # available, so there is no metadata to report. Once the root listing
32
+ # succeeds, any failed child request rejects the whole result.
33
+ def read_metadata
34
+ root_listing = root_metadata_listing
35
+ return {} unless root_listing
36
+
37
+ add_metadata_entries(EC2_METADATA_ROOT_URL, root_listing, {})
38
+ end
39
+
40
+ def root_metadata_listing
41
+ get_metadata_from(EC2_METADATA_ROOT_URL)
42
+ rescue StandardError => e
43
+ log.debug("EC2 metadata is not available: #{e.message}")
44
+ nil
45
+ end
46
+
27
47
  def query_for_metadata(url, container)
28
- metadata = get_data_from(url)
29
- metadata.each_line do |line|
48
+ add_metadata_entries(url, get_metadata_from(url), container)
49
+ end
50
+
51
+ def add_metadata_entries(url, listing, container)
52
+ listing.each_line do |line|
30
53
  next if line.empty?
31
54
 
32
55
  http_path_component = build_path_component(line)
@@ -34,14 +57,15 @@ module Facter
34
57
 
35
58
  if http_path_component.end_with?('/')
36
59
  child = {}
37
- child[http_path_component] = query_for_metadata("#{url}#{http_path_component}", child)
38
- child.reject! { |key, _info| key == http_path_component }
60
+ query_for_metadata("#{url}#{http_path_component}", child)
39
61
  name = http_path_component.chomp('/')
40
62
  container[name] = child
41
63
  else
42
- container[http_path_component] = get_data_from("#{url}#{http_path_component}").strip
64
+ container[http_path_component] = get_metadata_from("#{url}#{http_path_component}").strip
43
65
  end
44
66
  end
67
+
68
+ container
45
69
  end
46
70
 
47
71
  def build_path_component(line)
@@ -55,6 +79,12 @@ module Facter
55
79
  Facter::Util::Resolvers::Http.get_request(url, headers, { session: determine_session_timeout }, false)
56
80
  end
57
81
 
82
+ def get_metadata_from(url)
83
+ headers = {}
84
+ headers['X-aws-ec2-metadata-token'] = v2_token if v2_token
85
+ Facter::Util::Resolvers::Http.get_request!(url, headers, { session: determine_session_timeout }, false)
86
+ end
87
+
58
88
  def determine_session_timeout
59
89
  session_env = ENV['EC2_SESSION_TIMEOUT']
60
90
  session_env ? session_env.to_i : EC2_SESSION_TIMEOUT
@@ -6,6 +6,8 @@ module Facter
6
6
  module Http
7
7
  @log = Facter::Log.new(self)
8
8
 
9
+ class RequestError < StandardError; end
10
+
9
11
  class << self
10
12
  CONNECTION_TIMEOUT = 0.6
11
13
  SESSION_TIMEOUT = 5
@@ -27,6 +29,15 @@ module Facter
27
29
  make_request(url, headers, timeouts, 'GET', proxy)
28
30
  end
29
31
 
32
+ # Makes a GET HTTP request and returns its response body.
33
+ #
34
+ # Unlike get_request, this method raises when the response code is
35
+ # not 200 or when the request fails. A successful empty response is
36
+ # still returned as an empty string.
37
+ def get_request!(url, headers = {}, timeouts = {}, proxy = true)
38
+ make_request!(url, headers, timeouts, 'GET', proxy)
39
+ end
40
+
30
41
  # Makes a PUT HTTP request and returns its response
31
42
  # @param (see #get_request)
32
43
  # @return (see #get_request)
@@ -37,6 +48,28 @@ module Facter
37
48
  private
38
49
 
39
50
  def make_request(url, headers, timeouts, request_type, proxy)
51
+ response = perform_request(url, headers, timeouts, request_type, proxy)
52
+
53
+ successful_response?(response) ? response.body : ''
54
+ rescue StandardError => e
55
+ @log.debug("Trying to connect to #{url} but got: #{e.message}")
56
+ ''
57
+ end
58
+
59
+ def make_request!(url, headers, timeouts, request_type, proxy)
60
+ response = perform_request(url, headers, timeouts, request_type, proxy)
61
+
62
+ return response.body if successful_response?(response)
63
+
64
+ raise RequestError, "Request to #{url} failed with HTTP status #{response.code}"
65
+ rescue RequestError
66
+ raise
67
+ rescue StandardError => e
68
+ @log.debug("Trying to connect to #{url} but got: #{e.message}")
69
+ raise
70
+ end
71
+
72
+ def perform_request(url, headers, timeouts, request_type, proxy)
40
73
  require 'net/http'
41
74
 
42
75
  uri = URI.parse(url)
@@ -52,11 +85,7 @@ module Facter
52
85
  # Make the request
53
86
  response = http.request(request)
54
87
  response.uri = url
55
-
56
- successful_response?(response) ? response.body : ''
57
- rescue StandardError => e
58
- @log.debug("Trying to connect to #{url} but got: #{e.message}")
59
- ''
88
+ response
60
89
  end
61
90
 
62
91
  def http_obj(parsed_url, timeouts, proxy)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Facter
4
- VERSION = '5.7.0' unless defined?(VERSION)
4
+ VERSION = '5.7.2' unless defined?(VERSION)
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: openfact
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.7.0
4
+ version: 5.7.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - OpenVox Project
@@ -1299,7 +1299,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
1299
1299
  - !ruby/object:Gem::Version
1300
1300
  version: '0'
1301
1301
  requirements: []
1302
- rubygems_version: 4.0.10
1302
+ rubygems_version: 4.0.20
1303
1303
  specification_version: 4
1304
1304
  summary: OpenFact, a system inventory tool
1305
1305
  test_files: []