def __init__(self, collectorName): self.log = log self._daemon = zope.component.getUtility(ICollector) self.collectorName = collectorName self.rs = RenderServer(collectorName)
class HttpRender(resource.Resource): isLeaf = True def __init__(self, collectorName): self.log = log self._daemon = zope.component.getUtility(ICollector) self.collectorName = collectorName self.rs = RenderServer(collectorName) def remote_render(self, *args, **kw): return self.rs.render(*args, **kw) def remote_packageRRDFiles(self, *args, **kw): return self.rs.packageRRDFiles(*args, **kw) def remote_unpackageRRDFiles(self, *args, **kw): return self.rs.unpackageRRDFiles(*args, **kw) def remote_receiveRRDFiles(self, *args, **kw): return self.rs.receiveRRDFiles(*args, **kw) def remote_sendRRDFiles(self, *args, **kw): return self.rs.sendRRDFiles(*args, **kw) def remote_moveRRDFiles(self, *args, **kw): return self.rs.moveRRDFiles(*args, **kw) def remote_deleteRRDFiles(self, *args, **kw): return self.rs.deleteRRDFiles(*args, **kw) def remote_plugin(self, *args, **kw): return self.rs.plugin(*args, **kw) def remote_summary(self, *args, **kw): return self.rs.summary(*args, **kw) def remote_fetchValues(self, *args, **kw): return self.rs.fetchValues(*args, **kw) def remote_currentValues(self, *args, **kw): return self.rs.currentValues(*args, **kw) def _showHelp(self): """ When someone hits the HTTP port directly, give them something other than a traceback. """ helpText = [ """<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><title>zenrender Help</title> <body> <h3>This zenrender is for collector: %s</h3> <h3>About zenrender</h3> <p>The zenrender daemon receives calls from zenhub (or in some special cases, by a browser directly) and given a request, creates a graph of RRD data or returns back RRD information. This daemon is not meant to be browsed directly by users.</p> <p>A zenrender daemon should only respond to requests for the remote collector with which it is associated. This zenrender daemon is registered with the '%s' collector.</p> """ % (self.collectorName, self.collectorName)] methods = [] for name in dir(self): if not name.startswith('remote_'): continue name = name.replace('remote_', '') docs = getattr(self.rs, name).__doc__ docs = docs if docs is not None else '' methods.append( (name, docs) ) # Insert table of methods helpText.append("""<table border='1'> <caption>zenrender Methods</caption> <tr><th>Method Name</th><th>Description</th></tr>""") for name, docs in sorted(methods): helpText.append("<tr><td>%s</td> <td><pre>%s</pre></td></tr>" % ( name, docs)) helpText.append("</table>") # Drop in the trailer helpText.append("""</body></html>""") return '\n'.join(helpText) def render_GET(self, request): """ Respond to HTTP GET requests """ args = request.args.copy() for k, v in args.items(): if len(v) == 1: args[k] = v[0] command = request.postpath[-1] self.log.debug("Processing %s request from %s", command, request.getClientIP()) if command == '': return self._showHelp() args.setdefault('ftype', 'PNG') ftype = args['ftype'] del args['ftype'] mimetype = mimetypes.guess_type('x.%s' % ftype)[0] if mimetype is None: mimetype = 'image/%s' % ftype.lower() request.setHeader('Content-type', mimetype) request.setHeader('Pragma', 'no-cache') # IE specific cache headers see http://support.microsoft.com/kb/234067/EN-US request.setHeader('Cache-Control', 'no-cache, no-store') request.setHeader('Expires', '-1') functor = getattr(self._daemon, 'remote_' + command, None) if functor: return functor(**args) # Ignore trash and log error messages if command not in ('favicon.ico',): self.log.error("Received a bad request: %s", command) return '' def render_POST(self, request): """ Respond to HTTP POST requests (eg XML-RPC requests) """ content = request.content.read() args, command = xmlrpclib.loads(content) self.log.debug("Processing %s request from %s" % (command,request.getClientIP())) request.setHeader('Content-type', 'text/xml') functor = getattr(self._daemon, 'remote_' + command, None) if functor and isinstance(args, (tuple, list, dict)): if isinstance(args, (tuple, list)): result = functor(*args) elif isinstance(args, dict): result = functor(**args) response = xmlrpclib.dumps((result,), methodresponse=True, allow_none=True) return response self.log.error("Received a bad request: %s", command) return ''
class HttpRender(resource.Resource): isLeaf = True def __init__(self, collectorName): self.log = log self._daemon = zope.component.getUtility(ICollector) self.collectorName = collectorName self.rs = RenderServer(collectorName) def remote_render(self, *args, **kw): return self.rs.render(*args, **kw) def remote_packageRRDFiles(self, *args, **kw): return self.rs.packageRRDFiles(*args, **kw) def remote_unpackageRRDFiles(self, *args, **kw): return self.rs.unpackageRRDFiles(*args, **kw) def remote_receiveRRDFiles(self, *args, **kw): return self.rs.receiveRRDFiles(*args, **kw) def remote_sendRRDFiles(self, *args, **kw): return self.rs.sendRRDFiles(*args, **kw) def remote_moveRRDFiles(self, *args, **kw): return self.rs.moveRRDFiles(*args, **kw) def remote_deleteRRDFiles(self, *args, **kw): return self.rs.deleteRRDFiles(*args, **kw) def remote_plugin(self, *args, **kw): return self.rs.plugin(*args, **kw) def remote_summary(self, *args, **kw): return self.rs.summary(*args, **kw) def remote_fetchValues(self, *args, **kw): return self.rs.fetchValues(*args, **kw) def remote_currentValues(self, *args, **kw): return self.rs.currentValues(*args, **kw) def _showHelp(self): """ When someone hits the HTTP port directly, give them something other than a traceback. """ helpText = [ """<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><title>zenrender Help</title> <body> <h3>This zenrender is for collector: %s</h3> <h3>About zenrender</h3> <p>The zenrender daemon receives calls from zenhub (or in some special cases, by a browser directly) and given a request, creates a graph of RRD data or returns back RRD information. This daemon is not meant to be browsed directly by users.</p> <p>A zenrender daemon should only respond to requests for the remote collector with which it is associated. This zenrender daemon is registered with the '%s' collector.</p> """ % (self.collectorName, self.collectorName) ] methods = [] for name in dir(self): if not name.startswith('remote_'): continue name = name.replace('remote_', '') docs = getattr(self.rs, name).__doc__ docs = docs if docs is not None else '' methods.append((name, docs)) # Insert table of methods helpText.append("""<table border='1'> <caption>zenrender Methods</caption> <tr><th>Method Name</th><th>Description</th></tr>""") for name, docs in sorted(methods): helpText.append("<tr><td>%s</td> <td><pre>%s</pre></td></tr>" % (name, docs)) helpText.append("</table>") # Drop in the trailer helpText.append("""</body></html>""") return '\n'.join(helpText) def render_GET(self, request): """ Respond to HTTP GET requests """ args = request.args.copy() for k, v in args.items(): if len(v) == 1: args[k] = v[0] command = request.postpath[-1] self.log.debug("Processing %s request from %s", command, request.getClientIP()) if command == '': return self._showHelp() args.setdefault('ftype', 'PNG') ftype = args['ftype'] del args['ftype'] mimetype = mimetypes.guess_type('x.%s' % ftype)[0] if mimetype is None: mimetype = 'image/%s' % ftype.lower() request.setHeader('Content-type', mimetype) request.setHeader('Pragma', 'no-cache') # IE specific cache headers see http://support.microsoft.com/kb/234067/EN-US request.setHeader('Cache-Control', 'no-cache, no-store') request.setHeader('Expires', '-1') functor = getattr(self._daemon, 'remote_' + command, None) if functor: return functor(**args) # Ignore trash and log error messages if command not in ('favicon.ico', ): self.log.error("Received a bad request: %s", command) return '' def render_POST(self, request): """ Respond to HTTP POST requests (eg XML-RPC requests) """ content = request.content.read() args, command = xmlrpclib.loads(content) self.log.debug("Processing %s request from %s" % (command, request.getClientIP())) request.setHeader('Content-type', 'text/xml') functor = getattr(self._daemon, 'remote_' + command, None) if functor and isinstance(args, (tuple, list, dict)): if isinstance(args, (tuple, list)): result = functor(*args) elif isinstance(args, dict): result = functor(**args) response = xmlrpclib.dumps((result, ), methodresponse=True, allow_none=True) return response self.log.error("Received a bad request: %s", command) return ''