openvox 8.28.0 → 8.29.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 22a10676212dffb7385dd0b2a93b63e82b431be1721c626845e9b8c9aa3244a3
4
- data.tar.gz: 8b11717749ebc30080d5868897d2af18734696ef84bf52f9e0390ecf5e381431
3
+ metadata.gz: 86d05e7a3a189241096c6be834d26a8674a70cadfac8c90acce427992d619ad2
4
+ data.tar.gz: 430fe316be1706073496df35c7c5316d6402366f51b1f8a099a248769fe02960
5
5
  SHA512:
6
- metadata.gz: d83254af4656f5ba95cc0710ac577d80a53c6d8881c4905601d689eff159838dba3b59635c2db446cae49a5bf137453d055bd067d0c61541e00f6d5a73062d82
7
- data.tar.gz: 77ee41bb27713bf2867d9b616580904347595e64a87b24f9d3ba0b3c1c2cc63198cba689b3b806e612db26df8f2cc0e833d6a16e169bf17f393204cf0743a77e
6
+ metadata.gz: 914e4b11f6727fd2ab33dcdd76cfa3ef69626ed2b8217be0176bf58fafd6e89504096947715a1345f4c657986313f04918c27a1c639d553f63e6f8cb24c4b0cf
7
+ data.tar.gz: ac56bb6bd94bc23edc49986eaa92e8db16376865ae60b6833f86ad5615cab95857b0d08fbce52895517821d77aa5e954f4cdffe702ba2979514c08688bd98d9f
data/CHANGELOG.md CHANGED
@@ -2,6 +2,73 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file.
4
4
 
5
+ ## [8.29.0](https://github.com/openvoxproject/openvox/tree/8.29.0) (2026-09-04)
6
+
7
+ [Full Changelog](https://github.com/openvoxproject/openvox/compare/8.28.1...8.29.0)
8
+
9
+ **Implemented enhancements:**
10
+
11
+ - openfact: Allow 6.x [\#578](https://github.com/OpenVoxProject/openvox/pull/578) ([bastelfreak](https://github.com/bastelfreak))
12
+
13
+ **Fixed bugs:**
14
+
15
+ - \[Bug\]: Sometimes Error "This 'if' statement has no effect", sometimes not [\#542](https://github.com/OpenVoxProject/openvox/issues/542)
16
+ - \[Bug\]: Centralized filebucket not working properly [\#367](https://github.com/OpenVoxProject/openvox/issues/367)
17
+ - \[Bug\]: lines in file resource content looking like a checksum throws an error [\#169](https://github.com/OpenVoxProject/openvox/issues/169)
18
+ - \[Backport 8.x\] Fix excessive reads of /proc/mounts [\#621](https://github.com/OpenVoxProject/openvox/pull/621) ([OpenVoxProjectBot](https://github.com/OpenVoxProjectBot))
19
+ - \[Backport 8.x\] Report errors when renewing a certificate fails [\#611](https://github.com/OpenVoxProject/openvox/pull/611) ([OpenVoxProjectBot](https://github.com/OpenVoxProjectBot))
20
+ - \[Backport 8.x\] fix: Pacman provider uses unrecognized option '--update' [\#565](https://github.com/OpenVoxProject/openvox/pull/565) ([OpenVoxProjectBot](https://github.com/OpenVoxProjectBot))
21
+
22
+ **Security fixes:**
23
+
24
+ - Promote puppet-runtime 2026.09.02.1 into 8.x [\#629](https://github.com/OpenVoxProject/openvox/pull/629) ([OpenVoxProjectBot](https://github.com/OpenVoxProjectBot))
25
+
26
+ **Closed issues:**
27
+
28
+ - \[Deprecation\] Replace `puppet master` Terminology in User-Facing Docs/Help [\#347](https://github.com/OpenVoxProject/openvox/issues/347)
29
+ - \[Deprecation\] Fine-Grained `filetimeout` Control [\#345](https://github.com/OpenVoxProject/openvox/issues/345)
30
+ - \[Deprecation\] Data-Binding Settings [\#338](https://github.com/OpenVoxProject/openvox/issues/338)
31
+ - \[Deprecation\] `file { content => <checksum> }` Filebucket Retrieval Behavior [\#335](https://github.com/OpenVoxProject/openvox/issues/335)
32
+ - \[Deprecation\] `Puppet::Indirector::Hiera` Terminus [\#332](https://github.com/OpenVoxProject/openvox/issues/332)
33
+
34
+ **Merged pull requests:**
35
+
36
+ - \[Backport 8.x\] puppet generate: print module directory when types are missing [\#618](https://github.com/OpenVoxProject/openvox/pull/618) ([OpenVoxProjectBot](https://github.com/OpenVoxProjectBot))
37
+ - \[Backport 8.x\] Fix a small typo in the markdown docs \(redux\) [\#606](https://github.com/OpenVoxProject/openvox/pull/606) ([OpenVoxProjectBot](https://github.com/OpenVoxProjectBot))
38
+ - Remove unloadable CC-BY-1.0 RDoc template and generator [\#588](https://github.com/OpenVoxProject/openvox/pull/588) ([silug](https://github.com/silug))
39
+ - \[Backport 8.x\] Set `PUPPET_EXTRA_OPTS` variable to empty [\#561](https://github.com/OpenVoxProject/openvox/pull/561) ([OpenVoxProjectBot](https://github.com/OpenVoxProjectBot))
40
+
41
+ ## [8.28.1](https://github.com/openvoxproject/openvox/tree/8.28.1) (2026-07-07)
42
+
43
+ [Full Changelog](https://github.com/openvoxproject/openvox/compare/8.28.0...8.28.1)
44
+
45
+ **Fixed bugs:**
46
+
47
+ - \[Bug\]: ca\_refresh\_interval is not respected — agent refreshes CA on every run when server responds 304 [\#435](https://github.com/OpenVoxProject/openvox/issues/435)
48
+ - \[Bug\]: Puppet 8 introduced a regex node definition regression [\#14](https://github.com/OpenVoxProject/openvox/issues/14)
49
+ - \[Backport 8.x\] Update ca\_last\_update/crl\_last\_update on HTTP 304 [\#526](https://github.com/OpenVoxProject/openvox/pull/526) ([OpenVoxProjectBot](https://github.com/OpenVoxProjectBot))
50
+ - \[Backport 8.x\] Copy input mtime to files generated by puppet generate types [\#523](https://github.com/OpenVoxProject/openvox/pull/523) ([OpenVoxProjectBot](https://github.com/OpenVoxProjectBot))
51
+ - \[Backport 8.x\] Fix regex node lookup regression from PUP-11515 [\#515](https://github.com/OpenVoxProject/openvox/pull/515) ([OpenVoxProjectBot](https://github.com/OpenVoxProjectBot))
52
+ - \[Backport 8.x\] Tolerate concurrent creation of directories [\#507](https://github.com/OpenVoxProject/openvox/pull/507) ([OpenVoxProjectBot](https://github.com/OpenVoxProjectBot))
53
+
54
+ **Closed issues:**
55
+
56
+ - \[Deprecation\] `Puppet::SSL::Certificate` Class [\#344](https://github.com/OpenVoxProject/openvox/issues/344)
57
+ - \[Deprecation\] PAL Script Evaluation APIs [\#343](https://github.com/OpenVoxProject/openvox/issues/343)
58
+ - \[Deprecation\] `source_permissions` File Parameter [\#340](https://github.com/OpenVoxProject/openvox/issues/340)
59
+ - \[Deprecation\] `pluginsync` Setting [\#339](https://github.com/OpenVoxProject/openvox/issues/339)
60
+ - \[Deprecation\] `configprint` Setting [\#337](https://github.com/OpenVoxProject/openvox/issues/337)
61
+ - \[Deprecation\] `regsubst()` Encoding Argument [\#336](https://github.com/OpenVoxProject/openvox/issues/336)
62
+
63
+ **Merged pull requests:**
64
+
65
+ - Promote puppet-resource\_api 1.9.2 into 8.x [\#527](https://github.com/OpenVoxProject/openvox/pull/527) ([OpenVoxProjectBot](https://github.com/OpenVoxProjectBot))
66
+ - Promote puppet-resource\_api 1.9.1 into 8.x [\#518](https://github.com/OpenVoxProject/openvox/pull/518) ([OpenVoxProjectBot](https://github.com/OpenVoxProjectBot))
67
+ - \[Backport 8.x\] Fix handling of Puppet::Pops serialization issues [\#514](https://github.com/OpenVoxProject/openvox/pull/514) ([OpenVoxProjectBot](https://github.com/OpenVoxProjectBot))
68
+ - Promote puppet-runtime 2026.06.24.1 into 8.x [\#501](https://github.com/OpenVoxProject/openvox/pull/501) ([OpenVoxProjectBot](https://github.com/OpenVoxProjectBot))
69
+ - Add arm64 support to acceptance 8.x [\#499](https://github.com/OpenVoxProject/openvox/pull/499) ([jpartlow](https://github.com/jpartlow))
70
+ - Add jruby 9.4.15 to CI [\#487](https://github.com/OpenVoxProject/openvox/pull/487) ([bastelfreak](https://github.com/bastelfreak))
71
+
5
72
  ## [8.28.0](https://github.com/openvoxproject/openvox/tree/8.28.0) (2026-06-10)
6
73
 
7
74
  [Full Changelog](https://github.com/openvoxproject/openvox/compare/8.27.0...8.28.0)
data/Gemfile CHANGED
@@ -16,7 +16,7 @@ end
16
16
  # the runtime_dependencies in openvox.gemspec match the runtime dependencies here
17
17
  # (like openfact, semantic_puppet, and puppet-resource_api)
18
18
 
19
- gem "openfact", *location_for(ENV['OPENFACT_LOCATION'] || ["~> 5.0"])
19
+ gem "openfact", *location_for(ENV['OPENFACT_LOCATION'] || [">= 5.0", "< 7"])
20
20
  gem "semantic_puppet", *location_for(ENV['SEMANTIC_PUPPET_LOCATION'] || ["~> 1.0"])
21
21
  gem "puppet-resource_api", *location_for(ENV['RESOURCE_API_LOCATION'] || ["~> 2.0"])
22
22
  # Need to update the openssl gem on MacOS to avoid SSL errors.
@@ -45,11 +45,11 @@ end
45
45
  group(:test) do
46
46
  # 1.16.0 - 1.16.2 are broken on Windows
47
47
  gem 'ffi', '>= 1.15.5', '< 2', '!= 1.16.0', '!= 1.16.1', '!= 1.16.2', require: false
48
- gem "json-schema", '>= 2', '< 6', require: false
48
+ gem "json-schema", '>= 2', '< 7', require: false
49
49
  gem "rake", *location_for(ENV['RAKE_LOCATION'] || '~> 13.0')
50
50
  gem "rspec", "~> 3.1", require: false
51
51
  gem "rspec-expectations", ["~> 3.9", "!= 3.9.3"]
52
- gem "rspec-its", "~> 1.1", require: false
52
+ gem "rspec-its", "~> 2.0", require: false
53
53
  gem 'rspec-mocks', '< 3.13.3', require: false # breaking change afterwards: https://github.com/rspec/rspec-mocks/pull/1596
54
54
  gem 'vcr', '~> 6.1', require: false
55
55
  gem 'webmock', '~> 3.0', require: false
@@ -1,2 +1,3 @@
1
1
  # You may specify parameters to the puppet client here
2
2
  #PUPPET_EXTRA_OPTS=--waitforcert=500
3
+ PUPPET_EXTRA_OPTS=
@@ -304,13 +304,14 @@ class Puppet::Application::Ssl < Puppet::Application
304
304
  @cert_provider.delete_request(certname)
305
305
  cert
306
306
  rescue Puppet::HTTP::ResponseError => e
307
- if e.response.code == 404
308
- nil
309
- else
310
- raise Puppet::Error.new(_("Failed to download certificate: %{message}") % { message: e.message }, e)
311
- end
307
+ body = e.response.body.to_s.strip
308
+ raise Puppet::Error.new(_("Failed to renew certificate: %{code} %{reason}%{body}") % {
309
+ code: e.response.code,
310
+ reason: e.response.reason,
311
+ body: body.empty? ? '' : ": #{body}"
312
+ }, e)
312
313
  rescue => e
313
- raise Puppet::Error.new(_("Failed to download certificate: %{message}") % { message: e.message }, e)
314
+ raise Puppet::Error.new(_("Failed to renew certificate: %{message}") % { message: e.message }, e)
314
315
  end
315
316
 
316
317
  def verify(certname)
@@ -30,7 +30,7 @@
30
30
  # `tree_each($data) |$value| { <PUPPET CODE BLOCK> }`
31
31
  #
32
32
  # The parameter `$path` is always given as an `Array` containing the path that when applied to
33
- # the tree as `$data.dig(*$path) yields the `$value`.
33
+ # the tree as `$data.dig(*$path)` yields the `$value`.
34
34
  # The `$value` is the value at that path.
35
35
  #
36
36
  # For `Array` values, the path will contain `Integer` entries with the array index,
@@ -45,11 +45,14 @@ module Puppet
45
45
  end
46
46
 
47
47
  # Determines if the output file is up-to-date with respect to the input file.
48
+ # Generated files are stamped with their input's mtime, so the output is
49
+ # up-to-date only on an exact match; an input with older timestamps (e.g.
50
+ # a module downgrade) also triggers regeneration.
48
51
  # @param [String, nil] The path to output to, or nil if determined by input
49
52
  # @return [Boolean] Returns true if the output is up-to-date or false if not.
50
53
  def up_to_date?(outputdir)
51
54
  f = effective_output_path(outputdir)
52
- Puppet::FileSystem.exist?(f) && (Puppet::FileSystem.stat(@path) <=> Puppet::FileSystem.stat(f)) <= 0
55
+ Puppet::FileSystem.exist?(f) && (Puppet::FileSystem.stat(@path) <=> Puppet::FileSystem.stat(f)) == 0
53
56
  end
54
57
 
55
58
  # Gets the filename of the output file.
@@ -121,7 +124,7 @@ module Puppet
121
124
  environment.modules.each do |mod|
122
125
  directory = File.join(Puppet::Util::Autoload.cleanpath(mod.plugin_directory), 'puppet', 'type')
123
126
  unless Puppet::FileSystem.exist?(directory)
124
- Puppet.debug "Skipping '#{mod.name}' module because it contains no custom types."
127
+ Puppet.debug "Skipping '#{mod.name}' module because there is no readable puppet/type/ directory under: #{directory}"
125
128
  next
126
129
  end
127
130
 
@@ -240,6 +243,7 @@ module Puppet
240
243
  Puppet::FileSystem.open(effective_output_path, nil, 'w:UTF-8') do |file|
241
244
  file.write(result)
242
245
  end
246
+ Puppet::FileSystem.touch(effective_output_path, mtime: Puppet::FileSystem.stat(input.path).mtime)
243
247
  rescue Exception => e
244
248
  @bad_input = true
245
249
  Puppet.log_exception(e, _("Failed to generate '%{effective_output_path}': %{message}") % { effective_output_path: effective_output_path, message: e.message })
@@ -305,7 +305,7 @@ module Serialization
305
305
  if tos.empty?
306
306
  semantic = Puppet::Pops::SemanticError.new(issue, nil, EMPTY_HASH)
307
307
  else
308
- file, line = stacktrace
308
+ file, line = Puppet::Pops::PuppetStack.stacktrace
309
309
  semantic = Puppet::Pops::SemanticError.new(issue, nil, { :file => file, :line => line })
310
310
  end
311
311
  end
@@ -248,7 +248,7 @@ Puppet::Type.type(:package).provide :pacman, :parent => Puppet::Provider::Packag
248
248
  else
249
249
  fail _("Source %{source} is not supported by pacman") % { source: source }
250
250
  end
251
- pacman "--noconfirm", "--noprogressbar", "--update", source
251
+ pacman "--noconfirm", "--noprogressbar", "--upgrade", source
252
252
  end
253
253
 
254
254
  def install_from_repo
@@ -34,13 +34,13 @@ class Puppet::Resource::Type
34
34
  EMPTY_ARRAY = [].freeze
35
35
 
36
36
  LOOKAROUND_OPERATORS = {
37
- "(" => 'LP',
38
- "?" => "QU",
39
- "<" => "LT",
40
- ">" => "GT",
41
- "!" => "EX",
42
- "=" => "EQ",
43
- ")" => 'RP'
37
+ "(" => 'lp',
38
+ "?" => "qu",
39
+ "<" => "lt",
40
+ ">" => "gt",
41
+ "!" => "ex",
42
+ "=" => "eq",
43
+ ")" => 'rp'
44
44
  }.freeze
45
45
 
46
46
  attr_accessor :file, :line, :doc, :code, :parent, :resource_type_collection, :override
@@ -206,7 +206,7 @@ class Puppet::Resource::Type
206
206
 
207
207
  def name
208
208
  if type == :node && name_is_regex?
209
- # Normalize lookarround regex patthern
209
+ # Normalize lookaround regex pattern to a unique, lookup-safe lowercase string.
210
210
  internal_name = @name.source.downcase.gsub(/\(\?[^)]*\)/) do |str|
211
211
  str.gsub(/./) { |ch| LOOKAROUND_OPERATORS[ch] || ch }
212
212
  end
@@ -121,6 +121,10 @@ class Puppet::SSL::StateMachine
121
121
  rescue Puppet::HTTP::ResponseError => e
122
122
  if e.response.code == 304
123
123
  Puppet.info(_("CA certificate is unmodified, using existing CA certificate"))
124
+ # 304 confirms the local CA is current, so reset the TTL.
125
+ # Otherwise ca_last_update (backed by ca.pem mtime) never advances
126
+ # past the initial download and needs_refresh? triggers on every run.
127
+ @cert_provider.ca_last_update = Time.now
124
128
  else
125
129
  Puppet.info(_("Failed to refresh CA certificate, using existing CA certificate: %{message}") % { message: e.message })
126
130
  end
@@ -219,6 +223,8 @@ class Puppet::SSL::StateMachine
219
223
  rescue Puppet::HTTP::ResponseError => e
220
224
  if e.response.code == 304
221
225
  Puppet.info(_("CRL is unmodified, using existing CRL"))
226
+ # 304 confirms the local CRL is current, so reset the TTL.
227
+ @cert_provider.crl_last_update = Time.now
222
228
  else
223
229
  Puppet.info(_("Failed to refresh CRL, using existing CRL: %{message}") % { message: e.message })
224
230
  end
@@ -86,12 +86,21 @@ module Puppet
86
86
  raise Puppet::Error,
87
87
  "Cannot create #{@resource[:path]}; parent directory #{parent} does not exist"
88
88
  end
89
- if mode
90
- Puppet::Util.withumask(0o00) do
91
- Dir.mkdir(@resource[:path], symbolic_mode_to_int(mode, 0o755, true))
89
+ begin
90
+ if mode
91
+ Puppet::Util.withumask(0o00) do
92
+ Dir.mkdir(@resource[:path], symbolic_mode_to_int(mode, 0o755, true))
93
+ end
94
+ else
95
+ Dir.mkdir(@resource[:path])
92
96
  end
93
- else
94
- Dir.mkdir(@resource[:path])
97
+ rescue Errno::EEXIST
98
+ # Another process may have created the directory concurrently. If it
99
+ # really is a directory now, treat that as success.
100
+ #
101
+ # Directory mode, and other properties, will be checked and enforced by
102
+ # the call to `property_fix`.
103
+ raise unless Puppet::FileSystem.directory?(@resource[:path])
95
104
  end
96
105
  @resource.send(:property_fix)
97
106
  return :directory_created
@@ -16,9 +16,12 @@ module Puppet::Util::RDoc
16
16
 
17
17
  r = RDoc::RDoc.new
18
18
 
19
- # specify our own format & where to output
20
- options = ["--fmt", "puppet",
21
- "--quiet",
19
+ # Documentation is rendered by RDoc's default generator using our custom
20
+ # parser. The historical custom "puppet" generator and its HTML template
21
+ # targeted RDoc 1.x and could not be loaded under any supported RDoc; the
22
+ # template also carried a CC-BY-1.0 license, which is incompatible with
23
+ # the Debian Free Software Guidelines. Both were removed.
24
+ options = ["--quiet",
22
25
  "--exclude", "/modules/[^/]*/spec/.*$",
23
26
  "--exclude", "/modules/[^/]*/files/.*$",
24
27
  "--exclude", "/modules/[^/]*/tests/.*$",
@@ -18,6 +18,9 @@ module Puppet::Util::SELinux
18
18
  S_IFDIR = 0o040000
19
19
  S_IFLNK = 0o120000
20
20
 
21
+ @@mounts_cache = nil
22
+ @@mounts_mtime = nil
23
+
21
24
  def self.selinux_support?
22
25
  return false unless defined?(Selinux)
23
26
  if Selinux.is_selinux_enabled == 1
@@ -259,6 +262,16 @@ module Puppet::Util::SELinux
259
262
 
260
263
  # Internal helper function to read and parse /proc/mounts
261
264
  def read_mounts
265
+ current_mtime = begin
266
+ File.mtime('/proc/mounts')
267
+ rescue Errno::ENOENT, Errno::ENOTDIR
268
+ nil
269
+ end
270
+
271
+ if @@mounts_cache && current_mtime && @@mounts_mtime == current_mtime
272
+ return @@mounts_cache
273
+ end
274
+
262
275
  mounts = ''.dup
263
276
  begin
264
277
  if File.method_defined? "read_nonblock"
@@ -292,7 +305,9 @@ module Puppet::Util::SELinux
292
305
 
293
306
  mntpoint[params[1]] = params[2]
294
307
  end
295
- mntpoint
308
+
309
+ @@mounts_mtime = current_mtime
310
+ @@mounts_cache = mntpoint
296
311
  end
297
312
 
298
313
  # Internal helper function to return which type of filesystem a given file
@@ -8,7 +8,7 @@
8
8
  # Raketasks and such to set the version based on the output of `git describe`
9
9
 
10
10
  module Puppet
11
- PUPPETVERSION = '8.28.0'
11
+ PUPPETVERSION = '8.29.0'
12
12
  IMPLEMENTATION = 'openvox'
13
13
 
14
14
  ##
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: openvox
3
3
  version: !ruby/object:Gem::Version
4
- version: 8.28.0
4
+ version: 8.29.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - OpenVox Project
@@ -143,16 +143,22 @@ dependencies:
143
143
  name: openfact
144
144
  requirement: !ruby/object:Gem::Requirement
145
145
  requirements:
146
- - - "~>"
146
+ - - ">="
147
147
  - !ruby/object:Gem::Version
148
148
  version: '5.0'
149
+ - - "<"
150
+ - !ruby/object:Gem::Version
151
+ version: '7'
149
152
  type: :runtime
150
153
  prerelease: false
151
154
  version_requirements: !ruby/object:Gem::Requirement
152
155
  requirements:
153
- - - "~>"
156
+ - - ">="
154
157
  - !ruby/object:Gem::Version
155
158
  version: '5.0'
159
+ - - "<"
160
+ - !ruby/object:Gem::Version
161
+ version: '7'
156
162
  - !ruby/object:Gem::Dependency
157
163
  name: ostruct
158
164
  requirement: !ruby/object:Gem::Requirement
@@ -1257,8 +1263,6 @@ files:
1257
1263
  - lib/puppet/util/psych_support.rb
1258
1264
  - lib/puppet/util/rdoc.rb
1259
1265
  - lib/puppet/util/rdoc/code_objects.rb
1260
- - lib/puppet/util/rdoc/generators/puppet_generator.rb
1261
- - lib/puppet/util/rdoc/generators/template/puppet/puppet.rb
1262
1266
  - lib/puppet/util/rdoc/parser.rb
1263
1267
  - lib/puppet/util/rdoc/parser/puppet_parser_core.rb
1264
1268
  - lib/puppet/util/rdoc/parser/puppet_parser_rdoc2.rb
@@ -1366,7 +1370,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
1366
1370
  - !ruby/object:Gem::Version
1367
1371
  version: 1.3.1
1368
1372
  requirements: []
1369
- rubygems_version: 4.0.10
1373
+ rubygems_version: 4.0.16
1370
1374
  specification_version: 4
1371
1375
  summary: OpenVox, a community implementation of Puppet -- an automated configuration
1372
1376
  management tool