facter 4.5.1 → 4.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/bin/facter +1 -1
- data/lib/docs/generate.rb +1 -6
- data/lib/facter/custom_facts/core/directed_graph.rb +2 -4
- data/lib/facter/custom_facts/core/execution/base.rb +1 -1
- data/lib/facter/custom_facts/core/execution/posix.rb +6 -2
- data/lib/facter/custom_facts/core/execution/windows.rb +4 -1
- data/lib/facter/custom_facts/core/execution.rb +1 -1
- data/lib/facter/custom_facts/core/file_loader.rb +0 -4
- data/lib/facter/custom_facts/core/suitable.rb +1 -1
- data/lib/facter/custom_facts/util/collection.rb +2 -4
- data/lib/facter/custom_facts/util/confine.rb +4 -1
- data/lib/facter/custom_facts/util/fact.rb +1 -1
- data/lib/facter/custom_facts/util/loader.rb +2 -2
- data/lib/facter/custom_facts/util/resolution.rb +8 -4
- data/lib/facter/custom_facts/util/values.rb +1 -1
- data/lib/facter/facts/amzn/os/distro/release.rb +6 -1
- data/lib/facter/facts/amzn/os/release.rb +5 -0
- data/lib/facter/facts/linux/dmi/product/version.rb +19 -0
- data/lib/facter/facts/linux/kernelmajversion.rb +1 -1
- data/lib/facter/facts/macosx/is_virtual.rb +1 -1
- data/lib/facter/facts/macosx/virtual.rb +3 -3
- data/lib/facter/facts/mariner/os/release.rb +1 -1
- data/lib/facter/facts/photon/os/release.rb +1 -1
- data/lib/facter/facts/solaris/kernelmajversion.rb +1 -1
- data/lib/facter/facts/solaris/ldom.rb +1 -1
- data/lib/facter/facts/windows/hypervisors/kvm.rb +1 -1
- data/lib/facter/facts/windows/interfaces.rb +1 -1
- data/lib/facter/framework/benchmarking/timer.rb +2 -2
- data/lib/facter/framework/cli/cli.rb +6 -8
- data/lib/facter/framework/cli/cli_launcher.rb +1 -1
- data/lib/facter/framework/config/fact_groups.rb +1 -1
- data/lib/facter/framework/core/cache_manager.rb +5 -6
- data/lib/facter/framework/core/fact_loaders/class_discoverer.rb +4 -3
- data/lib/facter/framework/core/fact_loaders/fact_loader.rb +1 -3
- data/lib/facter/framework/core/fact_manager.rb +4 -4
- data/lib/facter/framework/core/file_loader.rb +736 -733
- data/lib/facter/framework/core/options/config_file_options.rb +4 -6
- data/lib/facter/framework/formatters/hocon_fact_formatter.rb +3 -2
- data/lib/facter/framework/formatters/legacy_fact_formatter.rb +4 -4
- data/lib/facter/framework/logging/logger.rb +6 -6
- data/lib/facter/framework/logging/logger_helper.rb +10 -11
- data/lib/facter/framework/parsers/query_parser.rb +24 -20
- data/lib/facter/resolvers/aix/disks.rb +1 -1
- data/lib/facter/resolvers/aix/ffi/ffi_helper.rb +1 -1
- data/lib/facter/resolvers/aix/networking.rb +1 -1
- data/lib/facter/resolvers/aix/partitions.rb +2 -2
- data/lib/facter/resolvers/aix/serialnumber.rb +1 -1
- data/lib/facter/resolvers/amzn/os_release_rpm.rb +40 -0
- data/lib/facter/resolvers/dmi.rb +2 -1
- data/lib/facter/resolvers/fips_enabled.rb +1 -1
- data/lib/facter/resolvers/freebsd/dmi.rb +1 -1
- data/lib/facter/resolvers/freebsd/swap_memory.rb +1 -1
- data/lib/facter/resolvers/freebsd/system_memory.rb +15 -7
- data/lib/facter/resolvers/freebsd/virtual.rb +1 -1
- data/lib/facter/resolvers/linux/hostname.rb +1 -1
- data/lib/facter/resolvers/macosx/dmi.rb +1 -1
- data/lib/facter/resolvers/macosx/filesystems.rb +1 -1
- data/lib/facter/resolvers/memory.rb +1 -1
- data/lib/facter/resolvers/networking.rb +3 -3
- data/lib/facter/resolvers/os_release.rb +1 -1
- data/lib/facter/resolvers/partitions.rb +2 -2
- data/lib/facter/resolvers/processors_lscpu.rb +2 -2
- data/lib/facter/resolvers/solaris/ffi/ffi.rb +2 -2
- data/lib/facter/resolvers/solaris/ffi/functions.rb +2 -2
- data/lib/facter/resolvers/solaris/mountpoints.rb +1 -1
- data/lib/facter/resolvers/solaris/networking.rb +2 -2
- data/lib/facter/resolvers/solaris/os_release.rb +2 -2
- data/lib/facter/resolvers/uname.rb +10 -6
- data/lib/facter/resolvers/virt_what.rb +2 -1
- data/lib/facter/resolvers/windows/memory.rb +3 -2
- data/lib/facter/resolvers/windows/product_release.rb +7 -7
- data/lib/facter/resolvers/xen.rb +3 -1
- data/lib/facter/util/aix/info_extractor.rb +1 -1
- data/lib/facter/util/aix/odm_query.rb +1 -1
- data/lib/facter/util/api_debugger.rb +2 -2
- data/lib/facter/util/facts/facts_utils.rb +2 -1
- data/lib/facter/util/facts/posix/virtual_detector.rb +8 -5
- data/lib/facter/util/facts/unit_converter.rb +2 -2
- data/lib/facter/util/file_helper.rb +1 -2
- data/lib/facter/util/macosx/system_profile_executor.rb +3 -3
- data/lib/facter/util/resolvers/fingerprint.rb +1 -7
- data/lib/facter/util/resolvers/networking/networking.rb +4 -3
- data/lib/facter/util/resolvers/networking/primary_interface.rb +2 -0
- data/lib/facter/util/resolvers/ssh.rb +1 -9
- data/lib/facter/util/resolvers/ssh_helper.rb +2 -0
- data/lib/facter/util/utils.rb +2 -2
- data/lib/facter/version.rb +1 -1
- data/lib/facter.rb +7 -0
- metadata +11 -9
|
@@ -60,10 +60,8 @@ module Facter
|
|
|
60
60
|
def augment_custom(file_global_conf)
|
|
61
61
|
return unless file_global_conf
|
|
62
62
|
|
|
63
|
-
if Options.cli?
|
|
64
|
-
|
|
65
|
-
@options[:no_custom_facts] = file_global_conf['no-custom-facts']
|
|
66
|
-
end
|
|
63
|
+
if Options.cli? && !file_global_conf['no-custom-facts'].nil?
|
|
64
|
+
@options[:no_custom_facts] = file_global_conf['no-custom-facts']
|
|
67
65
|
end
|
|
68
66
|
|
|
69
67
|
@options[:custom_dir] = file_global_conf['custom-dir'] unless file_global_conf['custom-dir'].nil?
|
|
@@ -73,8 +71,8 @@ module Facter
|
|
|
73
71
|
def augment_external(global_conf)
|
|
74
72
|
return unless global_conf
|
|
75
73
|
|
|
76
|
-
if Options.cli?
|
|
77
|
-
@options[:no_external_facts] = global_conf['no-external-facts']
|
|
74
|
+
if Options.cli? && !global_conf['no-external-facts'].nil?
|
|
75
|
+
@options[:no_external_facts] = global_conf['no-external-facts']
|
|
78
76
|
end
|
|
79
77
|
|
|
80
78
|
@options[:external_dir] = [global_conf['external-dir']].flatten unless global_conf['external-dir'].nil?
|
|
@@ -14,7 +14,8 @@ module Facter
|
|
|
14
14
|
|
|
15
15
|
user_query = user_queries.first
|
|
16
16
|
return format_for_no_query(resolved_facts) if user_query.empty?
|
|
17
|
-
|
|
17
|
+
|
|
18
|
+
format_for_single_user_query(user_queries.first, resolved_facts) unless user_query.empty?
|
|
18
19
|
end
|
|
19
20
|
|
|
20
21
|
private
|
|
@@ -39,7 +40,7 @@ module Facter
|
|
|
39
40
|
|
|
40
41
|
return '' unless fact_value
|
|
41
42
|
|
|
42
|
-
fact_value.
|
|
43
|
+
fact_value.instance_of?(Hash) ? hash_to_hocon(fact_value) : fact_value
|
|
43
44
|
end
|
|
44
45
|
|
|
45
46
|
def hash_to_hocon(fact_collection)
|
|
@@ -42,7 +42,7 @@ module Facter
|
|
|
42
42
|
pretty_json = handle_newlines(pretty_json)
|
|
43
43
|
|
|
44
44
|
@log.debug('Remove quotes from value if value is a string')
|
|
45
|
-
pretty_json.gsub(/^(\S*) =>
|
|
45
|
+
pretty_json.gsub(/^(\S*) => "(.*)"/, '\1 => \2')
|
|
46
46
|
end
|
|
47
47
|
|
|
48
48
|
def format_for_single_user_query(user_query, resolved_facts)
|
|
@@ -55,7 +55,7 @@ module Facter
|
|
|
55
55
|
pretty_json = fact_value.nil? ? '' : hash_to_facter_format(fact_value)
|
|
56
56
|
|
|
57
57
|
@log.debug('Remove quotes from value if it is a simple string')
|
|
58
|
-
pretty_json.gsub(/^"(.*)
|
|
58
|
+
pretty_json.gsub(/^"(.*)"/, '\1')
|
|
59
59
|
end
|
|
60
60
|
|
|
61
61
|
def hash_to_facter_format(facts_hash)
|
|
@@ -66,7 +66,7 @@ module Facter
|
|
|
66
66
|
pretty_json.gsub!(/":\s/, '" => ')
|
|
67
67
|
|
|
68
68
|
@log.debug('Remove quotes from parent nodes')
|
|
69
|
-
pretty_json.gsub!(
|
|
69
|
+
pretty_json.gsub!(/"(.*)"\ =>/, '\1 =>')
|
|
70
70
|
|
|
71
71
|
@log.debug('Remove double backslashes from paths')
|
|
72
72
|
pretty_json.gsub(/\\\\/, '\\')
|
|
@@ -95,7 +95,7 @@ module Facter
|
|
|
95
95
|
# quotation marks that come after \ are not removed
|
|
96
96
|
@log.debug('Remove unnecessary comma and quotation marks on root facts')
|
|
97
97
|
output.split("\n")
|
|
98
|
-
.map! { |line|
|
|
98
|
+
.map! { |line| /^\s+/.match?(line) ? line : line.gsub(/,$|(?<!\\)"/, '').gsub('\\"', '"') }.join("\n")
|
|
99
99
|
end
|
|
100
100
|
end
|
|
101
101
|
end
|
|
@@ -107,7 +107,7 @@ module Facter
|
|
|
107
107
|
@@message_callback.call(:debug, msg)
|
|
108
108
|
else
|
|
109
109
|
msg = colorize(msg, CYAN) if Options[:color]
|
|
110
|
-
@@logger.debug(@class_name
|
|
110
|
+
@@logger.debug("#{@class_name} - #{msg}")
|
|
111
111
|
end
|
|
112
112
|
end
|
|
113
113
|
|
|
@@ -128,7 +128,7 @@ module Facter
|
|
|
128
128
|
@@message_callback.call(:info, msg)
|
|
129
129
|
else
|
|
130
130
|
msg = colorize(msg, GREEN) if Options[:color]
|
|
131
|
-
@@logger.info(@class_name
|
|
131
|
+
@@logger.info("#{@class_name} - #{msg}")
|
|
132
132
|
end
|
|
133
133
|
end
|
|
134
134
|
|
|
@@ -137,7 +137,7 @@ module Facter
|
|
|
137
137
|
@@message_callback.call(:warn, msg)
|
|
138
138
|
else
|
|
139
139
|
msg = colorize(msg, YELLOW) if Options[:color]
|
|
140
|
-
@@logger.warn(@class_name
|
|
140
|
+
@@logger.warn("#{@class_name} - #{msg}")
|
|
141
141
|
end
|
|
142
142
|
end
|
|
143
143
|
|
|
@@ -149,20 +149,20 @@ module Facter
|
|
|
149
149
|
warn(message_string)
|
|
150
150
|
end
|
|
151
151
|
|
|
152
|
-
def error(msg, colorize = false)
|
|
152
|
+
def error(msg, colorize = false) # rubocop:disable Style/OptionalBooleanParameter
|
|
153
153
|
@@has_errors = true
|
|
154
154
|
|
|
155
155
|
if @@message_callback && Options[:allow_external_loggers]
|
|
156
156
|
@@message_callback.call(:error, msg)
|
|
157
157
|
else
|
|
158
158
|
msg = colorize(msg, RED) if colorize || Options[:color]
|
|
159
|
-
@@logger.error(@class_name
|
|
159
|
+
@@logger.error("#{@class_name} - #{msg}")
|
|
160
160
|
end
|
|
161
161
|
end
|
|
162
162
|
|
|
163
163
|
def log_exception(exception)
|
|
164
164
|
msg = exception.message
|
|
165
|
-
msg += "\n
|
|
165
|
+
msg += "\n#{exception.backtrace.join("\n")}" if Options[:trace]
|
|
166
166
|
|
|
167
167
|
error(msg, true)
|
|
168
168
|
end
|
|
@@ -3,17 +3,16 @@
|
|
|
3
3
|
class LoggerHelper
|
|
4
4
|
class << self
|
|
5
5
|
def determine_callers_name(sender_self)
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
class_name
|
|
6
|
+
case sender_self
|
|
7
|
+
when String
|
|
8
|
+
sender_self
|
|
9
|
+
when Class
|
|
10
|
+
sender_self.name
|
|
11
|
+
when Module
|
|
12
|
+
sender_self.name
|
|
13
|
+
else # when class is singleton
|
|
14
|
+
sender_self.class.name
|
|
15
|
+
end
|
|
17
16
|
end
|
|
18
17
|
end
|
|
19
18
|
end
|
|
@@ -18,18 +18,18 @@ module Facter
|
|
|
18
18
|
# Because a root fact will always be resolved by a collection of child facts,
|
|
19
19
|
# we can return one or more child facts for each parent.
|
|
20
20
|
#
|
|
21
|
-
#
|
|
22
|
-
#
|
|
21
|
+
# @param query_list [Array] The list of facts to search for
|
|
22
|
+
# @param loaded_facts [Array] All of the fact definitions for the current operating system
|
|
23
23
|
#
|
|
24
|
-
#
|
|
25
|
-
def parse(query_list,
|
|
24
|
+
# @return [Array<SearchedFact>] a list of searchable facts that resolve the user's query
|
|
25
|
+
def parse(query_list, loaded_facts)
|
|
26
26
|
matched_facts = []
|
|
27
27
|
@query_list = query_list
|
|
28
28
|
|
|
29
|
-
return no_user_query(
|
|
29
|
+
return no_user_query(loaded_facts) unless query_list.any?
|
|
30
30
|
|
|
31
31
|
query_list.each do |query|
|
|
32
|
-
found_facts = search_for_facts(query,
|
|
32
|
+
found_facts = search_for_facts(query, loaded_facts)
|
|
33
33
|
matched_facts << found_facts
|
|
34
34
|
end
|
|
35
35
|
|
|
@@ -44,15 +44,17 @@ module Facter
|
|
|
44
44
|
searched_facts
|
|
45
45
|
end
|
|
46
46
|
|
|
47
|
-
def search_for_facts(query,
|
|
47
|
+
def search_for_facts(query, loaded_facts)
|
|
48
48
|
resolvable_fact_list = []
|
|
49
49
|
query = query.to_s
|
|
50
50
|
query_tokens = query.end_with?('.*') ? [query] : query.split('.')
|
|
51
51
|
size = query_tokens.size
|
|
52
52
|
|
|
53
|
+
# Try to match the most specific query_tokens to the least, returning the first match
|
|
53
54
|
size.times do |i|
|
|
54
55
|
query_token_range = 0..size - i - 1
|
|
55
|
-
|
|
56
|
+
query_fact = query_tokens[query_token_range].join('.')
|
|
57
|
+
resolvable_fact_list = get_facts_matching_tokens(query_tokens, query_fact, loaded_facts)
|
|
56
58
|
|
|
57
59
|
return resolvable_fact_list if resolvable_fact_list.any?
|
|
58
60
|
end
|
|
@@ -62,12 +64,10 @@ module Facter
|
|
|
62
64
|
resolvable_fact_list
|
|
63
65
|
end
|
|
64
66
|
|
|
65
|
-
def get_facts_matching_tokens(query_tokens,
|
|
67
|
+
def get_facts_matching_tokens(query_tokens, query_fact, loaded_facts)
|
|
66
68
|
resolvable_fact_list = []
|
|
67
69
|
|
|
68
|
-
|
|
69
|
-
query_fact = query_tokens[query_token_range].join('.')
|
|
70
|
-
|
|
70
|
+
loaded_facts.each do |loaded_fact|
|
|
71
71
|
next unless found_fact?(loaded_fact.name, query_fact)
|
|
72
72
|
|
|
73
73
|
searched_fact = construct_loaded_fact(query_tokens, loaded_fact)
|
|
@@ -79,16 +79,20 @@ module Facter
|
|
|
79
79
|
end
|
|
80
80
|
|
|
81
81
|
def found_fact?(fact_name, query_fact)
|
|
82
|
+
# This is the case where the fact_name contains a wildcard like
|
|
83
|
+
# blockdevice_.*_model and we're querying for the legacy fact
|
|
84
|
+
# specifically using 'blockdevice_sba_model' and we don't want the query
|
|
85
|
+
# 'blockdevice.sba.model' to match
|
|
82
86
|
fact_with_wildcard = fact_name.include?('.*') && !query_fact.include?('.')
|
|
83
87
|
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
88
|
+
if fact_with_wildcard
|
|
89
|
+
# fact_name contains wildcard, so we're intentially not escaping.
|
|
90
|
+
query_fact.match("^#{fact_name}$")
|
|
91
|
+
else
|
|
92
|
+
processed_equery_fact = query_fact.gsub('\\', '\\\\\\\\')
|
|
93
|
+
# Must escape metacharacters (like dots) to ensure the correct fact is found
|
|
94
|
+
fact_name.match("^#{Regexp.escape(processed_equery_fact)}($|\\.)")
|
|
95
|
+
end
|
|
92
96
|
end
|
|
93
97
|
|
|
94
98
|
def construct_loaded_fact(query_tokens, loaded_fact)
|
|
@@ -47,7 +47,7 @@ module Facter
|
|
|
47
47
|
end
|
|
48
48
|
|
|
49
49
|
def compute_size(size_hash)
|
|
50
|
-
physical_partitions = size_hash['TOTAL PPs'].to_i
|
|
50
|
+
physical_partitions = size_hash['TOTAL PPs'].to_i
|
|
51
51
|
size_physical_partition = size_hash['PP SIZE']
|
|
52
52
|
exp = if size_physical_partition[/mega/]
|
|
53
53
|
Facter::Util::Aix::InfoExtractor::MEGABYTES_EXPONENT
|
|
@@ -47,7 +47,7 @@ module Facter
|
|
|
47
47
|
|
|
48
48
|
info = line.split("\s")
|
|
49
49
|
interface_name = info[0]
|
|
50
|
-
mac = info[3][/^([0-9a-f]{1,2}[
|
|
50
|
+
mac = info[3][/^([0-9a-f]{1,2}[.:-]){5}([0-9a-f]{1,2})$/]
|
|
51
51
|
if interfaces[interface_name]
|
|
52
52
|
interfaces[interface_name][:mtu] = info[1].to_i
|
|
53
53
|
interfaces[interface_name][:mac] = format_mac_address(mac) if mac
|
|
@@ -56,14 +56,14 @@ module Facter
|
|
|
56
56
|
end
|
|
57
57
|
|
|
58
58
|
def compute_size(info_hash)
|
|
59
|
-
|
|
59
|
+
logical_partitions = info_hash['LPs'].to_i
|
|
60
60
|
size_physical_partition = info_hash['PP SIZE']
|
|
61
61
|
exp = if size_physical_partition[/mega/]
|
|
62
62
|
Facter::Util::Aix::InfoExtractor::MEGABYTES_EXPONENT
|
|
63
63
|
else
|
|
64
64
|
Facter::Util::Aix::InfoExtractor::GIGABYTES_EXPONENT
|
|
65
65
|
end
|
|
66
|
-
size_physical_partition.to_i *
|
|
66
|
+
size_physical_partition.to_i * logical_partitions * exp
|
|
67
67
|
end
|
|
68
68
|
end
|
|
69
69
|
end
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Facter
|
|
4
|
+
module Resolvers
|
|
5
|
+
module Amzn
|
|
6
|
+
class OsReleaseRpm < BaseResolver
|
|
7
|
+
init_resolver
|
|
8
|
+
|
|
9
|
+
class << self
|
|
10
|
+
private
|
|
11
|
+
|
|
12
|
+
def post_resolve(fact_name, _options)
|
|
13
|
+
@fact_list.fetch(fact_name) { rpm_system_call(fact_name) }
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def rpm_system_call(fact_name)
|
|
17
|
+
output = Facter::Core::Execution.execute(
|
|
18
|
+
'rpm -q --qf \'%<NAME>s\n%<VERSION>s\n%<RELEASE>s\n%<VENDOR>s\' -f /etc/os-release',
|
|
19
|
+
logger: log
|
|
20
|
+
)
|
|
21
|
+
build_fact_list(output)
|
|
22
|
+
|
|
23
|
+
@fact_list[fact_name]
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def build_fact_list(output)
|
|
27
|
+
rpm_results = output.split("\n")
|
|
28
|
+
|
|
29
|
+
return if rpm_results.empty?
|
|
30
|
+
|
|
31
|
+
@fact_list[:package],
|
|
32
|
+
@fact_list[:version],
|
|
33
|
+
@fact_list[:release],
|
|
34
|
+
@fact_list[:vendor] = rpm_results.map(&:strip)
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
data/lib/facter/resolvers/dmi.rb
CHANGED
|
@@ -22,6 +22,7 @@ module Facter
|
|
|
22
22
|
# :product_serial
|
|
23
23
|
# :product_name
|
|
24
24
|
# :product_uuid
|
|
25
|
+
# :product_version
|
|
25
26
|
|
|
26
27
|
private
|
|
27
28
|
|
|
@@ -32,7 +33,7 @@ module Facter
|
|
|
32
33
|
def read_facts(fact_name)
|
|
33
34
|
files = %w[bios_date bios_vendor bios_version board_asset_tag board_vendor board_name
|
|
34
35
|
board_serial chassis_asset_tag chassis_type sys_vendor product_name
|
|
35
|
-
product_serial product_uuid]
|
|
36
|
+
product_serial product_uuid product_version]
|
|
36
37
|
return unless File.directory?('/sys/class/dmi')
|
|
37
38
|
|
|
38
39
|
file_content = Facter::Util::FileHelper.safe_read("/sys/class/dmi/id/#{fact_name}", nil)
|
|
@@ -15,7 +15,7 @@ module Facter
|
|
|
15
15
|
|
|
16
16
|
def read_swap_memory(fact_name)
|
|
17
17
|
output = Facter::Core::Execution.execute('swapinfo -k', logger: log)
|
|
18
|
-
data = output.split("\n")[1
|
|
18
|
+
data = output.split("\n")[1..].map { |line| line.split(/\s+/) }
|
|
19
19
|
|
|
20
20
|
unless data.empty?
|
|
21
21
|
@fact_list[:total_bytes] = kilobytes_to_bytes(data.map { |line| line[1].to_i }.inject(:+))
|
|
@@ -15,25 +15,33 @@ module Facter
|
|
|
15
15
|
|
|
16
16
|
def calculate_system_memory(fact_name)
|
|
17
17
|
read_total_memory_in_bytes
|
|
18
|
-
|
|
18
|
+
read_used_memory_in_bytes
|
|
19
19
|
|
|
20
|
-
@fact_list[:
|
|
20
|
+
@fact_list[:available_bytes] = @fact_list[:total_bytes] - @fact_list[:used_bytes]
|
|
21
21
|
@fact_list[:capacity] = Facter::Util::Resolvers::FilesystemHelper
|
|
22
22
|
.compute_capacity(@fact_list[:used_bytes], @fact_list[:total_bytes])
|
|
23
23
|
|
|
24
24
|
@fact_list[fact_name]
|
|
25
25
|
end
|
|
26
26
|
|
|
27
|
-
def
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
27
|
+
def pagesize
|
|
28
|
+
@pagesize ||= Facter::Freebsd::FfiHelper.sysctl_by_name(:long, 'vm.stats.vm.v_page_size')
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def read_used_memory_in_bytes
|
|
32
|
+
require_relative 'ffi/ffi_helper'
|
|
33
|
+
|
|
34
|
+
@fact_list[:used_bytes] = pagesize * (
|
|
35
|
+
Facter::Freebsd::FfiHelper.sysctl_by_name(:long, 'vm.stats.vm.v_active_count') +
|
|
36
|
+
Facter::Freebsd::FfiHelper.sysctl_by_name(:long, 'vm.stats.vm.v_wire_count')
|
|
37
|
+
)
|
|
31
38
|
end
|
|
32
39
|
|
|
33
40
|
def read_total_memory_in_bytes
|
|
34
41
|
require_relative 'ffi/ffi_helper'
|
|
35
42
|
|
|
36
|
-
@fact_list[:total_bytes] =
|
|
43
|
+
@fact_list[:total_bytes] = pagesize *
|
|
44
|
+
Facter::Freebsd::FfiHelper.sysctl_by_name(:long, 'vm.stats.vm.v_page_count')
|
|
37
45
|
end
|
|
38
46
|
end
|
|
39
47
|
end
|
|
@@ -16,7 +16,7 @@ module Facter
|
|
|
16
16
|
|
|
17
17
|
def read_filesystems(fact_name)
|
|
18
18
|
output = Facter::Core::Execution.execute('mount', logger: log)
|
|
19
|
-
filesystems = output.scan(/\(([a-z]+)
|
|
19
|
+
filesystems = output.scan(/\(([a-z]+),*/).flatten
|
|
20
20
|
@fact_list[:macosx_filesystems] = filesystems.uniq.sort.join(',')
|
|
21
21
|
@fact_list[fact_name]
|
|
22
22
|
end
|
|
@@ -57,7 +57,7 @@ module Facter
|
|
|
57
57
|
end
|
|
58
58
|
|
|
59
59
|
def compute_capacity(used, total)
|
|
60
|
-
format('%<computed_capacity>.2f', computed_capacity: (used / total.to_f * 100))
|
|
60
|
+
"#{format('%<computed_capacity>.2f', computed_capacity: (used / total.to_f * 100))}%"
|
|
61
61
|
end
|
|
62
62
|
|
|
63
63
|
def compute_used(total, free)
|
|
@@ -39,12 +39,12 @@ module Facter
|
|
|
39
39
|
# convert ip ranges into single ip. eg. 10.16.132.213 --> 10.16.132.213 is converted to 10.16.132.213
|
|
40
40
|
# convert ip6 ranges into single ip. eg. 2001:db8:cafe::132:213 -->
|
|
41
41
|
# 2001:db8:cafe::132:213 is converted to 2001:db8:cafe::132:213
|
|
42
|
-
response.gsub!(/([\da-fA-F]+([
|
|
42
|
+
response.gsub!(/([\da-fA-F]+([.:]+[\da-fA-F]+)*)\s+-->\s+[\da-fA-F]+([.:]+[\da-fA-F]+)*/, '\\1')
|
|
43
43
|
end
|
|
44
44
|
|
|
45
45
|
def parse_interfaces_response(response)
|
|
46
46
|
parsed_interfaces_data = {}
|
|
47
|
-
interfaces_data = Hash[*response.split(/^([A-Za-z0-9_
|
|
47
|
+
interfaces_data = Hash[*response.split(/^([A-Za-z0-9_.]+): /)[1..]]
|
|
48
48
|
|
|
49
49
|
interfaces_data.each do |interface_name, raw_data|
|
|
50
50
|
parsed_interface_data = {}
|
|
@@ -66,7 +66,7 @@ module Facter
|
|
|
66
66
|
|
|
67
67
|
def extract_mac(raw_data, parsed_interface_data)
|
|
68
68
|
mac = raw_data.match(/(?:ether|lladdr)\s+((?:\w?\w:){5}\w?\w)|(?:infiniband)\s+((?:\w?\w:){19}\w?\w)/)
|
|
69
|
-
|
|
69
|
+
&.captures&.compact&.first
|
|
70
70
|
parsed_interface_data[:mac] = mac unless mac.nil?
|
|
71
71
|
end
|
|
72
72
|
|
|
@@ -110,7 +110,7 @@ module Facter
|
|
|
110
110
|
|
|
111
111
|
def append_linux_to_os_name
|
|
112
112
|
os_name = @fact_list[:name]
|
|
113
|
-
@fact_list[:name] = os_name
|
|
113
|
+
@fact_list[:name] = "#{os_name}Linux" if os_name.downcase.start_with?('virtuozzo')
|
|
114
114
|
end
|
|
115
115
|
end
|
|
116
116
|
end
|
|
@@ -112,9 +112,9 @@ module Facter
|
|
|
112
112
|
|
|
113
113
|
def execute_and_extract_blkid_info
|
|
114
114
|
stdout = Facter::Core::Execution.execute('blkid', logger: log)
|
|
115
|
-
output_hash = Hash[*stdout.split(/^([^:]+):/)[1
|
|
115
|
+
output_hash = Hash[*stdout.split(/^([^:]+):/)[1..]]
|
|
116
116
|
output_hash.each do |key, value|
|
|
117
|
-
output_hash[key] = Hash[*value.delete('"').chomp.rstrip.split(/ ([^= ]+)=/)[1
|
|
117
|
+
output_hash[key] = Hash[*value.delete('"').chomp.rstrip.split(/ ([^= ]+)=/)[1..]]
|
|
118
118
|
end
|
|
119
119
|
end
|
|
120
120
|
|
|
@@ -10,7 +10,7 @@ module Facter
|
|
|
10
10
|
|
|
11
11
|
attach_function :ioctl_base, :ioctl, %i[int int pointer], :int
|
|
12
12
|
attach_function :open_socket, :socket, %i[int int int], :int
|
|
13
|
-
attach_function :close_socket, :
|
|
13
|
+
attach_function :close_socket, :close, %i[int], :int
|
|
14
14
|
attach_function :inet_ntop, %i[int pointer pointer uint], :string
|
|
15
15
|
|
|
16
16
|
def self.ioctl(call_const, pointer, address_family = AF_INET)
|
|
@@ -18,7 +18,7 @@ module Facter
|
|
|
18
18
|
begin
|
|
19
19
|
ioctl_base(fd, call_const, pointer)
|
|
20
20
|
ensure
|
|
21
|
-
Ioctl.close_socket(fd
|
|
21
|
+
Ioctl.close_socket(fd)
|
|
22
22
|
end
|
|
23
23
|
end
|
|
24
24
|
end
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require_relative 'ffi/ffi
|
|
3
|
+
require_relative 'ffi/ffi'
|
|
4
4
|
module Facter
|
|
5
5
|
module Resolvers
|
|
6
6
|
module Solaris
|
|
@@ -79,7 +79,7 @@ module Facter
|
|
|
79
79
|
ioctl = FFI::Ioctl.ioctl(FFI::SIOCGLIFMTU, lifreq, lifreq.ss_family)
|
|
80
80
|
|
|
81
81
|
if ioctl == -1
|
|
82
|
-
@log.error("
|
|
82
|
+
@log.error("Could not read MTU, error code is: #{::FFI::LastError.error}")
|
|
83
83
|
return
|
|
84
84
|
end
|
|
85
85
|
|
|
@@ -26,7 +26,7 @@ module Facter
|
|
|
26
26
|
|
|
27
27
|
@fact_list[:major] = major
|
|
28
28
|
@fact_list[:minor] = minor
|
|
29
|
-
@fact_list[:full] = major == '10' ? major
|
|
29
|
+
@fact_list[:full] = major == '10' ? "#{major}_u#{minor}" : "#{major}.#{minor}"
|
|
30
30
|
break
|
|
31
31
|
end
|
|
32
32
|
@fact_list[fact_name]
|
|
@@ -36,7 +36,7 @@ module Facter
|
|
|
36
36
|
result = text.match(regex_pattern)
|
|
37
37
|
major, minor = result.captures if result
|
|
38
38
|
minor = regex_pattern == /Solaris (\d+)/ ? '0' : minor
|
|
39
|
-
|
|
39
|
+
[major, minor] if major && minor
|
|
40
40
|
end
|
|
41
41
|
end
|
|
42
42
|
end
|
|
@@ -28,12 +28,16 @@ module Facter
|
|
|
28
28
|
def build_fact_list(output)
|
|
29
29
|
uname_results = output.split("\n")
|
|
30
30
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
31
|
+
if !uname_results.empty?
|
|
32
|
+
@fact_list[:machine],
|
|
33
|
+
@fact_list[:nodename],
|
|
34
|
+
@fact_list[:processor],
|
|
35
|
+
@fact_list[:kernelrelease],
|
|
36
|
+
@fact_list[:kernelname],
|
|
37
|
+
@fact_list[:kernelversion] = uname_results.map(&:strip)
|
|
38
|
+
else
|
|
39
|
+
log.warn('Request to uname returned no output. Uname related facts are not populated.')
|
|
40
|
+
end
|
|
37
41
|
end
|
|
38
42
|
end
|
|
39
43
|
end
|