facterdb 1.21.0 → 1.22.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/.github/dependabot.yml +17 -0
- data/.github/workflows/release.yml +3 -3
- data/.github/workflows/test.yml +28 -5
- data/.rubocop.yml +5 -0
- data/.rubocop_todo.yml +239 -0
- data/CHANGELOG.md +16 -0
- data/Gemfile +1 -5
- data/README.md +124 -122
- data/Rakefile +56 -51
- data/facterdb.gemspec +7 -7
- data/facts/4.1/centos-7-x86_64.facts +582 -0
- data/facts/4.1/debian-10-x86_64.facts +519 -0
- data/facts/4.2/debian-12-i386.facts +593 -0
- data/facts/4.2/debian-12-x86_64.facts +593 -0
- data/facts/4.2/fedora-38-x86_64.facts +656 -0
- data/facts/4.3/almalinux-8-x86_64.facts +551 -0
- data/facts/4.3/almalinux-9-x86_64.facts +525 -0
- data/facts/4.3/centos-7-x86_64.facts +592 -0
- data/facts/4.3/debian-10-x86_64.facts +526 -0
- data/facts/4.3/debian-11-x86_64.facts +521 -0
- data/facts/4.3/debian-12-i386.facts +593 -0
- data/facts/4.3/debian-12-x86_64.facts +593 -0
- data/facts/4.3/fedora-36-x86_64.facts +507 -0
- data/facts/4.3/fedora-37-x86_64.facts +512 -0
- data/facts/4.3/fedora-38-x86_64.facts +656 -0
- data/facts/4.3/opensuse-15-x86_64.facts +533 -0
- data/facts/4.3/redhat-8-x86_64.facts +526 -0
- data/facts/4.3/rocky-8-x86_64.facts +545 -0
- data/facts/4.3/rocky-9-x86_64.facts +626 -0
- data/facts/4.3/sles-12-x86_64.facts +908 -0
- data/facts/4.3/ubuntu-18.04-x86_64.facts +557 -0
- data/facts/4.3/ubuntu-20.04-x86_64.facts +647 -0
- data/facts/4.3/ubuntu-22.04-x86_64.facts +655 -0
- data/facts/4.3/windows-10-x86_64.facts +182 -0
- data/facts/4.3/windows-11-x86_64.facts +182 -0
- data/facts/4.3/windows-2012 r2-x86_64.facts +179 -0
- data/facts/4.3/windows-2012-x86_64.facts +179 -0
- data/facts/4.3/windows-2016-core-x86_64.facts +181 -0
- data/facts/4.3/windows-2016-x86_64.facts +181 -0
- data/facts/4.3/windows-2019-core-x86_64.facts +181 -0
- data/facts/4.3/windows-2019-x86_64.facts +181 -0
- data/facts/4.3/windows-2022-core-x86_64.facts +183 -0
- data/facts/4.3/windows-2022-x86_64.facts +183 -0
- data/facts/4.4/almalinux-8-x86_64.facts +551 -0
- data/facts/4.4/almalinux-9-x86_64.facts +525 -0
- data/facts/4.4/centos-7-x86_64.facts +592 -0
- data/facts/4.4/debian-10-x86_64.facts +526 -0
- data/facts/4.4/debian-11-x86_64.facts +521 -0
- data/facts/4.4/debian-12-i386.facts +593 -0
- data/facts/4.4/debian-12-x86_64.facts +593 -0
- data/facts/4.4/fedora-36-x86_64.facts +507 -0
- data/facts/4.4/fedora-37-x86_64.facts +512 -0
- data/facts/4.4/fedora-38-x86_64.facts +656 -0
- data/facts/4.4/opensuse-15-x86_64.facts +514 -0
- data/facts/4.4/redhat-8-x86_64.facts +526 -0
- data/facts/4.4/rocky-8-x86_64.facts +545 -0
- data/facts/4.4/rocky-9-x86_64.facts +626 -0
- data/facts/4.4/sles-12-x86_64.facts +908 -0
- data/facts/4.4/ubuntu-18.04-x86_64.facts +557 -0
- data/facts/4.4/ubuntu-20.04-x86_64.facts +647 -0
- data/facts/4.4/ubuntu-22.04-x86_64.facts +655 -0
- data/facts/4.4/windows-10-x86_64.facts +182 -0
- data/facts/4.4/windows-11-x86_64.facts +186 -0
- data/facts/4.4/windows-2012 r2-x86_64.facts +179 -0
- data/facts/4.4/windows-2012-x86_64.facts +179 -0
- data/facts/4.4/windows-2016-core-x86_64.facts +181 -0
- data/facts/4.4/windows-2016-x86_64.facts +181 -0
- data/facts/4.4/windows-2019-core-x86_64.facts +181 -0
- data/facts/4.4/windows-2019-x86_64.facts +181 -0
- data/facts/4.4/windows-2022-core-x86_64.facts +183 -0
- data/facts/4.4/windows-2022-x86_64.facts +183 -0
- data/facts/Gemfile +3 -7
- data/facts/Vagrantfile +313 -298
- data/facts/get_facts.sh +67 -9
- data/lib/facterdb/bin.rb +1 -1
- data/lib/facterdb/version.rb +1 -1
- data/lib/facterdb.rb +40 -32
- data/rakelib/rhel_alts.rake +8 -14
- data/spec/facterdb_spec.rb +37 -37
- data/spec/facts_spec.rb +13 -7
- metadata +84 -6
data/facts/get_facts.sh
CHANGED
@@ -65,7 +65,7 @@ case "${osfamily}" in
|
|
65
65
|
wget "http://yum.puppetlabs.com/puppet7-release-el-${operatingsystemmajrelease}.noarch.rpm" -O /tmp/puppet7-release.rpm
|
66
66
|
if test -f /tmp/puppet7-release.rpm; then
|
67
67
|
rpm -ivh /tmp/puppet7-release.rpm
|
68
|
-
for puppet_agent_version in 7.5.0 7.6.1 7.17.0; do
|
68
|
+
for puppet_agent_version in 7.5.0 7.6.1 7.17.0 7.24.0; do
|
69
69
|
if yum install -y puppet-agent-${puppet_agent_version}; then
|
70
70
|
output_file="/vagrant/$(facter --version | cut -d. -f1,2)/$(facter operatingsystem | tr '[:upper:]' '[:lower:]')-$(facter operatingsystemmajrelease)-$(facter hardwaremodel).facts"
|
71
71
|
mkdir -p $(dirname ${output_file})
|
@@ -74,15 +74,29 @@ case "${osfamily}" in
|
|
74
74
|
done
|
75
75
|
yum remove -y puppet7-release
|
76
76
|
fi
|
77
|
+
wget "http://yum.puppetlabs.com/puppet8-release-el-${operatingsystemmajrelease}.noarch.rpm" -O /tmp/puppet8-release.rpm
|
78
|
+
if test -f /tmp/puppet8-release.rpm; then
|
79
|
+
rpm -ivh /tmp/puppet8-release.rpm
|
80
|
+
for puppet_agent_version in 8.0.0; do
|
81
|
+
if yum install -y puppet-agent-${puppet_agent_version}; then
|
82
|
+
output_file="/vagrant/$(facter --version | cut -d. -f1,2)/$(facter os.name | tr '[:upper:]' '[:lower:]')-$(facter os.release.major)-$(facter os.hardware).facts"
|
83
|
+
mkdir -p $(dirname ${output_file})
|
84
|
+
facter --show-legacy -p -j | tee ${output_file}
|
85
|
+
fi
|
86
|
+
done
|
87
|
+
yum remove -y puppet8-release
|
88
|
+
fi
|
77
89
|
;;
|
78
90
|
'Debian')
|
79
|
-
apt_install curl
|
91
|
+
apt_install curl file
|
80
92
|
curl "https://apt.puppetlabs.com/puppet6-release-${lsbdistcodename}.deb" -o /tmp/puppet6-release.deb
|
81
93
|
# apt.puppetlabs.com returns an html document if the requested deb doesn't exist and /tmp/puppet6-release.deb will be an html doc
|
82
94
|
if test "$?" -eq 0 -a -f /tmp/puppet6-release.deb && [[ "$(file -b /tmp/puppet6-release.deb)" =~ "Debian binary package".* ]] ; then
|
83
95
|
dpkg --install /tmp/puppet6-release.deb
|
84
96
|
apt-get update
|
85
|
-
|
97
|
+
# as of 2023-04-27 older 6.x series aren't available (i.e. facter 3.12)
|
98
|
+
# the trailing dot is so that 6.4.* is the match so we get the last in the 6.4 series and not 6.40
|
99
|
+
for puppet_agent_version in 6.4. 6.28.; do
|
86
100
|
if apt_install puppet-agent=${puppet_agent_version}*; then
|
87
101
|
output_file="/vagrant/$(facter --version | cut -d. -f1,2)/$(facter operatingsystem | tr '[:upper:]' '[:lower:]')-$(facter operatingsystemmajrelease)-$(facter hardwaremodel).facts"
|
88
102
|
mkdir -p $(dirname ${output_file})
|
@@ -93,10 +107,10 @@ case "${osfamily}" in
|
|
93
107
|
fi
|
94
108
|
curl "https://apt.puppetlabs.com/puppet7-release-${lsbdistcodename}.deb" -o /tmp/puppet7-release.deb
|
95
109
|
# apt.puppetlabs.com returns an html document if the requested deb doesn't exist and /tmp/puppet6-release.deb will be an html doc
|
96
|
-
if test "$?" -eq 0 -a -f /tmp/puppet7-release.deb && [[ "$(file -b /tmp/
|
110
|
+
if test "$?" -eq 0 -a -f /tmp/puppet7-release.deb && [[ "$(file -b /tmp/puppet7-release.deb)" =~ "Debian binary package".* ]] ; then
|
97
111
|
dpkg --install /tmp/puppet7-release.deb
|
98
112
|
apt-get update
|
99
|
-
for puppet_agent_version in 7.5.0 7.6.1 7.12.0; do
|
113
|
+
for puppet_agent_version in 7.5.0 7.6.1 7.12.0 7.24.0; do
|
100
114
|
if apt_install puppet-agent=${puppet_agent_version}*; then
|
101
115
|
output_file="/vagrant/$(facter --version | cut -d. -f1,2)/$(facter operatingsystem | tr '[:upper:]' '[:lower:]')-$(facter operatingsystemmajrelease)-$(facter hardwaremodel).facts"
|
102
116
|
mkdir -p $(dirname ${output_file})
|
@@ -105,7 +119,29 @@ case "${osfamily}" in
|
|
105
119
|
done
|
106
120
|
apt-get -y remove --purge puppet7-release
|
107
121
|
fi
|
108
|
-
|
122
|
+
curl "https://apt.puppetlabs.com/puppet8-release-${lsbdistcodename}.deb" -o /tmp/puppet8-release.deb
|
123
|
+
# apt.puppetlabs.com returns an html document if the requested deb doesn't exist and /tmp/puppet6-release.deb will be an html doc
|
124
|
+
if test "$?" -eq 0 -a -f /tmp/puppet8-release.deb && [[ "$(file -b /tmp/puppet8-release.deb)" =~ "Debian binary package".* ]] ; then
|
125
|
+
dpkg --install /tmp/puppet8-release.deb
|
126
|
+
apt-get update
|
127
|
+
for puppet_agent_version in 8.0.0; do
|
128
|
+
if apt_install puppet-agent=${puppet_agent_version}*; then
|
129
|
+
output_file="/vagrant/$(facter --version | cut -d. -f1,2)/$(facter os.name | tr '[:upper:]' '[:lower:]')-$(facter os.release.major)-$(facter os.hardware).facts"
|
130
|
+
mkdir -p $(dirname ${output_file})
|
131
|
+
facter --show-legacy -p -j | tee ${output_file}
|
132
|
+
fi
|
133
|
+
done
|
134
|
+
apt-get -y remove --purge puppet8-release
|
135
|
+
fi
|
136
|
+
# libc6-dev needed to build the ffi gem
|
137
|
+
apt_install make gcc libgmp-dev libc6-dev
|
138
|
+
|
139
|
+
# puppetlabs repos/packages not yet available on bookworm https://puppet.atlassian.net/browse/PA-4995
|
140
|
+
# simply install puppet-agent that comes with the distro
|
141
|
+
if [[ "bookworm" =~ ${lsbdistcodename} ]]; then
|
142
|
+
apt_install ruby rubygems ruby-dev
|
143
|
+
facter --show-legacy -p -j | tee ${output_file}
|
144
|
+
fi
|
109
145
|
|
110
146
|
# There are no puppet-agent packages for $releasename yet, so generate a Facter 3.x
|
111
147
|
# fact set from the official Debian package.
|
@@ -151,7 +187,7 @@ case "${osfamily}" in
|
|
151
187
|
http_method='https'
|
152
188
|
fi
|
153
189
|
if rpm -Uvh ${http_method}://yum.puppet.com/puppet6-release-sles-${operatingsystemmajrelease}.noarch.rpm; then
|
154
|
-
for puppet_agent_version in 6.
|
190
|
+
for puppet_agent_version in 6.25.0 6.27.1; do
|
155
191
|
if zypper --gpg-auto-import-keys --non-interactive install puppet-agent-${puppet_agent_version}; then
|
156
192
|
output_file="/vagrant/$(facter --version | cut -d. -f1,2)/$(facter operatingsystem | tr '[:upper:]' '[:lower:]')-$(facter operatingsystemmajrelease)-$(facter hardwaremodel).facts"
|
157
193
|
mkdir -p $(dirname ${output_file})
|
@@ -160,6 +196,26 @@ case "${osfamily}" in
|
|
160
196
|
done
|
161
197
|
zypper --non-interactive remove puppet6-release
|
162
198
|
fi
|
199
|
+
if rpm -Uvh ${http_method}://yum.puppet.com/puppet7-release-sles-${operatingsystemmajrelease}.noarch.rpm; then
|
200
|
+
for puppet_agent_version in 7.5.0 7.6.1 7.12.0 7.24.0; do
|
201
|
+
if zypper --gpg-auto-import-keys --non-interactive install puppet-agent-${puppet_agent_version}; then
|
202
|
+
output_file="/vagrant/$(facter --version | cut -d. -f1,2)/$(facter operatingsystem | tr '[:upper:]' '[:lower:]')-$(facter operatingsystemmajrelease)-$(facter hardwaremodel).facts"
|
203
|
+
mkdir -p $(dirname ${output_file})
|
204
|
+
facter --show-legacy -p -j | tee ${output_file}
|
205
|
+
fi
|
206
|
+
done
|
207
|
+
zypper --non-interactive remove puppet7-release
|
208
|
+
fi
|
209
|
+
if rpm -Uvh ${http_method}://yum.puppet.com/puppet8-release-sles-${operatingsystemmajrelease}.noarch.rpm; then
|
210
|
+
for puppet_agent_version in 8.0.0; do
|
211
|
+
if zypper --gpg-auto-import-keys --non-interactive install puppet-agent-${puppet_agent_version}; then
|
212
|
+
output_file="/vagrant/$(facter --version | cut -d. -f1,2)/$(facter operatingsystem | tr '[:upper:]' '[:lower:]')-$(facter operatingsystemmajrelease)-$(facter hardwaremodel).facts"
|
213
|
+
mkdir -p $(dirname ${output_file})
|
214
|
+
facter --show-legacy -p -j | tee ${output_file}
|
215
|
+
fi
|
216
|
+
done
|
217
|
+
zypper --non-interactive remove puppet8-release
|
218
|
+
fi
|
163
219
|
;;
|
164
220
|
'Archlinux')
|
165
221
|
pacman -Syu --noconfirm ruby puppet ruby-bundler base-devel dnsutils facter
|
@@ -174,6 +230,9 @@ case "${osfamily}" in
|
|
174
230
|
facter --show-legacy -p -j | tee ${output_file}
|
175
231
|
esac
|
176
232
|
|
233
|
+
# this lower section relies on the ruby version and facter version that came
|
234
|
+
# with the last installed puppet_agent per above
|
235
|
+
# puppet-agent 8.0.0 has ruby 3.2.2 and it cant install 4.0.0, 4.1.0 facter gem
|
177
236
|
operatingsystem=$(facter operatingsystem | tr '[:upper:]' '[:lower:]')
|
178
237
|
operatingsystemrelease=$(facter operatingsystemrelease)
|
179
238
|
operatingsystemmajrelease=$(facter operatingsystemmajrelease)
|
@@ -190,7 +249,7 @@ else
|
|
190
249
|
fi
|
191
250
|
bundle install --path vendor/bundler
|
192
251
|
|
193
|
-
for version in 4.0.0 4.1.0 4.2.0; do
|
252
|
+
for version in 4.0.0 4.1.0 4.2.0 4.3.0 4.4.0; do
|
194
253
|
FACTER_GEM_VERSION="~> ${version}" bundle update
|
195
254
|
# sometimes all versions of facter are not possible, if the bundle update fails, skip the rest of the loop
|
196
255
|
if [ $? -ne 0 ]; then
|
@@ -223,4 +282,3 @@ for version in 4.0.0 4.1.0 4.2.0; do
|
|
223
282
|
FACTER_GEM_VERSION="~> ${version}" bundle exec facter --show-legacy --json | bundle exec ruby -e 'require "json"; jj JSON.parse gets' | tee $output_file ||
|
224
283
|
FACTER_GEM_VERSION="~> ${version}" bundle exec facter --show-legacy --json | tee $output_file
|
225
284
|
done
|
226
|
-
|
data/lib/facterdb/bin.rb
CHANGED
data/lib/facterdb/version.rb
CHANGED
data/lib/facterdb.rb
CHANGED
@@ -6,7 +6,7 @@ module FacterDB
|
|
6
6
|
class InvalidFilter < RuntimeError; end
|
7
7
|
end
|
8
8
|
|
9
|
-
# @return [String]
|
9
|
+
# @return [String] returns a giant incomprehensible string of concatenated json data
|
10
10
|
def self.database
|
11
11
|
@database ||= "[#{facterdb_fact_files.map { |f| read_json_file(f) }.join(',')}]\n"
|
12
12
|
end
|
@@ -18,14 +18,14 @@ module FacterDB
|
|
18
18
|
Thread.current[:facterdb_last_facts_seen] = nil
|
19
19
|
end
|
20
20
|
|
21
|
-
# @return [Boolean]
|
21
|
+
# @return [Boolean] returns true if we should use the default facterdb database, false otherwise
|
22
22
|
# @note If the user passes anything to the FACTERDB_SKIP_DEFAULTDB environment variable we assume
|
23
23
|
# they want to skip the default db
|
24
24
|
def self.use_defaultdb?
|
25
25
|
ENV['FACTERDB_SKIP_DEFAULTDB'].nil?
|
26
26
|
end
|
27
27
|
|
28
|
-
# @return [Boolean]
|
28
|
+
# @return [Boolean] returns true if we should inject the source file name and file path into the json factsets.
|
29
29
|
# The default is false.
|
30
30
|
def self.inject_source?
|
31
31
|
!ENV['FACTERDB_INJECT_SOURCE'].nil?
|
@@ -34,9 +34,11 @@ module FacterDB
|
|
34
34
|
def self.read_json_file(f)
|
35
35
|
content = File.read(f)
|
36
36
|
return content unless inject_source?
|
37
|
+
|
37
38
|
# Find the opening brace
|
38
39
|
first_brace = content.index('{')
|
39
40
|
return content if first_brace.nil?
|
41
|
+
|
40
42
|
# Inject source file information
|
41
43
|
json_injection = "\"_facterdb_filename\": #{File.basename(f).to_json}, "
|
42
44
|
json_injection += "\"_facterdb_path\": #{File.expand_path(f).to_json}, "
|
@@ -44,19 +46,21 @@ module FacterDB
|
|
44
46
|
end
|
45
47
|
private_class_method :read_json_file
|
46
48
|
|
47
|
-
# @return [Array[String]]
|
49
|
+
# @return [Array[String]] list of all files found in the default facterdb facts path
|
48
50
|
def self.default_fact_files
|
49
51
|
return [] unless use_defaultdb?
|
52
|
+
|
50
53
|
proj_root = File.join(File.dirname(File.dirname(__FILE__)))
|
51
54
|
facts_dir = File.expand_path(File.join(proj_root, 'facts'))
|
52
|
-
Dir.glob(File.join(facts_dir,
|
55
|
+
Dir.glob(File.join(facts_dir, '**', '*.facts'))
|
53
56
|
end
|
54
57
|
|
55
|
-
# @return [Array[String]]
|
56
|
-
# @param fact_paths [String]
|
57
|
-
def self.external_fact_files(fact_paths = ENV
|
58
|
+
# @return [Array[String]] list of all files found in the user supplied facterdb facts path
|
59
|
+
# @param fact_paths [String] a comma separated list of paths to search for fact files
|
60
|
+
def self.external_fact_files(fact_paths = ENV.fetch('FACTERDB_SEARCH_PATHS', nil))
|
58
61
|
fact_paths ||= ''
|
59
62
|
return [] if fact_paths.empty?
|
63
|
+
|
60
64
|
paths = fact_paths.split(File::PATH_SEPARATOR).map do |fact_path|
|
61
65
|
unless File.directory?(fact_path)
|
62
66
|
warn("[FACTERDB] Ignoring external facts path #{fact_path} as it is not a directory")
|
@@ -68,33 +72,36 @@ module FacterDB
|
|
68
72
|
Dir.glob(paths)
|
69
73
|
end
|
70
74
|
|
71
|
-
# @return [Array[String]]
|
75
|
+
# @return [Array[String]] list of all files found in the default facterdb facts path and user supplied path
|
72
76
|
# @note external fact files supplied by the user will take precedence over default fact files found in this gem
|
73
77
|
def self.facterdb_fact_files
|
74
78
|
(external_fact_files + default_fact_files).uniq
|
75
79
|
end
|
76
80
|
|
77
|
-
|
81
|
+
# @deprecated Use {.get_facts} instead.
|
82
|
+
def self.get_os_facts(facter_version = '*', filter = [])
|
78
83
|
if facter_version == '*'
|
79
84
|
if filter.is_a?(Array)
|
80
|
-
filter_str = filter.map { |f| f.map { |k,v
|
85
|
+
filter_str = filter.map { |f| f.map { |k, v| "#{k}=#{v}" }.join(' and ') }.join(' or ')
|
81
86
|
elsif filter.is_a?(Hash)
|
82
|
-
filter_str = filter.map { |k,v
|
87
|
+
filter_str = filter.map { |k, v| "#{k}=#{v}" }.join(' and ')
|
83
88
|
elsif filter.is_a?(String)
|
84
89
|
filter_str = filter
|
85
90
|
else
|
86
91
|
raise 'filter must be either an Array a Hash or a String'
|
87
92
|
end
|
93
|
+
elsif filter.is_a?(Array)
|
94
|
+
filter_str = "facterversion=/^#{facter_version}/ and (#{filter.map do |f|
|
95
|
+
f.map do |k, v|
|
96
|
+
"#{k}=#{v}"
|
97
|
+
end.join(' and ')
|
98
|
+
end.join(' or ')})"
|
99
|
+
elsif filter.is_a?(Hash)
|
100
|
+
filter_str = "facterversion=/^#{facter_version}/ and (#{filter.map { |k, v| "#{k}=#{v}" }.join(' and ')})"
|
101
|
+
elsif filter.is_a?(String)
|
102
|
+
filter_str = "facterversion=/^#{facter_version}/ and (#{filter})"
|
88
103
|
else
|
89
|
-
|
90
|
-
filter_str = "facterversion=/^#{facter_version}/ and (#{filter.map { |f| f.map { |k,v | "#{k}=#{v}" }.join(' and ') }.join(' or ')})"
|
91
|
-
elsif filter.is_a?(Hash)
|
92
|
-
filter_str = "facterversion=/^#{facter_version}/ and (#{filter.map { |k,v | "#{k}=#{v}" }.join(' and ')})"
|
93
|
-
elsif filter.is_a?(String)
|
94
|
-
filter_str = "facterversion=/^#{facter_version}/ and (#{filter})"
|
95
|
-
else
|
96
|
-
raise 'filter must be either an Array a Hash or a String'
|
97
|
-
end
|
104
|
+
raise 'filter must be either an Array a Hash or a String'
|
98
105
|
end
|
99
106
|
|
100
107
|
warn "[DEPRECATION] `get_os_facts` is deprecated. Please use `get_facts(#{filter_str})` instead."
|
@@ -102,14 +109,14 @@ module FacterDB
|
|
102
109
|
get_facts(filter_str)
|
103
110
|
end
|
104
111
|
|
105
|
-
# @return [String]
|
106
|
-
# @param filter [Object]
|
107
|
-
def self.generate_filter_str(filter=nil)
|
112
|
+
# @return [String] the string filter
|
113
|
+
# @param filter [Object] The filter to convert to jgrep string
|
114
|
+
def self.generate_filter_str(filter = nil)
|
108
115
|
case filter
|
109
116
|
when ::Array
|
110
|
-
'(' + filter.map { |f| f.map { |k,v
|
117
|
+
'(' + filter.map { |f| f.map { |k, v| "#{k}=#{v}" }.join(' and ') }.join(') or (') + ')'
|
111
118
|
when ::Hash
|
112
|
-
filter.map { |k,v
|
119
|
+
filter.map { |k, v| "#{k}=#{v}" }.join(' and ')
|
113
120
|
when ::String
|
114
121
|
filter
|
115
122
|
when ::NilClass
|
@@ -119,8 +126,8 @@ module FacterDB
|
|
119
126
|
end
|
120
127
|
end
|
121
128
|
|
122
|
-
# @return [Boolean]
|
123
|
-
# @param
|
129
|
+
# @return [Boolean] true if the filter is valid against the jgrep filter validator
|
130
|
+
# @param filters [Object] The filter to convert to jgrep string
|
124
131
|
def self.valid_filters?(filters)
|
125
132
|
filter_str = generate_filter_str(filters)
|
126
133
|
JGrep.validate_filters(filter_str).nil?
|
@@ -128,14 +135,15 @@ module FacterDB
|
|
128
135
|
false
|
129
136
|
end
|
130
137
|
|
131
|
-
# @return [Array]
|
132
|
-
# @param filter [Object]
|
133
|
-
def self.get_facts(filter=nil, cache=true)
|
138
|
+
# @return [Array[Hash[Symbol, Any]]] array of hashes of facts
|
139
|
+
# @param filter [Object] The filter to convert to jgrep string
|
140
|
+
def self.get_facts(filter = nil, cache = true)
|
134
141
|
if cache && filter && filter == Thread.current[:facterdb_last_filter_seen]
|
135
142
|
return Thread.current[:facterdb_last_facts_seen]
|
136
143
|
end
|
144
|
+
|
137
145
|
filter_str = generate_filter_str(filter)
|
138
|
-
result = JGrep.jgrep(database, filter_str).map { |hash|
|
146
|
+
result = JGrep.jgrep(database, filter_str).map { |hash| hash.map { |k, v| [k.to_sym, v] }.to_h }
|
139
147
|
if cache
|
140
148
|
Thread.current[:facterdb_last_filter_seen] = filter
|
141
149
|
Thread.current[:facterdb_last_facts_seen] = result
|
data/rakelib/rhel_alts.rake
CHANGED
@@ -3,22 +3,16 @@ task :rhel_alts do
|
|
3
3
|
Dir[File.join(__dir__, '..', 'facts', '*', 'centos-*-x86_64.facts')].each do |f|
|
4
4
|
centos_factset = File.read(f)
|
5
5
|
|
6
|
-
rhel_path = f.gsub(
|
7
|
-
File.
|
8
|
-
fd.puts centos_factset.gsub(%r{CentOS}, 'RedHat')
|
9
|
-
end
|
6
|
+
rhel_path = f.gsub('centos-', 'redhat-')
|
7
|
+
File.write(rhel_path, centos_factset.gsub('CentOS', 'RedHat'))
|
10
8
|
|
11
|
-
oracle_path = f.gsub(
|
12
|
-
File.
|
13
|
-
fd.puts centos_factset.gsub(%r{CentOS}, 'OracleLinux')
|
14
|
-
end
|
9
|
+
oracle_path = f.gsub('centos-', 'oraclelinux-')
|
10
|
+
File.write(oracle_path, centos_factset.gsub('CentOS', 'OracleLinux'))
|
15
11
|
|
16
12
|
# Scientific isn't going to be updated to 8
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
end
|
22
|
-
end
|
13
|
+
next unless File.basename(f)[/-(\d+)-/, 1].to_i <= 7
|
14
|
+
|
15
|
+
scientific_path = f.gsub('centos-', 'scientific-')
|
16
|
+
File.write(scientific_path, centos_factset.gsub('CentOS', 'Scientific'))
|
23
17
|
end
|
24
18
|
end
|
data/spec/facterdb_spec.rb
CHANGED
@@ -16,14 +16,14 @@ describe FacterDB do
|
|
16
16
|
end
|
17
17
|
|
18
18
|
let(:facts_24_path) { File.join(project_dir, 'facts', '2.4') }
|
19
|
-
let(:facts_24_count) { Dir.glob(File.join(facts_24_path,'*.facts')).count }
|
19
|
+
let(:facts_24_count) { Dir.glob(File.join(facts_24_path, '*.facts')).count }
|
20
20
|
let(:facts_23_path) { File.join(project_dir, 'facts', '2.3') }
|
21
|
-
let(:facts_23_count) { Dir.glob(File.join(facts_23_path,'*.facts')).count }
|
21
|
+
let(:facts_23_count) { Dir.glob(File.join(facts_23_path, '*.facts')).count }
|
22
22
|
|
23
23
|
describe '.use_defaultdb?' do
|
24
24
|
subject { described_class.use_defaultdb? }
|
25
25
|
|
26
|
-
before
|
26
|
+
before do
|
27
27
|
ENV.delete('FACTERDB_SKIP_DEFAULTDB')
|
28
28
|
end
|
29
29
|
|
@@ -32,7 +32,7 @@ describe FacterDB do
|
|
32
32
|
end
|
33
33
|
|
34
34
|
context 'when FACTERDB_SKIP_DEFAULTDB environment variable is set' do
|
35
|
-
before
|
35
|
+
before do
|
36
36
|
ENV['FACTERDB_SKIP_DEFAULTDB'] = '1'
|
37
37
|
end
|
38
38
|
|
@@ -45,7 +45,7 @@ describe FacterDB do
|
|
45
45
|
|
46
46
|
let(:non_directory_path) { File.join('this', 'is', 'not', 'a', 'directory') }
|
47
47
|
|
48
|
-
before
|
48
|
+
before do
|
49
49
|
ENV.delete('FACTERDB_SEARCH_PATHS')
|
50
50
|
allow(File).to receive(:directory?).and_call_original
|
51
51
|
allow(File).to receive(:directory?).with(non_directory_path).and_return(false)
|
@@ -73,7 +73,7 @@ describe FacterDB do
|
|
73
73
|
|
74
74
|
object = defined?(Warning) ? Warning : Kernel
|
75
75
|
allow(object).to receive(:warn).and_call_original
|
76
|
-
allow(object).to receive(:warn).with(a_string_matching(
|
76
|
+
allow(object).to receive(:warn).with(a_string_matching(/is not a directory/))
|
77
77
|
|
78
78
|
expect(file_count).to eq(facts_24_count)
|
79
79
|
end
|
@@ -105,7 +105,7 @@ describe FacterDB do
|
|
105
105
|
it 'ignores the path that is not a directory' do
|
106
106
|
object = defined?(Warning) ? Warning : Kernel
|
107
107
|
allow(object).to receive(:warn).and_call_original
|
108
|
-
allow(object).to receive(:warn).with(a_string_matching(
|
108
|
+
allow(object).to receive(:warn).with(a_string_matching(/is not a directory/))
|
109
109
|
|
110
110
|
expect(file_count).to eq(facts_24_count)
|
111
111
|
end
|
@@ -116,7 +116,7 @@ describe FacterDB do
|
|
116
116
|
describe '.default_fact_files' do
|
117
117
|
subject(:default_fact_files) { described_class.default_fact_files }
|
118
118
|
|
119
|
-
before
|
119
|
+
before do
|
120
120
|
ENV.delete('FACTERDB_SKIP_DEFAULTDB')
|
121
121
|
end
|
122
122
|
|
@@ -128,7 +128,7 @@ describe FacterDB do
|
|
128
128
|
end
|
129
129
|
|
130
130
|
context 'when FACTERDB_SKIP_DEFAULTDB environment variable is set' do
|
131
|
-
before
|
131
|
+
before do
|
132
132
|
ENV['FACTERDB_SKIP_DEFAULTDB'] = '1'
|
133
133
|
end
|
134
134
|
|
@@ -139,11 +139,11 @@ describe FacterDB do
|
|
139
139
|
describe '.facterdb_fact_files' do
|
140
140
|
subject(:facterdb_fact_files) { described_class.facterdb_fact_files }
|
141
141
|
|
142
|
-
before
|
142
|
+
before do
|
143
143
|
ENV.delete('FACTERDB_SKIP_DEFAULTDB')
|
144
144
|
end
|
145
145
|
|
146
|
-
after
|
146
|
+
after do
|
147
147
|
ENV.delete('FACTERDB_SEARCH_PATHS')
|
148
148
|
end
|
149
149
|
|
@@ -154,7 +154,7 @@ describe FacterDB do
|
|
154
154
|
end
|
155
155
|
|
156
156
|
context 'with no loaded fact sets' do
|
157
|
-
before
|
157
|
+
before do
|
158
158
|
ENV['FACTERDB_SKIP_DEFAULTDB'] = '1'
|
159
159
|
ENV.delete('FACTERDB_SEARCH_PATHS')
|
160
160
|
end
|
@@ -166,7 +166,7 @@ describe FacterDB do
|
|
166
166
|
describe '.database' do
|
167
167
|
subject(:database) { described_class.database }
|
168
168
|
|
169
|
-
before
|
169
|
+
before do
|
170
170
|
ENV.delete('FACTERDB_SKIP_DEFAULTDB')
|
171
171
|
ENV.delete('FACTERDB_SEARCH_PATHS')
|
172
172
|
FacterDB.instance_variable_set(:@database, nil)
|
@@ -183,7 +183,7 @@ describe FacterDB do
|
|
183
183
|
context 'when FACTERDB_INJECT_SOURCE environment variable is set' do
|
184
184
|
subject(:json_database) { JSON.parse(database) }
|
185
185
|
|
186
|
-
before
|
186
|
+
before do
|
187
187
|
ENV['FACTERDB_INJECT_SOURCE'] = '1'
|
188
188
|
end
|
189
189
|
|
@@ -200,14 +200,14 @@ describe FacterDB do
|
|
200
200
|
describe '.get_os_facts' do
|
201
201
|
subject(:result) { FacterDB.get_os_facts(facter_version, filter) }
|
202
202
|
|
203
|
-
before
|
203
|
+
before do
|
204
204
|
object = defined?(Warning) ? Warning : Kernel
|
205
205
|
allow(object).to receive(:warn).and_call_original
|
206
|
-
allow(object).to receive(:warn).with(a_string_matching(
|
206
|
+
allow(object).to receive(:warn).with(a_string_matching(/`get_os_facts` is deprecated/))
|
207
207
|
end
|
208
208
|
|
209
209
|
context 'without parameters' do
|
210
|
-
subject(:result) { FacterDB.get_os_facts
|
210
|
+
subject(:result) { FacterDB.get_os_facts }
|
211
211
|
|
212
212
|
include_examples 'returns a result'
|
213
213
|
end
|
@@ -216,13 +216,13 @@ describe FacterDB do
|
|
216
216
|
let(:facter_version) { '*' }
|
217
217
|
|
218
218
|
context 'with an Array filter' do
|
219
|
-
let(:filter) { [{ :
|
219
|
+
let(:filter) { [{ osfamily: 'Debian' }] }
|
220
220
|
|
221
221
|
include_examples 'returns a result'
|
222
222
|
end
|
223
223
|
|
224
224
|
context 'with a Hash filter' do
|
225
|
-
let(:filter) { { :
|
225
|
+
let(:filter) { { osfamily: 'Debian' } }
|
226
226
|
|
227
227
|
include_examples 'returns a result'
|
228
228
|
end
|
@@ -237,7 +237,7 @@ describe FacterDB do
|
|
237
237
|
let(:filter) { true }
|
238
238
|
|
239
239
|
it 'raises an error' do
|
240
|
-
expect { result }.to raise_error(
|
240
|
+
expect { result }.to raise_error(/filter must be either/)
|
241
241
|
end
|
242
242
|
end
|
243
243
|
end
|
@@ -247,19 +247,19 @@ describe FacterDB do
|
|
247
247
|
|
248
248
|
shared_examples 'returns only the specified version' do
|
249
249
|
it 'only includes fact sets for the specified version' do
|
250
|
-
expect(result).to all(include(:
|
250
|
+
expect(result).to all(include(facterversion: match(/\A2\.4/)))
|
251
251
|
end
|
252
252
|
end
|
253
253
|
|
254
254
|
context 'with an Array filter' do
|
255
|
-
let(:filter) { [{ :
|
255
|
+
let(:filter) { [{ osfamily: 'Debian' }] }
|
256
256
|
|
257
257
|
include_examples 'returns a result'
|
258
258
|
include_examples 'returns only the specified version'
|
259
259
|
end
|
260
260
|
|
261
261
|
context 'with a Hash filter' do
|
262
|
-
let(:filter) { { :
|
262
|
+
let(:filter) { { osfamily: 'Debian' } }
|
263
263
|
|
264
264
|
include_examples 'returns a result'
|
265
265
|
include_examples 'returns only the specified version'
|
@@ -276,7 +276,7 @@ describe FacterDB do
|
|
276
276
|
let(:filter) { true }
|
277
277
|
|
278
278
|
it 'raises an error' do
|
279
|
-
expect { result }.to raise_error(
|
279
|
+
expect { result }.to raise_error(/filter must be either/)
|
280
280
|
end
|
281
281
|
end
|
282
282
|
end
|
@@ -284,29 +284,29 @@ describe FacterDB do
|
|
284
284
|
|
285
285
|
describe '.valid_filters?' do
|
286
286
|
it 'invalid and false' do
|
287
|
-
expect(
|
287
|
+
expect(FacterDB.valid_filters?('and')).to be_falsey
|
288
288
|
end
|
289
289
|
|
290
290
|
it 'valid and true' do
|
291
|
-
expect(
|
291
|
+
expect(FacterDB.valid_filters?('foo')).to be_truthy
|
292
292
|
end
|
293
293
|
end
|
294
294
|
|
295
295
|
describe '.generate_filter_str' do
|
296
296
|
it 'invalid type' do
|
297
|
-
expect{FacterDB.generate_filter_str(3)}.to raise_error(FacterDB::Errors::InvalidFilter)
|
297
|
+
expect { FacterDB.generate_filter_str(3) }.to raise_error(FacterDB::Errors::InvalidFilter)
|
298
298
|
end
|
299
299
|
|
300
300
|
it 'with string' do
|
301
|
-
expect(FacterDB.generate_filter_str('foo')).to eq(
|
301
|
+
expect(FacterDB.generate_filter_str('foo')).to eq('foo')
|
302
302
|
end
|
303
303
|
|
304
304
|
it 'with hash' do
|
305
|
-
|
305
|
+
expect(FacterDB.generate_filter_str({ osfamily: 'Debian' })).to eq('osfamily=Debian')
|
306
306
|
end
|
307
307
|
|
308
308
|
it 'with Array' do
|
309
|
-
expect(FacterDB.generate_filter_str([:
|
309
|
+
expect(FacterDB.generate_filter_str([osfamily: 'Debian'])).to eq('(osfamily=Debian)')
|
310
310
|
end
|
311
311
|
|
312
312
|
it 'empty' do
|
@@ -324,32 +324,32 @@ describe FacterDB do
|
|
324
324
|
let(:filter) { nil }
|
325
325
|
|
326
326
|
context 'without parameters' do
|
327
|
-
include_examples
|
327
|
+
include_examples 'returns a result'
|
328
328
|
end
|
329
329
|
|
330
330
|
context 'with an Array filter' do
|
331
|
-
let(:filter) { [:
|
331
|
+
let(:filter) { [osfamily: 'Debian'] }
|
332
332
|
|
333
|
-
include_examples
|
333
|
+
include_examples 'returns a result'
|
334
334
|
end
|
335
335
|
|
336
336
|
context 'with a Hash filter' do
|
337
|
-
let(:filter) { { :
|
337
|
+
let(:filter) { { osfamily: 'Debian' } }
|
338
338
|
|
339
|
-
include_examples
|
339
|
+
include_examples 'returns a result'
|
340
340
|
end
|
341
341
|
|
342
342
|
context 'with a String filter' do
|
343
343
|
let(:filter) { 'osfamily=Debian' }
|
344
344
|
|
345
|
-
include_examples
|
345
|
+
include_examples 'returns a result'
|
346
346
|
end
|
347
347
|
|
348
348
|
context 'with a filter of an unsupported type' do
|
349
349
|
let(:filter) { true }
|
350
350
|
|
351
351
|
it 'raises an error' do
|
352
|
-
expect { result }.to raise_error(
|
352
|
+
expect { result }.to raise_error(/filter must be either/)
|
353
353
|
end
|
354
354
|
end
|
355
355
|
end
|