1
require 'puppet/network/http/rack/httphandler'
2
require 'puppet/network/xmlrpc/server'
5
class Puppet::Network::HTTP::RackXMLRPC < Puppet::Network::HTTP::RackHttpHandler
6
def initialize(handlers)
7
@xmlrpc_server = Puppet::Network::XMLRPCServer.new
8
handlers.each do |name|
9
Puppet.debug " -> register xmlrpc namespace %s" % name
10
unless handler = Puppet::Network::Handler.handler(name)
11
raise ArgumentError, "Invalid XMLRPC handler %s" % name
13
@xmlrpc_server.add_handler(handler.interface, handler.new({}))
18
def process(request, response)
19
# errors are sent as text/plain
20
response['Content-Type'] = 'text/plain'
21
if not request.post? then
23
response.write 'Method Not Allowed'
26
if request.media_type() != "text/xml" then
28
response.write 'Bad Request'
32
# get auth/certificate data
33
client_request = build_client_request(request)
35
response_body = @xmlrpc_server.process(request.body.read(), client_request)
38
response['Content-Type'] = 'text/xml; charset=utf-8'
39
response.write response_body
42
def build_client_request(request)
45
# if we find SSL info in the headers, use them to get a hostname.
46
# try this with :ssl_client_header.
47
# For Apache you need special configuration, see ext/rack/README.
48
if dn = ssl_client_header(request) and dn_matchdata = dn.match(/^.*?CN\s*=\s*(.*)/)
49
node = dn_matchdata[1].to_str
50
authenticated = (ssl_client_verify_header(request) == 'SUCCESS')
53
node = Resolv.getname(ip)
55
Puppet.err "Could not resolve %s: %s" % [ip, detail]
61
Puppet::Network::ClientRequest.new(node, ip, authenticated)