Skip to content

[Bug]: agent fails plugin sync because of issue with JSON serialization #201

@buzzdeee

Description

@buzzdeee

Is this a critical security issue?

  • This is not a security issue.

Describe the Bug

Seen with agent: openvox-8.24.2
against server: openvox-server-8.12.1
Both with Ruby: ruby-3.4.8

using an empty puppet.conf on agent side, the agent run starts alike:

# puppet agent --test 
Info: Refreshing CA certificate
Info: CA certificate is unmodified, using existing CA certificate
Info: Refreshing CRL
Info: CRL is unmodified, using existing CRL
Info: Using environment 'production'
Error: Server Error
Info: Loading facts
...

And on the server side, following exception can be observed in puppetserver.log:

2026-02-10T09:12:40.617+01:00 ERROR [qtp1624652065-63] [puppetserver] Puppet Server Error: Failed to serialize Puppet::FileServing::Metadata for 'plugins': Could not render_multiple to Puppet::Network::Format[json]: undefined method `except' for #<JSON::Ext::Generator::State:0x2fda81>
Did you mean?  exec
/var/puppetlabs/puppetserver/data/jruby-gems/gems/openvox-8.24.2/lib/puppet/network/http/api/indirected_routes.rb:195:in `block in first_response_formatter_for'
org/jruby/RubyEnumerable.java:664:in `find'
/var/puppetlabs/puppetserver/data/jruby-gems/gems/openvox-8.24.2/lib/puppet/network/http/api/indirected_routes.rb:186:in `first_response_formatter_for'
/var/puppetlabs/puppetserver/data/jruby-gems/gems/openvox-8.24.2/lib/puppet/network/http/api/indirected_routes.rb:156:in `do_search'
/var/puppetlabs/puppetserver/data/jruby-gems/gems/openvox-8.24.2/lib/puppet/network/http/api/indirected_routes.rb:54:in `block in call'
/var/puppetlabs/puppetserver/data/jruby-gems/gems/openvox-8.24.2/lib/puppet/context.rb:64:in `override'
/var/puppetlabs/puppetserver/data/jruby-gems/gems/openvox-8.24.2/lib/puppet.rb:292:in `override'
/var/puppetlabs/puppetserver/data/jruby-gems/gems/openvox-8.24.2/lib/puppet/network/http/api/indirected_routes.rb:53:in `call'
/var/puppetlabs/puppetserver/data/jruby-gems/gems/openvox-8.24.2/lib/puppet/network/http/api/server/v3.rb:18:in `block in wrap'
/var/puppetlabs/puppetserver/data/jruby-gems/gems/openvox-8.24.2/lib/puppet/network/http/route.rb:85:in `block in process'
org/jruby/RubyArray.java:2009:in `each'
/var/puppetlabs/puppetserver/data/jruby-gems/gems/openvox-8.24.2/lib/puppet/network/http/route.rb:84:in `process'
/var/puppetlabs/puppetserver/data/jruby-gems/gems/openvox-8.24.2/lib/puppet/network/http/route.rb:91:in `process'
/var/puppetlabs/puppetserver/data/jruby-gems/gems/openvox-8.24.2/lib/puppet/network/http/route.rb:91:in `process'
/var/puppetlabs/puppetserver/data/jruby-gems/gems/openvox-8.24.2/lib/puppet/network/http/handler.rb:88:in `block in process'
/var/puppetlabs/puppetserver/data/jruby-gems/gems/openvox-8.24.2/lib/puppet/network/http/handler.rb:71:in `block in with_request_profiling'
/var/puppetlabs/puppetserver/data/jruby-gems/gems/openvox-8.24.2/lib/puppet/util/profiler/around_profiler.rb:59:in `profile'
/var/puppetlabs/puppetserver/data/jruby-gems/gems/openvox-8.24.2/lib/puppet/util/profiler.rb:53:in `profile'
/var/puppetlabs/puppetserver/data/jruby-gems/gems/openvox-8.24.2/lib/puppet/network/http/handler.rb:67:in `with_request_profiling'
/var/puppetlabs/puppetserver/data/jruby-gems/gems/openvox-8.24.2/lib/puppet/network/http/handler.rb:87:in `block in process'
/var/puppetlabs/puppetserver/data/jruby-gems/gems/openvox-8.24.2/lib/puppet/network/http/handler.rb:94:in `respond_to_errors'
/var/puppetlabs/puppetserver/data/jruby-gems/gems/openvox-8.24.2/lib/puppet/network/http/handler.rb:86:in `process'
uri:classloader:/puppetserver-lib/puppet/server/master.rb:69:in `block in handleRequest'
/var/puppetlabs/puppetserver/data/jruby-gems/gems/openvox-8.24.2/lib/puppet/context.rb:64:in `override'
/var/puppetlabs/puppetserver/data/jruby-gems/gems/openvox-8.24.2/lib/puppet.rb:292:in `override'
uri:classloader:/puppetserver-lib/puppet/server/master.rb:68:in `handleRequest'

Workaround I found is to use msgpack serialization, so adding the following to the client puppet.conf:

[main]
preferred_serialization_format = msgpack

This requires the msgpack gem installed on the agent, as well as in the server via puppetserver gem install msgpack.

Expected Behavior

The default JSON serialization format should "just work"

Steps to Reproduce

see description above

Environment

OpenBSD recent snapshots with openvox 8.24.2 agent and openvox-server 8.12.1 and openvoxdb packages available
Ruby 3.4.8.

Additional Context

No response

Relevant log output

2026-02-10T09:12:40.617+01:00 ERROR [qtp1624652065-63] [puppetserver] Puppet Server Error: Failed to serialize Puppet::FileServing::Metadata for 'plugins': Could not render_multiple to Puppet::Network::Format[json]: undefined method `except' for #<JSON::Ext::Generator::State:0x2fda81>
Did you mean?  exec
/var/puppetlabs/puppetserver/data/jruby-gems/gems/openvox-8.24.2/lib/puppet/network/http/api/indirected_routes.rb:195:in `block in first_response_formatter_for'
org/jruby/RubyEnumerable.java:664:in `find'
/var/puppetlabs/puppetserver/data/jruby-gems/gems/openvox-8.24.2/lib/puppet/network/http/api/indirected_routes.rb:186:in `first_response_formatter_for'
/var/puppetlabs/puppetserver/data/jruby-gems/gems/openvox-8.24.2/lib/puppet/network/http/api/indirected_routes.rb:156:in `do_search'
/var/puppetlabs/puppetserver/data/jruby-gems/gems/openvox-8.24.2/lib/puppet/network/http/api/indirected_routes.rb:54:in `block in call'
/var/puppetlabs/puppetserver/data/jruby-gems/gems/openvox-8.24.2/lib/puppet/context.rb:64:in `override'
/var/puppetlabs/puppetserver/data/jruby-gems/gems/openvox-8.24.2/lib/puppet.rb:292:in `override'
/var/puppetlabs/puppetserver/data/jruby-gems/gems/openvox-8.24.2/lib/puppet/network/http/api/indirected_routes.rb:53:in `call'
/var/puppetlabs/puppetserver/data/jruby-gems/gems/openvox-8.24.2/lib/puppet/network/http/api/server/v3.rb:18:in `block in wrap'
/var/puppetlabs/puppetserver/data/jruby-gems/gems/openvox-8.24.2/lib/puppet/network/http/route.rb:85:in `block in process'
org/jruby/RubyArray.java:2009:in `each'
/var/puppetlabs/puppetserver/data/jruby-gems/gems/openvox-8.24.2/lib/puppet/network/http/route.rb:84:in `process'
/var/puppetlabs/puppetserver/data/jruby-gems/gems/openvox-8.24.2/lib/puppet/network/http/route.rb:91:in `process'
/var/puppetlabs/puppetserver/data/jruby-gems/gems/openvox-8.24.2/lib/puppet/network/http/route.rb:91:in `process'
/var/puppetlabs/puppetserver/data/jruby-gems/gems/openvox-8.24.2/lib/puppet/network/http/handler.rb:88:in `block in process'
/var/puppetlabs/puppetserver/data/jruby-gems/gems/openvox-8.24.2/lib/puppet/network/http/handler.rb:71:in `block in with_request_profiling'
/var/puppetlabs/puppetserver/data/jruby-gems/gems/openvox-8.24.2/lib/puppet/util/profiler/around_profiler.rb:59:in `profile'
/var/puppetlabs/puppetserver/data/jruby-gems/gems/openvox-8.24.2/lib/puppet/util/profiler.rb:53:in `profile'
/var/puppetlabs/puppetserver/data/jruby-gems/gems/openvox-8.24.2/lib/puppet/network/http/handler.rb:67:in `with_request_profiling'
/var/puppetlabs/puppetserver/data/jruby-gems/gems/openvox-8.24.2/lib/puppet/network/http/handler.rb:87:in `block in process'
/var/puppetlabs/puppetserver/data/jruby-gems/gems/openvox-8.24.2/lib/puppet/network/http/handler.rb:94:in `respond_to_errors'
/var/puppetlabs/puppetserver/data/jruby-gems/gems/openvox-8.24.2/lib/puppet/network/http/handler.rb:86:in `process'
uri:classloader:/puppetserver-lib/puppet/server/master.rb:69:in `block in handleRequest'
/var/puppetlabs/puppetserver/data/jruby-gems/gems/openvox-8.24.2/lib/puppet/context.rb:64:in `override'
/var/puppetlabs/puppetserver/data/jruby-gems/gems/openvox-8.24.2/lib/puppet.rb:292:in `override'
uri:classloader:/puppetserver-lib/puppet/server/master.rb:68:in `handleRequest'

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions