Skip to content

Instantly share code, notes, and snippets.

@Magisus
Created July 12, 2019 17:25
Show Gist options
  • Save Magisus/7fd9268c55de66e8e9a6e0170c8a4b39 to your computer and use it in GitHub Desktop.
Save Magisus/7fd9268c55de66e8e9a6e0170c8a4b39 to your computer and use it in GitHub Desktop.
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 = { 'my_fact' => 'fact_value' }, name = clientname)
{
'name' => name,
'values' => values,
'timestamp' => Time.now.iso8601
}
end
def compile_params(facts: create_facts, env: 'maggie')
{ "certname"=>"localhost",
"facts"=>facts,
"trusted_facts"=>{"values"=>{"my_trusted"=>"trusted_value"}},
"environment"=>env,
"options"=>{"capture_logs"=>true, "log_level"=>"debug"},
"variables"=>{"values"=>{"foo"=>"bar"}},
"code_ast"=>
"{\"__ptype\":\"Puppet::AST::Program\",\"locator\":{\"__ptype\":\"Puppet::AST::Locator\",\"string\":\"notify { \\\"${lookup('hiera_key')}\\\": }\",\"file\":null,\"line_index\":[0]},\"body\":{\"__ptype\":\"Puppet::AST::ResourceExpression\",\"locator\":{\"__ptype\":\"LocalRef\",\"__pvalue\":\"$['locator']\"},\"offset\":0,\"length\":36,\"type_name\":{\"__ptype\":\"Puppet::AST::QualifiedName\",\"locator\":{\"__ptype\":\"LocalRef\",\"__pvalue\":\"$['locator']\"},\"offset\":0,\"length\":6,\"value\":\"notify\"},\"form\":\"regular\",\"bodies\":[{\"__ptype\":\"Puppet::AST::ResourceBody\",\"locator\":{\"__ptype\":\"LocalRef\",\"__pvalue\":\"$['locator']\"},\"offset\":0,\"length\":0,\"title\":{\"__ptype\":\"Puppet::AST::ConcatenatedString\",\"locator\":{\"__ptype\":\"LocalRef\",\"__pvalue\":\"$['locator']\"},\"offset\":9,\"length\":24,\"segments\":[{\"__ptype\":\"Puppet::AST::TextExpression\",\"locator\":{\"__ptype\":\"LocalRef\",\"__pvalue\":\"$['locator']\"},\"offset\":9,\"length\":0,\"expr\":{\"__ptype\":\"Puppet::AST::CallNamedFunctionExpression\",\"locator\":{\"__ptype\":\"LocalRef\",\"__pvalue\":\"$['locator']\"},\"offset\":12,\"length\":19,\"functor_expr\":{\"__ptype\":\"Puppet::AST::QualifiedName\",\"locator\":{\"__ptype\":\"LocalRef\",\"__pvalue\":\"$['locator']\"},\"offset\":12,\"length\":6,\"value\":\"lookup\"},\"rval_required\":true,\"arguments\":[{\"__ptype\":\"Puppet::AST::LiteralString\",\"locator\":{\"__ptype\":\"LocalRef\",\"__pvalue\":\"$['locator']\"},\"offset\":19,\"length\":11,\"value\":\"hiera_key\"}]}}]}}]}}"
}
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_compile_request(params = create_params,
cert = create_cert,
client = clientname,
server = servername)
{
"authenticated" => true,
"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/compile",
"headers" => {
"accept" => "application/json, application/x-msgpack, text/pson",
"x-puppet-version" => "6.5.0",
"user-agent" => "Puppet/6.5.0 Ruby/2.5.1 (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 catalog_params(certname: 'localhost', environment: 'production')
{"certname"=>certname,"persistence"=>{"facts"=>false,"catalog"=>false},"job_id"=>"12345","facts"=>{"values"=>{"foo"=>"fact_value"}},"trusted_facts"=>{"values"=>{"trusted"=>"trust_value"}},"environment"=>environment, "options"=>{"log_level"=>"debug","capture_logs"=>true}}
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!
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment