Skip to content

Instantly share code, notes, and snippets.

@justinstoller
Last active April 8, 2020 18:57
Show Gist options
  • Select an option

  • Save justinstoller/aa2f0ede214c42adede9278085a55051 to your computer and use it in GitHub Desktop.

Select an option

Save justinstoller/aa2f0ede214c42adede9278085a55051 to your computer and use it in GitHub Desktop.
Puppet Server Dev Debugger
puppetserver justin (master *$%<>) ‖ wget https://gist.githubusercontent.com/justinstoller/aa2f0ede214c42adede9278085a55051/raw/e089a2474608af9d42fff1ba2832f3e989b2f562/puppet_server_helper.rb
puppetserver justin (master *$%<>) ‖ lein gem install pry-nav
puppetserver justin (master *$%<>) ‖ lein irb
....
irb(main):002:0> load './puppet_server_helper.rb'
=> true
irb(main):005:0> req = @helper.basic_catalog_request
=> {"authenticated"=>true, "params"=....
irb(main):006:0> @server.handleRequest(req)
From: uri:classloader:/puppetserver-lib/puppet/server/master.rb @ line 47 Puppet::Server::Master#handleRequest:
46: def handleRequest(request)
=> 47: binding.pry
48: response = {}
49: process(request, response)
require 'puppet/server/master'
require 'securerandom'
require 'json'
require 'uri'
class PuppetServerHelper
# alternatively: load 'spec/lib/puppet_spec/handler'; profiler = PuppetSpec::HandlerProfiler.new ????
NullProfiler = Struct.new("Profiler") do
def start(*args); end
def finish(*args); end
def shutdown(*args); end
end
NullRegistry = Struct.new("Registry") do
def register_environment(env); end
def is_expired?(env); true; end
def remove_environment(env); end
def evicted(env); end
end
attr_accessor :root_dir, :servername, :clientname,
:profiler, :env_registry, :metric_registry
def initialize
@root_dir = ENV['HOME'] + '/.puppetlabs'
@servername = @clientname = 'localhost'
@profiler = Puppet::Server::JvmProfiler.new(NullProfiler.new)
@env_registry = NullRegistry.new
import com.codahale.metrics.MetricRegistry
@metric_registry = Java::ComCodahaleMetrics::MetricRegistry.new
end
def default_puppet_config(overrides = {})
{
"codedir" => @root_dir + '/etc/code',
"confdir" => @root_dir + '/etc/puppet',
"vardir" => @root_dir + '/opt/puppet/cache',
"rundir" => @root_dir + '/var/run',
"logdir" => @root_dir + '/var/log'
}.merge(overrides)
end
def default_server_config(overrides = {})
{
"metric_registry" => @metric_registry,
"use_legacy_auth_conf" => false,
"environment_registry" => @env_registry,
"http_connect_timeout_milliseconds" => 120000,
"http_idle_timeout_milliseconds" => 1200000,
"profiler" => @profiler,
"server_id" => @servername,
}.merge(overrides)
end
def load_puppet_server!
puppet_config = default_puppet_config
puppet_server_config = default_server_config
Puppet::Server::Master.new(puppet_config, puppet_server_config)
end
def create_facts(values = {}, name = clientname)
{
'name' => name,
'values' => values,
'timestamp' => Time.now.iso8601
}
end
def create_params(facts = create_facts, env = 'production')
{
"fail_on_404" => "true",
"code_id" => nil,
"facts" => URI.encode(JSON.dump(facts)),
"rest" => "localhost",
"transaction_uuid" => SecureRandom.uuid,
"static_catalog" => "true",
"checksum_type" => "md5.sha256",
"environment" => env,
"facts_format" => "application/json"
}
end
def create_cert(cert_path = root_dir + '/etc/puppet/ssl/certs/' + clientname + '.pem')
import com.puppetlabs.ssl_utils.SSLUtils
pem = File.read(cert_path)
reader = Java::JavaIo::StringReader.new(pem)
Java::ComPuppetlabsSsl_utils::SSLUtils.pemToCert(reader)
end
def basic_catalog_request(params = create_params,
cert = create_cert,
client = clientname,
server = servername)
{
"authenticated" => true,
"params" => params,
"remote-addr" => "0:0:0:0:0:0:0:1",
"client-cert-cn" => client,
"client-cert" => cert,
"body" => URI.encode(JSON.dump(params)),
"request-method" => "POST",
"uri" => "/puppet/v3/catalog/" + client,
"headers" => {
"accept" => "application/json, application/x-msgpack, text/pson",
"x-puppet-version" => "5.3.3",
"user-agent" => "Puppet/5.3.3 Ruby/2.2.7-p470 (x86_64-darwin16)",
"host" => server + ":8140",
"accept-encoding" => "gzip;q=1.0,deflate; q=0.6,identity;q=0.3",
"content-length" => "7278",
"content-type" => "application/x-www-form-urlencoded"
}
}
end
def response_to_hash(java_res)
{
body: java_res.getBody,
status: java_res.getStatus,
content_type: java_res.getContentType,
puppet_version: java_res.getPuppetVersion
}
end
end
@helper = PuppetServerHelper.new
@server = @helper.load_puppet_server!
puppetserver justin (master *$%<>) ‖ git diff
diff --git a/project.clj b/project.clj
index 5b52c1a..84ef415 100644
--- a/project.clj
+++ b/project.clj
@@ -142,7 +142,8 @@
[com.cemerick/url "0.1.1"]]
;; SERVER-332, enable SSLv3 for unit tests that exercise SSLv3
- :jvm-opts ["-Djava.security.properties=./dev-resources/java.security"]}
+ :jvm-opts ["-Djava.security.properties=./dev-resources/java.security"
+ "-Djruby.debug.fullTrace=true"]}
:testutils {:source-paths ["test/unit" "test/integration"]}
:test {
diff --git a/src/ruby/puppetserver-lib/puppet/server/master.rb b/src/ruby/puppetserver-lib/puppet/server/master.rb
index a682467..8b6cb05 100644
--- a/src/ruby/puppetserver-lib/puppet/server/master.rb
+++ b/src/ruby/puppetserver-lib/puppet/server/master.rb
@@ -10,6 +10,8 @@ require 'puppet/server/config'
require 'puppet/server/puppet_config'
require 'puppet/server/network/http/handler'
require 'puppet/server/compiler'
+require 'pry'
+require 'pry-nav'
require 'java'
@@ -42,6 +44,7 @@ class Puppet::Server::Master
end
def handleRequest(request)
+ binding.pry
response = {}
process(request, response)
# 'process' returns only the status -
@Magisus

Magisus commented Jul 2, 2019

Copy link
Copy Markdown

Adding this at the bottom of the script shortens the number of steps that must be done each time in the REPL:

@helper = PuppetServerHelper.new
@server = @helper.load_puppet_server!

@justinstoller

Copy link
Copy Markdown
Author

Updated

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment