facter 4.0.30 → 4.0.35

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 (254) hide show
  1. checksums.yaml +4 -4
  2. data/lib/facter.rb +3 -4
  3. data/lib/facter/custom_facts/util/directory_loader.rb +10 -0
  4. data/lib/facter/custom_facts/util/parser.rb +3 -3
  5. data/lib/facter/facts/aix/disks.rb +17 -0
  6. data/lib/facter/facts/aix/memory/swap/available.rb +22 -0
  7. data/lib/facter/facts/aix/memory/swap/available_bytes.rb +22 -0
  8. data/lib/facter/facts/aix/memory/swap/capacity.rb +20 -0
  9. data/lib/facter/facts/aix/memory/swap/total.rb +22 -0
  10. data/lib/facter/facts/aix/memory/swap/total_bytes.rb +22 -0
  11. data/lib/facter/facts/aix/memory/swap/used.rb +21 -0
  12. data/lib/facter/facts/aix/memory/swap/used_bytes.rb +19 -0
  13. data/lib/facter/facts/aix/memory/system/available.rb +22 -0
  14. data/lib/facter/facts/aix/memory/system/available_bytes.rb +22 -0
  15. data/lib/facter/facts/aix/memory/system/capacity.rb +20 -0
  16. data/lib/facter/facts/aix/memory/system/total.rb +22 -0
  17. data/lib/facter/facts/aix/memory/system/total_bytes.rb +22 -0
  18. data/lib/facter/facts/aix/memory/system/used.rb +21 -0
  19. data/lib/facter/facts/aix/memory/system/used_bytes.rb +19 -0
  20. data/lib/facter/facts/aix/ssh.rb +3 -1
  21. data/lib/facter/facts/bsd/load_averages.rb +1 -1
  22. data/lib/facter/facts/freebsd/augeas/version.rb +19 -0
  23. data/lib/facter/facts/freebsd/dmi/bios/release_date.rb +19 -0
  24. data/lib/facter/facts/freebsd/dmi/bios/vendor.rb +19 -0
  25. data/lib/facter/facts/freebsd/dmi/bios/version.rb +19 -0
  26. data/lib/facter/facts/freebsd/dmi/manufacturer.rb +17 -0
  27. data/lib/facter/facts/freebsd/dmi/product/name.rb +19 -0
  28. data/lib/facter/facts/freebsd/dmi/product/serial_number.rb +19 -0
  29. data/lib/facter/facts/freebsd/dmi/product/uuid.rb +19 -0
  30. data/lib/facter/facts/freebsd/facterversion.rb +14 -0
  31. data/lib/facter/facts/freebsd/identity/gid.rb +16 -0
  32. data/lib/facter/facts/{solaris/solaris_zones/current.rb → freebsd/identity/group.rb} +6 -6
  33. data/lib/facter/facts/freebsd/identity/privileged.rb +16 -0
  34. data/lib/facter/facts/freebsd/identity/uid.rb +16 -0
  35. data/lib/facter/facts/freebsd/identity/user.rb +17 -0
  36. data/lib/facter/facts/freebsd/kernel.rb +14 -0
  37. data/lib/facter/facts/freebsd/kernelrelease.rb +14 -0
  38. data/lib/facter/facts/freebsd/memory/swap/available.rb +21 -0
  39. data/lib/facter/facts/freebsd/memory/swap/available_bytes.rb +20 -0
  40. data/lib/facter/facts/freebsd/memory/swap/capacity.rb +18 -0
  41. data/lib/facter/facts/freebsd/memory/swap/encrypted.rb +19 -0
  42. data/lib/facter/facts/freebsd/memory/swap/total.rb +21 -0
  43. data/lib/facter/facts/freebsd/memory/swap/total_bytes.rb +20 -0
  44. data/lib/facter/facts/freebsd/memory/swap/used.rb +20 -0
  45. data/lib/facter/facts/freebsd/memory/swap/used_bytes.rb +18 -0
  46. data/lib/facter/facts/freebsd/memory/system/available.rb +21 -0
  47. data/lib/facter/facts/freebsd/memory/system/available_bytes.rb +20 -0
  48. data/lib/facter/facts/freebsd/memory/system/capacity.rb +18 -0
  49. data/lib/facter/facts/freebsd/memory/system/total.rb +21 -0
  50. data/lib/facter/facts/freebsd/memory/system/total_bytes.rb +20 -0
  51. data/lib/facter/facts/freebsd/memory/system/used.rb +20 -0
  52. data/lib/facter/facts/freebsd/memory/system/used_bytes.rb +18 -0
  53. data/lib/facter/facts/freebsd/mountpoints.rb +21 -0
  54. data/lib/facter/facts/freebsd/netmask6_interfaces.rb +20 -0
  55. data/lib/facter/facts/freebsd/netmask_interfaces.rb +20 -0
  56. data/lib/facter/facts/freebsd/network6_interfaces.rb +20 -0
  57. data/lib/facter/facts/freebsd/network_interfaces.rb +20 -0
  58. data/lib/facter/facts/freebsd/networking/dhcp.rb +17 -0
  59. data/lib/facter/facts/freebsd/networking/domain.rb +18 -0
  60. data/lib/facter/facts/freebsd/networking/fqdn.rb +18 -0
  61. data/lib/facter/facts/freebsd/networking/hostname.rb +18 -0
  62. data/lib/facter/facts/freebsd/networking/interfaces.rb +17 -0
  63. data/lib/facter/facts/freebsd/networking/ip.rb +18 -0
  64. data/lib/facter/facts/freebsd/networking/ip6.rb +18 -0
  65. data/lib/facter/facts/freebsd/networking/mac.rb +18 -0
  66. data/lib/facter/facts/freebsd/networking/mtu.rb +17 -0
  67. data/lib/facter/facts/freebsd/networking/netmask.rb +18 -0
  68. data/lib/facter/facts/freebsd/networking/netmask6.rb +18 -0
  69. data/lib/facter/facts/freebsd/networking/network.rb +18 -0
  70. data/lib/facter/facts/freebsd/networking/network6.rb +18 -0
  71. data/lib/facter/facts/freebsd/networking/primary.rb +17 -0
  72. data/lib/facter/facts/freebsd/networking/scope6.rb +17 -0
  73. data/lib/facter/facts/freebsd/os/architecture.rb +18 -0
  74. data/lib/facter/facts/freebsd/os/hardware.rb +18 -0
  75. data/lib/facter/facts/freebsd/os/name.rb +18 -0
  76. data/lib/facter/facts/{bsd/bsd_example_fact.rb → freebsd/path.rb} +5 -4
  77. data/lib/facter/facts/freebsd/processors/isa.rb +17 -0
  78. data/lib/facter/facts/freebsd/puppet_version.rb +15 -0
  79. data/lib/facter/facts/freebsd/ruby/platform.rb +18 -0
  80. data/lib/facter/facts/freebsd/ruby/sitedir.rb +18 -0
  81. data/lib/facter/facts/freebsd/ruby/version.rb +18 -0
  82. data/lib/facter/facts/freebsd/ssh.rb +26 -0
  83. data/lib/facter/facts/freebsd/system_uptime/days.rb +18 -0
  84. data/lib/facter/facts/freebsd/system_uptime/hours.rb +18 -0
  85. data/lib/facter/facts/freebsd/system_uptime/seconds.rb +18 -0
  86. data/lib/facter/facts/freebsd/system_uptime/uptime.rb +18 -0
  87. data/lib/facter/facts/freebsd/timezone.rb +15 -0
  88. data/lib/facter/facts/freebsd/zfs_featurenumbers.rb +14 -0
  89. data/lib/facter/facts/freebsd/zfs_version.rb +14 -0
  90. data/lib/facter/facts/freebsd/zpool_featureflags.rb +14 -0
  91. data/lib/facter/facts/freebsd/zpool_featurenumbers.rb +14 -0
  92. data/lib/facter/facts/freebsd/zpool_version.rb +14 -0
  93. data/lib/facter/facts/linux/hypervisors/vmware.rb +2 -1
  94. data/lib/facter/facts/linux/mountpoints.rb +1 -1
  95. data/lib/facter/facts/linux/partitions.rb +1 -1
  96. data/lib/facter/facts/linux/ssh.rb +19 -9
  97. data/lib/facter/facts/linux/system_uptime/days.rb +7 -1
  98. data/lib/facter/facts/linux/system_uptime/hours.rb +7 -1
  99. data/lib/facter/facts/linux/system_uptime/seconds.rb +7 -1
  100. data/lib/facter/facts/linux/system_uptime/uptime.rb +7 -1
  101. data/lib/facter/facts/linux/virtual.rb +17 -0
  102. data/lib/facter/facts/macosx/dhcp_servers.rb +2 -2
  103. data/lib/facter/facts/macosx/interfaces.rb +1 -1
  104. data/lib/facter/facts/macosx/ipaddress6_interfaces.rb +1 -1
  105. data/lib/facter/facts/macosx/ipaddress_interfaces.rb +1 -1
  106. data/lib/facter/facts/macosx/macaddress_interfaces.rb +1 -1
  107. data/lib/facter/facts/macosx/mtu_interfaces.rb +1 -1
  108. data/lib/facter/facts/macosx/netmask6_interfaces.rb +1 -1
  109. data/lib/facter/facts/macosx/netmask_interfaces.rb +1 -1
  110. data/lib/facter/facts/macosx/network6_interfaces.rb +1 -1
  111. data/lib/facter/facts/macosx/network_interfaces.rb +1 -1
  112. data/lib/facter/facts/macosx/networking/dhcp.rb +1 -1
  113. data/lib/facter/facts/macosx/networking/interfaces.rb +1 -1
  114. data/lib/facter/facts/macosx/networking/ip.rb +1 -1
  115. data/lib/facter/facts/macosx/networking/ip6.rb +1 -1
  116. data/lib/facter/facts/macosx/networking/mac.rb +1 -1
  117. data/lib/facter/facts/macosx/networking/mtu.rb +1 -1
  118. data/lib/facter/facts/macosx/networking/netmask.rb +1 -1
  119. data/lib/facter/facts/macosx/networking/netmask6.rb +1 -1
  120. data/lib/facter/facts/macosx/networking/network.rb +1 -1
  121. data/lib/facter/facts/macosx/networking/network6.rb +1 -1
  122. data/lib/facter/facts/macosx/networking/primary.rb +1 -1
  123. data/lib/facter/facts/macosx/networking/scope6.rb +1 -1
  124. data/lib/facter/facts/macosx/scope6_interfaces.rb +2 -2
  125. data/lib/facter/facts/macosx/ssh.rb +19 -11
  126. data/lib/facter/facts/macosx/system_profiler/hardware_uuid.rb +1 -1
  127. data/lib/facter/facts/macosx/system_profiler/l2_cache_per_core.rb +1 -1
  128. data/lib/facter/facts/macosx/system_profiler/memory.rb +1 -1
  129. data/lib/facter/facts/macosx/system_profiler/processor_name.rb +1 -1
  130. data/lib/facter/facts/macosx/system_profiler/processors.rb +1 -1
  131. data/lib/facter/facts/macosx/virtual.rb +1 -1
  132. data/lib/facter/facts/solaris/current_zone.rb +16 -0
  133. data/lib/facter/facts/solaris/disks.rb +14 -0
  134. data/lib/facter/facts/solaris/dmi/bios/release_date.rb +24 -0
  135. data/lib/facter/facts/solaris/dmi/bios/vendor.rb +24 -0
  136. data/lib/facter/facts/solaris/dmi/bios/version.rb +24 -0
  137. data/lib/facter/facts/solaris/dmi/chassis/asset_tag.rb +24 -0
  138. data/lib/facter/facts/solaris/dmi/chassis/type.rb +24 -0
  139. data/lib/facter/facts/solaris/dmi/manufacturer.rb +25 -0
  140. data/lib/facter/facts/solaris/dmi/product/name.rb +27 -0
  141. data/lib/facter/facts/solaris/dmi/product/serial_number.rb +27 -0
  142. data/lib/facter/facts/solaris/dmi/product/uuid.rb +24 -0
  143. data/lib/facter/facts/solaris/load_averages.rb +14 -0
  144. data/lib/facter/facts/solaris/memory/swap/available.rb +22 -0
  145. data/lib/facter/facts/solaris/memory/swap/available_bytes.rb +22 -0
  146. data/lib/facter/facts/solaris/memory/swap/capacity.rb +20 -0
  147. data/lib/facter/facts/solaris/memory/swap/total.rb +22 -0
  148. data/lib/facter/facts/solaris/memory/swap/total_bytes.rb +22 -0
  149. data/lib/facter/facts/solaris/memory/swap/used.rb +21 -0
  150. data/lib/facter/facts/solaris/memory/swap/used_bytes.rb +19 -0
  151. data/lib/facter/facts/solaris/memory/system/available.rb +22 -0
  152. data/lib/facter/facts/solaris/memory/system/available_bytes.rb +22 -0
  153. data/lib/facter/facts/solaris/memory/system/capacity.rb +20 -0
  154. data/lib/facter/facts/solaris/memory/system/total.rb +22 -0
  155. data/lib/facter/facts/solaris/memory/system/total_bytes.rb +22 -0
  156. data/lib/facter/facts/solaris/memory/system/used.rb +21 -0
  157. data/lib/facter/facts/solaris/memory/system/used_bytes.rb +19 -0
  158. data/lib/facter/facts/solaris/mountpoints.rb +1 -1
  159. data/lib/facter/facts/solaris/os/release.rb +3 -3
  160. data/lib/facter/facts/solaris/ssh.rb +19 -9
  161. data/lib/facter/facts/solaris/zfs_featurenumbers.rb +1 -1
  162. data/lib/facter/facts/solaris/zfs_version.rb +1 -1
  163. data/lib/facter/facts/solaris/zones.rb +60 -0
  164. data/lib/facter/facts/solaris/zpool_featureflags.rb +1 -1
  165. data/lib/facter/facts/solaris/zpool_featurenumbers.rb +1 -1
  166. data/lib/facter/facts/solaris/zpool_version.rb +1 -1
  167. data/lib/facter/facts/windows/dhcp_servers.rb +2 -2
  168. data/lib/facter/facts/windows/interfaces.rb +1 -1
  169. data/lib/facter/facts/windows/ipaddress6_interfaces.rb +1 -1
  170. data/lib/facter/facts/windows/ipaddress_interfaces.rb +1 -1
  171. data/lib/facter/facts/windows/macaddress_interfaces.rb +1 -1
  172. data/lib/facter/facts/windows/mtu_interfaces.rb +1 -1
  173. data/lib/facter/facts/windows/netmask6_interfaces.rb +1 -1
  174. data/lib/facter/facts/windows/netmask_interfaces.rb +1 -1
  175. data/lib/facter/facts/windows/network6_interfaces.rb +1 -1
  176. data/lib/facter/facts/windows/network_interfaces.rb +1 -1
  177. data/lib/facter/facts/windows/networking/dhcp.rb +1 -1
  178. data/lib/facter/facts/windows/networking/domain.rb +1 -1
  179. data/lib/facter/facts/windows/networking/fqdn.rb +1 -1
  180. data/lib/facter/facts/windows/networking/interfaces.rb +1 -1
  181. data/lib/facter/facts/windows/networking/ip.rb +1 -1
  182. data/lib/facter/facts/windows/networking/ip6.rb +1 -1
  183. data/lib/facter/facts/windows/networking/mac.rb +1 -1
  184. data/lib/facter/facts/windows/networking/mtu.rb +1 -1
  185. data/lib/facter/facts/windows/networking/netmask.rb +1 -1
  186. data/lib/facter/facts/windows/networking/netmask6.rb +1 -1
  187. data/lib/facter/facts/windows/networking/network.rb +1 -1
  188. data/lib/facter/facts/windows/networking/network6.rb +1 -1
  189. data/lib/facter/facts/windows/networking/primary.rb +1 -1
  190. data/lib/facter/facts/windows/networking/scope6.rb +1 -1
  191. data/lib/facter/facts/windows/scope6_interfaces.rb +1 -1
  192. data/lib/facter/framework/cli/cli.rb +35 -6
  193. data/lib/facter/framework/config/fact_groups.rb +13 -0
  194. data/lib/facter/framework/core/fact/internal/internal_fact_manager.rb +1 -1
  195. data/lib/facter/framework/core/fact_loaders/fact_loader.rb +2 -0
  196. data/lib/facter/framework/core/options.rb +1 -0
  197. data/lib/facter/framework/core/options/option_store.rb +3 -6
  198. data/lib/facter/framework/detector/os_detector.rb +5 -1
  199. data/lib/facter/framework/logging/logger.rb +13 -5
  200. data/lib/facter/os_hierarchy.json +6 -7
  201. data/lib/facter/resolvers/aix/disks.rb +63 -0
  202. data/lib/facter/resolvers/aix/memory.rb +65 -0
  203. data/lib/facter/resolvers/aix/partitions.rb +9 -20
  204. data/lib/facter/resolvers/aix/utils/info_extractor.rb +20 -0
  205. data/lib/facter/resolvers/augeas_resolver.rb +19 -2
  206. data/lib/facter/resolvers/base_resolver.rb +1 -1
  207. data/lib/facter/resolvers/bsd/ffi/ffi_helper.rb +0 -10
  208. data/lib/facter/resolvers/ec2.rb +2 -2
  209. data/lib/facter/resolvers/filesystems_resolver.rb +1 -1
  210. data/lib/facter/resolvers/freebsd/dmi_resolver.rb +38 -0
  211. data/lib/facter/resolvers/freebsd/ffi/ffi_helper.rb +19 -0
  212. data/lib/facter/resolvers/freebsd/swap_memory_resolver.rb +39 -0
  213. data/lib/facter/resolvers/freebsd/system_memory_resolver.rb +41 -0
  214. data/lib/facter/resolvers/linux/docker_uptime.rb +45 -0
  215. data/lib/facter/resolvers/{load_averages_resolver.rb → linux/load_averages.rb} +0 -1
  216. data/lib/facter/resolvers/load_averages.rb +26 -0
  217. data/lib/facter/resolvers/lspci.rb +2 -0
  218. data/lib/facter/resolvers/mountpoints_resolver.rb +42 -44
  219. data/lib/facter/resolvers/networking_linux_resolver.rb +16 -1
  220. data/lib/facter/resolvers/networking_resolver.rb +106 -0
  221. data/lib/facter/resolvers/os_release_resolver.rb +1 -1
  222. data/lib/facter/resolvers/redhat_release_resolver.rb +4 -3
  223. data/lib/facter/resolvers/solaris/disks.rb +51 -0
  224. data/lib/facter/resolvers/solaris/dmi.rb +57 -0
  225. data/lib/facter/resolvers/solaris/dmi_sparc.rb +47 -0
  226. data/lib/facter/resolvers/solaris/ffi/ffi.rb +5 -0
  227. data/lib/facter/resolvers/solaris/{filesystems_resolver.rb → filesystems.rb} +0 -0
  228. data/lib/facter/resolvers/solaris/{ipaddress_resolver.rb → ipaddress.rb} +0 -0
  229. data/lib/facter/resolvers/solaris/memory.rb +93 -0
  230. data/lib/facter/resolvers/solaris/{networking_resolver.rb → networking.rb} +2 -6
  231. data/lib/facter/resolvers/solaris/os_release.rb +44 -0
  232. data/lib/facter/resolvers/solaris/zone.rb +51 -0
  233. data/lib/facter/resolvers/solaris/zone_name.rb +31 -0
  234. data/lib/facter/resolvers/uptime_resolver.rb +1 -27
  235. data/lib/facter/resolvers/utils/ffi/load_averages.rb +27 -0
  236. data/lib/facter/resolvers/utils/networking.rb +2 -0
  237. data/lib/facter/resolvers/utils/uptime_helper.rb +32 -0
  238. data/lib/facter/resolvers/windows/ffi/ffi.rb +1 -1
  239. data/lib/facter/resolvers/windows/networking_resolver.rb +100 -100
  240. data/lib/facter/resolvers/zfs.rb +32 -0
  241. data/lib/facter/resolvers/zpool.rb +34 -0
  242. data/lib/facter/templates/man.erb +122 -0
  243. data/lib/facter/version.rb +1 -1
  244. metadata +140 -18
  245. data/lib/facter/facts/freebsd/solaris_zones/current.rb +0 -15
  246. data/lib/facter/facts/freebsd/solaris_zones/zone.rb +0 -15
  247. data/lib/facter/facts/solaris/solaris_zones/zone.rb +0 -62
  248. data/lib/facter/resolvers/bsd/load_averages_resolver.rb +0 -26
  249. data/lib/facter/resolvers/macosx/networking_resolver.rb +0 -108
  250. data/lib/facter/resolvers/solaris/solaris_os_release_resolver.rb +0 -42
  251. data/lib/facter/resolvers/solaris/solaris_zone_name.rb +0 -28
  252. data/lib/facter/resolvers/solaris/zfs_resolver.rb +0 -34
  253. data/lib/facter/resolvers/solaris/zone_resolver.rb +0 -48
  254. data/lib/facter/resolvers/solaris/zpool_resolver.rb +0 -36
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Facter
4
+ module Resolvers
5
+ module Solaris
6
+ class DmiSparc < BaseResolver
7
+ @semaphore = Mutex.new
8
+ @fact_list ||= {}
9
+
10
+ class << self
11
+ private
12
+
13
+ def post_resolve(fact_name)
14
+ @fact_list.fetch(fact_name) { read_facts(fact_name) }
15
+ end
16
+
17
+ def read_facts(fact_name)
18
+ output = exec_prtdiag
19
+ return unless output
20
+
21
+ matches = output.match(/System Configuration:\s+(.+?)\s+sun\d+\S+\s+(.+)/)&.captures
22
+
23
+ @fact_list[:manufacturer] = matches[0]&.strip
24
+ @fact_list[:product_name] = matches[1]&.strip
25
+
26
+ sneep = exec_sneep&.strip
27
+ @fact_list[:serial_number] = sneep
28
+
29
+ @fact_list[fact_name]
30
+ end
31
+
32
+ def exec_prtdiag
33
+ return unless File.executable?('/usr/sbin/prtdiag')
34
+
35
+ Facter::Core::Execution.execute('/usr/sbin/prtdiag', logger: log)
36
+ end
37
+
38
+ def exec_sneep
39
+ return unless File.executable?('/usr/sbin/sneep')
40
+
41
+ Facter::Core::Execution.execute('/usr/sbin/sneep', logger: log)
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -20,6 +20,11 @@ module Facter
20
20
  INET_ADDRSTRLEN = 16
21
21
  INET6_ADDRSTRLEN = 46
22
22
  end
23
+
24
+ BINDINGS_KEY = {
25
+ FFI::AF_INET => :bindings,
26
+ FFI::AF_INET6 => :bindings6
27
+ }.freeze
23
28
  end
24
29
  end
25
30
  end
@@ -0,0 +1,93 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Facter
4
+ module Resolvers
5
+ module Solaris
6
+ class Memory < BaseResolver
7
+ BLOCKSIZE = 512
8
+ # :system
9
+ # :swap
10
+ @semaphore = Mutex.new
11
+ @fact_list ||= {}
12
+ class << self
13
+ private
14
+
15
+ def post_resolve(fact_name)
16
+ @fact_list.fetch(fact_name) { calculate_memory(fact_name) }
17
+ end
18
+
19
+ def calculate_memory(fact_name)
20
+ @fact_list = { system: sys, swap: swap }
21
+
22
+ @fact_list[fact_name]
23
+ end
24
+
25
+ def sys
26
+ sys = {}
27
+ output = Facter::Core::Execution.execute('/usr/bin/kstat -m unix -n system_pages', logger: log).strip
28
+ total, free = parse_sys_output(output)
29
+
30
+ return unless total || free
31
+
32
+ sys[:total_bytes] = total
33
+ sys[:available_bytes] = free
34
+ sys[:used_bytes] = total - free
35
+ sys[:capacity] = FilesystemHelper.compute_capacity(total - free, total)
36
+
37
+ sys
38
+ end
39
+
40
+ def swap
41
+ swap_hash = {}
42
+ output = Facter::Core::Execution.execute('/usr/sbin/swap -l', logger: log).strip
43
+ total, free = parse_swap_output(output)
44
+
45
+ swap_hash[:total_bytes] = total
46
+ swap_hash[:available_bytes] = free
47
+ swap_hash[:used_bytes] = total - free
48
+ swap_hash[:capacity] = FilesystemHelper.compute_capacity(total - free, total)
49
+
50
+ swap_hash if total != 0
51
+ end
52
+
53
+ def parse_sys_output(output)
54
+ kstats = output.scan(/(physmem|pagesfree)\s+(\d+)/)
55
+ kstats = kstats.to_h
56
+ return unless kstats['physmem'] || kstats['pagesfree']
57
+ return unless pagesize != 0
58
+
59
+ total = kstats['physmem'].to_i * pagesize
60
+ free = kstats['pagesfree'].to_i * pagesize
61
+
62
+ [total, free]
63
+ end
64
+
65
+ def parse_swap_output(output)
66
+ total = 0
67
+ free = 0
68
+
69
+ output.each_line do |line|
70
+ swap_sizes = line.match(/(\d+)\s+(\d+)$/)
71
+ next if swap_sizes.nil?
72
+
73
+ total += swap_sizes[1].to_i
74
+ free += swap_sizes[2].to_i
75
+ end
76
+ total *= BLOCKSIZE
77
+ free *= BLOCKSIZE
78
+
79
+ [total, free]
80
+ end
81
+
82
+ def pagesize
83
+ unless @fact_list[:pagesize]
84
+ @fact_list[:pagesize] = Facter::Core::Execution.execute('pagesize', logger: log).strip.to_i
85
+ log.debug("Pagesize: #{@fact_list[:pagesize]}")
86
+ end
87
+ @fact_list[:pagesize]
88
+ end
89
+ end
90
+ end
91
+ end
92
+ end
93
+ end
@@ -12,11 +12,6 @@ module Facter
12
12
  @fact_list ||= {}
13
13
  @interfaces = {}
14
14
 
15
- BINDINGS_KEY = {
16
- FFI::AF_INET => :bindings,
17
- FFI::AF_INET6 => :bindings6
18
- }.freeze
19
-
20
15
  class << self
21
16
  private
22
17
 
@@ -141,7 +136,8 @@ module Facter
141
136
  end
142
137
 
143
138
  def add_dhcp(interface_name)
144
- result = Facter::Core::Execution.execute("dhcpinfo -i #{interface_name} ServerID", logger: log)
139
+ dhcpinfo_command = Facter::Core::Execution.which('dhcpinfo') || '/sbin/dhcpinfo'
140
+ result = Facter::Core::Execution.execute("#{dhcpinfo_command} -i #{interface_name} ServerID", logger: log)
145
141
 
146
142
  @interfaces[interface_name][:dhcp] = result.chomp
147
143
  end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Facter
4
+ module Resolvers
5
+ module Solaris
6
+ class OsRelease < BaseResolver
7
+ @semaphore = Mutex.new
8
+ @fact_list ||= {}
9
+ @os_version_regex_patterns = ['Solaris \d+ \d+/\d+ s(\d+)[sx]?_u(\d+)wos_',
10
+ 'Solaris (\d+)[.](\d+)', 'Solaris (\d+)']
11
+ class << self
12
+ private
13
+
14
+ def post_resolve(fact_name)
15
+ @fact_list.fetch(fact_name) { build_release_facts(fact_name) }
16
+ end
17
+
18
+ def build_release_facts(fact_name)
19
+ result = Util::FileHelper.safe_read('/etc/release', nil)
20
+ return @fact_list[fact_name] = nil if result.nil?
21
+
22
+ @os_version_regex_patterns.each do |os_version_regex|
23
+ major, minor = search_for_os_version(/#{os_version_regex}/, result)
24
+ next unless major || minor
25
+
26
+ @fact_list[:major] = major
27
+ @fact_list[:minor] = minor
28
+ @fact_list[:full] = major == '10' ? major + '_u' + minor : major + '.' + minor
29
+ break
30
+ end
31
+ @fact_list[fact_name]
32
+ end
33
+
34
+ def search_for_os_version(regex_pattern, text)
35
+ result = text.match(regex_pattern)
36
+ major, minor = result.captures if result
37
+ minor = regex_pattern == /Solaris (\d+)/ ? '0' : minor
38
+ return [major, minor] if major && minor
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Facter
4
+ module Resolvers
5
+ module Solaris
6
+ class Zone < BaseResolver
7
+ @semaphore = Mutex.new
8
+ @fact_list ||= {}
9
+
10
+ class << self
11
+ private
12
+
13
+ def post_resolve(fact_name)
14
+ @fact_list.fetch(fact_name) { build_zone_fact(fact_name) }
15
+ end
16
+
17
+ def build_zone_fact(fact_name)
18
+ command = '/usr/sbin/zoneadm list -cp'
19
+ zone_adm_output = Facter::Core::Execution.execute(command, logger: log)
20
+
21
+ if zone_adm_output.empty?
22
+ log.debug("Command #{command} returned an empty result")
23
+ return
24
+ end
25
+ @fact_list[:zone] = create_zone_facts(zone_adm_output)
26
+
27
+ @fact_list[fact_name]
28
+ end
29
+
30
+ def create_zone_facts(zones_result)
31
+ zones_fact = []
32
+ zones_result.each_line do |zone_line|
33
+ id, name, status, path, uuid, brand, ip_type = zone_line.split(':')
34
+ zones_fact << {
35
+ brand: brand,
36
+ id: id,
37
+ iptype: ip_type.chomp,
38
+ name: name,
39
+ uuid: uuid,
40
+ status: status,
41
+ path: path
42
+
43
+ }
44
+ end
45
+ zones_fact
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Facter
4
+ module Resolvers
5
+ module Solaris
6
+ class ZoneName < BaseResolver
7
+ @semaphore = Mutex.new
8
+ @fact_list ||= {}
9
+
10
+ class << self
11
+ private
12
+
13
+ def post_resolve(fact_name)
14
+ @fact_list.fetch(fact_name) { build_current_zone_name_fact(fact_name) }
15
+ end
16
+
17
+ def build_current_zone_name_fact(fact_name)
18
+ zone_name_output = Facter::Core::Execution.execute('/bin/zonename', logger: log)
19
+
20
+ if zone_name_output.empty?
21
+ log.debug("Command #{command} returned an empty result")
22
+ return
23
+ end
24
+ @fact_list[:current_zone_name] = zone_name_output.chomp
25
+ @fact_list[fact_name]
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -23,33 +23,7 @@ module Facter
23
23
  def build_fact_list(seconds)
24
24
  return @fact_list[:uptime] = 'unknown' unless seconds
25
25
 
26
- uptime_hash = create_uptime_hash(seconds)
27
-
28
- @fact_list[:seconds] = uptime_hash[:seconds]
29
- @fact_list[:hours] = uptime_hash[:hours]
30
- @fact_list[:days] = uptime_hash[:days]
31
- @fact_list[:uptime] = uptime_hash[:uptime]
32
- end
33
-
34
- def create_uptime_hash(seconds)
35
- results = {}
36
- minutes = (seconds / 60) % 60
37
-
38
- results[:seconds] = seconds
39
- results[:hours] = seconds / (60 * 60)
40
- results[:days] = results[:hours] / 24
41
- results[:uptime] = build_uptime_text(results[:days], results[:hours], minutes)
42
-
43
- results
44
- end
45
-
46
- def build_uptime_text(days, hours, minutes)
47
- case days
48
- when 0 then "#{hours}:#{format('%<minutes>02d', minutes: minutes)} hours"
49
- when 1 then '1 day'
50
- else
51
- "#{days} days"
52
- end
26
+ @fact_list = Utils::UptimeHelper.create_uptime_hash(seconds)
53
27
  end
54
28
  end
55
29
  end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'ffi'
4
+
5
+ module Facter
6
+ module Resolvers
7
+ module Utils
8
+ module Ffi
9
+ module LoadAverages
10
+ extend ::FFI::Library
11
+ ffi_lib ::FFI::Library::LIBC
12
+
13
+ attach_function :getloadavg, %i[pointer int], :int
14
+
15
+ def self.read_load_averages
16
+ raw_loadavg = ::FFI::MemoryPointer.new(:double, 3)
17
+
18
+ res = LoadAverages.getloadavg(raw_loadavg, 3)
19
+ return unless res == 3
20
+
21
+ raw_loadavg.read_array_of_double(res)
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'ipaddr'
4
+
3
5
  module Resolvers
4
6
  module Utils
5
7
  module Networking
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Facter
4
+ module Resolvers
5
+ module Utils
6
+ module UptimeHelper
7
+ class << self
8
+ def create_uptime_hash(seconds)
9
+ results = {}
10
+ minutes = (seconds / 60) % 60
11
+
12
+ results[:seconds] = seconds
13
+ results[:hours] = seconds / (60 * 60)
14
+ results[:days] = results[:hours] / 24
15
+ results[:uptime] = build_uptime_text(results[:days], results[:hours], minutes)
16
+
17
+ results
18
+ end
19
+
20
+ def build_uptime_text(days, hours, minutes)
21
+ case days
22
+ when 0 then "#{hours}:#{format('%<minutes>02d', minutes: minutes)} hours"
23
+ when 1 then '1 day'
24
+ else
25
+ "#{days} days"
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -30,7 +30,7 @@ module FFI
30
30
  def read_wide_string_with_length(char_length)
31
31
  # char_length is number of wide chars (typically excluding NULLs), *not* bytes
32
32
  str = get_bytes(0, char_length * 2).force_encoding('UTF-16LE')
33
- str.encode('UTF-8', str.encoding, {})
33
+ str.encode('UTF-8', str.encoding)
34
34
  end
35
35
 
36
36
  def read_wide_string_without_length
@@ -1,134 +1,134 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'ipaddr'
4
-
5
3
  module Facter
6
4
  module Resolvers
7
- class Networking < BaseResolver
8
- @log = Facter::Log.new(self)
9
- @semaphore = Mutex.new
10
- @fact_list ||= {}
11
- class << self
12
- private
13
-
14
- def post_resolve(fact_name)
15
- @fact_list.fetch(fact_name) { read_network_information(fact_name) }
16
- end
17
-
18
- def read_network_information(fact_name)
19
- require 'facter/resolvers/windows/ffi/networking_ffi'
5
+ module Windows
6
+ class Networking < BaseResolver
7
+ @log = Facter::Log.new(self)
8
+ @semaphore = Mutex.new
9
+ @fact_list ||= {}
10
+ class << self
11
+ private
12
+
13
+ def post_resolve(fact_name)
14
+ @fact_list.fetch(fact_name) { read_network_information(fact_name) }
15
+ end
20
16
 
21
- size_ptr = FFI::MemoryPointer.new(NetworkingFFI::BUFFER_LENGTH)
22
- adapter_addresses = FFI::MemoryPointer.new(IpAdapterAddressesLh.size, NetworkingFFI::BUFFER_LENGTH)
23
- flags = NetworkingFFI::GAA_FLAG_SKIP_ANYCAST |
24
- NetworkingFFI::GAA_FLAG_SKIP_MULTICAST | NetworkingFFI::GAA_FLAG_SKIP_DNS_SERVER
17
+ def read_network_information(fact_name)
18
+ require 'facter/resolvers/windows/ffi/networking_ffi'
25
19
 
26
- return unless (adapter_addresses = get_adapter_addresses(size_ptr, adapter_addresses, flags))
20
+ size_ptr = FFI::MemoryPointer.new(NetworkingFFI::BUFFER_LENGTH)
21
+ adapter_addresses = FFI::MemoryPointer.new(IpAdapterAddressesLh.size, NetworkingFFI::BUFFER_LENGTH)
22
+ flags = NetworkingFFI::GAA_FLAG_SKIP_ANYCAST |
23
+ NetworkingFFI::GAA_FLAG_SKIP_MULTICAST | NetworkingFFI::GAA_FLAG_SKIP_DNS_SERVER
27
24
 
28
- iterate_list(adapter_addresses)
25
+ return unless (adapter_addresses = get_adapter_addresses(size_ptr, adapter_addresses, flags))
29
26
 
30
- ::Resolvers::Utils::Networking.expand_main_bindings(@fact_list)
27
+ iterate_list(adapter_addresses)
31
28
 
32
- @fact_list[fact_name]
33
- end
29
+ ::Resolvers::Utils::Networking.expand_main_bindings(@fact_list)
34
30
 
35
- def get_adapter_addresses(size_ptr, adapter_addresses, flags)
36
- error = nil
37
- 3.times do
38
- error = NetworkingFFI::GetAdaptersAddresses(NetworkingFFI::AF_UNSPEC, flags,
39
- FFI::Pointer::NULL, adapter_addresses, size_ptr)
40
- break if error == NetworkingFFI::ERROR_SUCCES
41
-
42
- if error == NetworkingFFI::ERROR_BUFFER_OVERFLOW
43
- adapter_addresses = FFI::MemoryPointer.new(IpAdapterAddressesLh.size, NetworkingFFI::BUFFER_LENGTH)
44
- else
45
- @log.debug 'Unable to retrieve networking facts!'
46
- return nil
47
- end
31
+ @fact_list[fact_name]
48
32
  end
49
- return nil unless error.zero?
50
33
 
51
- adapter_addresses
52
- end
34
+ def get_adapter_addresses(size_ptr, adapter_addresses, flags)
35
+ error = nil
36
+ 3.times do
37
+ error = NetworkingFFI::GetAdaptersAddresses(NetworkingFFI::AF_UNSPEC, flags,
38
+ FFI::Pointer::NULL, adapter_addresses, size_ptr)
39
+ break if error == NetworkingFFI::ERROR_SUCCES
40
+
41
+ if error == NetworkingFFI::ERROR_BUFFER_OVERFLOW
42
+ adapter_addresses = FFI::MemoryPointer.new(IpAdapterAddressesLh.size, NetworkingFFI::BUFFER_LENGTH)
43
+ else
44
+ @log.debug 'Unable to retrieve networking facts!'
45
+ return nil
46
+ end
47
+ end
48
+ return nil unless error.zero?
53
49
 
54
- def adapter_down?(adapter)
55
- adapter[:OperStatus] != NetworkingFFI::IF_OPER_STATUS_UP ||
56
- ![NetworkingFFI::IF_TYPE_ETHERNET_CSMACD, NetworkingFFI::IF_TYPE_IEEE80211].include?(adapter[:IfType])
57
- end
50
+ adapter_addresses
51
+ end
58
52
 
59
- def retrieve_dhcp_server(adapter)
60
- if !(adapter[:Flags] & NetworkingFFI::IP_ADAPTER_DHCP_ENABLED).zero? &&
61
- adapter[:Union][:Struct][:Length] >= IpAdapterAddressesLh.size
62
- NetworkUtils.address_to_string(adapter[:Dhcpv4Server])
53
+ def adapter_down?(adapter)
54
+ adapter[:OperStatus] != NetworkingFFI::IF_OPER_STATUS_UP ||
55
+ ![NetworkingFFI::IF_TYPE_ETHERNET_CSMACD, NetworkingFFI::IF_TYPE_IEEE80211].include?(adapter[:IfType])
63
56
  end
64
- end
65
57
 
66
- def iterate_list(adapter_addresses)
67
- net_interface = {}
68
- IpAdapterAddressesLh.read_list(adapter_addresses) do |adapter_address|
69
- if adapter_down?(adapter_address)
70
- adapter_address = IpAdapterAddressesLh.new(adapter_address[:Next])
71
- next
58
+ def retrieve_dhcp_server(adapter)
59
+ if !(adapter[:Flags] & NetworkingFFI::IP_ADAPTER_DHCP_ENABLED).zero? &&
60
+ adapter[:Union][:Struct][:Length] >= IpAdapterAddressesLh.size
61
+ NetworkUtils.address_to_string(adapter[:Dhcpv4Server])
72
62
  end
73
- @fact_list[:domain] ||= adapter_address[:DnsSuffix].read_wide_string_without_length
74
- name = adapter_address[:FriendlyName].read_wide_string_without_length
75
- net_interface[name] = build_interface_info(adapter_address, name)
76
63
  end
77
64
 
78
- @fact_list[:interfaces] = net_interface unless net_interface.empty?
79
- end
65
+ def iterate_list(adapter_addresses)
66
+ net_interface = {}
67
+ IpAdapterAddressesLh.read_list(adapter_addresses) do |adapter_address|
68
+ if adapter_down?(adapter_address)
69
+ adapter_address = IpAdapterAddressesLh.new(adapter_address[:Next])
70
+ next
71
+ end
72
+ @fact_list[:domain] ||= adapter_address[:DnsSuffix].read_wide_string_without_length
73
+ name = adapter_address[:FriendlyName].read_wide_string_without_length
74
+ net_interface[name] = build_interface_info(adapter_address, name)
75
+ end
80
76
 
81
- def build_interface_info(adapter_address, name)
82
- hash = {}
77
+ @fact_list[:interfaces] = net_interface unless net_interface.empty?
78
+ end
83
79
 
84
- hash[:dhcp] = retrieve_dhcp_server(adapter_address)
85
- hash[:mtu] = adapter_address[:Mtu]
80
+ def build_interface_info(adapter_address, name)
81
+ hash = {}
86
82
 
87
- bindings = find_ip_addresses(adapter_address[:FirstUnicastAddress], name)
88
- hash[:bindings] = bindings[:ipv4] unless bindings[:ipv4].empty?
89
- hash[:bindings6] = bindings[:ipv6] unless bindings[:ipv6].empty?
90
- hash[:mac] = NetworkUtils.find_mac_address(adapter_address)
91
- hash
92
- end
83
+ hash[:dhcp] = retrieve_dhcp_server(adapter_address)
84
+ hash[:mtu] = adapter_address[:Mtu]
93
85
 
94
- def find_ip_addresses(unicast_addresses, name)
95
- bindings = {}
96
- bindings[:ipv6] = []
97
- bindings[:ipv4] = []
86
+ bindings = find_ip_addresses(adapter_address[:FirstUnicastAddress], name)
87
+ hash[:bindings] = bindings[:ipv4] unless bindings[:ipv4].empty?
88
+ hash[:bindings6] = bindings[:ipv6] unless bindings[:ipv6].empty?
89
+ hash[:mac] = NetworkUtils.find_mac_address(adapter_address)
90
+ hash
91
+ end
98
92
 
99
- IpAdapterUnicastAddressLH.read_list(unicast_addresses) do |unicast|
100
- addr = NetworkUtils.address_to_string(unicast[:Address])
101
- unless addr
102
- unicast = IpAdapterUnicastAddressLH.new(unicast[:Next])
103
- next
93
+ def find_ip_addresses(unicast_addresses, name)
94
+ bindings = {}
95
+ bindings[:ipv6] = []
96
+ bindings[:ipv4] = []
97
+
98
+ IpAdapterUnicastAddressLH.read_list(unicast_addresses) do |unicast|
99
+ addr = NetworkUtils.address_to_string(unicast[:Address])
100
+ unless addr
101
+ unicast = IpAdapterUnicastAddressLH.new(unicast[:Next])
102
+ next
103
+ end
104
+
105
+ sock_addr = SockAddr.new(unicast[:Address][:lpSockaddr])
106
+ add_ip_data(addr, unicast, sock_addr, bindings)
107
+ find_primary_interface(sock_addr, name, addr)
104
108
  end
105
-
106
- sock_addr = SockAddr.new(unicast[:Address][:lpSockaddr])
107
- add_ip_data(addr, unicast, sock_addr, bindings)
108
- find_primary_interface(sock_addr, name, addr)
109
+ bindings
109
110
  end
110
- bindings
111
- end
112
111
 
113
- def add_ip_data(addr, unicast, sock_addr, bindings)
114
- result = find_bindings(sock_addr, unicast, addr)
115
- return unless result
112
+ def add_ip_data(addr, unicast, sock_addr, bindings)
113
+ result = find_bindings(sock_addr, unicast, addr)
114
+ return unless result
116
115
 
117
- bindings[:ipv6] << result if sock_addr[:sa_family] == NetworkingFFI::AF_INET6
118
- bindings[:ipv4] << result if sock_addr[:sa_family] == NetworkingFFI::AF_INET
119
- end
116
+ bindings[:ipv6] << result if sock_addr[:sa_family] == NetworkingFFI::AF_INET6
117
+ bindings[:ipv4] << result if sock_addr[:sa_family] == NetworkingFFI::AF_INET
118
+ end
120
119
 
121
- def find_bindings(sock_addr, unicast, addr)
122
- return unless [NetworkingFFI::AF_INET, NetworkingFFI::AF_INET6].include?(sock_addr[:sa_family])
120
+ def find_bindings(sock_addr, unicast, addr)
121
+ return unless [NetworkingFFI::AF_INET, NetworkingFFI::AF_INET6].include?(sock_addr[:sa_family])
123
122
 
124
- ::Resolvers::Utils::Networking.build_binding(addr, unicast[:OnLinkPrefixLength])
125
- end
123
+ ::Resolvers::Utils::Networking.build_binding(addr, unicast[:OnLinkPrefixLength])
124
+ end
126
125
 
127
- def find_primary_interface(sock_addr, name, addr)
128
- if !@fact_list[:primary_interface] &&
129
- ([NetworkingFFI::AF_INET, NetworkingFFI::AF_INET6].include?(sock_addr[:sa_family]) &&
130
- !::Resolvers::Utils::Networking.ignored_ip_address(addr))
131
- @fact_list[:primary_interface] = name.to_s
126
+ def find_primary_interface(sock_addr, name, addr)
127
+ if !@fact_list[:primary_interface] &&
128
+ ([NetworkingFFI::AF_INET, NetworkingFFI::AF_INET6].include?(sock_addr[:sa_family]) &&
129
+ !::Resolvers::Utils::Networking.ignored_ip_address(addr))
130
+ @fact_list[:primary_interface] = name.to_s
131
+ end
132
132
  end
133
133
  end
134
134
  end