facter 4.1.1 → 4.2.0

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.
Files changed (54) hide show
  1. checksums.yaml +4 -4
  2. data/lib/facter.rb +1 -1
  3. data/lib/facter/config.rb +2 -0
  4. data/lib/facter/custom_facts/core/execution/posix.rb +2 -2
  5. data/lib/facter/custom_facts/core/execution/windows.rb +1 -1
  6. data/lib/facter/custom_facts/util/directory_loader.rb +1 -1
  7. data/lib/facter/custom_facts/util/windows_root.rb +2 -1
  8. data/lib/facter/facts/freebsd/is_virtual.rb +1 -5
  9. data/lib/facter/facts/freebsd/virtual.rb +1 -2
  10. data/lib/facter/facts/linux/az_metadata.rb +1 -5
  11. data/lib/facter/facts/linux/cloud/provider.rb +1 -5
  12. data/lib/facter/facts/linux/ec2_metadata.rb +1 -5
  13. data/lib/facter/facts/linux/ec2_userdata.rb +1 -5
  14. data/lib/facter/facts/linux/hypervisors/xen.rb +1 -2
  15. data/lib/facter/facts/linux/is_virtual.rb +1 -5
  16. data/lib/facter/facts/linux/virtual.rb +1 -2
  17. data/lib/facter/facts/macosx/os/macosx/version.rb +6 -3
  18. data/lib/facter/facts/windows/az_metadata.rb +1 -1
  19. data/lib/facter/facts/windows/cloud/provider.rb +1 -1
  20. data/lib/facter/facts/windows/ec2_metadata.rb +1 -1
  21. data/lib/facter/facts/windows/ec2_userdata.rb +1 -1
  22. data/lib/facter/facts/windows/gce.rb +1 -1
  23. data/lib/facter/facts/windows/hypervisors/hyperv.rb +1 -1
  24. data/lib/facter/facts/windows/hypervisors/kvm.rb +2 -1
  25. data/lib/facter/facts/windows/hypervisors/virtualbox.rb +2 -2
  26. data/lib/facter/facts/windows/hypervisors/vmware.rb +1 -1
  27. data/lib/facter/facts/windows/hypervisors/xen.rb +3 -1
  28. data/lib/facter/facts/windows/is_virtual.rb +15 -0
  29. data/lib/facter/facts/windows/virtual.rb +15 -0
  30. data/lib/facter/framework/core/cache_manager.rb +2 -2
  31. data/lib/facter/framework/core/fact/external/external_fact_manager.rb +0 -1
  32. data/lib/facter/framework/core/fact/internal/internal_fact_manager.rb +41 -39
  33. data/lib/facter/framework/core/fact_filter.rb +4 -14
  34. data/lib/facter/framework/core/file_loader.rb +1 -1
  35. data/lib/facter/framework/parsers/query_parser.rb +5 -12
  36. data/lib/facter/models/fact_collection.rb +20 -3
  37. data/lib/facter/models/resolved_fact.rb +2 -3
  38. data/lib/facter/models/searched_fact.rb +2 -3
  39. data/lib/facter/resolvers/linux/networking.rb +18 -0
  40. data/lib/facter/resolvers/mountpoints.rb +16 -8
  41. data/lib/facter/resolvers/partitions.rb +1 -1
  42. data/lib/facter/resolvers/ruby.rb +1 -1
  43. data/lib/facter/resolvers/windows/ffi/identity_ffi.rb +5 -0
  44. data/lib/facter/resolvers/windows/identity.rb +1 -6
  45. data/lib/facter/resolvers/windows/virtualization.rb +46 -44
  46. data/lib/facter/resolvers/xen.rb +6 -1
  47. data/lib/facter/util/facts/posix/virtual_detector.rb +74 -0
  48. data/lib/facter/util/linux/if_inet6.rb +73 -0
  49. data/lib/facter/version.rb +1 -1
  50. metadata +26 -9
  51. data/lib/facter/facts/windows/virtualization/is_virtual.rb +0 -17
  52. data/lib/facter/facts/windows/virtualization/virtual.rb +0 -17
  53. data/lib/facter/framework/core/fact_augmenter.rb +0 -54
  54. data/lib/facter/util/facts/virtual_detector.rb +0 -83
@@ -0,0 +1,73 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'ipaddr'
4
+
5
+ module Facter
6
+ module Util
7
+ module Linux
8
+ class IfInet6
9
+ class << self
10
+ IFA_FLAGS = {
11
+ 'temporary' => 0x01,
12
+ 'noad' => 0x02,
13
+ 'optimistic' => 0x04,
14
+ 'dadfailed' => 0x08,
15
+ 'homeaddress' => 0x10,
16
+ 'deprecated' => 0x20,
17
+ 'tentative' => 0x40,
18
+ 'permanent' => 0x80
19
+ # /proc/net/if_inet6 only supports the old 8bit flags
20
+ # I have been unable to find a simple solution to accesses
21
+ # the full 32bit flags. netlink is all I can could find but
22
+ # that will likely be ugly
23
+ # 'managetempaddr' => 0x100,
24
+ # 'noprefixroute' => 0x200,
25
+ # 'mcautojoin' => 0x400,
26
+ # 'stableprivacy' => 0x800
27
+ }.freeze
28
+
29
+ def read_flags
30
+ return read_flags_from_proc if File.exist?('/proc/net/if_inet6')
31
+
32
+ {}
33
+ end
34
+
35
+ private
36
+
37
+ def read_flags_from_proc
38
+ flags = init_flags
39
+ Facter::Util::FileHelper.safe_read('/proc/net/if_inet6', nil).each_line do |line|
40
+ iface = line.split
41
+ next unless iface.size == 6
42
+
43
+ ip = parse_ip(iface[0])
44
+ flags[iface[5]][ip] = parse_ifa_flags(iface[4])
45
+ end
46
+ flags
47
+ end
48
+
49
+ def init_flags
50
+ Hash.new { |h1, k1| h1[k1] = Hash.new { |h2, k2| h2[k2] = [] } }
51
+ end
52
+
53
+ def parse_ifa_flags(flag)
54
+ flag = flag.hex
55
+ flags = []
56
+ IFA_FLAGS.each_pair do |name, value|
57
+ next if (flag & value).zero?
58
+
59
+ flags << name
60
+ end
61
+ flags
62
+ end
63
+
64
+ def parse_ip(ip)
65
+ # The ip address in if_net6 is a long string wit no colons
66
+ ip = ip.scan(/(\h{4})/).join(':')
67
+ IPAddr.new(ip).to_s
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Facter
4
- VERSION = '4.1.1' unless defined?(VERSION)
4
+ VERSION = '4.2.0' unless defined?(VERSION)
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: facter
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.1.1
4
+ version: 4.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Puppet
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-04-21 00:00:00.000000000 Z
11
+ date: 2021-05-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -108,6 +108,20 @@ dependencies:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
110
  version: '1.3'
111
+ - !ruby/object:Gem::Dependency
112
+ name: webmock
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '3.12'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '3.12'
111
125
  - !ruby/object:Gem::Dependency
112
126
  name: yard
113
127
  requirement: !ruby/object:Gem::Requirement
@@ -156,7 +170,7 @@ dependencies:
156
170
  - - "<"
157
171
  - !ruby/object:Gem::Version
158
172
  version: '2.0'
159
- description: New version of Facter
173
+ description: You can prove anything with facts!
160
174
  email:
161
175
  - team-nw@puppet.com
162
176
  executables:
@@ -774,6 +788,7 @@ files:
774
788
  - lib/facter/facts/windows/interfaces.rb
775
789
  - lib/facter/facts/windows/ipaddress6_interfaces.rb
776
790
  - lib/facter/facts/windows/ipaddress_interfaces.rb
791
+ - lib/facter/facts/windows/is_virtual.rb
777
792
  - lib/facter/facts/windows/kernel.rb
778
793
  - lib/facter/facts/windows/kernelmajversion.rb
779
794
  - lib/facter/facts/windows/kernelrelease.rb
@@ -836,8 +851,7 @@ files:
836
851
  - lib/facter/facts/windows/system_uptime/seconds.rb
837
852
  - lib/facter/facts/windows/system_uptime/uptime.rb
838
853
  - lib/facter/facts/windows/timezone.rb
839
- - lib/facter/facts/windows/virtualization/is_virtual.rb
840
- - lib/facter/facts/windows/virtualization/virtual.rb
854
+ - lib/facter/facts/windows/virtual.rb
841
855
  - lib/facter/framework/benchmarking/timer.rb
842
856
  - lib/facter/framework/cli/cli.rb
843
857
  - lib/facter/framework/cli/cli_launcher.rb
@@ -847,7 +861,6 @@ files:
847
861
  - lib/facter/framework/core/fact/external/external_fact_manager.rb
848
862
  - lib/facter/framework/core/fact/internal/core_fact.rb
849
863
  - lib/facter/framework/core/fact/internal/internal_fact_manager.rb
850
- - lib/facter/framework/core/fact_augmenter.rb
851
864
  - lib/facter/framework/core/fact_filter.rb
852
865
  - lib/facter/framework/core/fact_loaders/class_discoverer.rb
853
866
  - lib/facter/framework/core/fact_loaders/external_fact_loader.rb
@@ -1011,12 +1024,13 @@ files:
1011
1024
  - lib/facter/util/aix/odm_query.rb
1012
1025
  - lib/facter/util/api_debugger.rb
1013
1026
  - lib/facter/util/facts/facts_utils.rb
1027
+ - lib/facter/util/facts/posix/virtual_detector.rb
1014
1028
  - lib/facter/util/facts/unit_converter.rb
1015
1029
  - lib/facter/util/facts/uptime_parser.rb
1016
- - lib/facter/util/facts/virtual_detector.rb
1017
1030
  - lib/facter/util/facts/windows_release_finder.rb
1018
1031
  - lib/facter/util/file_helper.rb
1019
1032
  - lib/facter/util/linux/dhcp.rb
1033
+ - lib/facter/util/linux/if_inet6.rb
1020
1034
  - lib/facter/util/linux/routing_table.rb
1021
1035
  - lib/facter/util/linux/socket_parser.rb
1022
1036
  - lib/facter/util/macosx/system_profile_executor.rb
@@ -1045,9 +1059,12 @@ require_paths:
1045
1059
  - lib
1046
1060
  required_ruby_version: !ruby/object:Gem::Requirement
1047
1061
  requirements:
1048
- - - "~>"
1062
+ - - ">="
1049
1063
  - !ruby/object:Gem::Version
1050
1064
  version: '2.3'
1065
+ - - "<"
1066
+ - !ruby/object:Gem::Version
1067
+ version: '4.0'
1051
1068
  required_rubygems_version: !ruby/object:Gem::Requirement
1052
1069
  requirements:
1053
1070
  - - ">="
@@ -1057,5 +1074,5 @@ requirements: []
1057
1074
  rubygems_version: 3.0.8
1058
1075
  signing_key:
1059
1076
  specification_version: 4
1060
- summary: New version of Facter
1077
+ summary: Facter, a system inventory tool
1061
1078
  test_files: []
@@ -1,17 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Facts
4
- module Windows
5
- module Virtualization
6
- class IsVirtual
7
- FACT_NAME = 'is_virtual'
8
-
9
- def call_the_resolver
10
- fact_value = Facter::Resolvers::Virtualization.resolve(:is_virtual)
11
-
12
- Facter::ResolvedFact.new(FACT_NAME, fact_value)
13
- end
14
- end
15
- end
16
- end
17
- end
@@ -1,17 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Facts
4
- module Windows
5
- module Virtualization
6
- class Virtual
7
- FACT_NAME = 'virtual'
8
-
9
- def call_the_resolver
10
- fact_value = Facter::Resolvers::Virtualization.resolve(:virtual)
11
-
12
- Facter::ResolvedFact.new(FACT_NAME, fact_value)
13
- end
14
- end
15
- end
16
- end
17
- end
@@ -1,54 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Facter
4
- module FactAugmenter
5
- def self.augment_resolved_facts(searched_facts, resolved_facts)
6
- augumented_resolved_facts = []
7
- searched_facts.each do |searched_fact|
8
- matched_facts = get_resolved_facts_for_searched_fact(searched_fact, resolved_facts)
9
- augment_resolved_fact_for_user_query!(searched_fact, matched_facts)
10
- augumented_resolved_facts.concat(matched_facts)
11
- end
12
-
13
- augumented_resolved_facts
14
- end
15
-
16
- private_class_method def self.get_resolved_facts_for_searched_fact(searched_fact, resolved_facts)
17
- if searched_fact.name.include?('.*')
18
- resolved_facts
19
- .select { |resolved_fact| resolved_fact.name.match(searched_fact.name) }
20
- .reject(&:user_query)
21
- .uniq(&:name)
22
- else
23
- resolved_facts.select do |resolved_fact|
24
- valid_fact(searched_fact, resolved_fact)
25
- end.reject(&:user_query).uniq(&:name)
26
- end
27
- end
28
-
29
- private_class_method def self.augment_resolved_fact_for_user_query!(searched_fact, matched_facts)
30
- matched_facts.each do |matched_fact|
31
- matched_fact.user_query = searched_fact.user_query
32
- matched_fact.filter_tokens = searched_fact.filter_tokens
33
- end
34
- end
35
-
36
- private_class_method def self.valid_fact(searched_fact, resolved_fact)
37
- return false unless searched_fact.name.eql?(resolved_fact.name)
38
-
39
- if searched_fact.filter_tokens.any?
40
- case resolved_fact.value
41
- when Array, Hash
42
- begin
43
- resolved_fact.value.dig(*searched_fact.filter_tokens)
44
- rescue TypeError
45
- return false
46
- end
47
- else
48
- return false
49
- end
50
- end
51
- true
52
- end
53
- end
54
- end
@@ -1,83 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Facter
4
- module Util
5
- module Facts
6
- class VirtualDetector
7
- def initialize
8
- @log = Facter::Log.new(self)
9
- end
10
-
11
- def platform
12
- @@fact_value ||= check_docker_lxc || check_freebsd || check_gce || retrieve_from_virt_what
13
- @@fact_value ||= check_vmware || check_open_vz || check_vserver || check_xen || check_other_facts
14
- @@fact_value ||= check_lspci || 'physical'
15
-
16
- @@fact_value
17
- end
18
-
19
- private
20
-
21
- def check_docker_lxc
22
- @log.debug('Checking Docker and LXC')
23
- Facter::Resolvers::Containers.resolve(:vm)
24
- end
25
-
26
- def check_gce
27
- @log.debug('Checking GCE')
28
- bios_vendor = Facter::Resolvers::Linux::DmiBios.resolve(:bios_vendor)
29
- 'gce' if bios_vendor&.include?('Google')
30
- end
31
-
32
- def check_vmware
33
- @log.debug('Checking VMware')
34
- Facter::Resolvers::Vmware.resolve(:vm)
35
- end
36
-
37
- def retrieve_from_virt_what
38
- @log.debug('Checking virtual_what')
39
- Facter::Resolvers::VirtWhat.resolve(:vm)
40
- end
41
-
42
- def check_open_vz
43
- @log.debug('Checking OpenVZ')
44
- Facter::Resolvers::OpenVz.resolve(:vm)
45
- end
46
-
47
- def check_vserver
48
- @log.debug('Checking VServer')
49
- Facter::Resolvers::VirtWhat.resolve(:vserver)
50
- end
51
-
52
- def check_xen
53
- @log.debug('Checking XEN')
54
- Facter::Resolvers::Xen.resolve(:vm)
55
- end
56
-
57
- def check_freebsd
58
- return unless Object.const_defined?('Facter::Resolvers::Freebsd::Virtual')
59
-
60
- @log.debug('Checking if jailed')
61
- Facter::Resolvers::Freebsd::Virtual.resolve(:vm)
62
- end
63
-
64
- def check_other_facts
65
- @log.debug('Checking others')
66
- product_name = Facter::Resolvers::Linux::DmiBios.resolve(:product_name)
67
- bios_vendor = Facter::Resolvers::Linux::DmiBios.resolve(:bios_vendor)
68
- return 'kvm' if bios_vendor&.include?('Amazon EC2')
69
- return unless product_name
70
-
71
- Facter::Util::Facts::HYPERVISORS_HASH.each { |key, value| return value if product_name.include?(key) }
72
-
73
- nil
74
- end
75
-
76
- def check_lspci
77
- @log.debug('Checking lspci')
78
- Facter::Resolvers::Lspci.resolve(:vm)
79
- end
80
- end
81
- end
82
- end
83
- end