1
2
3
4
5
6
7
8
9
10
11
12
13
14 from Products.ZenHub.HubService import HubService
15 from twisted.web import resource, server
16 from twisted.internet import reactor
17
18 import xmlrpclib
19
20 import mimetypes
21
22 htmlResource = None
23
24 import logging
25 log = logging.getLogger("zenrender")
26
27 __doc__ = "Provide a simple web server to forward render requests"
28
29 -class Render(resource.Resource):
30
31 isLeaf = True
32
34 resource.Resource.__init__(self)
35 self.renderers = {}
36
37
39 "Deal with http requests"
40 args = request.args.copy()
41 for k, v in args.items():
42 if len(v) == 1:
43 args[k] = v[0]
44
45 listener = request.postpath[-2]
46 command = request.postpath[-1]
47 args.setdefault('ftype', 'PNG')
48 ftype = args['ftype']
49 del args['ftype']
50 mimetype = mimetypes.guess_type('.%s'%ftype)[0]
51 if not mimetype: mimetype = 'image/%s'%ftype
52 request.setHeader('Content-type', mimetype)
53 def write(result):
54 if result:
55 request.write(result)
56 request.finish()
57 def error(reason):
58 log.error("Unable to fetch graph: %s", reason)
59 request.finish()
60 renderer = self.renderers.get(listener, False)
61 if not renderer or not renderer.listeners:
62 raise Exception("Renderer %s unavailable" % listener)
63 d = renderer.listeners[0].callRemote(command, **args)
64 d.addCallbacks(write, error)
65 return server.NOT_DONE_YET
66
67 - def render_POST(self, request):
68 "Deal with XML-RPC requests"
69 content = request.content.read()
70 for instance, renderer in self.renderers.items():
71 if instance != request.postpath[-1]: continue
72 for listener in renderer.listeners:
73 try:
74 args, command = xmlrpclib.loads(content)
75 request.setHeader('Content-type', 'text/xml')
76 d = listener.callRemote(str(command), *args)
77 def write(result):
78 try:
79 response = xmlrpclib.dumps((result,),
80 methodresponse=True,
81 allow_none=True)
82 request.write(response)
83 except Exception, ex:
84 log.error("Unable to %s: %s", command, ex)
85 request.finish()
86 def error(reason):
87 log.error("Unable to %s: %s", command, reason)
88 request.finish()
89 d.addCallbacks(write, error)
90 return server.NOT_DONE_YET
91 except Exception, ex:
92 log.exception(ex)
93 log.warning("Skipping renderer %s" % instance)
94 raise Exception("No renderer registered")
95
97 "Handle all paths"
98 return self, ()
99
100
102 self.renderers[renderer.instance] = renderer
103
113