facter 4.0.7.pre → 4.0.8.pre
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.rubocop.yml +17 -4
- data/.rubocop_todo.yml +119 -0
- data/Gemfile +3 -2
- data/VERSION +1 -1
- data/facter.gemspec +2 -0
- data/lib/custom_facts/core/execution/posix.rb +1 -1
- data/lib/custom_facts/core/execution/windows.rb +1 -1
- data/lib/custom_facts/core/logging.rb +6 -3
- data/lib/custom_facts/core/resolvable.rb +3 -2
- data/lib/custom_facts/util/confine.rb +1 -1
- data/lib/custom_facts/util/fact.rb +10 -6
- data/lib/custom_facts/util/resolution.rb +1 -1
- data/lib/facter.rb +4 -2
- data/lib/facts/solaris/zfs_featurenumbers.rb +14 -0
- data/lib/facts/solaris/zfs_version.rb +14 -0
- data/lib/facts/solaris/zpool_featurenumbers.rb +14 -0
- data/lib/facts/solaris/zpool_version.rb +14 -0
- data/lib/framework/config/config_reader.rb +0 -1
- data/lib/framework/core/file_loader.rb +2 -3
- data/lib/framework/core/options.rb +3 -0
- data/lib/framework/core/options/config_file_options.rb +12 -6
- data/lib/framework/core/options/default_options.rb +3 -1
- data/lib/framework/core/options/validate_options.rb +47 -0
- data/lib/framework/formatters/legacy_fact_formatter.rb +1 -1
- data/lib/resolvers/aix/networking_resolver.rb +1 -1
- data/lib/resolvers/hostname_resolver.rb +2 -2
- data/lib/resolvers/macosx/system_profiler_resolver.rb +1 -1
- data/lib/resolvers/selinux_resolver.rb +1 -1
- data/lib/resolvers/solaris/zfs_resolver.rb +35 -0
- data/lib/resolvers/solaris/zpool_resolver.rb +35 -0
- data/lib/resolvers/windows/ffi/ffi.rb +6 -9
- data/lib/resolvers/windows/ffi/network_utils.rb +2 -1
- data/lib/resolvers/windows/identity_resolver.rb +2 -2
- data/lib/resolvers/windows/memory_resolver.rb +1 -1
- data/lib/resolvers/windows/netkvm_resolver.rb +2 -0
- data/lib/resolvers/windows/system32_resolver.rb +1 -1
- metadata +38 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 476e88581612a000fbf67c3eb00d8dc338cf15085a3717b32dea1a6214856469
|
4
|
+
data.tar.gz: bb0258fe0e3df51439f90427c5e2afeee3b6057e4e98291f410d9869e44ed350
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2048f930daed9ea2e5b008b8941246af8d094b7d84de1e465828804ef04122812fa7e0b9115a4b76b74de33da46f0ffa2cc321399d6794985858e58c6a55911b
|
7
|
+
data.tar.gz: 40741371996abb97ccfd30d60dfe9a8e6279b757f8eb4fa8f6af1dfaf9f0d2457edbe14ba2ff943a397c13f302cd76f88a819e321259a53c8cfae777fbb1686c
|
data/.gitignore
CHANGED
data/.rubocop.yml
CHANGED
@@ -1,13 +1,16 @@
|
|
1
|
+
---
|
2
|
+
inherit_from: .rubocop_todo.yml
|
3
|
+
|
4
|
+
require:
|
5
|
+
- rubocop-performance
|
6
|
+
- rubocop-rspec
|
7
|
+
|
1
8
|
Documentation:
|
2
9
|
Enabled: false
|
3
10
|
|
4
11
|
Metrics/LineLength:
|
5
12
|
Max: 120
|
6
13
|
|
7
|
-
Metrics/ModuleLength:
|
8
|
-
Exclude:
|
9
|
-
- 'lib/facter-ng.rb'
|
10
|
-
|
11
14
|
Metrics/MethodLength:
|
12
15
|
Max: 20
|
13
16
|
Exclude:
|
@@ -24,14 +27,17 @@ Metrics/ModuleLength:
|
|
24
27
|
Metrics/BlockLength:
|
25
28
|
Exclude:
|
26
29
|
- !ruby/regexp /(?:(?!.+_spec.rb).)*$/
|
30
|
+
|
27
31
|
Style/ClassVars:
|
28
32
|
Exclude:
|
29
33
|
- !ruby/regexp /(?:(?!.+_resolver.rb).)*$/
|
34
|
+
|
30
35
|
Naming/ClassAndModuleCamelCase:
|
31
36
|
Exclude:
|
32
37
|
- 'spec/mocks/**/*'
|
33
38
|
|
34
39
|
Metrics/AbcSize:
|
40
|
+
Max: 16
|
35
41
|
Exclude:
|
36
42
|
- 'spec/custom_facts/util/parser_spec.rb'
|
37
43
|
- 'spec/custom_facts/core/logging_spec.rb'
|
@@ -41,6 +47,7 @@ Metrics/AbcSize:
|
|
41
47
|
- 'lib/custom_facts/util/confine.rb'
|
42
48
|
- 'lib/custom_facts/core/execution/windows.rb'
|
43
49
|
- 'lib/custom_facts/core/execution/base.rb'
|
50
|
+
- 'lib/custom_facts/core/resolvable.rb'
|
44
51
|
|
45
52
|
Style/FrozenStringLiteralComment:
|
46
53
|
Exclude:
|
@@ -120,3 +127,9 @@ Naming/FileName:
|
|
120
127
|
Exclude:
|
121
128
|
- 'lib/facter.rb'
|
122
129
|
- 'agent/lib/facter-ng.rb'
|
130
|
+
|
131
|
+
RSpec/ExampleLength:
|
132
|
+
Enabled: false
|
133
|
+
|
134
|
+
RSpec/DescribedClass:
|
135
|
+
EnforcedStyle: explicit
|
data/.rubocop_todo.yml
ADDED
@@ -0,0 +1,119 @@
|
|
1
|
+
# This configuration was generated by
|
2
|
+
# `rubocop --auto-gen-config`
|
3
|
+
# on 2020-02-21 22:34:28 +0200 using RuboCop version 0.74.0.
|
4
|
+
# The point is for the user to remove these configuration records
|
5
|
+
# one by one as the offenses are removed from the code base.
|
6
|
+
# Note that changes in the inspected code, or installation of new
|
7
|
+
# versions of RuboCop, may require this file to be generated again.
|
8
|
+
|
9
|
+
# Offense count: 75
|
10
|
+
RSpec/AnyInstance:
|
11
|
+
Enabled: false
|
12
|
+
|
13
|
+
# Offense count: 79
|
14
|
+
# Configuration parameters: Prefixes.
|
15
|
+
# Prefixes: when, with, without
|
16
|
+
RSpec/ContextWording:
|
17
|
+
Enabled: false
|
18
|
+
|
19
|
+
# Offense count: 82
|
20
|
+
RSpec/ExpectInHook:
|
21
|
+
Enabled: false
|
22
|
+
|
23
|
+
# Offense count: 412
|
24
|
+
# Configuration parameters: CustomTransform, IgnoreMethods.
|
25
|
+
RSpec/FilePath:
|
26
|
+
Enabled: false
|
27
|
+
|
28
|
+
# Offense count: 15
|
29
|
+
# Configuration parameters: AssignmentOnly.
|
30
|
+
RSpec/InstanceVariable:
|
31
|
+
Exclude:
|
32
|
+
- 'spec/custom_facts/core/execution/fact_manager_spec.rb'
|
33
|
+
- 'spec/custom_facts/util/collection_spec.rb'
|
34
|
+
- 'spec/custom_facts/util/confine_spec.rb'
|
35
|
+
|
36
|
+
# Offense count: 2
|
37
|
+
RSpec/IteratedExpectation:
|
38
|
+
Exclude:
|
39
|
+
- 'spec/custom_facts/core/aggregate_spec.rb'
|
40
|
+
- 'spec/custom_facts/core/suitable_spec.rb'
|
41
|
+
|
42
|
+
# Offense count: 16
|
43
|
+
RSpec/LeakyConstantDeclaration:
|
44
|
+
Exclude:
|
45
|
+
- 'spec/custom_facts/core/resolvable_spec.rb'
|
46
|
+
- 'spec/custom_facts/core/suitable_spec.rb'
|
47
|
+
- 'spec/custom_facts/shared_contexts/platform.rb'
|
48
|
+
- 'spec/custom_facts/util/collection_spec.rb'
|
49
|
+
- 'spec/facter/resolvers/macosx/mountpoints_resolver_spec.rb'
|
50
|
+
- 'spec/facter/resolvers/utils/windows/network_utils_spec.rb'
|
51
|
+
|
52
|
+
# Offense count: 428
|
53
|
+
# Configuration parameters: EnforcedStyle.
|
54
|
+
# SupportedStyles: have_received, receive
|
55
|
+
RSpec/MessageSpies:
|
56
|
+
Enabled: false
|
57
|
+
|
58
|
+
# Offense count: 146
|
59
|
+
# Configuration parameters: AggregateFailuresByDefault.
|
60
|
+
RSpec/MultipleExpectations:
|
61
|
+
Max: 9
|
62
|
+
|
63
|
+
# Offense count: 250
|
64
|
+
# Configuration parameters: IgnoreSharedExamples.
|
65
|
+
RSpec/NamedSubject:
|
66
|
+
Exclude:
|
67
|
+
- 'spec/custom_facts/core/aggregate_spec.rb'
|
68
|
+
- 'spec/custom_facts/core/execution/fact_manager_spec.rb'
|
69
|
+
- 'spec/custom_facts/core/execution/posix_spec.rb'
|
70
|
+
- 'spec/custom_facts/core/execution/windows_spec.rb'
|
71
|
+
- 'spec/custom_facts/core/execution_spec.rb'
|
72
|
+
- 'spec/custom_facts/core/logging_spec.rb'
|
73
|
+
- 'spec/custom_facts/core/resolvable_spec.rb'
|
74
|
+
- 'spec/custom_facts/core/suitable_spec.rb'
|
75
|
+
- 'spec/custom_facts/util/directory_loader_spec.rb'
|
76
|
+
- 'spec/custom_facts/util/fact_spec.rb'
|
77
|
+
- 'spec/custom_facts/util/normalization_spec.rb'
|
78
|
+
- 'spec/custom_facts/util/resolution_spec.rb'
|
79
|
+
- 'spec/facter/resolvers/linux/networking_linux_resolver_spec.rb'
|
80
|
+
- 'spec/framework/core/options_spec.rb'
|
81
|
+
|
82
|
+
# Offense count: 22
|
83
|
+
RSpec/NestedGroups:
|
84
|
+
Max: 4
|
85
|
+
|
86
|
+
# Offense count: 7
|
87
|
+
RSpec/RepeatedDescription:
|
88
|
+
Exclude:
|
89
|
+
- 'spec/custom_facts/util/confine_spec.rb'
|
90
|
+
- 'spec/facter/resolvers/macosx/system_memory_resolver_spec.rb'
|
91
|
+
- 'spec/facter/resolvers/windows/uptime_resolver_spec.rb'
|
92
|
+
|
93
|
+
# Offense count: 4
|
94
|
+
RSpec/RepeatedExampleGroupDescription:
|
95
|
+
Exclude:
|
96
|
+
- 'spec/custom_facts/util/parser_spec.rb'
|
97
|
+
- 'spec/facter/resolvers/windows/fips_resolver_spec.rb'
|
98
|
+
|
99
|
+
# Offense count: 7
|
100
|
+
RSpec/ScatteredLet:
|
101
|
+
Exclude:
|
102
|
+
- 'spec/facter/resolvers/windows/product_release_resolver_spec.rb'
|
103
|
+
|
104
|
+
# Offense count: 39
|
105
|
+
RSpec/SubjectStub:
|
106
|
+
Exclude:
|
107
|
+
- 'spec/custom_facts/core/aggregate_spec.rb'
|
108
|
+
- 'spec/custom_facts/core/execution/fact_manager_spec.rb'
|
109
|
+
- 'spec/custom_facts/core/execution/posix_spec.rb'
|
110
|
+
- 'spec/custom_facts/core/execution/windows_spec.rb'
|
111
|
+
- 'spec/custom_facts/core/logging_spec.rb'
|
112
|
+
- 'spec/custom_facts/core/resolvable_spec.rb'
|
113
|
+
- 'spec/custom_facts/util/fact_spec.rb'
|
114
|
+
- 'spec/custom_facts/util/resolution_spec.rb'
|
115
|
+
|
116
|
+
# Offense count: 392
|
117
|
+
# Configuration parameters: IgnoreNameless, IgnoreSymbolicNames.
|
118
|
+
RSpec/VerifiedDoubles:
|
119
|
+
Enabled: false
|
data/Gemfile
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
source ENV['GEM_SOURCE'] || 'https://rubygems.org'
|
4
4
|
|
5
|
-
git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }
|
6
|
-
|
7
5
|
gemspec name: 'facter'
|
6
|
+
|
7
|
+
local_gemfile = File.expand_path('Gemfile.local', __dir__)
|
8
|
+
eval_gemfile(local_gemfile) if File.exist?(local_gemfile)
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
4.0.
|
1
|
+
4.0.8.pre
|
data/facter.gemspec
CHANGED
@@ -40,6 +40,8 @@ Gem::Specification.new do |spec|
|
|
40
40
|
spec.add_development_dependency 'rake', '~> 10.0'
|
41
41
|
spec.add_development_dependency 'rspec', '~> 3.0'
|
42
42
|
spec.add_development_dependency 'rubocop', '~> 0.74.0'
|
43
|
+
spec.add_development_dependency 'rubocop-performance', '~> 1.5'
|
44
|
+
spec.add_development_dependency 'rubocop-rspec', '~> 1.38'
|
43
45
|
spec.add_development_dependency 'rubycritic', '~> 4.1.0'
|
44
46
|
spec.add_development_dependency 'sys-filesystem', '~> 1.3'
|
45
47
|
|
@@ -48,7 +48,7 @@ module LegacyFacter
|
|
48
48
|
return unless debugging?
|
49
49
|
|
50
50
|
if msg.nil? || msg.empty?
|
51
|
-
invoker = caller
|
51
|
+
invoker = caller(1..1).first.slice(/.*:\d+/)
|
52
52
|
self.warn "#{self.class}#debug invoked with invalid message #{msg.inspect}:#{msg.class} at #{invoker}"
|
53
53
|
elsif @@message_callback
|
54
54
|
@@message_callback.call(:debug, msg)
|
@@ -79,7 +79,7 @@ module LegacyFacter
|
|
79
79
|
# @return [void]
|
80
80
|
def warn(msg)
|
81
81
|
if msg.nil? || msg.empty?
|
82
|
-
invoker = caller
|
82
|
+
invoker = caller(1..1).first.slice(/.*:\d+/)
|
83
83
|
msg = "#{self.class}#debug invoked with invalid message #{msg.inspect}:#{msg.class} at #{invoker}"
|
84
84
|
end
|
85
85
|
if @@message_callback
|
@@ -119,7 +119,10 @@ module LegacyFacter
|
|
119
119
|
arr << message
|
120
120
|
end
|
121
121
|
|
122
|
-
|
122
|
+
if trace
|
123
|
+
arr << 'backtrace:'
|
124
|
+
arr.concat(exception.backtrace)
|
125
|
+
end
|
123
126
|
|
124
127
|
"#{RED}#{arr.flatten.join("\n")}#{RESET}"
|
125
128
|
end
|
@@ -75,8 +75,9 @@ module LegacyFacter
|
|
75
75
|
LegacyFacter.log_exception(e, "Fact resolution #{qualified_name} resolved to an invalid value: #{e.message}")
|
76
76
|
nil
|
77
77
|
rescue StandardError => e
|
78
|
-
LegacyFacter.log_exception(e, "
|
79
|
-
|
78
|
+
LegacyFacter.log_exception(e, "Error while resolving custom fact #{qualified_name}: #{e.message}")
|
79
|
+
at_exit { exit 1 }
|
80
|
+
raise Facter::ResolveCustomFactError
|
80
81
|
end
|
81
82
|
|
82
83
|
private
|
@@ -48,7 +48,7 @@ module LegacyFacter
|
|
48
48
|
#
|
49
49
|
# @param options [Hash] A hash of options to set on the resolution
|
50
50
|
#
|
51
|
-
# @return [
|
51
|
+
# @return [Facter::Util::Resolution]
|
52
52
|
#
|
53
53
|
# @api private
|
54
54
|
def add(options = {}, &block)
|
@@ -61,7 +61,7 @@ module LegacyFacter
|
|
61
61
|
#
|
62
62
|
# @param resolution_name [String] The name of the resolve to define or look up
|
63
63
|
# @param options [Hash] A hash of options to set on the resolution
|
64
|
-
# @return [
|
64
|
+
# @return [Facter::Util::Resolution]
|
65
65
|
#
|
66
66
|
# @api public
|
67
67
|
def define_resolution(resolution_name, options = {}, &block)
|
@@ -82,7 +82,7 @@ module LegacyFacter
|
|
82
82
|
#
|
83
83
|
# @param name [String]
|
84
84
|
#
|
85
|
-
# @return [
|
85
|
+
# @return [Facter::Util::Resolution, nil] The resolution if exists, nil if
|
86
86
|
# it doesn't exist or name is nil
|
87
87
|
def resolution(name)
|
88
88
|
return nil if name.nil?
|
@@ -163,7 +163,11 @@ module LegacyFacter
|
|
163
163
|
|
164
164
|
def find_first_real_value(resolutions)
|
165
165
|
resolutions.each do |resolve|
|
166
|
-
|
166
|
+
begin
|
167
|
+
value = resolve.value
|
168
|
+
rescue Facter::ResolveCustomFactError
|
169
|
+
break
|
170
|
+
end
|
167
171
|
@used_resolution_weight = resolve.weight
|
168
172
|
return value unless value.nil?
|
169
173
|
end
|
@@ -173,7 +177,7 @@ module LegacyFacter
|
|
173
177
|
def announce_when_no_suitable_resolution(resolutions)
|
174
178
|
return unless resolutions.empty?
|
175
179
|
|
176
|
-
LegacyFacter.debug format('Found no suitable resolves of %<
|
180
|
+
LegacyFacter.debug format('Found no suitable resolves of %<resolver_length> for %<name>s',
|
177
181
|
resolver_length: @resolves.length, name: @name)
|
178
182
|
end
|
179
183
|
|
@@ -192,7 +196,7 @@ module LegacyFacter
|
|
192
196
|
else
|
193
197
|
case resolution_type
|
194
198
|
when :simple
|
195
|
-
resolve =
|
199
|
+
resolve = Facter::Util::Resolution.new(resolution_name, self)
|
196
200
|
when :aggregate
|
197
201
|
resolve = LegacyFacter::Core::Aggregate.new(resolution_name, self)
|
198
202
|
else
|
data/lib/facter.rb
CHANGED
@@ -8,6 +8,8 @@ require "#{ROOT_DIR}/lib/framework/core/file_loader"
|
|
8
8
|
require "#{ROOT_DIR}/lib/framework/core/options/options_validator"
|
9
9
|
|
10
10
|
module Facter
|
11
|
+
class ResolveCustomFactError < StandardError; end
|
12
|
+
|
11
13
|
@options = Options.instance
|
12
14
|
|
13
15
|
def self.[](name)
|
@@ -44,7 +46,7 @@ module Facter
|
|
44
46
|
end
|
45
47
|
|
46
48
|
def self.debugging(debug_bool)
|
47
|
-
@options.priority_options = { debug:
|
49
|
+
@options.priority_options = { debug: debug_bool }
|
48
50
|
@options.refresh
|
49
51
|
|
50
52
|
debug_bool
|
@@ -108,7 +110,7 @@ module Facter
|
|
108
110
|
end
|
109
111
|
|
110
112
|
def self.to_user_output(cli_options, *args)
|
111
|
-
@options.priority_options = cli_options
|
113
|
+
@options.priority_options = { is_cli: true }.merge!(cli_options.map { |(k, v)| [k.to_sym, v] }.to_h)
|
112
114
|
@options.refresh(args)
|
113
115
|
|
114
116
|
resolved_facts = Facter::FactManager.instance.resolve_facts(@options, args)
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Facter
|
4
|
+
module Solaris
|
5
|
+
class ZFSFeatureNumbers
|
6
|
+
FACT_NAME = 'zfs_featurenumbers'
|
7
|
+
|
8
|
+
def call_the_resolver
|
9
|
+
fact_value = Resolvers::Solaris::ZFS.resolve(:zfs_featurenumbers)
|
10
|
+
ResolvedFact.new(FACT_NAME, fact_value)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Facter
|
4
|
+
module Solaris
|
5
|
+
class ZFSVersion
|
6
|
+
FACT_NAME = 'zfs_version'
|
7
|
+
|
8
|
+
def call_the_resolver
|
9
|
+
fact_value = Resolvers::Solaris::ZFS.resolve(:zfs_version)
|
10
|
+
ResolvedFact.new(FACT_NAME, fact_value)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Facter
|
4
|
+
module Solaris
|
5
|
+
class ZPoolFeatureNumbers
|
6
|
+
FACT_NAME = 'zpool_featurenumbers'
|
7
|
+
|
8
|
+
def call_the_resolver
|
9
|
+
fact_value = Resolvers::Solaris::ZPool.resolve(:zpool_featurenumbers)
|
10
|
+
ResolvedFact.new(FACT_NAME, fact_value)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Facter
|
4
|
+
module Solaris
|
5
|
+
class ZPoolVersion
|
6
|
+
FACT_NAME = 'zpool_version'
|
7
|
+
|
8
|
+
def call_the_resolver
|
9
|
+
fact_value = Resolvers::Solaris::ZPool.resolve(:zpool_version)
|
10
|
+
ResolvedFact.new(FACT_NAME, fact_value)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -40,7 +40,6 @@ load_dir(['config'])
|
|
40
40
|
|
41
41
|
load_lib_dirs('resolvers')
|
42
42
|
load_lib_dirs('facts_utils')
|
43
|
-
load_lib_dirs('utils')
|
44
43
|
load_lib_dirs('framework', 'core')
|
45
44
|
load_lib_dirs('models')
|
46
45
|
load_lib_dirs('framework', 'core', 'fact_loaders')
|
@@ -53,8 +52,8 @@ os_hierarchy.each { |operating_system| load_lib_dirs('facts', operating_system.d
|
|
53
52
|
os_hierarchy.each { |operating_system| load_lib_dirs('resolvers', operating_system.downcase, '**') }
|
54
53
|
|
55
54
|
require "#{ROOT_DIR}/lib/custom_facts/core/legacy_facter"
|
56
|
-
|
57
|
-
|
55
|
+
load_lib_dirs('framework', 'utils')
|
56
|
+
load_lib_dirs('util')
|
58
57
|
|
59
58
|
require "#{ROOT_DIR}/lib/framework/core/fact_augmenter"
|
60
59
|
require "#{ROOT_DIR}/lib/framework/parsers/query_parser"
|
@@ -6,6 +6,7 @@ module Facter
|
|
6
6
|
include Facter::ConfigFileOptions
|
7
7
|
include Facter::PriorityOptions
|
8
8
|
include Facter::HelperOptions
|
9
|
+
include Facter::ValidateOptions
|
9
10
|
|
10
11
|
include Singleton
|
11
12
|
|
@@ -58,10 +59,12 @@ module Facter
|
|
58
59
|
private
|
59
60
|
|
60
61
|
def initialize_options
|
62
|
+
@options = {}
|
61
63
|
augment_with_defaults!
|
62
64
|
augment_with_to_hash_defaults! if @priority_options[:to_hash]
|
63
65
|
augment_with_config_file_options!(@priority_options[:config])
|
64
66
|
augment_with_priority_options!(@priority_options)
|
67
|
+
validate_configs
|
65
68
|
augment_with_helper_options!(@user_query)
|
66
69
|
end
|
67
70
|
end
|
@@ -6,10 +6,12 @@ module Facter
|
|
6
6
|
conf_reader = Facter::ConfigReader.new(config_path)
|
7
7
|
|
8
8
|
augment_config_path(config_path)
|
9
|
-
|
9
|
+
if @priority_options[:is_cli]
|
10
|
+
augment_cli(conf_reader.cli)
|
11
|
+
augment_ruby(conf_reader.global)
|
12
|
+
end
|
10
13
|
augment_custom(conf_reader.global)
|
11
14
|
augment_external(conf_reader.global)
|
12
|
-
augment_ruby(conf_reader.global)
|
13
15
|
augment_show_legacy(conf_reader.global)
|
14
16
|
augment_facts(conf_reader.ttls)
|
15
17
|
end
|
@@ -32,15 +34,19 @@ module Facter
|
|
32
34
|
def augment_custom(file_global_conf)
|
33
35
|
return unless file_global_conf
|
34
36
|
|
35
|
-
@
|
36
|
-
|
37
|
+
if @priority_options[:is_cli]
|
38
|
+
@options[:custom_facts] = !file_global_conf['no-custom-facts'] unless file_global_conf['no-custom-facts'].nil?
|
39
|
+
end
|
40
|
+
@options[:custom_dir] = [file_global_conf['custom-dir']].flatten unless file_global_conf['custom-dir'].nil?
|
37
41
|
end
|
38
42
|
|
39
43
|
def augment_external(global_conf)
|
40
44
|
return unless global_conf
|
41
45
|
|
42
|
-
@
|
43
|
-
|
46
|
+
if @priority_options[:is_cli]
|
47
|
+
@options[:external_facts] = !global_conf['no-external-facts'] unless global_conf['no-external-facts'].nil?
|
48
|
+
end
|
49
|
+
@options[:external_dir] = [global_conf['external-dir']].flatten unless global_conf['external-dir'].nil?
|
44
50
|
end
|
45
51
|
|
46
52
|
def augment_ruby(global_conf)
|
@@ -7,6 +7,8 @@ module Facter
|
|
7
7
|
global_defaults
|
8
8
|
end
|
9
9
|
|
10
|
+
DEFAULT_LOG_LEVEL = :warn
|
11
|
+
|
10
12
|
def augment_with_to_hash_defaults!
|
11
13
|
@options[:show_legacy] = true
|
12
14
|
end
|
@@ -17,7 +19,7 @@ module Facter
|
|
17
19
|
@options[:debug] ||= false
|
18
20
|
@options[:trace] ||= false
|
19
21
|
@options[:verbose] ||= false
|
20
|
-
@options[:log_level] ||=
|
22
|
+
@options[:log_level] ||= DEFAULT_LOG_LEVEL
|
21
23
|
@options[:show_legacy] ||= false
|
22
24
|
end
|
23
25
|
|
@@ -0,0 +1,47 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Facter
|
4
|
+
module ValidateOptions
|
5
|
+
def validate_configs
|
6
|
+
conflicting_configs.each do |op|
|
7
|
+
if op.values[0] && op.values[1]
|
8
|
+
raise_error("#{op.keys[0]} and #{op.keys[1]} options conflict: please specify only one")
|
9
|
+
end
|
10
|
+
end
|
11
|
+
validate_log_options
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def conflicting_configs
|
17
|
+
no_ruby = !@options[:ruby]
|
18
|
+
no_custom_facts = !@options[:custom_facts]
|
19
|
+
puppet = @options[:puppet]
|
20
|
+
custom_dir = @options[:custom_dir].nil? ? false : @options[:custom_dir].any?
|
21
|
+
external_dir = @options[:external_dir].nil? ? false : @options[:external_dir].any?
|
22
|
+
|
23
|
+
[
|
24
|
+
{ 'no-ruby' => no_ruby, 'custom-dir' => custom_dir },
|
25
|
+
{ 'no-external-facts' => !@options[:external_facts], 'external-dir' => external_dir },
|
26
|
+
{ 'no-custom-facts' => no_custom_facts, 'custom-fir' => custom_dir },
|
27
|
+
{ 'no-ruby' => no_ruby, 'puppet' => puppet },
|
28
|
+
{ 'no-custom-facts' => no_custom_facts, 'puppet' => puppet }
|
29
|
+
]
|
30
|
+
end
|
31
|
+
|
32
|
+
def validate_log_options
|
33
|
+
return unless [@options[:debug],
|
34
|
+
@options[:verbose],
|
35
|
+
@options[:log_level] != Facter::DefaultOptions::DEFAULT_LOG_LEVEL]
|
36
|
+
.count(true) > 1
|
37
|
+
|
38
|
+
raise_error('debug, verbose, and log-level options conflict: please specify only one.')
|
39
|
+
end
|
40
|
+
|
41
|
+
def raise_error(message)
|
42
|
+
log = Facter::Log.new(self)
|
43
|
+
log.error(message, true)
|
44
|
+
raise ArgumentError, message
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -84,7 +84,7 @@ module Facter
|
|
84
84
|
|
85
85
|
def remove_comma_and_quation(output)
|
86
86
|
@log.debug('Remove unnecessary comma and quotation marks on root facts')
|
87
|
-
output.split("\n").map! { |line| line
|
87
|
+
output.split("\n").map! { |line| line =~ /^[\s]+/ ? line : line.gsub(/,$|\"/, '') }.join("\n")
|
88
88
|
end
|
89
89
|
end
|
90
90
|
end
|
@@ -23,7 +23,7 @@ module Facter
|
|
23
23
|
end
|
24
24
|
|
25
25
|
def get_primary_interface_info(output)
|
26
|
-
primary_interface_info = output.
|
26
|
+
primary_interface_info = output.find { |line| line =~ /=>/ }.split(' ')
|
27
27
|
@fact_list[:primary] = primary_interface_info[5]
|
28
28
|
@fact_list[:ip] = primary_interface_info[1]
|
29
29
|
end
|
@@ -32,9 +32,9 @@ module Facter
|
|
32
32
|
domain = Regexp.last_match(1)
|
33
33
|
elsif File.exist?('/etc/resolv.conf')
|
34
34
|
file = File.read('/etc/resolv.conf')
|
35
|
-
if file
|
35
|
+
if file =~ /^search\s+(\S+)/
|
36
36
|
domain = Regexp.last_match(1)
|
37
|
-
elsif file
|
37
|
+
elsif file =~ /^domain\s+(\S+)/
|
38
38
|
domain = Regexp.last_match(1)
|
39
39
|
end
|
40
40
|
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Facter
|
4
|
+
module Resolvers
|
5
|
+
module Solaris
|
6
|
+
class ZFS < 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) { zfs_fact(fact_name) }
|
15
|
+
end
|
16
|
+
|
17
|
+
def zfs_fact(fact_name)
|
18
|
+
build_zfs_facts
|
19
|
+
@fact_list[fact_name]
|
20
|
+
end
|
21
|
+
|
22
|
+
def build_zfs_facts
|
23
|
+
output, _status = Open3.capture2('zfs upgrade -v')
|
24
|
+
features_list = output.scan(/^\s+(\d+)/).flatten
|
25
|
+
|
26
|
+
return if features_list.empty?
|
27
|
+
|
28
|
+
@fact_list[:zfs_featurenumbers] = features_list.join(',')
|
29
|
+
@fact_list[:zfs_version] = features_list.last
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Facter
|
4
|
+
module Resolvers
|
5
|
+
module Solaris
|
6
|
+
class ZPool < 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) { zpool_fact(fact_name) }
|
15
|
+
end
|
16
|
+
|
17
|
+
def zpool_fact(fact_name)
|
18
|
+
build_zpool_facts
|
19
|
+
@fact_list[fact_name]
|
20
|
+
end
|
21
|
+
|
22
|
+
def build_zpool_facts
|
23
|
+
output, _status = Open3.capture2('zpool upgrade -v')
|
24
|
+
features_list = output.scan(/^\s+(\d+)/).flatten
|
25
|
+
|
26
|
+
return if features_list.empty?
|
27
|
+
|
28
|
+
@fact_list[:zpool_featurenumbers] = features_list.join(',')
|
29
|
+
@fact_list[:zpool_version] = features_list.last
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -23,13 +23,10 @@ ERROR_MORE_DATA = 234
|
|
23
23
|
MAX_PATH = 32_767
|
24
24
|
|
25
25
|
module FFI
|
26
|
-
|
26
|
+
WIN32FALSE = 0
|
27
27
|
END_OF_WCHAR_STRING = "\0\0".encode('UTF-16LE')
|
28
28
|
|
29
29
|
class Pointer
|
30
|
-
alias write_dword write_uint32
|
31
|
-
alias read_dword read_uint32
|
32
|
-
|
33
30
|
def read_wide_string_with_length(char_length)
|
34
31
|
# char_length is number of wide chars (typically excluding NULLs), *not* bytes
|
35
32
|
str = get_bytes(0, char_length * 2).force_encoding('UTF-16LE')
|
@@ -39,27 +36,27 @@ module FFI
|
|
39
36
|
def read_wide_string_without_length
|
40
37
|
wide_character = get_bytes(0, 2)
|
41
38
|
i = 2
|
42
|
-
str =
|
39
|
+
str = []
|
43
40
|
|
44
41
|
while wide_character.encode('UTF-16LE') != END_OF_WCHAR_STRING
|
45
|
-
str
|
42
|
+
str << wide_character
|
46
43
|
wide_character = get_bytes(i, 2)
|
47
44
|
i += 2
|
48
45
|
end
|
49
|
-
str.force_encoding('UTF-16LE').encode('UTF-8')
|
46
|
+
str.join.force_encoding('UTF-16LE').encode('UTF-8')
|
50
47
|
end
|
51
48
|
|
52
49
|
def read_win32_bool
|
53
50
|
# BOOL is always a 32-bit integer in Win32
|
54
51
|
# some Win32 APIs return 1 for true, while others are non-0
|
55
|
-
read_int32 !=
|
52
|
+
read_int32 != WIN32FALSE
|
56
53
|
end
|
57
54
|
end
|
58
55
|
|
59
56
|
class Struct
|
60
57
|
def self.read_list(first_address)
|
61
58
|
instance = new(first_address)
|
62
|
-
while instance.to_ptr !=
|
59
|
+
while instance.to_ptr != Pointer::NULL
|
63
60
|
yield(instance)
|
64
61
|
instance = new(instance[:Next])
|
65
62
|
end
|
@@ -47,7 +47,7 @@ class NetworkUtils
|
|
47
47
|
|
48
48
|
def get_scope(sockaddr)
|
49
49
|
require 'socket'
|
50
|
-
scope6 =
|
50
|
+
scope6 = []
|
51
51
|
addrinfo = Addrinfo.new(['AF_INET6', 0, nil, sockaddr], :INET6)
|
52
52
|
|
53
53
|
scope6 << 'compat,' if addrinfo.ipv6_v4compat?
|
@@ -59,6 +59,7 @@ class NetworkUtils
|
|
59
59
|
'host'
|
60
60
|
else 'global'
|
61
61
|
end
|
62
|
+
scope6.join
|
62
63
|
end
|
63
64
|
end
|
64
65
|
end
|
@@ -26,7 +26,7 @@ module Facter
|
|
26
26
|
end
|
27
27
|
|
28
28
|
name_ptr = FFI::MemoryPointer.new(:wchar, size_ptr.read_uint32)
|
29
|
-
if IdentityFFI::GetUserNameExW(NAME_SAM_COMPATIBLE, name_ptr, size_ptr) == FFI::
|
29
|
+
if IdentityFFI::GetUserNameExW(NAME_SAM_COMPATIBLE, name_ptr, size_ptr) == FFI::WIN32FALSE
|
30
30
|
@log.debug "failure resolving identity facts: #{FFI.errno}"
|
31
31
|
return
|
32
32
|
end
|
@@ -36,7 +36,7 @@ module Facter
|
|
36
36
|
|
37
37
|
def privileged?
|
38
38
|
result = IdentityFFI::IsUserAnAdmin()
|
39
|
-
result && result != FFI::
|
39
|
+
result && result != FFI::WIN32FALSE
|
40
40
|
end
|
41
41
|
|
42
42
|
def retrieve_facts(fact_name)
|
@@ -17,7 +17,7 @@ module Facter
|
|
17
17
|
require "#{ROOT_DIR}/lib/resolvers/windows/ffi/memory_ffi"
|
18
18
|
|
19
19
|
state_ptr = FFI::MemoryPointer.new(PerformanceInformation.size)
|
20
|
-
if MemoryFFI::GetPerformanceInfo(state_ptr, state_ptr.size) == FFI::
|
20
|
+
if MemoryFFI::GetPerformanceInfo(state_ptr, state_ptr.size) == FFI::WIN32FALSE
|
21
21
|
@log.debug 'Resolving memory facts failed'
|
22
22
|
return
|
23
23
|
end
|
@@ -24,7 +24,7 @@ module Facter
|
|
24
24
|
end
|
25
25
|
|
26
26
|
bool_ptr = FFI::MemoryPointer.new(:win32_bool, 1)
|
27
|
-
if System32FFI::IsWow64Process(System32FFI::GetCurrentProcess(), bool_ptr) == FFI::
|
27
|
+
if System32FFI::IsWow64Process(System32FFI::GetCurrentProcess(), bool_ptr) == FFI::WIN32FALSE
|
28
28
|
@log.debug 'IsWow64Process failed'
|
29
29
|
return
|
30
30
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: facter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.0.
|
4
|
+
version: 4.0.8.pre
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Puppet
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-02-
|
11
|
+
date: 2020-02-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -80,6 +80,34 @@ dependencies:
|
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: 0.74.0
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rubocop-performance
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '1.5'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '1.5'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: rubocop-rspec
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '1.38'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '1.38'
|
83
111
|
- !ruby/object:Gem::Dependency
|
84
112
|
name: rubycritic
|
85
113
|
requirement: !ruby/object:Gem::Requirement
|
@@ -154,6 +182,7 @@ files:
|
|
154
182
|
- ".jrubyrc"
|
155
183
|
- ".rspec"
|
156
184
|
- ".rubocop.yml"
|
185
|
+
- ".rubocop_todo.yml"
|
157
186
|
- ".rubycritic.yml"
|
158
187
|
- ".travis.yml"
|
159
188
|
- CODEOWNERS
|
@@ -457,6 +486,10 @@ files:
|
|
457
486
|
- lib/facts/solaris/ruby/version.rb
|
458
487
|
- lib/facts/solaris/solaris_zones/current.rb
|
459
488
|
- lib/facts/solaris/solaris_zones/zone.rb
|
489
|
+
- lib/facts/solaris/zfs_featurenumbers.rb
|
490
|
+
- lib/facts/solaris/zfs_version.rb
|
491
|
+
- lib/facts/solaris/zpool_featurenumbers.rb
|
492
|
+
- lib/facts/solaris/zpool_version.rb
|
460
493
|
- lib/facts/windows/dhcp_servers.rb
|
461
494
|
- lib/facts/windows/dmi/manufacturer.rb
|
462
495
|
- lib/facts/windows/dmi/product/name.rb
|
@@ -558,6 +591,7 @@ files:
|
|
558
591
|
- lib/framework/core/options/helper_options.rb
|
559
592
|
- lib/framework/core/options/options_validator.rb
|
560
593
|
- lib/framework/core/options/priority_options.rb
|
594
|
+
- lib/framework/core/options/validate_options.rb
|
561
595
|
- lib/framework/detector/os_detector.rb
|
562
596
|
- lib/framework/formatters/formatter_factory.rb
|
563
597
|
- lib/framework/formatters/formatter_helper.rb
|
@@ -617,7 +651,9 @@ files:
|
|
617
651
|
- lib/resolvers/solaris/ipaddress_resolver.rb
|
618
652
|
- lib/resolvers/solaris/solaris_os_release_resolver.rb
|
619
653
|
- lib/resolvers/solaris/solaris_zone_name.rb
|
654
|
+
- lib/resolvers/solaris/zfs_resolver.rb
|
620
655
|
- lib/resolvers/solaris/zone_resolver.rb
|
656
|
+
- lib/resolvers/solaris/zpool_resolver.rb
|
621
657
|
- lib/resolvers/ssh_resolver.rb
|
622
658
|
- lib/resolvers/suse_release_resolver.rb
|
623
659
|
- lib/resolvers/sw_vers_resolver.rb
|