facter 3.12.1.cfacter.20181031 → 3.12.2.cfacter.20181217
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/ext/facter/facter/CMakeLists.txt +1 -1
- data/ext/facter/facter/acceptance/Gemfile +4 -2
- data/ext/facter/facter/acceptance/lib/helper.rb +2 -0
- data/ext/facter/facter/acceptance/tests/custom_facts/conflicts_with_builtin_fact.rb +106 -0
- data/ext/facter/facter/acceptance/tests/facts/networking_facts.rb +13 -13
- data/ext/facter/facter/lib/Doxyfile +1 -1
- data/ext/facter/facter/lib/src/ruby/fact.cc +57 -41
- data/ext/facter/leatherman/CMakeLists.txt +1 -1
- data/ext/facter/leatherman/cmake/cflags.cmake +9 -2
- data/ext/facter/leatherman/cmake/options.cmake +1 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 364520fb97a986c1682b878a85b491f6ab50c5da1ba5a74bf782636b7c29e890
|
4
|
+
data.tar.gz: 07c221de09300211796b4cdec443ca96486da6df7368687ad4b74869ab221188
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 49033dc14634dce2a4c1a2c1c37f919fe6ac9d7f3d0cf4cf48e5038b7708e3fc11d4a9e1488249443198fc635f4080976b33d637ba25dc97efabde957258f004
|
7
|
+
data.tar.gz: 260954f857485b92e261a04978d6447c844bc4f3af2d1d023afd13104aa6844240d7521d7557fbf54a21c423f0795db29a3f6f400e604df1836602da5ca42885
|
@@ -10,10 +10,12 @@ def location_for(place, fake_version = nil)
|
|
10
10
|
end
|
11
11
|
end
|
12
12
|
|
13
|
-
gem "beaker", *location_for(ENV['BEAKER_VERSION'] || "~>
|
14
|
-
gem 'beaker-puppet', *location_for(ENV['BEAKER_PUPPET_VERSION'] || '~>
|
13
|
+
gem "beaker", *location_for(ENV['BEAKER_VERSION'] || "~> 4")
|
14
|
+
gem 'beaker-puppet', *location_for(ENV['BEAKER_PUPPET_VERSION'] || '~> 1')
|
15
15
|
gem "beaker-hostgenerator", *location_for(ENV['BEAKER_HOSTGENERATOR_VERSION'] || "~> 1.1")
|
16
16
|
gem "beaker-abs", *location_for(ENV['BEAKER_ABS_VERSION'] || "~> 0.5")
|
17
|
+
gem "beaker-vagrant", *location_for(ENV['BEAKER_VAGRANT_VERSION'] || "~> 0")
|
18
|
+
gem "beaker-vmpooler", *location_for(ENV['BEAKER_VMPOOLER_VERSION'] || "~> 1")
|
17
19
|
gem 'rake', "~> 10.1.0"
|
18
20
|
gem "multi_json", "~> 1.8"
|
19
21
|
|
@@ -0,0 +1,106 @@
|
|
1
|
+
test_name 'Facter should appropriately resolve a custom fact when it conflicts with a builtin fact' do
|
2
|
+
tag 'risk:medium'
|
3
|
+
|
4
|
+
def create_custom_fact_on(host, custom_fact_dir, fact_file_name, fact)
|
5
|
+
fact_file_contents = <<-CUSTOM_FACT
|
6
|
+
Facter.add(:#{fact[:name]}) do
|
7
|
+
has_weight #{fact[:weight]}
|
8
|
+
setcode do
|
9
|
+
#{fact[:value]}
|
10
|
+
end
|
11
|
+
end
|
12
|
+
CUSTOM_FACT
|
13
|
+
|
14
|
+
fact_file_path = File.join(custom_fact_dir, fact_file_name)
|
15
|
+
create_remote_file(host, fact_file_path, fact_file_contents)
|
16
|
+
end
|
17
|
+
|
18
|
+
def clear_custom_facts_on(host, custom_fact_dir)
|
19
|
+
step "Clean-up the previous test's custom facts" do
|
20
|
+
on(agent, "rm -f #{custom_fact_dir}/*")
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
agents.each do |agent|
|
25
|
+
custom_fact_dir = agent.tmpdir('facter')
|
26
|
+
teardown do
|
27
|
+
on(agent, "rm -rf '#{custom_fact_dir}'")
|
28
|
+
end
|
29
|
+
|
30
|
+
fact_name = 'timezone'
|
31
|
+
builtin_value = on(agent, facter('timezone')).stdout.chomp
|
32
|
+
|
33
|
+
step "Verify that Facter uses the custom fact's value when its weight is > 0" do
|
34
|
+
custom_fact_value = "custom_timezone"
|
35
|
+
create_custom_fact_on(
|
36
|
+
agent,
|
37
|
+
custom_fact_dir,
|
38
|
+
'custom_timezone.rb',
|
39
|
+
name: fact_name,
|
40
|
+
weight: 10,
|
41
|
+
value: "'#{custom_fact_value}'"
|
42
|
+
)
|
43
|
+
|
44
|
+
on(agent, facter("--custom-dir=#{custom_fact_dir} timezone")) do |result|
|
45
|
+
assert_match(/#{custom_fact_value}/, result.stdout.chomp, "Facter does not use the custom fact's value when its weight is > 0")
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
clear_custom_facts_on(agent, custom_fact_dir)
|
50
|
+
|
51
|
+
step "Verify that Facter uses the builtin fact's value when all conflicting custom facts fail to resolve" do
|
52
|
+
[ 'timezone_one.rb', 'timezone_two.rb'].each do |fact_file|
|
53
|
+
create_custom_fact_on(
|
54
|
+
agent,
|
55
|
+
custom_fact_dir,
|
56
|
+
fact_file,
|
57
|
+
{ name: fact_name, weight: 10, value: nil }
|
58
|
+
)
|
59
|
+
end
|
60
|
+
|
61
|
+
on(agent, facter("--custom-dir=#{custom_fact_dir} timezone")) do |result|
|
62
|
+
assert_match(/#{builtin_value}/, result.stdout.chomp, "Facter does not use the builtin fact's value when all conflicting custom facts fail to resolve")
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
step "Verify that Facter gives precedence to the builtin fact over zero weight custom facts" do
|
67
|
+
step "when all custom facts have zero weight" do
|
68
|
+
{
|
69
|
+
'timezone_one.rb' => "'timezone_one'",
|
70
|
+
'timezone_two.rb' => "'timezone_two'"
|
71
|
+
}.each do |fact_file, fact_value|
|
72
|
+
create_custom_fact_on(
|
73
|
+
agent,
|
74
|
+
custom_fact_dir,
|
75
|
+
fact_file,
|
76
|
+
{ name: fact_name, weight: 0, value: fact_value }
|
77
|
+
)
|
78
|
+
end
|
79
|
+
|
80
|
+
on(agent, facter("--custom-dir=#{custom_fact_dir} timezone")) do |result|
|
81
|
+
assert_match(/#{builtin_value}/, result.stdout.chomp, "Facter does not give precedence to the builtin fact when all custom facts have zero weight")
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
clear_custom_facts_on(agent, custom_fact_dir)
|
86
|
+
|
87
|
+
step "when some custom facts have zero weight" do
|
88
|
+
{
|
89
|
+
'timezone_one.rb' => { weight: 10, value: nil },
|
90
|
+
'timezone_two.rb' => { weight: 0, value: "'timezone_two'" }
|
91
|
+
}.each do |fact_file, fact|
|
92
|
+
create_custom_fact_on(
|
93
|
+
agent,
|
94
|
+
custom_fact_dir,
|
95
|
+
fact_file,
|
96
|
+
fact.merge(name: fact_name)
|
97
|
+
)
|
98
|
+
end
|
99
|
+
|
100
|
+
on(agent, facter("--custom-dir=#{custom_fact_dir} timezone")) do |result|
|
101
|
+
assert_match(/#{builtin_value}/, result.stdout.chomp, "Facter does not give precedence to the builtin fact when only some custom facts have zero weight")
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
@@ -26,12 +26,12 @@ test_name 'C59029: networking facts should be fully populated' do
|
|
26
26
|
refute_empty(primary_interface)
|
27
27
|
|
28
28
|
expected_bindings = {
|
29
|
-
"
|
30
|
-
"
|
31
|
-
"
|
32
|
-
"
|
33
|
-
"
|
34
|
-
"
|
29
|
+
"networking.interfaces.#{primary_interface}.bindings.0.address" => @ip_regex,
|
30
|
+
"networking.interfaces.#{primary_interface}.bindings.0.netmask" => @netmask_regex,
|
31
|
+
"networking.interfaces.#{primary_interface}.bindings.0.network" => @ip_regex,
|
32
|
+
"networking.interfaces.#{primary_interface}.bindings6.0.address" => /[a-f0-9:]+/,
|
33
|
+
"networking.interfaces.#{primary_interface}.bindings6.0.netmask" => /[a-f0-9:]+/,
|
34
|
+
"networking.interfaces.#{primary_interface}.bindings6.0.network" => /[a-f0-9:]+/
|
35
35
|
}
|
36
36
|
|
37
37
|
if agent['platform'] =~ /eos|solaris|aix|cisco/
|
@@ -41,9 +41,9 @@ test_name 'C59029: networking facts should be fully populated' do
|
|
41
41
|
expected_networking.delete("networking.network6")
|
42
42
|
|
43
43
|
#remove invalid bindings for the primary networking interface eccentric platforms
|
44
|
-
expected_bindings.delete("
|
45
|
-
expected_bindings.delete("
|
46
|
-
expected_bindings.delete("
|
44
|
+
expected_bindings.delete("networking.interfaces.#{primary_interface}.bindings6.0.address")
|
45
|
+
expected_bindings.delete("networking.interfaces.#{primary_interface}.bindings6.0.netmask")
|
46
|
+
expected_bindings.delete("networking.interfaces.#{primary_interface}.bindings6.0.network")
|
47
47
|
end
|
48
48
|
|
49
49
|
if agent['platform'] =~ /aix|sparc|cisco|huawei|sles|s390x/
|
@@ -57,19 +57,19 @@ test_name 'C59029: networking facts should be fully populated' do
|
|
57
57
|
expected_networking.delete("networking.netmask")
|
58
58
|
|
59
59
|
#remove invalid bindings for Cisco's primary networking interface
|
60
|
-
expected_bindings.delete("
|
61
|
-
expected_bindings.delete("
|
60
|
+
expected_bindings.delete("networking.interfaces.#{primary_interface}.bindings.0.netmask")
|
61
|
+
expected_bindings.delete("networking.interfaces.#{primary_interface}.bindings.0.network")
|
62
62
|
end
|
63
63
|
|
64
64
|
step "Ensure the Networking fact resolves with reasonable values for at least one interface" do
|
65
65
|
expected_networking.each do |fact, value|
|
66
|
-
assert_match(value, fact_on(agent, fact))
|
66
|
+
assert_match(value, fact_on(agent, fact).to_s)
|
67
67
|
end
|
68
68
|
end
|
69
69
|
|
70
70
|
step "Ensure bindings for the primary networking interface are present" do
|
71
71
|
expected_bindings.each do |fact, value|
|
72
|
-
assert_match(value, fact_on(agent, fact))
|
72
|
+
assert_match(value, fact_on(agent, fact).to_s)
|
73
73
|
end
|
74
74
|
end
|
75
75
|
end
|
@@ -38,7 +38,7 @@ PROJECT_NAME = facter
|
|
38
38
|
# could be handy for archiving the generated documentation or if some version
|
39
39
|
# control system is used.
|
40
40
|
|
41
|
-
PROJECT_NUMBER = 3.12.
|
41
|
+
PROJECT_NUMBER = 3.12.2
|
42
42
|
|
43
43
|
# Using the PROJECT_BRIEF tag one can provide an optional one line description
|
44
44
|
# for a project that appears at the top of each page and should give viewer a
|
@@ -83,53 +83,69 @@ namespace facter { namespace ruby {
|
|
83
83
|
});
|
84
84
|
|
85
85
|
_resolving = true;
|
86
|
-
|
87
|
-
// If no resolutions or the top resolution has a weight of 0, first check the native collection for the fact
|
88
|
-
// This way we treat the "built-in" as implicitly having a resolution with weight 0
|
89
86
|
bool add = true;
|
90
|
-
if (_resolutions.empty() || ruby.to_native<resolution>(_resolutions.front())->weight() == 0) {
|
91
|
-
// Check to see the value is in the collection
|
92
|
-
auto value = facts[ruby.to_string(_name)];
|
93
|
-
if (value) {
|
94
|
-
// Already in collection, do not add
|
95
|
-
add = false;
|
96
|
-
_value = facter->to_ruby(value);
|
97
|
-
_weight = value->weight();
|
98
|
-
}
|
99
|
-
}
|
100
87
|
|
101
|
-
|
102
|
-
|
103
|
-
ruby.
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
break;
|
117
|
-
}
|
88
|
+
vector<VALUE>::iterator it;
|
89
|
+
ruby.rescue([&]() {
|
90
|
+
volatile VALUE value = ruby.nil_value();
|
91
|
+
size_t weight = 0;
|
92
|
+
|
93
|
+
// Look through the resolutions and find the first allowed resolution that resolves
|
94
|
+
for (it = _resolutions.begin(); it != _resolutions.end(); ++it) {
|
95
|
+
auto res = ruby.to_native<resolution>(*it);
|
96
|
+
if (!res->suitable(*facter)) {
|
97
|
+
continue;
|
98
|
+
}
|
99
|
+
value = res->value();
|
100
|
+
if (!ruby.is_nil(value)) {
|
101
|
+
weight = res->weight();
|
102
|
+
break;
|
118
103
|
}
|
104
|
+
}
|
119
105
|
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
return 0;
|
124
|
-
}, [&](VALUE ex) {
|
125
|
-
LOG_ERROR("error while resolving custom fact \"{1}\": {2}", ruby.rb_string_value_ptr(&_name), ruby.exception_to_string(ex));
|
106
|
+
// Set the value to what was resolved
|
107
|
+
_value = value;
|
108
|
+
_weight = weight;
|
126
109
|
|
127
|
-
|
128
|
-
_value = ruby.nil_value();
|
129
|
-
_weight = 0;
|
110
|
+
if (! ruby.is_nil(_value) && _weight != 0) {
|
130
111
|
return 0;
|
131
|
-
}
|
132
|
-
|
112
|
+
}
|
113
|
+
|
114
|
+
// There's two possibilities here:
|
115
|
+
// 1. None of our resolvers could resolve the value
|
116
|
+
// 2. A resolver of weight 0 resolved the value
|
117
|
+
//
|
118
|
+
// In both cases, we attempt to use the "built-in" fact's
|
119
|
+
// value. This serves as a fallback resolver for Case (1)
|
120
|
+
// while for Case (2), we want built-in values to take
|
121
|
+
// precedence over 0-weight custom facts.
|
122
|
+
|
123
|
+
auto builtin_value = facts[ruby.to_string(_name)];
|
124
|
+
if (! builtin_value) {
|
125
|
+
return 0;
|
126
|
+
}
|
127
|
+
auto builtin_ruby_value = facter->to_ruby(builtin_value);
|
128
|
+
|
129
|
+
// We need this check for Case (2). Otherwise, we risk
|
130
|
+
// overwriting our resolved value in the small chance
|
131
|
+
// that builtin_value exists, but its ruby value is
|
132
|
+
// nil.
|
133
|
+
if (! ruby.is_nil(builtin_ruby_value)) {
|
134
|
+
// Already in collection, do not add
|
135
|
+
add = false;
|
136
|
+
_value = builtin_ruby_value;
|
137
|
+
_weight = builtin_value->weight();
|
138
|
+
}
|
139
|
+
|
140
|
+
return 0;
|
141
|
+
}, [&](VALUE ex) {
|
142
|
+
LOG_ERROR("error while resolving custom fact \"{1}\": {2}", ruby.rb_string_value_ptr(&_name), ruby.exception_to_string(ex));
|
143
|
+
|
144
|
+
// Failed, so set to nil
|
145
|
+
_value = ruby.nil_value();
|
146
|
+
_weight = 0;
|
147
|
+
return 0;
|
148
|
+
});
|
133
149
|
|
134
150
|
if (add) {
|
135
151
|
facts.add_custom(ruby.to_string(_name), ruby.is_nil(_value) ? nullptr : make_value<ruby::ruby_value>(_value), _weight);
|
@@ -2,7 +2,10 @@
|
|
2
2
|
# Each of our project dirs sets CMAKE_CXX_FLAGS based on these. We do
|
3
3
|
# not set CMAKE_CXX_FLAGS globally because gtest is not warning-clean.
|
4
4
|
if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "\\w*Clang")
|
5
|
-
|
5
|
+
if (ENABLE_CXX_WERROR)
|
6
|
+
set(CMAKE_CXX_FLAGS "-Werror ${CMAKE_CXX_FLAGS}")
|
7
|
+
endif()
|
8
|
+
set(LEATHERMAN_CXX_FLAGS "-std=c++11 -Wall -Wextra -Wno-unused-parameter -Wno-tautological-constant-out-of-range-compare ${CMAKE_CXX_FLAGS}")
|
6
9
|
|
7
10
|
# Clang warns that 'register' is deprecated; 'register' is used throughout boost, so it can't be an error yet.
|
8
11
|
# The warning flag is different on different clang versions so we need to extract the clang version.
|
@@ -40,8 +43,12 @@ elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
|
|
40
43
|
# it's also sometimes wrong
|
41
44
|
set(CMAKE_CXX_FLAGS "-Wno-maybe-uninitialized ${CMAKE_CXX_FLAGS}")
|
42
45
|
|
46
|
+
if (ENABLE_CXX_WERROR)
|
47
|
+
set(CMAKE_CXX_FLAGS "-Werror ${CMAKE_CXX_FLAGS}")
|
48
|
+
endif()
|
49
|
+
|
43
50
|
# missing-field-initializers is disabled because GCC can't make up their mind how to treat C++11 initializers
|
44
|
-
set(LEATHERMAN_CXX_FLAGS "-std=c++11 -Wall -
|
51
|
+
set(LEATHERMAN_CXX_FLAGS "-std=c++11 -Wall -Wno-unused-parameter -Wno-unused-local-typedefs -Wno-unknown-pragmas -Wno-missing-field-initializers ${CMAKE_CXX_FLAGS}")
|
45
52
|
if (NOT "${CMAKE_SYSTEM_NAME}" MATCHES "SunOS")
|
46
53
|
set(LEATHERMAN_CXX_FLAGS "-Wextra ${LEATHERMAN_CXX_FLAGS}")
|
47
54
|
endif()
|
@@ -1,4 +1,5 @@
|
|
1
1
|
include(leatherman)
|
2
|
+
defoption(ENABLE_CXX_WERROR "Enables the -Werror compiler option" ON)
|
2
3
|
defoption(COVERALLS "Generate code coverage using Coveralls.io" OFF)
|
3
4
|
defoption(BOOST_STATIC "Use Boost's static libraries" OFF)
|
4
5
|
defoption(CURL_STATIC "Use curl's static libraries" OFF)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: facter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.12.
|
4
|
+
version: 3.12.2.cfacter.20181217
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Puppet
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2018-
|
12
|
+
date: 2018-12-17 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description:
|
15
15
|
email: info@puppet.com
|
@@ -203,6 +203,7 @@ files:
|
|
203
203
|
- ext/facter/facter/acceptance/lib/puppet/acceptance/common_utils.rb
|
204
204
|
- ext/facter/facter/acceptance/lib/puppet/acceptance/git_utils.rb
|
205
205
|
- ext/facter/facter/acceptance/lib/puppet/acceptance/install_utils.rb
|
206
|
+
- ext/facter/facter/acceptance/tests/custom_facts/conflicts_with_builtin_fact.rb
|
206
207
|
- ext/facter/facter/acceptance/tests/custom_facts/custom_fact_with_10001_weight_overrides_external_fact.rb
|
207
208
|
- ext/facter/facter/acceptance/tests/custom_facts/having_multiple_facts_in_one_file.rb
|
208
209
|
- ext/facter/facter/acceptance/tests/custom_facts/using_win32ole_should_not_hang.rb
|