facter 4.0.49 → 4.0.50

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 (143) hide show
  1. checksums.yaml +4 -4
  2. data/lib/facter/config.rb +20 -7
  3. data/lib/facter/custom_facts/core/execution/base.rb +3 -2
  4. data/lib/facter/custom_facts/core/execution/popen3.rb +47 -0
  5. data/lib/facter/custom_facts/util/fact.rb +2 -2
  6. data/lib/facter/facts/alpine/os/release.rb +29 -0
  7. data/lib/facter/facts/amzn/os/release.rb +29 -0
  8. data/lib/facter/facts/devuan/os/distro/release.rb +36 -0
  9. data/lib/facter/facts/devuan/os/release.rb +29 -0
  10. data/lib/facter/facts/gentoo/os/release.rb +29 -0
  11. data/lib/facter/facts/linuxmint/os/name.rb +18 -0
  12. data/lib/facter/facts/linuxmint/os/release.rb +35 -0
  13. data/lib/facter/facts/mageia/os/release.rb +36 -0
  14. data/lib/facter/facts/meego/os/release.rb +29 -0
  15. data/lib/facter/facts/oel/os/release.rb +29 -0
  16. data/lib/facter/facts/ol/os/release.rb +29 -0
  17. data/lib/facter/facts/openwrt/os/release.rb +35 -0
  18. data/lib/facter/facts/ovs/os/release.rb +29 -0
  19. data/lib/facter/facts/photon/os/release.rb +45 -0
  20. data/lib/facter/facts/rhel/os/release.rb +1 -8
  21. data/lib/facter/facts/slackware/os/release.rb +35 -0
  22. data/lib/facter/framework/config/config_reader.rb +7 -0
  23. data/lib/facter/framework/config/fact_groups.rb +3 -0
  24. data/lib/facter/framework/core/fact_loaders/external_fact_loader.rb +0 -4
  25. data/lib/facter/framework/core/fact_loaders/fact_loader.rb +2 -0
  26. data/lib/facter/framework/detector/os_detector.rb +7 -0
  27. data/lib/facter/resolvers/aio_agent_version.rb +1 -1
  28. data/lib/facter/resolvers/aix/architecture.rb +1 -1
  29. data/lib/facter/resolvers/aix/disks.rb +1 -1
  30. data/lib/facter/resolvers/aix/ffi/ffi.rb +63 -0
  31. data/lib/facter/resolvers/aix/ffi/ffi_helper.rb +146 -20
  32. data/lib/facter/resolvers/aix/ffi/structs.rb +69 -0
  33. data/lib/facter/resolvers/aix/filesystem.rb +1 -1
  34. data/lib/facter/resolvers/aix/hardware.rb +1 -1
  35. data/lib/facter/resolvers/aix/load_averages.rb +2 -2
  36. data/lib/facter/resolvers/aix/memory.rb +1 -1
  37. data/lib/facter/resolvers/aix/mountpoints.rb +1 -1
  38. data/lib/facter/resolvers/aix/networking.rb +9 -16
  39. data/lib/facter/resolvers/aix/nim.rb +1 -1
  40. data/lib/facter/resolvers/aix/os_level.rb +1 -1
  41. data/lib/facter/resolvers/aix/partitions.rb +1 -1
  42. data/lib/facter/resolvers/aix/processors.rb +1 -1
  43. data/lib/facter/resolvers/aix/serialnumber.rb +1 -1
  44. data/lib/facter/resolvers/augeas.rb +1 -1
  45. data/lib/facter/resolvers/base_resolver.rb +4 -4
  46. data/lib/facter/resolvers/bsd/processors.rb +1 -1
  47. data/lib/facter/resolvers/cloud.rb +1 -1
  48. data/lib/facter/resolvers/containers.rb +1 -1
  49. data/lib/facter/resolvers/debian_version.rb +1 -1
  50. data/lib/facter/resolvers/disk.rb +1 -1
  51. data/lib/facter/resolvers/dmi.rb +1 -1
  52. data/lib/facter/resolvers/dmi_decode.rb +1 -1
  53. data/lib/facter/resolvers/ec2.rb +1 -1
  54. data/lib/facter/resolvers/eos_release.rb +1 -1
  55. data/lib/facter/resolvers/facterversion.rb +1 -1
  56. data/lib/facter/resolvers/filesystems.rb +1 -1
  57. data/lib/facter/resolvers/fips_enabled.rb +1 -1
  58. data/lib/facter/resolvers/freebsd/dmi.rb +1 -1
  59. data/lib/facter/resolvers/freebsd/freebsd_version.rb +1 -1
  60. data/lib/facter/resolvers/freebsd/geom.rb +1 -1
  61. data/lib/facter/resolvers/freebsd/processors.rb +1 -1
  62. data/lib/facter/resolvers/freebsd/swap_memory.rb +1 -1
  63. data/lib/facter/resolvers/freebsd/system_memory.rb +1 -1
  64. data/lib/facter/resolvers/freebsd/virtual.rb +1 -1
  65. data/lib/facter/resolvers/gce.rb +1 -1
  66. data/lib/facter/resolvers/hostname.rb +1 -1
  67. data/lib/facter/resolvers/identity.rb +1 -1
  68. data/lib/facter/resolvers/linux/docker_uptime.rb +1 -1
  69. data/lib/facter/resolvers/linux/load_averages.rb +1 -1
  70. data/lib/facter/resolvers/load_averages.rb +1 -1
  71. data/lib/facter/resolvers/lpar.rb +1 -1
  72. data/lib/facter/resolvers/lsb_release.rb +1 -1
  73. data/lib/facter/resolvers/lspci.rb +1 -1
  74. data/lib/facter/resolvers/macosx/dmi.rb +1 -1
  75. data/lib/facter/resolvers/macosx/filesystems.rb +1 -1
  76. data/lib/facter/resolvers/macosx/load_averages.rb +1 -1
  77. data/lib/facter/resolvers/macosx/mountpoints.rb +1 -1
  78. data/lib/facter/resolvers/macosx/processor.rb +1 -1
  79. data/lib/facter/resolvers/macosx/swap_memory.rb +1 -1
  80. data/lib/facter/resolvers/macosx/system_memory.rb +1 -1
  81. data/lib/facter/resolvers/macosx/system_profiler.rb +1 -1
  82. data/lib/facter/resolvers/memory.rb +1 -1
  83. data/lib/facter/resolvers/mountpoints.rb +1 -1
  84. data/lib/facter/resolvers/networking.rb +1 -1
  85. data/lib/facter/resolvers/networking_linux.rb +1 -1
  86. data/lib/facter/resolvers/open_vz.rb +1 -1
  87. data/lib/facter/resolvers/os_release.rb +1 -1
  88. data/lib/facter/resolvers/partitions.rb +1 -1
  89. data/lib/facter/resolvers/path.rb +1 -1
  90. data/lib/facter/resolvers/processors.rb +1 -1
  91. data/lib/facter/resolvers/redhat_release.rb +1 -1
  92. data/lib/facter/resolvers/release_from_first_line.rb +41 -0
  93. data/lib/facter/resolvers/ruby.rb +1 -1
  94. data/lib/facter/resolvers/selinux.rb +1 -1
  95. data/lib/facter/resolvers/solaris/disks.rb +1 -1
  96. data/lib/facter/resolvers/solaris/dmi.rb +1 -1
  97. data/lib/facter/resolvers/solaris/dmi_sparc.rb +1 -1
  98. data/lib/facter/resolvers/solaris/filesystems.rb +1 -1
  99. data/lib/facter/resolvers/solaris/ipaddress.rb +1 -1
  100. data/lib/facter/resolvers/solaris/ldom.rb +1 -1
  101. data/lib/facter/resolvers/solaris/memory.rb +1 -1
  102. data/lib/facter/resolvers/solaris/mountpoints.rb +1 -1
  103. data/lib/facter/resolvers/solaris/networking.rb +1 -1
  104. data/lib/facter/resolvers/solaris/os_release.rb +1 -1
  105. data/lib/facter/resolvers/solaris/processors.rb +1 -1
  106. data/lib/facter/resolvers/solaris/zone.rb +1 -1
  107. data/lib/facter/resolvers/solaris/zone_name.rb +1 -1
  108. data/lib/facter/resolvers/specific_release_file.rb +35 -0
  109. data/lib/facter/resolvers/ssh.rb +1 -1
  110. data/lib/facter/resolvers/suse_release.rb +1 -1
  111. data/lib/facter/resolvers/sw_vers.rb +1 -1
  112. data/lib/facter/resolvers/timezone.rb +1 -1
  113. data/lib/facter/resolvers/uname.rb +1 -1
  114. data/lib/facter/resolvers/uptime.rb +1 -1
  115. data/lib/facter/resolvers/virt_what.rb +1 -1
  116. data/lib/facter/resolvers/vmware.rb +1 -1
  117. data/lib/facter/resolvers/windows/aio_agent_version.rb +1 -1
  118. data/lib/facter/resolvers/windows/dmi_bios.rb +1 -1
  119. data/lib/facter/resolvers/windows/dmi_computersystem.rb +1 -1
  120. data/lib/facter/resolvers/windows/ffi/network_utils.rb +1 -2
  121. data/lib/facter/resolvers/windows/fips.rb +1 -1
  122. data/lib/facter/resolvers/windows/hardware_architecture.rb +1 -1
  123. data/lib/facter/resolvers/windows/identity.rb +1 -1
  124. data/lib/facter/resolvers/windows/kernel.rb +1 -1
  125. data/lib/facter/resolvers/windows/memory.rb +1 -1
  126. data/lib/facter/resolvers/windows/netkvm.rb +1 -1
  127. data/lib/facter/resolvers/windows/networking.rb +8 -4
  128. data/lib/facter/resolvers/windows/processors.rb +1 -1
  129. data/lib/facter/resolvers/windows/product_release.rb +1 -1
  130. data/lib/facter/resolvers/windows/ssh.rb +1 -1
  131. data/lib/facter/resolvers/windows/system32.rb +1 -1
  132. data/lib/facter/resolvers/windows/uptime.rb +1 -1
  133. data/lib/facter/resolvers/windows/virtualization.rb +1 -1
  134. data/lib/facter/resolvers/windows/win_os_description.rb +1 -1
  135. data/lib/facter/resolvers/wpar.rb +1 -1
  136. data/lib/facter/resolvers/xen.rb +1 -1
  137. data/lib/facter/resolvers/zfs.rb +1 -1
  138. data/lib/facter/resolvers/zpool.rb +1 -1
  139. data/lib/facter/util/facts/facts_utils.rb +17 -0
  140. data/lib/facter/util/facts/unit_converter.rb +11 -4
  141. data/lib/facter/util/utils.rb +0 -4
  142. data/lib/facter/version.rb +1 -1
  143. metadata +22 -2
@@ -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) { collect_kstat_info(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) { build_zone_fact(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) { build_current_zone_name_fact(fact_name) }
14
14
  end
15
15
 
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Facter
4
+ module Resolvers
5
+ class SpecificReleaseFile < BaseResolver
6
+ # :release
7
+
8
+ init_resolver
9
+
10
+ class << self
11
+ private
12
+
13
+ def post_resolve(fact_name, options)
14
+ @fact_list.fetch(fact_name) { read_release_file(fact_name, options) }
15
+ end
16
+
17
+ def read_release_file(fact_name, options)
18
+ release_file = options[:release_file]
19
+ return unless release_file
20
+
21
+ output = Facter::Util::FileHelper.safe_read(release_file, nil)
22
+ return @fact_list[fact_name] = nil if output.nil?
23
+
24
+ if options[:regex]
25
+ @fact_list[:release] = output.strip =~ /#{options[:regex]}/ ? Regexp.last_match : nil
26
+ return @fact_list[fact_name]
27
+ end
28
+
29
+ @fact_list[:release] = output.strip
30
+ @fact_list[fact_name]
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -13,7 +13,7 @@ module Facter
13
13
  class << self
14
14
  private
15
15
 
16
- def post_resolve(fact_name)
16
+ def post_resolve(fact_name, _options)
17
17
  @fact_list.fetch(fact_name) { retrieve_info(fact_name) }
18
18
  end
19
19
 
@@ -12,7 +12,7 @@ module Facter
12
12
  class << self
13
13
  private
14
14
 
15
- def post_resolve(fact_name)
15
+ def post_resolve(fact_name, _options)
16
16
  @fact_list.fetch(fact_name) { read_suse_release(fact_name) }
17
17
  end
18
18
 
@@ -12,7 +12,7 @@ module Facter
12
12
  class << self
13
13
  private
14
14
 
15
- def post_resolve(fact_name)
15
+ def post_resolve(fact_name, _options)
16
16
  @fact_list.fetch(fact_name) { software_version_system_call(fact_name) }
17
17
  end
18
18
 
@@ -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) { determine_timezone }
13
13
  end
14
14
 
@@ -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) { uname_system_call(fact_name) }
13
13
  end
14
14
 
@@ -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) { uptime_system_call(fact_name) }
13
13
  end
14
14
 
@@ -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) { retrieve_from_virt_what(fact_name) }
13
13
  end
14
14
 
@@ -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) { vmware_command(fact_name) }
13
13
  end
14
14
 
@@ -10,7 +10,7 @@ module Facter
10
10
  class << self
11
11
  private
12
12
 
13
- def post_resolve(fact_name)
13
+ def post_resolve(fact_name, _options)
14
14
  @fact_list.fetch(fact_name) { read_version(fact_name) }
15
15
  end
16
16
 
@@ -12,7 +12,7 @@ module Facter
12
12
 
13
13
  private
14
14
 
15
- def post_resolve(fact_name)
15
+ def post_resolve(fact_name, _options)
16
16
  @fact_list.fetch(fact_name) { read_fact_from_bios(fact_name) }
17
17
  end
18
18
 
@@ -12,7 +12,7 @@ module Facter
12
12
 
13
13
  private
14
14
 
15
- def post_resolve(fact_name)
15
+ def post_resolve(fact_name, _options)
16
16
  @fact_list.fetch(fact_name) { read_fact_from_computer_system(fact_name) }
17
17
  end
18
18
 
@@ -31,8 +31,7 @@ class NetworkUtils
31
31
 
32
32
  def find_mac_address(adapter)
33
33
  adapter[:PhysicalAddress].first(adapter[:PhysicalAddressLength])
34
- .map { |e| format('%<mac_address>02x', mac_address: e.to_i) }
35
- .join(':').upcase
34
+ .map { |e| format('%<mac_address>02x', mac_address: e.to_i) }.join(':').upcase
36
35
  end
37
36
  end
38
37
  end
@@ -12,7 +12,7 @@ module Facter
12
12
  class << self
13
13
  private
14
14
 
15
- def post_resolve(fact_name)
15
+ def post_resolve(fact_name, _options)
16
16
  @fact_list.fetch(fact_name) { read_fact_from_registry(fact_name) }
17
17
  end
18
18
 
@@ -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_hardware_information(fact_name) }
13
13
  end
14
14
 
@@ -11,7 +11,7 @@ module Facter
11
11
  class << self
12
12
  private
13
13
 
14
- def post_resolve(fact_name)
14
+ def post_resolve(fact_name, _options)
15
15
  @fact_list.fetch(fact_name) { retrieve_facts(fact_name) }
16
16
  end
17
17
 
@@ -10,7 +10,7 @@ module Facter
10
10
  class << self
11
11
  private
12
12
 
13
- def post_resolve(fact_name)
13
+ def post_resolve(fact_name, _options)
14
14
  @fact_list.fetch(fact_name) { read_os_version_information(fact_name) }
15
15
  end
16
16
 
@@ -10,7 +10,7 @@ module Facter
10
10
  class << self
11
11
  private
12
12
 
13
- def post_resolve(fact_name)
13
+ def post_resolve(fact_name, _options)
14
14
  @fact_list.fetch(fact_name) { validate_info(fact_name) }
15
15
  end
16
16
 
@@ -10,7 +10,7 @@ module Facter
10
10
  class << self
11
11
  private
12
12
 
13
- def post_resolve(fact_name)
13
+ def post_resolve(fact_name, _options)
14
14
  @fact_list.fetch(fact_name) { read_fact_from_registry(fact_name) }
15
15
  end
16
16
 
@@ -10,7 +10,7 @@ module Facter
10
10
  class << self
11
11
  private
12
12
 
13
- def post_resolve(fact_name)
13
+ def post_resolve(fact_name, _options)
14
14
  @fact_list.fetch(fact_name) { read_network_information(fact_name) }
15
15
  end
16
16
 
@@ -24,12 +24,12 @@ module Facter
24
24
 
25
25
  return unless (adapter_addresses = get_adapter_addresses(size_ptr, adapter_addresses, flags))
26
26
 
27
+ retrieve_domain_from_registry
28
+
27
29
  iterate_list(adapter_addresses)
28
30
 
29
31
  Facter::Util::Resolvers::Networking.expand_main_bindings(@fact_list)
30
32
 
31
- retrieve_domain_from_registry if !@fact_list[:domain] || @fact_list[:domain].empty?
32
-
33
33
  @fact_list[fact_name]
34
34
  end
35
35
 
@@ -71,7 +71,11 @@ module Facter
71
71
  adapter_address = IpAdapterAddressesLh.new(adapter_address[:Next])
72
72
  next
73
73
  end
74
- @fact_list[:domain] ||= adapter_address[:DnsSuffix].read_wide_string_without_length
74
+
75
+ if !@fact_list[:domain] || @fact_list[:domain].empty?
76
+ @fact_list[:domain] = adapter_address[:DnsSuffix].read_wide_string_without_length
77
+ end
78
+
75
79
  name = adapter_address[:FriendlyName].read_wide_string_without_length
76
80
  net_interface[name] = build_interface_info(adapter_address, name)
77
81
  end
@@ -13,7 +13,7 @@ module Facter
13
13
 
14
14
  private
15
15
 
16
- def post_resolve(fact_name)
16
+ def post_resolve(fact_name, _options)
17
17
  @fact_list.fetch(fact_name) { read_fact_from_win32_processor(fact_name) }
18
18
  end
19
19
 
@@ -10,7 +10,7 @@ module Facter
10
10
  class << self
11
11
  private
12
12
 
13
- def post_resolve(fact_name)
13
+ def post_resolve(fact_name, _options)
14
14
  @fact_list.fetch(fact_name) { read_fact_from_registry(fact_name) }
15
15
  end
16
16
 
@@ -13,7 +13,7 @@ module Facter
13
13
  class << self
14
14
  private
15
15
 
16
- def post_resolve(fact_name)
16
+ def post_resolve(fact_name, _options)
17
17
  @fact_list.fetch(fact_name) { retrieve_info(fact_name) }
18
18
  end
19
19
 
@@ -10,7 +10,7 @@ module Facter
10
10
  class << self
11
11
  private
12
12
 
13
- def post_resolve(fact_name)
13
+ def post_resolve(fact_name, _options)
14
14
  @fact_list.fetch(fact_name) { retrieve_windows_binaries_path }
15
15
  end
16
16
 
@@ -13,7 +13,7 @@ module Facter
13
13
  class << self
14
14
  private
15
15
 
16
- def post_resolve(fact_name)
16
+ def post_resolve(fact_name, _options)
17
17
  @fact_list.fetch(fact_name) { calculate_system_uptime(fact_name) }
18
18
  end
19
19
 
@@ -16,7 +16,7 @@ module Facter
16
16
 
17
17
  private
18
18
 
19
- def post_resolve(fact_name)
19
+ def post_resolve(fact_name, _options)
20
20
  @fact_list.fetch(fact_name) { read_fact_from_computer_system(fact_name) }
21
21
  end
22
22
 
@@ -10,7 +10,7 @@ module Facter
10
10
  class << self
11
11
  private
12
12
 
13
- def post_resolve(fact_name)
13
+ def post_resolve(fact_name, _options)
14
14
  @fact_list.fetch(fact_name) { read_from_ole(fact_name) }
15
15
  end
16
16
 
@@ -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_wpar(fact_name) }
13
13
  end
14
14
 
@@ -12,7 +12,7 @@ module Facter
12
12
  class << self
13
13
  private
14
14
 
15
- def post_resolve(fact_name)
15
+ def post_resolve(fact_name, _options)
16
16
  @fact_list.fetch(fact_name) { detect_xen(fact_name) }
17
17
  end
18
18
 
@@ -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) { zfs_fact(fact_name) }
13
13
  end
14
14
 
@@ -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) { zpool_fact(fact_name) }
13
13
  end
14
14
 
@@ -24,6 +24,23 @@ module Facter
24
24
  FAMILY_HASH.each { |key, array_value| return key if array_value.any? { |os_flavour| os =~ /#{os_flavour}/i } }
25
25
  os
26
26
  end
27
+
28
+ def release_hash_from_string(output)
29
+ return unless output
30
+
31
+ versions = output.split('.')
32
+ {}.tap do |release|
33
+ release['full'] = output
34
+ release['major'] = versions[0]
35
+ release['minor'] = versions[1] if versions[1]
36
+ end
37
+ end
38
+
39
+ def release_hash_from_matchdata(data)
40
+ return if data.nil? || data[1].nil?
41
+
42
+ release_hash_from_string(data[1].to_s)
43
+ end
27
44
  end
28
45
  end
29
46
  end
@@ -17,10 +17,9 @@ module Facter
17
17
  speed = speed.to_i
18
18
  return if !speed || speed.zero?
19
19
 
20
- prefix = { 3 => 'k', 6 => 'M', 9 => 'G', 12 => 'T' }
21
- power = Math.log10(speed).floor
22
- validated_speed = power.zero? ? speed.to_f : speed.fdiv(10**power)
23
- format('%<displayed_speed>.2f', displayed_speed: validated_speed).to_s + ' ' + prefix[power] + 'Hz'
20
+ validated_speed, metric_prefix = determine_metric_prefix(speed)
21
+
22
+ format('%<displayed_speed>.2f', displayed_speed: validated_speed).to_s + ' ' + metric_prefix + 'Hz'
24
23
  end
25
24
 
26
25
  def bytes_to_human_readable(bytes)
@@ -54,6 +53,14 @@ module Facter
54
53
  converted_number = bytes if multiple == 'bytes'
55
54
  [converted_number, multiple]
56
55
  end
56
+
57
+ def determine_metric_prefix(num)
58
+ metric_prefix = { 0 => '', 3 => 'k', 6 => 'M', 9 => 'G', 12 => 'T' }
59
+ power = Math.log10(num).floor
60
+ display_exponent = power - power % 3
61
+ coefficient = power.zero? ? num.to_f : num.fdiv(10**display_exponent)
62
+ [coefficient, metric_prefix[display_exponent]]
63
+ end
57
64
  end
58
65
  end
59
66
  end