facter 4.0.41 → 4.0.47

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 (269) hide show
  1. checksums.yaml +4 -4
  2. data/lib/docs/generate.rb +32 -0
  3. data/lib/docs/template.erb +34 -0
  4. data/lib/facter.rb +110 -25
  5. data/lib/facter/config.rb +386 -0
  6. data/lib/facter/custom_facts/core/aggregate.rb +51 -17
  7. data/lib/facter/custom_facts/core/execution.rb +54 -38
  8. data/lib/facter/custom_facts/core/execution/base.rb +46 -40
  9. data/lib/facter/custom_facts/util/collection.rb +1 -2
  10. data/lib/facter/custom_facts/util/directory_loader.rb +1 -1
  11. data/lib/facter/custom_facts/util/fact.rb +19 -2
  12. data/lib/facter/custom_facts/util/loader.rb +1 -1
  13. data/lib/facter/custom_facts/util/parser.rb +17 -3
  14. data/lib/facter/custom_facts/util/resolution.rb +41 -12
  15. data/lib/facter/facts/aix/interfaces.rb +1 -0
  16. data/lib/facter/facts/aix/memory/swap/available.rb +1 -1
  17. data/lib/facter/facts/aix/memory/swap/available_bytes.rb +1 -1
  18. data/lib/facter/facts/aix/memory/swap/total.rb +1 -1
  19. data/lib/facter/facts/aix/memory/swap/total_bytes.rb +1 -1
  20. data/lib/facter/facts/aix/memory/swap/used.rb +1 -1
  21. data/lib/facter/facts/aix/memory/system/available.rb +1 -1
  22. data/lib/facter/facts/aix/memory/system/available_bytes.rb +1 -1
  23. data/lib/facter/facts/aix/memory/system/total.rb +1 -1
  24. data/lib/facter/facts/aix/memory/system/total_bytes.rb +1 -1
  25. data/lib/facter/facts/aix/memory/system/used.rb +1 -1
  26. data/lib/facter/facts/aix/processors/speed.rb +1 -1
  27. data/lib/facter/facts/bsd/processors/speed.rb +1 -1
  28. data/lib/facter/facts/freebsd/is_virtual.rb +25 -0
  29. data/lib/facter/facts/freebsd/memory/swap/available.rb +1 -1
  30. data/lib/facter/facts/freebsd/memory/swap/available_bytes.rb +1 -1
  31. data/lib/facter/facts/freebsd/memory/swap/total.rb +1 -1
  32. data/lib/facter/facts/freebsd/memory/swap/total_bytes.rb +1 -1
  33. data/lib/facter/facts/freebsd/memory/swap/used.rb +1 -1
  34. data/lib/facter/facts/freebsd/memory/system/available.rb +1 -1
  35. data/lib/facter/facts/freebsd/memory/system/available_bytes.rb +1 -1
  36. data/lib/facter/facts/freebsd/memory/system/total.rb +1 -1
  37. data/lib/facter/facts/freebsd/memory/system/total_bytes.rb +1 -1
  38. data/lib/facter/facts/freebsd/memory/system/used.rb +1 -1
  39. data/lib/facter/facts/freebsd/processors/speed.rb +1 -1
  40. data/lib/facter/facts/freebsd/virtual.rb +22 -0
  41. data/lib/facter/facts/linux/dhcp_servers.rb +1 -0
  42. data/lib/facter/facts/linux/ec2_metadata.rb +1 -1
  43. data/lib/facter/facts/linux/ec2_userdata.rb +1 -1
  44. data/lib/facter/facts/linux/hypervisors/kvm.rb +1 -1
  45. data/lib/facter/facts/linux/hypervisors/xen.rb +1 -1
  46. data/lib/facter/facts/linux/interfaces.rb +1 -0
  47. data/lib/facter/facts/linux/is_virtual.rb +2 -2
  48. data/lib/facter/facts/linux/memory/swap/available.rb +1 -1
  49. data/lib/facter/facts/linux/memory/swap/available_bytes.rb +1 -1
  50. data/lib/facter/facts/linux/memory/swap/total.rb +1 -1
  51. data/lib/facter/facts/linux/memory/swap/total_bytes.rb +1 -1
  52. data/lib/facter/facts/linux/memory/swap/used.rb +1 -1
  53. data/lib/facter/facts/linux/memory/system/available.rb +1 -1
  54. data/lib/facter/facts/linux/memory/system/available_bytes.rb +1 -1
  55. data/lib/facter/facts/linux/memory/system/total.rb +1 -1
  56. data/lib/facter/facts/linux/memory/system/total_bytes.rb +1 -1
  57. data/lib/facter/facts/linux/memory/system/used.rb +1 -1
  58. data/lib/facter/facts/linux/processors/speed.rb +1 -1
  59. data/lib/facter/facts/linux/virtual.rb +1 -1
  60. data/lib/facter/facts/macosx/dhcp_servers.rb +1 -0
  61. data/lib/facter/facts/macosx/interfaces.rb +1 -0
  62. data/lib/facter/facts/macosx/memory/swap/available.rb +1 -1
  63. data/lib/facter/facts/macosx/memory/swap/available_bytes.rb +1 -1
  64. data/lib/facter/facts/macosx/memory/swap/total.rb +1 -1
  65. data/lib/facter/facts/macosx/memory/swap/total_bytes.rb +1 -1
  66. data/lib/facter/facts/macosx/memory/swap/used.rb +1 -1
  67. data/lib/facter/facts/macosx/memory/system/available.rb +1 -1
  68. data/lib/facter/facts/macosx/memory/system/available_bytes.rb +1 -1
  69. data/lib/facter/facts/macosx/memory/system/total.rb +1 -1
  70. data/lib/facter/facts/macosx/memory/system/total_bytes.rb +1 -1
  71. data/lib/facter/facts/macosx/memory/system/used.rb +1 -1
  72. data/lib/facter/facts/macosx/processors/speed.rb +1 -1
  73. data/lib/facter/facts/rhel/os/release.rb +1 -1
  74. data/lib/facter/facts/solaris/dhcp_servers.rb +1 -0
  75. data/lib/facter/facts/solaris/hypervisors/ldom.rb +3 -0
  76. data/lib/facter/facts/solaris/interfaces.rb +1 -0
  77. data/lib/facter/facts/solaris/is_virtual.rb +2 -2
  78. data/lib/facter/facts/solaris/ldom.rb +34 -4
  79. data/lib/facter/facts/solaris/memory/swap/available.rb +1 -1
  80. data/lib/facter/facts/solaris/memory/swap/available_bytes.rb +1 -1
  81. data/lib/facter/facts/solaris/memory/swap/total.rb +1 -1
  82. data/lib/facter/facts/solaris/memory/swap/total_bytes.rb +1 -1
  83. data/lib/facter/facts/solaris/memory/swap/used.rb +1 -1
  84. data/lib/facter/facts/solaris/memory/system/available.rb +1 -1
  85. data/lib/facter/facts/solaris/memory/system/available_bytes.rb +1 -1
  86. data/lib/facter/facts/solaris/memory/system/total.rb +1 -1
  87. data/lib/facter/facts/solaris/memory/system/total_bytes.rb +1 -1
  88. data/lib/facter/facts/solaris/memory/system/used.rb +1 -1
  89. data/lib/facter/facts/solaris/processors/speed.rb +1 -1
  90. data/lib/facter/facts/solaris/virtual.rb +1 -1
  91. data/lib/facter/facts/solaris/zones.rb +1 -1
  92. data/lib/facter/facts/windows/dhcp_servers.rb +1 -0
  93. data/lib/facter/facts/windows/interfaces.rb +1 -0
  94. data/lib/facter/facts/windows/memory/system/available.rb +1 -1
  95. data/lib/facter/facts/windows/memory/system/available_bytes.rb +1 -1
  96. data/lib/facter/facts/windows/memory/system/total.rb +1 -1
  97. data/lib/facter/facts/windows/memory/system/total_bytes.rb +1 -1
  98. data/lib/facter/facts/windows/memory/system/used.rb +1 -1
  99. data/lib/facter/facts/windows/os/release.rb +1 -1
  100. data/lib/facter/framework/benchmarking/timer.rb +4 -2
  101. data/lib/facter/framework/cli/cli.rb +20 -6
  102. data/lib/facter/framework/config/fact_groups.rb +10 -8
  103. data/lib/facter/framework/core/cache_manager.rb +79 -29
  104. data/lib/facter/framework/core/fact/internal/core_fact.rb +6 -1
  105. data/lib/facter/framework/core/fact/internal/internal_fact_manager.rb +38 -4
  106. data/lib/facter/framework/core/fact_augmenter.rb +1 -1
  107. data/lib/facter/framework/core/fact_loaders/external_fact_loader.rb +4 -2
  108. data/lib/facter/framework/core/fact_loaders/fact_loader.rb +17 -1
  109. data/lib/facter/framework/core/fact_manager.rb +15 -3
  110. data/lib/facter/framework/core/file_loader.rb +6 -2
  111. data/lib/facter/framework/core/options/config_file_options.rb +16 -5
  112. data/lib/facter/framework/core/options/option_store.rb +40 -20
  113. data/lib/facter/framework/detector/os_hierarchy.rb +5 -9
  114. data/lib/facter/framework/logging/logger.rb +3 -3
  115. data/lib/facter/models/fact_collection.rb +11 -1
  116. data/lib/facter/models/loaded_fact.rb +2 -1
  117. data/lib/facter/resolvers/aio_agent_version.rb +2 -2
  118. data/lib/facter/resolvers/aix/architecture_resolver.rb +19 -4
  119. data/lib/facter/resolvers/aix/disks.rb +6 -5
  120. data/lib/facter/resolvers/aix/filesystem_resolver.rb +2 -2
  121. data/lib/facter/resolvers/aix/hardware_resolver.rb +4 -3
  122. data/lib/facter/resolvers/aix/load_averages_resolver.rb +2 -1
  123. data/lib/facter/resolvers/aix/memory.rb +4 -3
  124. data/lib/facter/resolvers/aix/mountpoints.rb +6 -5
  125. data/lib/facter/resolvers/aix/networking_resolver.rb +4 -3
  126. data/lib/facter/resolvers/aix/nim.rb +1 -1
  127. data/lib/facter/resolvers/aix/os_level.rb +2 -2
  128. data/lib/facter/resolvers/aix/partitions.rb +7 -6
  129. data/lib/facter/resolvers/aix/processors.rb +5 -4
  130. data/lib/facter/resolvers/aix/serialnumber.rb +2 -2
  131. data/lib/facter/resolvers/augeas_resolver.rb +8 -2
  132. data/lib/facter/resolvers/base_resolver.rb +14 -4
  133. data/lib/facter/resolvers/bsd/processors.rb +13 -8
  134. data/lib/facter/resolvers/cloud.rb +2 -2
  135. data/lib/facter/resolvers/containers.rb +5 -4
  136. data/lib/facter/resolvers/debian_version.rb +2 -2
  137. data/lib/facter/resolvers/disk_resolver.rb +17 -6
  138. data/lib/facter/resolvers/dmi_decode.rb +1 -1
  139. data/lib/facter/resolvers/dmi_resolver.rb +5 -4
  140. data/lib/facter/resolvers/ec2.rb +5 -2
  141. data/lib/facter/resolvers/eos_release_resolver.rb +2 -2
  142. data/lib/facter/resolvers/facterversion_resolver.rb +1 -1
  143. data/lib/facter/resolvers/filesystems_resolver.rb +5 -2
  144. data/lib/facter/resolvers/fips_enabled_resolver.rb +5 -2
  145. data/lib/facter/resolvers/freebsd/dmi_resolver.rb +1 -1
  146. data/lib/facter/resolvers/freebsd/freebsd_version_resolver.rb +9 -7
  147. data/lib/facter/resolvers/freebsd/geom_resolver.rb +15 -22
  148. data/lib/facter/resolvers/freebsd/processors.rb +13 -8
  149. data/lib/facter/resolvers/freebsd/swap_memory_resolver.rb +5 -3
  150. data/lib/facter/resolvers/freebsd/system_memory_resolver.rb +4 -2
  151. data/lib/facter/resolvers/freebsd/virtual_resolver.rb +45 -0
  152. data/lib/facter/resolvers/gce.rb +3 -2
  153. data/lib/facter/resolvers/hostname_resolver.rb +69 -21
  154. data/lib/facter/resolvers/identity_resolver.rb +2 -1
  155. data/lib/facter/resolvers/linux/docker_uptime.rb +3 -2
  156. data/lib/facter/resolvers/linux/load_averages.rb +3 -2
  157. data/lib/facter/resolvers/load_averages.rb +5 -3
  158. data/lib/facter/resolvers/lpar_resolver.rb +1 -1
  159. data/lib/facter/resolvers/lsb_release_resolver.rb +1 -1
  160. data/lib/facter/resolvers/lspci.rb +1 -1
  161. data/lib/facter/resolvers/macosx/dmi_resolver.rb +1 -1
  162. data/lib/facter/resolvers/macosx/filesystems_resolver.rb +1 -1
  163. data/lib/facter/resolvers/macosx/load_averages_resolver.rb +2 -1
  164. data/lib/facter/resolvers/macosx/mountpoints_resolver.rb +9 -8
  165. data/lib/facter/resolvers/macosx/processor_resolver.rb +2 -1
  166. data/lib/facter/resolvers/macosx/swap_memory_resolver.rb +2 -1
  167. data/lib/facter/resolvers/macosx/system_memory_resolver.rb +2 -1
  168. data/lib/facter/resolvers/macosx/system_profiler_resolver.rb +4 -6
  169. data/lib/facter/resolvers/memory_resolver.rb +16 -16
  170. data/lib/facter/resolvers/mountpoints_resolver.rb +56 -25
  171. data/lib/facter/resolvers/networking_linux_resolver.rb +188 -83
  172. data/lib/facter/resolvers/networking_resolver.rb +9 -6
  173. data/lib/facter/resolvers/open_vz.rb +2 -4
  174. data/lib/facter/resolvers/os_release_resolver.rb +2 -2
  175. data/lib/facter/resolvers/partitions.rb +67 -63
  176. data/lib/facter/resolvers/path_resolver.rb +1 -1
  177. data/lib/facter/resolvers/processors_resolver.rb +10 -3
  178. data/lib/facter/resolvers/redhat_release_resolver.rb +2 -2
  179. data/lib/facter/resolvers/ruby_resolver.rb +1 -1
  180. data/lib/facter/resolvers/selinux_resolver.rb +4 -4
  181. data/lib/facter/resolvers/solaris/disks.rb +2 -2
  182. data/lib/facter/resolvers/solaris/dmi.rb +3 -1
  183. data/lib/facter/resolvers/solaris/dmi_sparc.rb +1 -1
  184. data/lib/facter/resolvers/solaris/filesystems.rb +1 -1
  185. data/lib/facter/resolvers/solaris/ipaddress.rb +2 -1
  186. data/lib/facter/resolvers/solaris/ldom.rb +1 -3
  187. data/lib/facter/resolvers/solaris/memory.rb +4 -3
  188. data/lib/facter/resolvers/solaris/mountpoints.rb +61 -0
  189. data/lib/facter/resolvers/solaris/networking.rb +51 -44
  190. data/lib/facter/resolvers/solaris/os_release.rb +7 -5
  191. data/lib/facter/resolvers/solaris/processors.rb +2 -1
  192. data/lib/facter/resolvers/solaris/zone.rb +1 -1
  193. data/lib/facter/resolvers/solaris/zone_name.rb +1 -1
  194. data/lib/facter/resolvers/ssh_resolver.rb +11 -7
  195. data/lib/facter/resolvers/suse_release_resolver.rb +2 -2
  196. data/lib/facter/resolvers/sw_vers_resolver.rb +2 -2
  197. data/lib/facter/resolvers/timezone_resolver.rb +1 -1
  198. data/lib/facter/resolvers/uname_resolver.rb +1 -1
  199. data/lib/facter/resolvers/uptime_resolver.rb +3 -3
  200. data/lib/facter/resolvers/virt_what.rb +1 -1
  201. data/lib/facter/resolvers/vmware.rb +1 -1
  202. data/lib/facter/resolvers/windows/aio_agent_version.rb +2 -2
  203. data/lib/facter/resolvers/windows/dmi_bios_resolver.rb +2 -2
  204. data/lib/facter/resolvers/windows/dmi_computersystem_resolver.rb +2 -2
  205. data/lib/facter/resolvers/windows/fips_resolver.rb +2 -1
  206. data/lib/facter/resolvers/windows/hardware_architecture_resolver.rb +2 -1
  207. data/lib/facter/resolvers/windows/identity_resolver.rb +2 -1
  208. data/lib/facter/resolvers/windows/kernel_resolver.rb +3 -1
  209. data/lib/facter/resolvers/windows/memory_resolver.rb +7 -1
  210. data/lib/facter/resolvers/windows/netkvm_resolver.rb +2 -1
  211. data/lib/facter/resolvers/windows/networking_resolver.rb +5 -4
  212. data/lib/facter/resolvers/windows/processors_resolver.rb +3 -2
  213. data/lib/facter/resolvers/windows/product_release_resolver.rb +2 -1
  214. data/lib/facter/resolvers/windows/ssh.rb +5 -3
  215. data/lib/facter/resolvers/windows/system32_resolver.rb +3 -1
  216. data/lib/facter/resolvers/windows/uptime_resolver.rb +3 -2
  217. data/lib/facter/resolvers/windows/virtualization_resolver.rb +3 -2
  218. data/lib/facter/resolvers/windows/win_os_description_resolver.rb +4 -2
  219. data/lib/facter/resolvers/wpar_resolver.rb +1 -1
  220. data/lib/facter/resolvers/xen.rb +2 -2
  221. data/lib/facter/resolvers/zfs.rb +2 -1
  222. data/lib/facter/resolvers/zpool.rb +2 -1
  223. data/lib/facter/util/aix/info_extractor.rb +24 -0
  224. data/lib/facter/util/aix/odm_query.rb +46 -0
  225. data/lib/facter/util/api_debugger.rb +33 -29
  226. data/lib/facter/util/facts/facts_utils.rb +14 -0
  227. data/lib/facter/util/facts/unit_converter.rb +61 -0
  228. data/lib/facter/util/facts/uptime_parser.rb +128 -0
  229. data/lib/facter/util/facts/virtual_detector.rb +90 -0
  230. data/lib/facter/util/facts/windows_release_finder.rb +55 -0
  231. data/lib/facter/{resolvers/macosx/utils → util/macosx}/system_profile_executor.rb +1 -1
  232. data/lib/facter/util/resolvers/aws_token.rb +37 -0
  233. data/lib/facter/{resolvers/utils → util/resolvers}/ffi/load_averages.rb +2 -2
  234. data/lib/facter/util/resolvers/filesystem_helper.rb +47 -0
  235. data/lib/facter/util/resolvers/fingerprint.rb +15 -0
  236. data/lib/facter/{resolvers/utils → util/resolvers}/http.rb +17 -10
  237. data/lib/facter/util/resolvers/networking.rb +90 -0
  238. data/lib/facter/util/resolvers/networking/dhcp.rb +21 -0
  239. data/lib/facter/util/resolvers/networking/networking.rb +109 -0
  240. data/lib/facter/util/resolvers/networking/primary_interface.rb +82 -0
  241. data/lib/facter/util/resolvers/ssh.rb +17 -0
  242. data/lib/facter/util/resolvers/ssh_helper.rb +31 -0
  243. data/lib/facter/{resolvers/utils → util/resolvers}/uptime_helper.rb +2 -2
  244. data/lib/facter/{framework/utils → util}/utils.rb +0 -0
  245. data/lib/facter/util/windows/win32ole.rb +30 -0
  246. data/lib/facter/version.rb +1 -1
  247. metadata +33 -44
  248. data/lib/facter/fact_groups.conf +0 -308
  249. data/lib/facter/facts/aix/puppet_version.rb +0 -15
  250. data/lib/facter/facts/freebsd/puppet_version.rb +0 -15
  251. data/lib/facter/facts/linux/puppet_version.rb +0 -15
  252. data/lib/facter/facts/macosx/puppet_version.rb +0 -15
  253. data/lib/facter/facts/solaris/puppet_version.rb +0 -15
  254. data/lib/facter/facts/windows/puppet_version.rb +0 -15
  255. data/lib/facter/facts_utils/facts_utils.rb +0 -12
  256. data/lib/facter/facts_utils/unit_converter.rb +0 -59
  257. data/lib/facter/facts_utils/uptime_parser.rb +0 -124
  258. data/lib/facter/facts_utils/virtual_detector.rb +0 -78
  259. data/lib/facter/facts_utils/windows_release_finder.rb +0 -51
  260. data/lib/facter/os_hierarchy.json +0 -36
  261. data/lib/facter/resolvers/aix/utils/info_extractor.rb +0 -20
  262. data/lib/facter/resolvers/aix/utils/odm_query.rb +0 -42
  263. data/lib/facter/resolvers/puppet_version_resolver.rb +0 -26
  264. data/lib/facter/resolvers/utils/filesystem_helper.rb +0 -43
  265. data/lib/facter/resolvers/utils/fingerprint.rb +0 -11
  266. data/lib/facter/resolvers/utils/networking.rb +0 -86
  267. data/lib/facter/resolvers/utils/ssh.rb +0 -13
  268. data/lib/facter/resolvers/utils/ssh_helper.rb +0 -27
  269. data/lib/facter/resolvers/windows/utils/win32ole.rb +0 -24
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Facter
4
+ module Util
5
+ module Resolvers
6
+ class FingerPrint
7
+ attr_accessor :sha1, :sha256
8
+ def initialize(sha1, sha256)
9
+ @sha1 = sha1
10
+ @sha256 = sha256
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Facter
4
- module Resolvers
5
- module Utils
4
+ module Util
5
+ module Resolvers
6
6
  module Http
7
7
  @log = Facter::Log.new(self)
8
8
 
@@ -27,6 +27,10 @@ module Facter
27
27
  make_request(url, headers, timeouts, 'GET')
28
28
  end
29
29
 
30
+ def put_request(url, headers = {}, timeouts = {})
31
+ make_request(url, headers, timeouts, 'PUT')
32
+ end
33
+
30
34
  private
31
35
 
32
36
  def make_request(url, headers, timeouts, request_type)
@@ -37,8 +41,10 @@ module Facter
37
41
  request = request_obj(headers, uri, request_type)
38
42
 
39
43
  # Make the request
40
- resp = http.request(request)
41
- response_code_valid?(resp.code.to_i) ? resp.body : ''
44
+ response = http.request(request)
45
+ response.uri = url
46
+
47
+ successful_response?(response) ? response.body : ''
42
48
  rescue StandardError => e
43
49
  @log.debug("Trying to connect to #{url} but got: #{e.message}")
44
50
  ''
@@ -52,14 +58,15 @@ module Facter
52
58
  end
53
59
 
54
60
  def request_obj(headers, parsed_url, request_type)
55
- return Net::HTTP::Get.new(parsed_url.request_uri, headers) if request_type == 'GET'
56
-
57
- raise StandardError("Unknown http request type: #{request_type}")
61
+ Module.const_get("Net::HTTP::#{request_type.capitalize}").new(parsed_url.request_uri, headers)
58
62
  end
59
63
 
60
- def response_code_valid?(http_code)
61
- @log.debug("Request failed with error code #{http_code}") unless http_code.equal?(200)
62
- http_code.equal?(200)
64
+ def successful_response?(response)
65
+ success = response.code.to_i.equal?(200)
66
+
67
+ @log.debug("Request to #{response.uri} failed with error code #{response.code}") unless success
68
+
69
+ success
63
70
  end
64
71
  end
65
72
  end
@@ -0,0 +1,90 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'ipaddr'
4
+
5
+ module Facter
6
+ module Util
7
+ module Resolvers
8
+ module Networking
9
+ class << self
10
+ # Creates a hash with IP, netmask and network. Works for IPV4 and IPV6
11
+ # @param [String] addr The IP address
12
+ # @param [Integer] mask_length Number of 1 bits the netmask has
13
+ #
14
+ # @return [Hash] Hash containing ip address, netmask and network
15
+ def build_binding(addr, mask_length)
16
+ return if !addr || !mask_length
17
+
18
+ ip = IPAddr.new(addr)
19
+ mask_helper = ip.ipv6? ? 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff' : '255.255.255.255'
20
+ mask = IPAddr.new(mask_helper).mask(mask_length)
21
+
22
+ { address: addr, netmask: mask.to_s, network: ip.mask(mask_length).to_s }
23
+ end
24
+
25
+ def expand_main_bindings(networking_facts)
26
+ primary = networking_facts[:primary_interface]
27
+ interfaces = networking_facts[:interfaces]
28
+
29
+ expand_interfaces(interfaces) unless interfaces.nil?
30
+ expand_primary_interface(networking_facts, primary) unless primary.nil? || interfaces.nil?
31
+ end
32
+
33
+ def get_scope(ip)
34
+ require 'socket'
35
+
36
+ scope6 = []
37
+ addrinfo = Addrinfo.new(['AF_INET6', 0, nil, ip], :INET6)
38
+
39
+ scope6 << 'compat,' if IPAddr.new(ip).ipv4_compat?
40
+ scope6 << if addrinfo.ipv6_linklocal?
41
+ 'link'
42
+ elsif addrinfo.ipv6_sitelocal?
43
+ 'site'
44
+ elsif addrinfo.ipv6_loopback?
45
+ 'host'
46
+ else 'global'
47
+ end
48
+ scope6.join
49
+ end
50
+
51
+ def find_valid_binding(bindings)
52
+ bindings.each do |binding|
53
+ return binding unless ignored_ip_address(binding[:address])
54
+ end
55
+ bindings.empty? ? nil : bindings.first
56
+ end
57
+
58
+ def ignored_ip_address(addr)
59
+ addr.empty? || addr.start_with?('127.', '169.254.') || addr.start_with?('fe80') || addr.eql?('::1')
60
+ end
61
+
62
+ private
63
+
64
+ def expand_interfaces(interfaces)
65
+ interfaces.each_value do |values|
66
+ expand_binding(values, values[:bindings]) if values[:bindings]
67
+ expand_binding(values, values[:bindings6], false) if values[:bindings6]
68
+ end
69
+ end
70
+
71
+ def expand_primary_interface(networking_facts, primary)
72
+ networking_facts[:interfaces][primary].each do |key, value|
73
+ networking_facts[key] = value unless %i[bindings bindings6].include?(key)
74
+ end
75
+ end
76
+
77
+ def expand_binding(values, bindings, ipv4_type = true)
78
+ binding = find_valid_binding(bindings)
79
+ ip_protocol_type = ipv4_type ? '' : '6'
80
+
81
+ values["ip#{ip_protocol_type}".to_sym] = binding[:address]
82
+ values["netmask#{ip_protocol_type}".to_sym] = binding[:netmask]
83
+ values["network#{ip_protocol_type}".to_sym] = binding[:network]
84
+ values[:scope6] = get_scope(binding[:address]) unless ipv4_type
85
+ end
86
+ end
87
+ end
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Facter
4
+ module Util
5
+ module Resolvers
6
+ module Networking
7
+ module Dhcp
8
+ class << self
9
+ def get(interface_name, log = nil)
10
+ dhcpinfo_command = Facter::Core::Execution.which('dhcpinfo') || '/sbin/dhcpinfo'
11
+ result = Facter::Core::Execution.execute("#{dhcpinfo_command} -i #{interface_name} ServerID", logger: log)
12
+ result.chomp!
13
+
14
+ result.empty? ? nil : result
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,109 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'ipaddr'
4
+
5
+ module Facter
6
+ module Util
7
+ module Resolvers
8
+ module Networking
9
+ class << self
10
+ # Creates a hash with IP, netmask and network. Works for IPV4 and IPV6
11
+ # @param [String] addr The IP address
12
+ # @param [Integer] mask_length Number of 1 bits the netmask has
13
+ #
14
+ # @return [Hash] Hash containing ip address, netmask and network
15
+ def build_binding(addr, mask_length)
16
+ return if !addr || !mask_length
17
+
18
+ ip = IPAddr.new(addr)
19
+ mask_helper = nil
20
+ scope = nil
21
+ if ip.ipv6?
22
+ scope = get_scope(addr)
23
+ mask_helper = 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff'
24
+ else
25
+ mask_helper = '255.255.255.255'
26
+ end
27
+ mask = IPAddr.new(mask_helper).mask(mask_length)
28
+
29
+ result = { address: addr, netmask: mask.to_s, network: ip.mask(mask_length).to_s }
30
+ result[:scope6] = scope if scope
31
+ result
32
+ end
33
+
34
+ def expand_main_bindings(networking_facts)
35
+ primary = networking_facts[:primary_interface]
36
+ interfaces = networking_facts[:interfaces]
37
+
38
+ expand_interfaces(interfaces) unless interfaces.nil?
39
+ expand_primary_interface(networking_facts, primary) unless primary.nil? || interfaces.nil?
40
+ end
41
+
42
+ def get_scope(ip)
43
+ require 'socket'
44
+
45
+ scope6 = []
46
+ addrinfo = Addrinfo.new(['AF_INET6', 0, nil, ip], :INET6)
47
+
48
+ scope6 << 'compat,' if IPAddr.new(ip).ipv4_compat?
49
+ scope6 << if addrinfo.ipv6_linklocal?
50
+ 'link'
51
+ elsif addrinfo.ipv6_sitelocal?
52
+ 'site'
53
+ elsif addrinfo.ipv6_loopback?
54
+ 'host'
55
+ else 'global'
56
+ end
57
+ scope6.join
58
+ end
59
+
60
+ def find_valid_binding(bindings)
61
+ bindings.each do |binding|
62
+ return binding unless ignored_ip_address(binding[:address])
63
+ end
64
+ bindings.empty? ? nil : bindings.first
65
+ end
66
+
67
+ def ignored_ip_address(addr)
68
+ addr.empty? || addr.start_with?('127.', '169.254.') || addr.start_with?('fe80') || addr.eql?('::1')
69
+ end
70
+
71
+ def calculate_mask_length(netmask)
72
+ ipaddr = IPAddr.new(netmask)
73
+
74
+ ipaddr.to_i.to_s(2).count('1')
75
+ end
76
+
77
+ def format_mac_address(address)
78
+ address.split('.').map { |e| format('%<mac_address>02s', mac_address: e) }.join(':').tr(' ', '0')
79
+ end
80
+
81
+ private
82
+
83
+ def expand_interfaces(interfaces)
84
+ interfaces.each_value do |values|
85
+ expand_binding(values, values[:bindings]) if values[:bindings]
86
+ expand_binding(values, values[:bindings6], false) if values[:bindings6]
87
+ end
88
+ end
89
+
90
+ def expand_primary_interface(networking_facts, primary)
91
+ networking_facts[:interfaces][primary].each do |key, value|
92
+ networking_facts[key] = value unless %i[bindings bindings6].include?(key)
93
+ end
94
+ end
95
+
96
+ def expand_binding(values, bindings, ipv4_type = true)
97
+ binding = find_valid_binding(bindings)
98
+ ip_protocol_type = ipv4_type ? '' : '6'
99
+
100
+ values["ip#{ip_protocol_type}".to_sym] = binding[:address]
101
+ values["netmask#{ip_protocol_type}".to_sym] = binding[:netmask]
102
+ values["network#{ip_protocol_type}".to_sym] = binding[:network]
103
+ values[:scope6] = get_scope(binding[:address]) unless ipv4_type
104
+ end
105
+ end
106
+ end
107
+ end
108
+ end
109
+ end
@@ -0,0 +1,82 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Facter
4
+ module Util
5
+ module Resolvers
6
+ module Networking
7
+ module PrimaryInterface
8
+ @log ||= Log.new(self)
9
+
10
+ class << self
11
+ ROUTE_TABLE_MAPPING = {
12
+ 'Iface' => 0,
13
+ 'Destination' => 1,
14
+ 'Gateway' => 2,
15
+ 'Flags' => 3,
16
+ 'RefCnt' => 4,
17
+ 'Use' => 5,
18
+ 'Metric' => 6,
19
+ 'Mask' => 7,
20
+ 'MTU' => 8,
21
+ 'Window' => 9,
22
+ 'IRTT' => 10
23
+ }.freeze
24
+
25
+ def read_from_route
26
+ return if Facter::Core::Execution.which('route').nil?
27
+
28
+ result = Facter::Core::Execution.execute('route -n get default', logger: @log)
29
+
30
+ result.match(/interface: (.+)/)&.captures&.first
31
+ end
32
+
33
+ def read_from_proc_route
34
+ content = Facter::Util::FileHelper.safe_read('/proc/net/route', '')
35
+
36
+ content.each_line.with_index do |line, index|
37
+ next if index.zero?
38
+
39
+ route = line.strip.split("\t")
40
+ if route.count > 7 &&
41
+ route[ROUTE_TABLE_MAPPING['Destination']] == '00000000' &&
42
+ route[ROUTE_TABLE_MAPPING['Mask']] == '00000000'
43
+ return route[ROUTE_TABLE_MAPPING['Iface']]
44
+ end
45
+ end
46
+
47
+ nil
48
+ end
49
+
50
+ def read_from_ip_route
51
+ return if Facter::Core::Execution.which('ip').nil?
52
+
53
+ output = Facter::Core::Execution.execute('ip route show default', logger: @log)
54
+ primary_interface = nil
55
+ output.each_line do |line|
56
+ primary_interface = line.strip.split(' ')[4] if line.start_with?('default')
57
+ end
58
+
59
+ primary_interface
60
+ end
61
+
62
+ def find_in_interfaces(interfaces)
63
+ interfaces.each do |iface_name, interface|
64
+ interface[:bindings]&.each do |binding|
65
+ return iface_name unless Facter::Util::Resolvers::Networking.ignored_ip_address(binding[:address])
66
+ end
67
+
68
+ next unless interface[:bindings6]
69
+
70
+ interface[:bindings6].each do |binding|
71
+ return iface_name unless Facter::Util::Resolvers::Networking.ignored_ip_address(binding[:address])
72
+ end
73
+ end
74
+
75
+ nil
76
+ end
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Facter
4
+ module Util
5
+ module Resolvers
6
+ class Ssh
7
+ attr_accessor :fingerprint, :type, :key, :name
8
+ def initialize(fingerprint, type, key, name)
9
+ @fingerprint = fingerprint
10
+ @type = type
11
+ @key = key
12
+ @name = name
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'base64'
4
+ require 'digest/sha1'
5
+
6
+ module Facter
7
+ module Util
8
+ module Resolvers
9
+ class SshHelper
10
+ class << self
11
+ SSH_NAME = { 'ssh-dss' => 'dsa', 'ecdsa-sha2-nistp256' => 'ecdsa',
12
+ 'ssh-ed25519' => 'ed25519', 'ssh-rsa' => 'rsa' }.freeze
13
+ SSH_FINGERPRINT = { 'rsa' => 1, 'dsa' => 2, 'ecdsa' => 3, 'ed25519' => 4 }.freeze
14
+
15
+ def create_ssh(key_type, key)
16
+ key_name = SSH_NAME[key_type]
17
+ return unless key_name
18
+
19
+ decoded_key = Base64.decode64(key)
20
+ ssh_fp = SSH_FINGERPRINT[key_name]
21
+ sha1 = "SSHFP #{ssh_fp} 1 #{Digest::SHA1.new.update(decoded_key)}"
22
+ sha256 = "SSHFP #{ssh_fp} 2 #{Digest::SHA2.new.update(decoded_key)}"
23
+
24
+ fingerprint = Facter::Util::Resolvers::FingerPrint.new(sha1, sha256)
25
+ Facter::Util::Resolvers::Ssh.new(fingerprint, key_type, key, key_name)
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Facter
4
- module Resolvers
5
- module Utils
4
+ module Util
5
+ module Resolvers
6
6
  module UptimeHelper
7
7
  class << self
8
8
  def create_uptime_hash(seconds)
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'win32ole'
4
+
5
+ module Facter
6
+ module Util
7
+ module Windows
8
+ class Win32Ole
9
+ RPC_C_IMP_LEVEL_IMPERSONATE = 3
10
+
11
+ def initialize
12
+ locator = WIN32OLE.new('WbemScripting.SWbemLocator')
13
+ @conn = locator.ConnectServer('.', 'root\\cimv2')
14
+ @conn.Security_.ImpersonationLevel = RPC_C_IMP_LEVEL_IMPERSONATE
15
+ end
16
+
17
+ def return_first(query)
18
+ result = exec_query(query)
19
+ return result.to_enum.first if result
20
+
21
+ nil
22
+ end
23
+
24
+ def exec_query(query)
25
+ @conn.execquery(query)
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end