def __init__(self, collectorName):
     self.log = log
     self._daemon = zope.component.getUtility(ICollector)
     self.collectorName = collectorName
     self.rs = RenderServer(collectorName)
Example #2
0
 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 ''
Example #4
0
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 ''