Skip to content

Instantly share code, notes, and snippets.

@justinstoller
Last active April 8, 2020 18:57
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save justinstoller/aa2f0ede214c42adede9278085a55051 to your computer and use it in GitHub Desktop.
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
Copy link

Magisus commented Jul 2, 2019

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
Author

Updated

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