facter 4.0.47 → 4.0.52

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 (240) hide show
  1. checksums.yaml +4 -4
  2. data/lib/docs/generate_cli.rb +7 -0
  3. data/lib/facter.rb +76 -43
  4. data/lib/facter/config.rb +21 -9
  5. data/lib/facter/custom_facts/core/aggregate.rb +16 -0
  6. data/lib/facter/custom_facts/core/execution/base.rb +3 -2
  7. data/lib/facter/custom_facts/core/execution/popen3.rb +47 -0
  8. data/lib/facter/custom_facts/core/resolvable.rb +11 -0
  9. data/lib/facter/custom_facts/util/fact.rb +22 -3
  10. data/lib/facter/custom_facts/util/resolution.rb +3 -1
  11. data/lib/facter/facts/aix/disks.rb +1 -1
  12. data/lib/facter/facts/aix/ssh.rb +1 -1
  13. data/lib/facter/facts/aix/sshalgorithmkey.rb +1 -1
  14. data/lib/facter/facts/aix/sshfp_algorithm.rb +1 -1
  15. data/lib/facter/facts/alpine/os/release.rb +29 -0
  16. data/lib/facter/facts/amzn/lsbdistcodename.rb +16 -0
  17. data/lib/facter/facts/amzn/lsbdistdescription.rb +16 -0
  18. data/lib/facter/facts/amzn/lsbdistid.rb +16 -0
  19. data/lib/facter/facts/amzn/os/distro/codename.rb +24 -0
  20. data/lib/facter/facts/amzn/os/distro/description.rb +21 -0
  21. data/lib/facter/facts/amzn/os/distro/id.rb +21 -0
  22. data/lib/facter/facts/amzn/os/distro/release.rb +32 -0
  23. data/lib/facter/facts/amzn/os/release.rb +29 -0
  24. data/lib/facter/facts/devuan/os/distro/release.rb +36 -0
  25. data/lib/facter/facts/devuan/os/release.rb +29 -0
  26. data/lib/facter/facts/freebsd/ssh.rb +1 -1
  27. data/lib/facter/facts/freebsd/sshalgorithmkey.rb +1 -1
  28. data/lib/facter/facts/freebsd/sshfp_algorithm.rb +1 -1
  29. data/lib/facter/facts/gentoo/os/release.rb +29 -0
  30. data/lib/facter/facts/linux/az_metadata.rb +27 -0
  31. data/lib/facter/facts/linux/cloud/provider.rb +17 -0
  32. data/lib/facter/facts/linux/dhcp_servers.rb +2 -2
  33. data/lib/facter/facts/linux/disks.rb +1 -1
  34. data/lib/facter/facts/linux/interfaces.rb +1 -1
  35. data/lib/facter/facts/linux/ipaddress6_interfaces.rb +1 -1
  36. data/lib/facter/facts/linux/ipaddress_interfaces.rb +1 -1
  37. data/lib/facter/facts/linux/macaddress_interfaces.rb +1 -1
  38. data/lib/facter/facts/linux/mtu_interfaces.rb +1 -1
  39. data/lib/facter/facts/linux/netmask6_interfaces.rb +1 -1
  40. data/lib/facter/facts/linux/netmask_interfaces.rb +1 -1
  41. data/lib/facter/facts/linux/network6_interfaces.rb +1 -1
  42. data/lib/facter/facts/linux/network_interfaces.rb +1 -1
  43. data/lib/facter/facts/linux/networking/dhcp.rb +1 -1
  44. data/lib/facter/facts/linux/networking/domain.rb +1 -1
  45. data/lib/facter/facts/linux/networking/fqdn.rb +1 -1
  46. data/lib/facter/facts/linux/networking/hostname.rb +1 -1
  47. data/lib/facter/facts/linux/networking/interfaces.rb +1 -1
  48. data/lib/facter/facts/linux/networking/ip.rb +1 -1
  49. data/lib/facter/facts/linux/networking/ip6.rb +1 -1
  50. data/lib/facter/facts/linux/networking/mac.rb +1 -1
  51. data/lib/facter/facts/linux/networking/mtu.rb +1 -1
  52. data/lib/facter/facts/linux/networking/netmask.rb +1 -1
  53. data/lib/facter/facts/linux/networking/netmask6.rb +1 -1
  54. data/lib/facter/facts/linux/networking/network.rb +1 -1
  55. data/lib/facter/facts/linux/networking/network6.rb +1 -1
  56. data/lib/facter/facts/linux/networking/primary.rb +1 -1
  57. data/lib/facter/facts/linux/networking/scope6.rb +1 -1
  58. data/lib/facter/facts/linux/os/family.rb +4 -2
  59. data/lib/facter/facts/linux/scope6_interfaces.rb +1 -1
  60. data/lib/facter/facts/linux/ssh.rb +1 -1
  61. data/lib/facter/facts/linux/sshalgorithmkey.rb +1 -1
  62. data/lib/facter/facts/linux/sshfp_algorithm.rb +1 -1
  63. data/lib/facter/facts/linuxmint/os/name.rb +18 -0
  64. data/lib/facter/facts/linuxmint/os/release.rb +35 -0
  65. data/lib/facter/facts/macosx/ssh.rb +1 -1
  66. data/lib/facter/facts/macosx/sshalgorithmkey.rb +1 -1
  67. data/lib/facter/facts/macosx/sshfp_algorithm.rb +1 -1
  68. data/lib/facter/facts/mageia/os/release.rb +36 -0
  69. data/lib/facter/facts/meego/os/release.rb +29 -0
  70. data/lib/facter/facts/oel/os/release.rb +29 -0
  71. data/lib/facter/facts/ol/os/release.rb +29 -0
  72. data/lib/facter/facts/openwrt/os/release.rb +35 -0
  73. data/lib/facter/facts/ovs/os/release.rb +29 -0
  74. data/lib/facter/facts/photon/os/release.rb +45 -0
  75. data/lib/facter/facts/rhel/lsbdistcodename.rb +16 -0
  76. data/lib/facter/facts/rhel/lsbdistdescription.rb +16 -0
  77. data/lib/facter/facts/rhel/lsbdistid.rb +16 -0
  78. data/lib/facter/facts/rhel/os/distro/codename.rb +2 -4
  79. data/lib/facter/facts/rhel/os/distro/description.rb +2 -4
  80. data/lib/facter/facts/rhel/os/distro/id.rb +2 -4
  81. data/lib/facter/facts/rhel/os/distro/release.rb +13 -12
  82. data/lib/facter/facts/rhel/os/release.rb +1 -8
  83. data/lib/facter/facts/slackware/os/release.rb +35 -0
  84. data/lib/facter/facts/sles/lsbdistcodename.rb +16 -0
  85. data/lib/facter/facts/sles/lsbdistdescription.rb +16 -0
  86. data/lib/facter/facts/sles/lsbdistid.rb +16 -0
  87. data/lib/facter/facts/sles/os/distro/codename.rb +3 -4
  88. data/lib/facter/facts/sles/os/distro/description.rb +2 -5
  89. data/lib/facter/facts/sles/os/distro/id.rb +6 -5
  90. data/lib/facter/facts/sles/os/distro/release.rb +17 -12
  91. data/lib/facter/facts/solaris/disks.rb +1 -1
  92. data/lib/facter/facts/solaris/ssh.rb +1 -1
  93. data/lib/facter/facts/solaris/sshalgorithmkey.rb +1 -1
  94. data/lib/facter/facts/solaris/sshfp_algorithm.rb +1 -1
  95. data/lib/facter/facts/ubuntu/lsbdistrelease.rb +2 -2
  96. data/lib/facter/facts/windows/az_metadata.rb +27 -0
  97. data/lib/facter/facts/windows/cloud/provider.rb +17 -0
  98. data/lib/facter/facts/windows/networking/fqdn.rb +1 -1
  99. data/lib/facter/framework/cli/cli.rb +6 -8
  100. data/lib/facter/framework/config/config_reader.rb +9 -0
  101. data/lib/facter/framework/config/fact_groups.rb +28 -2
  102. data/lib/facter/framework/core/cache_manager.rb +5 -1
  103. data/lib/facter/framework/core/fact_filter.rb +3 -3
  104. data/lib/facter/framework/core/fact_loaders/external_fact_loader.rb +0 -4
  105. data/lib/facter/framework/core/fact_loaders/fact_loader.rb +2 -1
  106. data/lib/facter/framework/core/fact_manager.rb +5 -3
  107. data/lib/facter/framework/core/options.rb +1 -2
  108. data/lib/facter/framework/core/options/option_store.rb +11 -5
  109. data/lib/facter/framework/detector/os_detector.rb +8 -0
  110. data/lib/facter/framework/logging/logger.rb +4 -4
  111. data/lib/facter/framework/parsers/query_parser.rb +13 -6
  112. data/lib/facter/resolvers/aio_agent_version.rb +1 -1
  113. data/lib/facter/resolvers/aix/{architecture_resolver.rb → architecture.rb} +1 -1
  114. data/lib/facter/resolvers/aix/disks.rb +1 -1
  115. data/lib/facter/resolvers/aix/ffi/ffi.rb +63 -0
  116. data/lib/facter/resolvers/aix/ffi/ffi_helper.rb +146 -20
  117. data/lib/facter/resolvers/aix/ffi/structs.rb +69 -0
  118. data/lib/facter/resolvers/aix/{filesystem_resolver.rb → filesystem.rb} +1 -1
  119. data/lib/facter/resolvers/aix/{hardware_resolver.rb → hardware.rb} +1 -1
  120. data/lib/facter/resolvers/aix/{load_averages_resolver.rb → load_averages.rb} +2 -2
  121. data/lib/facter/resolvers/aix/memory.rb +1 -1
  122. data/lib/facter/resolvers/aix/mountpoints.rb +1 -1
  123. data/lib/facter/resolvers/aix/{networking_resolver.rb → networking.rb} +9 -16
  124. data/lib/facter/resolvers/aix/nim.rb +1 -1
  125. data/lib/facter/resolvers/aix/os_level.rb +1 -1
  126. data/lib/facter/resolvers/aix/partitions.rb +1 -1
  127. data/lib/facter/resolvers/aix/processors.rb +1 -1
  128. data/lib/facter/resolvers/aix/serialnumber.rb +1 -1
  129. data/lib/facter/resolvers/{augeas_resolver.rb → augeas.rb} +1 -1
  130. data/lib/facter/resolvers/az.rb +39 -0
  131. data/lib/facter/resolvers/base_resolver.rb +4 -4
  132. data/lib/facter/resolvers/bsd/processors.rb +1 -1
  133. data/lib/facter/resolvers/containers.rb +1 -1
  134. data/lib/facter/resolvers/debian_version.rb +1 -1
  135. data/lib/facter/resolvers/{disk_resolver.rb → disk.rb} +1 -1
  136. data/lib/facter/resolvers/{dmi_resolver.rb → dmi.rb} +1 -1
  137. data/lib/facter/resolvers/dmi_decode.rb +1 -1
  138. data/lib/facter/resolvers/ec2.rb +1 -1
  139. data/lib/facter/resolvers/{eos_release_resolver.rb → eos_release.rb} +1 -1
  140. data/lib/facter/resolvers/{facterversion_resolver.rb → facterversion.rb} +1 -1
  141. data/lib/facter/resolvers/{filesystems_resolver.rb → filesystems.rb} +1 -1
  142. data/lib/facter/resolvers/{fips_enabled_resolver.rb → fips_enabled.rb} +1 -1
  143. data/lib/facter/resolvers/freebsd/{dmi_resolver.rb → dmi.rb} +1 -1
  144. data/lib/facter/resolvers/freebsd/{freebsd_version_resolver.rb → freebsd_version.rb} +1 -1
  145. data/lib/facter/resolvers/freebsd/{geom_resolver.rb → geom.rb} +1 -1
  146. data/lib/facter/resolvers/freebsd/processors.rb +1 -1
  147. data/lib/facter/resolvers/freebsd/{swap_memory_resolver.rb → swap_memory.rb} +1 -1
  148. data/lib/facter/resolvers/freebsd/{system_memory_resolver.rb → system_memory.rb} +1 -1
  149. data/lib/facter/resolvers/freebsd/{virtual_resolver.rb → virtual.rb} +1 -1
  150. data/lib/facter/resolvers/gce.rb +1 -1
  151. data/lib/facter/resolvers/{hostname_resolver.rb → hostname.rb} +1 -1
  152. data/lib/facter/resolvers/{identity_resolver.rb → identity.rb} +1 -1
  153. data/lib/facter/resolvers/linux/docker_uptime.rb +1 -1
  154. data/lib/facter/resolvers/linux/hostname.rb +115 -0
  155. data/lib/facter/resolvers/linux/load_averages.rb +1 -1
  156. data/lib/facter/resolvers/linux/networking.rb +106 -0
  157. data/lib/facter/resolvers/load_averages.rb +1 -1
  158. data/lib/facter/resolvers/{lpar_resolver.rb → lpar.rb} +1 -1
  159. data/lib/facter/resolvers/{lsb_release_resolver.rb → lsb_release.rb} +1 -1
  160. data/lib/facter/resolvers/lspci.rb +1 -1
  161. data/lib/facter/resolvers/macosx/{dmi_resolver.rb → dmi.rb} +1 -1
  162. data/lib/facter/resolvers/macosx/{filesystems_resolver.rb → filesystems.rb} +1 -1
  163. data/lib/facter/resolvers/macosx/{load_averages_resolver.rb → load_averages.rb} +1 -1
  164. data/lib/facter/resolvers/macosx/{mountpoints_resolver.rb → mountpoints.rb} +1 -1
  165. data/lib/facter/resolvers/macosx/{processor_resolver.rb → processor.rb} +1 -1
  166. data/lib/facter/resolvers/macosx/{swap_memory_resolver.rb → swap_memory.rb} +1 -1
  167. data/lib/facter/resolvers/macosx/{system_memory_resolver.rb → system_memory.rb} +1 -1
  168. data/lib/facter/resolvers/macosx/{system_profiler_resolver.rb → system_profiler.rb} +1 -1
  169. data/lib/facter/resolvers/{memory_resolver.rb → memory.rb} +1 -1
  170. data/lib/facter/resolvers/{mountpoints_resolver.rb → mountpoints.rb} +1 -1
  171. data/lib/facter/resolvers/{networking_resolver.rb → networking.rb} +1 -1
  172. data/lib/facter/resolvers/open_vz.rb +1 -1
  173. data/lib/facter/resolvers/{os_release_resolver.rb → os_release.rb} +1 -1
  174. data/lib/facter/resolvers/partitions.rb +1 -1
  175. data/lib/facter/resolvers/{path_resolver.rb → path.rb} +1 -1
  176. data/lib/facter/resolvers/{processors_resolver.rb → processors.rb} +1 -1
  177. data/lib/facter/resolvers/redhat_release.rb +71 -0
  178. data/lib/facter/resolvers/release_from_first_line.rb +41 -0
  179. data/lib/facter/resolvers/{ruby_resolver.rb → ruby.rb} +1 -1
  180. data/lib/facter/resolvers/{selinux_resolver.rb → selinux.rb} +1 -1
  181. data/lib/facter/resolvers/solaris/disks.rb +1 -1
  182. data/lib/facter/resolvers/solaris/dmi.rb +1 -1
  183. data/lib/facter/resolvers/solaris/dmi_sparc.rb +1 -1
  184. data/lib/facter/resolvers/solaris/ffi/functions.rb +1 -1
  185. data/lib/facter/resolvers/solaris/filesystems.rb +1 -1
  186. data/lib/facter/resolvers/solaris/ipaddress.rb +1 -1
  187. data/lib/facter/resolvers/solaris/ldom.rb +1 -1
  188. data/lib/facter/resolvers/solaris/memory.rb +1 -1
  189. data/lib/facter/resolvers/solaris/mountpoints.rb +1 -1
  190. data/lib/facter/resolvers/solaris/networking.rb +1 -1
  191. data/lib/facter/resolvers/solaris/os_release.rb +1 -1
  192. data/lib/facter/resolvers/solaris/processors.rb +1 -1
  193. data/lib/facter/resolvers/solaris/zone.rb +1 -1
  194. data/lib/facter/resolvers/solaris/zone_name.rb +1 -1
  195. data/lib/facter/resolvers/specific_release_file.rb +35 -0
  196. data/lib/facter/resolvers/{ssh_resolver.rb → ssh.rb} +2 -2
  197. data/lib/facter/resolvers/{suse_release_resolver.rb → suse_release.rb} +1 -1
  198. data/lib/facter/resolvers/{sw_vers_resolver.rb → sw_vers.rb} +1 -1
  199. data/lib/facter/resolvers/{timezone_resolver.rb → timezone.rb} +1 -1
  200. data/lib/facter/resolvers/{uname_resolver.rb → uname.rb} +1 -1
  201. data/lib/facter/resolvers/{uptime_resolver.rb → uptime.rb} +1 -1
  202. data/lib/facter/resolvers/virt_what.rb +1 -1
  203. data/lib/facter/resolvers/vmware.rb +1 -1
  204. data/lib/facter/resolvers/windows/aio_agent_version.rb +1 -1
  205. data/lib/facter/resolvers/windows/{dmi_bios_resolver.rb → dmi_bios.rb} +1 -1
  206. data/lib/facter/resolvers/windows/{dmi_computersystem_resolver.rb → dmi_computersystem.rb} +1 -1
  207. data/lib/facter/resolvers/windows/ffi/network_utils.rb +1 -2
  208. data/lib/facter/resolvers/windows/{fips_resolver.rb → fips.rb} +1 -1
  209. data/lib/facter/resolvers/windows/{hardware_architecture_resolver.rb → hardware_architecture.rb} +1 -1
  210. data/lib/facter/resolvers/windows/{identity_resolver.rb → identity.rb} +1 -1
  211. data/lib/facter/resolvers/windows/{kernel_resolver.rb → kernel.rb} +1 -1
  212. data/lib/facter/resolvers/windows/{memory_resolver.rb → memory.rb} +1 -1
  213. data/lib/facter/resolvers/windows/{netkvm_resolver.rb → netkvm.rb} +1 -1
  214. data/lib/facter/resolvers/windows/{networking_resolver.rb → networking.rb} +19 -2
  215. data/lib/facter/resolvers/windows/{processors_resolver.rb → processors.rb} +1 -1
  216. data/lib/facter/resolvers/windows/{product_release_resolver.rb → product_release.rb} +1 -1
  217. data/lib/facter/resolvers/windows/ssh.rb +1 -1
  218. data/lib/facter/resolvers/windows/{system32_resolver.rb → system32.rb} +1 -1
  219. data/lib/facter/resolvers/windows/{uptime_resolver.rb → uptime.rb} +1 -1
  220. data/lib/facter/resolvers/windows/{virtualization_resolver.rb → virtualization.rb} +1 -1
  221. data/lib/facter/resolvers/windows/{win_os_description_resolver.rb → win_os_description.rb} +1 -1
  222. data/lib/facter/resolvers/{wpar_resolver.rb → wpar.rb} +1 -1
  223. data/lib/facter/resolvers/xen.rb +1 -1
  224. data/lib/facter/resolvers/zfs.rb +1 -1
  225. data/lib/facter/resolvers/zpool.rb +1 -1
  226. data/lib/facter/templates/man.erb +8 -0
  227. data/lib/facter/util/facts/facts_utils.rb +33 -0
  228. data/lib/facter/util/facts/unit_converter.rb +11 -4
  229. data/lib/facter/util/linux/dhcp.rb +86 -0
  230. data/lib/facter/util/linux/routing_table.rb +60 -0
  231. data/lib/facter/util/linux/socket_parser.rb +114 -0
  232. data/lib/facter/util/resolvers/ffi/hostname.rb +70 -0
  233. data/lib/facter/util/utils.rb +0 -4
  234. data/lib/facter/version.rb +1 -1
  235. metadata +124 -83
  236. data/lib/facter/facts/linux/cloud.rb +0 -15
  237. data/lib/facter/resolvers/cloud.rb +0 -39
  238. data/lib/facter/resolvers/networking_linux_resolver.rb +0 -258
  239. data/lib/facter/resolvers/redhat_release_resolver.rb +0 -55
  240. data/lib/facter/util/resolvers/networking.rb +0 -90
@@ -45,6 +45,7 @@ class OsDetector
45
45
  if hierarchy.empty?
46
46
  @log.debug("Could not detect hierarchy using os identifier: #{identifier} , trying with family")
47
47
 
48
+ # https://www.commandlinux.com/man-page/man5/os-release.5.html
48
49
  detect_family.to_s.split.each do |family|
49
50
  hierarchy = @os_hierarchy.construct_hierarchy(family)
50
51
  return hierarchy unless hierarchy.empty?
@@ -63,7 +64,14 @@ class OsDetector
63
64
  Facter::Resolvers::OsRelease.resolve(:id_like)
64
65
  end
65
66
 
67
+ def detect_based_on_release_file
68
+ @identifier = :devuan if File.readable?('/etc/devuan_version')
69
+ end
70
+
66
71
  def detect_distro
72
+ detect_based_on_release_file
73
+ return @identifier if @identifier
74
+
67
75
  [Facter::Resolvers::OsRelease,
68
76
  Facter::Resolvers::RedHatRelease,
69
77
  Facter::Resolvers::SuseRelease].each do |resolver|
@@ -60,7 +60,7 @@ module Facter
60
60
  def debug(msg)
61
61
  return unless debugging_active?
62
62
 
63
- if @@message_callback
63
+ if @@message_callback && Options[:allow_external_loggers]
64
64
  @@message_callback.call(:debug, msg)
65
65
  else
66
66
  msg = colorize(msg, CYAN) if Options[:color]
@@ -71,7 +71,7 @@ module Facter
71
71
  def info(msg)
72
72
  if msg.nil? || msg.empty?
73
73
  empty_message_error(msg)
74
- elsif @@message_callback
74
+ elsif @@message_callback && Options[:allow_external_loggers]
75
75
  @@message_callback.call(:info, msg)
76
76
  else
77
77
  msg = colorize(msg, GREEN) if Options[:color]
@@ -80,7 +80,7 @@ module Facter
80
80
  end
81
81
 
82
82
  def warn(msg)
83
- if @@message_callback
83
+ if @@message_callback && Options[:allow_external_loggers]
84
84
  @@message_callback.call(:warn, msg)
85
85
  else
86
86
  msg = colorize(msg, YELLOW) if Options[:color]
@@ -91,7 +91,7 @@ module Facter
91
91
  def error(msg, colorize = false)
92
92
  @@has_errors = true
93
93
 
94
- if @@message_callback
94
+ if @@message_callback && Options[:allow_external_loggers]
95
95
  @@message_callback.call(:error, msg)
96
96
  else
97
97
  msg = colorize(msg, RED) if colorize || Options[:color]
@@ -69,12 +69,19 @@ module Facter
69
69
  resolvable_fact_list = []
70
70
 
71
71
  loaded_fact_hash.each do |loaded_fact|
72
- query_fact = query_tokens[query_token_range].join('.')
73
-
74
- next unless found_fact?(loaded_fact.name, query_fact)
75
-
76
- searched_fact = construct_loaded_fact(query_tokens, query_token_range, loaded_fact)
77
- resolvable_fact_list << searched_fact
72
+ # return the fact if toplevel namespace is found in the first query token
73
+ # eg. query: 'os.name' and loaded_fact_hash contains a fact with 'os' name
74
+ # it will construt and return the 'os' fact
75
+ if loaded_fact.name == query_tokens[0]
76
+ resolvable_fact_list = [construct_loaded_fact(query_tokens, query_token_range, loaded_fact)]
77
+ else
78
+ query_fact = query_tokens[query_token_range].join('.')
79
+
80
+ next unless found_fact?(loaded_fact.name, query_fact)
81
+
82
+ searched_fact = construct_loaded_fact(query_tokens, query_token_range, loaded_fact)
83
+ resolvable_fact_list << searched_fact
84
+ end
78
85
  end
79
86
 
80
87
  @log.debug "List of resolvable facts: #{resolvable_fact_list.inspect}"
@@ -8,7 +8,7 @@ module Facter
8
8
  class << self
9
9
  private
10
10
 
11
- def post_resolve(fact_name)
11
+ def post_resolve(fact_name, _options)
12
12
  @fact_list.fetch(fact_name) { read_agent_version }
13
13
  end
14
14
 
@@ -9,7 +9,7 @@ module Facter
9
9
  class << self
10
10
  private
11
11
 
12
- def post_resolve(fact_name)
12
+ def post_resolve(fact_name, _options)
13
13
  @fact_list.fetch(fact_name) { read_architecture(fact_name) }
14
14
  end
15
15
 
@@ -9,7 +9,7 @@ module Facter
9
9
  class << self
10
10
  private
11
11
 
12
- def post_resolve(fact_name)
12
+ def post_resolve(fact_name, _options)
13
13
  @fact_list.fetch(fact_name) { execute_lspv(fact_name) }
14
14
  end
15
15
 
@@ -0,0 +1,63 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Facter
4
+ module Resolvers
5
+ module Aix
6
+ module FFI
7
+ RTM_IFINFO = 0xe
8
+ RTM_NEWADDR = 0xc
9
+
10
+ RTAX_DST = 0
11
+ RTAX_GATEWAY = 1
12
+ RTAX_NETMASK = 2
13
+ RTAX_GENMASK = 3
14
+ RTAX_IFP = 4
15
+ RTAX_IFA = 5
16
+ RTAX_AUTHOR = 6
17
+ RTAX_BRD = 7
18
+ RTAX_MAX = 8
19
+
20
+ RTA_DST = 0x1
21
+ RTA_GATEWAY = 0x2
22
+ RTA_NETMASK = 0x4
23
+ RTA_GENMASK = 0x8
24
+ RTA_IFP = 0x10
25
+ RTA_IFA = 0x20
26
+ RTA_AUTHOR = 0x40
27
+ RTA_BRD = 0x80
28
+ RTA_DOWNSTREAM = 0x100
29
+
30
+ AF_UNSPEC = 0
31
+ AF_INET = 2
32
+ AF_INET6 = 24
33
+ AF_MAX = 30
34
+
35
+ INET_ADDRSTRLEN = 16
36
+ INET6_ADDRSTRLEN = 46
37
+
38
+ RTAX_LIST = [
39
+ RTAX_DST,
40
+ RTAX_GATEWAY,
41
+ RTAX_NETMASK,
42
+ RTAX_GENMASK,
43
+ RTAX_IFP,
44
+ RTAX_IFA,
45
+ RTAX_AUTHOR,
46
+ RTAX_BRD
47
+ ].freeze
48
+
49
+ RTA_LIST = [
50
+ RTA_DST,
51
+ RTA_GATEWAY,
52
+ RTA_NETMASK,
53
+ RTA_GENMASK,
54
+ RTA_IFP,
55
+ RTA_IFA,
56
+ RTA_AUTHOR,
57
+ RTA_BRD,
58
+ RTA_DOWNSTREAM
59
+ ].freeze
60
+ end
61
+ end
62
+ end
63
+ end
@@ -1,34 +1,160 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'ffi'
4
-
4
+ require_relative 'structs'
5
+ require_relative 'ffi'
5
6
  module Facter
6
- module Aix
7
- module FfiHelper
8
- KINFO_GET_AVENRUN = 1
9
- KINFO_READ = 8 << 8
7
+ module Resolvers
8
+ module Aix
9
+ module FfiHelper
10
+ KINFO_GET_AVENRUN = 1
11
+ KINFO_READ = 8 << 8
12
+ KINFO_RT = 1 << 8
13
+ KINFO_RT_IFLIST = KINFO_RT | 3
10
14
 
11
- module Libc
12
- extend FFI::Library
15
+ module Libc
16
+ extend ::FFI::Library
13
17
 
14
- RTLD_LAZY = 0x00000004
15
- RTLD_GLOBAL = 0x00010000
16
- RTLD_MEMBER = 0x00040000
18
+ RTLD_LAZY = 0x00000004
19
+ RTLD_GLOBAL = 0x00010000
20
+ RTLD_MEMBER = 0x00040000
17
21
 
18
- @ffi_lib_flags = RTLD_LAZY | RTLD_GLOBAL | RTLD_MEMBER
19
- ffi_lib 'libc.a(shr.o)'
22
+ @ffi_lib_flags = RTLD_LAZY | RTLD_GLOBAL | RTLD_MEMBER
23
+ ffi_lib 'libc.a(shr.o)'
20
24
 
21
- attach_function :getkerninfo, %i[int pointer pointer int], :int
22
- end
25
+ attach_function :getkerninfo, %i[int pointer pointer int], :int
26
+ attach_function :inet_ntop, %i[int pointer pointer uint], :string
27
+ end
28
+
29
+ def self.read_load_averages
30
+ averages = ::FFI::MemoryPointer.new(:long_long, 3)
31
+ averages_size = ::FFI::MemoryPointer.new(:int, 1)
32
+ averages_size.write_int(averages.size)
33
+
34
+ return if Libc.getkerninfo(KINFO_READ | KINFO_GET_AVENRUN, averages, averages_size, 0).negative?
35
+
36
+ averages.read_array_of_long_long(3).map { |x| (x / 65_536.0).round(5) }
37
+ end
38
+
39
+ def self.read_interfaces
40
+ ksize = Libc.getkerninfo(KINFO_RT_IFLIST, nil, nil, 0)
41
+
42
+ log.debug('getkerninfo call was unsuccessful') if ksize.zero?
43
+
44
+ ksize_ptr = ::FFI::MemoryPointer.new(:int, ksize.size)
45
+ ksize_ptr.write_int(ksize)
46
+
47
+ result_ptr = ::FFI::MemoryPointer.new(:char, ksize)
48
+
49
+ res = Libc.getkerninfo(KINFO_RT_IFLIST, result_ptr, ksize_ptr, 0)
50
+ log.debug('getkerninfo call was unsuccessful') if res == -1
51
+
52
+ cursor = 0
53
+
54
+ interfaces = {}
55
+ while cursor < ksize_ptr.read_int
56
+ hdr = FFI::IfMsghdr.new(result_ptr + cursor)
57
+
58
+ case hdr[:ifm_type]
59
+ when FFI::RTM_IFINFO
60
+ link_addr = FFI::SockaddrDl.new(hdr.to_ptr + hdr.size)
61
+
62
+ interface_name = link_addr[:sdl_data].to_s[0, link_addr[:sdl_nlen]]
63
+ interfaces[interface_name] ||= {}
64
+
65
+ when FFI::RTM_NEWADDR
66
+ addresses = {}
67
+ addr_cursor = cursor + hdr.size
68
+ FFI::RTAX_LIST.each do |key|
69
+ xand = hdr[:ifm_addrs] & FFI::RTA_LIST[key]
70
+ next unless xand != 0
71
+
72
+ sockaddr = FFI::Sockaddr.new(result_ptr + addr_cursor)
73
+ addresses[key] = sockaddr
74
+ roundup_nr = roundup(sockaddr)
75
+ addr_cursor += roundup_nr
76
+ end
77
+
78
+ family = FFI::AF_UNSPEC
79
+
80
+ addresses.each do |_k, addr|
81
+ if family != FFI::AF_UNSPEC &&
82
+ addr[:sa_family] != FFI::AF_UNSPEC &&
83
+ family != addr[:sa_family]
84
+ family = FFI::AF_MAX
85
+ break
86
+ end
87
+ family = addr[:sa_family]
88
+ end
89
+
90
+ if addresses[FFI::RTAX_NETMASK][:sa_len]
91
+ addresses[FFI::RTAX_NETMASK][:sa_family] = family
92
+ netmask = address_to_string(addresses[FFI::RTAX_NETMASK])
93
+ end
94
+
95
+ address = address_to_string(addresses[FFI::RTAX_IFA]) if addresses[FFI::RTAX_IFA][:sa_len]
96
+
97
+ if addresses[FFI::RTAX_NETMASK][:sa_len] && addresses[FFI::RTAX_IFA][:sa_len]
98
+ network = address_to_string(addresses[FFI::RTAX_IFA], addresses[FFI::RTAX_NETMASK])
99
+ end
100
+
101
+ bindings = family == FFI::AF_INET ? :bindings : :bindings6
102
+ interfaces[interface_name][bindings] ||= []
103
+ interfaces[interface_name][bindings] << {
104
+ netmask: netmask.read_string,
105
+ address: address.read_string,
106
+ network: network.read_string
107
+ }
108
+ else
109
+ log.debug("got an unknown RT_IFLIST message: #{hdr[:ifm_type]}")
110
+ end
111
+
112
+ cursor += hdr[:ifm_msglen]
113
+ end
114
+
115
+ interfaces
116
+ end
117
+
118
+ def self.roundup(sockaddr)
119
+ if sockaddr[:sa_len].positive?
120
+ 1 + ((sockaddr[:sa_len] - 1) | (1.size - 1))
121
+ else
122
+ 1.size
123
+ end
124
+ end
125
+
126
+ def self.address_to_string(sockaddr, mask = nil)
127
+ if sockaddr[:sa_family] == FFI::AF_INET
128
+ in_addr_ip = FFI::SockaddrIn.new(sockaddr.to_ptr)
129
+
130
+ if mask && sockaddr[:sa_family] == mask[:sa_family]
131
+ in_addr_mask = FFI::SockaddrIn.new(mask.to_ptr)
132
+ in_addr_ip[:sin_addr][:s_addr] &= in_addr_mask[:sin_addr][:s_addr]
133
+ end
134
+
135
+ buffer = ::FFI::MemoryPointer.new(:char, FFI::INET_ADDRSTRLEN)
136
+ Libc.inet_ntop(FFI::AF_INET, in_addr_ip[:sin_addr].to_ptr, buffer, 16)
137
+
138
+ buffer
139
+ elsif sockaddr[:sa_family] == FFI::AF_INET6
140
+ in_addr_ip = FFI::SockaddrIn6.new(sockaddr.to_ptr)
141
+ if mask && sockaddr[:sa_family] == mask[:sa_family]
142
+ in_addr_mask = FFI::SockaddrIn6.new(sockaddr.to_ptr)
143
+ 16.times do |i|
144
+ in_addr_ip[:sin6_addr][:u6_addr8][i] &= in_addr_mask[:sin6_addr][:u6_addr8][i]
145
+ end
146
+ end
23
147
 
24
- def self.read_load_averages
25
- averages = FFI::MemoryPointer.new(:long_long, 3)
26
- averages_size = FFI::MemoryPointer.new(:int, 1)
27
- averages_size.write_int(averages.size)
148
+ buffer = ::FFI::MemoryPointer.new(:char, FFI::INET6_ADDRSTRLEN)
149
+ Libc.inet_ntop(FFI::AF_INET6, in_addr_ip[:sin6_addr].to_ptr, buffer, 16)
28
150
 
29
- return if Libc.getkerninfo(KINFO_READ | KINFO_GET_AVENRUN, averages, averages_size, 0).negative?
151
+ buffer
152
+ end
153
+ end
30
154
 
31
- averages.read_array_of_long_long(3).map { |x| (x / 65_536.0).round(5) }
155
+ def self.log
156
+ @log ||= Log.new(self)
157
+ end
32
158
  end
33
159
  end
34
160
  end
@@ -0,0 +1,69 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Facter
4
+ module Resolvers
5
+ module Aix
6
+ module FFI
7
+ class SockaddrDl < ::FFI::Struct
8
+ layout :sdl_len, :uchar,
9
+ :sdl_family, :uchar,
10
+ :sdl_index, :ushort,
11
+ :sdl_type, :uchar,
12
+ :sdl_nlen, :uchar,
13
+ :sdl_alen, :uchar,
14
+ :sdl_slen, :uchar,
15
+ :sdl_data, [:char, 120]
16
+ end
17
+
18
+ class IfMsghdr < ::FFI::Struct
19
+ layout :ifm_msglen, :ushort,
20
+ :ifm_version, :uchar,
21
+ :ifm_type, :uchar,
22
+ :ifm_addrs, :int,
23
+ :ifm_flags, :int,
24
+ :ifm_index, :ushort,
25
+ :ifm_addrlen, :uchar
26
+ end
27
+
28
+ class Sockaddr < ::FFI::Struct
29
+ layout :sa_len, :uchar,
30
+ :sa_family, :uchar,
31
+ :sa_data, [:char, 14]
32
+ end
33
+
34
+ class InAddr < ::FFI::Struct
35
+ layout :s_addr, :uint
36
+ end
37
+
38
+ class In6Addr < ::FFI::Struct
39
+ layout :u6_addr8, [:uchar, 16]
40
+ end
41
+
42
+ class SockaddrIn < ::FFI::Struct
43
+ layout :sin_len, :uchar,
44
+ :sin_family, :uchar,
45
+ :sin_port, :ushort,
46
+ :sin_addr, InAddr,
47
+ :sin_zero, [:uchar, 8]
48
+ end
49
+
50
+ class SockaddrIn6 < ::FFI::Struct
51
+ layout :sin6_len, :uchar,
52
+ :sin6_family, :uchar,
53
+ :sin6_port, :ushort,
54
+ :sin6_flowinfo, :uint,
55
+ :sin6_addr, In6Addr,
56
+ :sin6_scope_id, :uint
57
+ end
58
+
59
+ class SockaddrStorage < ::FFI::Struct
60
+ layout :ss_len, :uchar,
61
+ :ss_family, :uchar,
62
+ :ss_pad, [:char, 6],
63
+ :ss_align, :long_long,
64
+ :ss_pad2, [:char, 1264]
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
@@ -9,7 +9,7 @@ module Facter
9
9
  class << self
10
10
  private
11
11
 
12
- def post_resolve(fact_name)
12
+ def post_resolve(fact_name, _options)
13
13
  @fact_list.fetch(fact_name) { read_vtf_file(fact_name) }
14
14
  end
15
15
 
@@ -9,7 +9,7 @@ module Facter
9
9
  class << self
10
10
  private
11
11
 
12
- def post_resolve(fact_name)
12
+ def post_resolve(fact_name, _options)
13
13
  @fact_list.fetch(fact_name) { read_hardware(fact_name) }
14
14
  end
15
15