]> git.ipfire.org Git - people/ms/westferry.git/blobdiff - src/westferry/handlers/analytics.py
UI: Rename menu to menus
[people/ms/westferry.git] / src / westferry / handlers / analytics.py
index 94f291ed1b58d849d761269848577677cd066d3b..3cf785e838f681a95eadc0977ebe7f06853f6ef9 100644 (file)
@@ -20,7 +20,6 @@
 ###############################################################################
 
 import datetime
-import collecty.client
 import mimetypes
 import tornado.web
 
@@ -34,17 +33,22 @@ class AnalyticsBaseHandler(base.BaseHandler):
        def menu(self):
                _ = self.locale.translate
 
-               m = ui.menu.Menu(self, _("Analytics"))
+               m = ui.menus.Menu(self, _("Analytics"))
 
                # Overview
                m.add_handler(AnalyticsOverviewHandler)
-               m.add_divider()
+
+               # Network
+               m.add_handler(AnalyticsNetworkOverviewHandler)
 
                # System
                m.add_handler(AnalyticsSystemOverviewHandler)
 
                return m
 
+       def render_graphs(self, graphs):
+               self.render("graphs.html", graphs=graphs)
+
 
 class AnalyticsOverviewHandler(AnalyticsBaseHandler):
        url = r"/analytics"
@@ -54,24 +58,85 @@ class AnalyticsOverviewHandler(AnalyticsBaseHandler):
                self.render("base.html")
 
 
+class AnalyticsNetworkBaseHandler(AnalyticsBaseHandler):
+       @property
+       def menu(self):
+               _ = self.locale.translate
+
+               m = ui.menus.Menu(self, _("Network"))
+
+               # Back...
+               m.add_handler(AnalyticsOverviewHandler, title=_("Back..."))
+
+               # Overview
+               m.add_handler(AnalyticsNetworkOverviewHandler, title=_("Overview"))
+
+               # Connections
+               m.add_handler(AnalyticsNetworkConnectionsHandler)
+
+               # Fragmentation
+               m.add_handler(AnalyticsNetworkIPFragmentationHandler)
+
+               return m
+
+
+class AnalyticsNetworkOverviewHandler(AnalyticsNetworkBaseHandler):
+       url = r"/analytics/network"
+       title = N_("Network")
+
+       def get(self):
+               self.render("base.html")
+
+
+class AnalyticsNetworkConnectionsHandler(AnalyticsNetworkBaseHandler):
+       url = r"/analytics/connections"
+       title = N_("Connections")
+
+       def get(self):
+               _ = self.locale.translate
+
+               graphs = [
+                       ui.graphs.Graph(self, "conntrack"),
+               ]
+
+               self.render_graphs(graphs)
+
+
+class AnalyticsNetworkIPFragmentationHandler(AnalyticsNetworkBaseHandler):
+       url = r"/analytics/network/fragmentation"
+       title = N_("Fragmentation")
+
+       def initialize(self):
+               _ = self.locale.translate
+
+               for proto, title in (("ipv6", _("IPv6")), ("ipv4", _("IPv4"))):
+                       tab = self.tabs.add_tab(proto, title=title)
+
+                       tab.add_graph("%s-fragmentation" % proto)
+
+
 class AnalyticsSystemBaseHandler(AnalyticsBaseHandler):
        @property
        def menu(self):
                _ = self.locale.translate
 
-               m = ui.menu.Menu(self, _("System"))
+               m = ui.menus.Menu(self, _("System"))
 
                # Back...
                m.add_handler(AnalyticsOverviewHandler, title=_("Back..."))
-               m.add_divider()
 
                # Overview
                m.add_handler(AnalyticsSystemOverviewHandler, title=_("Overview"))
-               m.add_divider()
 
-               # Others
+               # Most interesting items
                m.add_handler(AnalyticsSystemProcessorsHandler)
                m.add_handler(AnalyticsSystemMemoryHandler)
+               m.add_handler(AnalyticsSystemTemperaturesHandler)
+
+               # Others
+               s = m.add_menu(_("More"))
+               s.add_handler(AnalyticsSystemContextSwitchesHandler)
+               s.add_handler(AnalyticsSystemInterruptsHandler)
 
                return m
 
@@ -80,16 +145,83 @@ class AnalyticsSystemOverviewHandler(AnalyticsSystemBaseHandler):
        url = r"/analytics/system"
        title = N_("System")
 
+       def initialize(self):
+               _ = self.locale.translate
+
+               tab = self.tabs.add_tab("loadavg", _("Load Average"))
+               tab.add_graph("loadavg")
+
 
 class AnalyticsSystemProcessorsHandler(AnalyticsSystemBaseHandler):
        url = r"/analytics/system/processors"
        title = N_("Processors")
 
+       def initialize(self):
+               _ = self.locale.translate
+
+               tab = self.tabs.add_tab("usage", _("Usage"))
+               tab.add_graph("processor")
+
+               tab = self.tabs.add_tab("frequency", _("Frequency"))
+               tab.add_graph("cpufreq")
+
+               tab = self.tabs.add_tab("temperature", _("Temperature"))
+               tab.add_graph("processor-temperature")
+
 
 class AnalyticsSystemMemoryHandler(AnalyticsSystemBaseHandler):
        url = r"/analytics/system/memory"
        title = N_("Memory")
 
+       def initialize(self):
+               _ = self.locale.translate
+
+               tab = self.tabs.add_tab("usage", _("Usage"))
+               tab.add_graph("memory")
+
+
+class AnalyticsSystemTemperaturesHandler(AnalyticsSystemBaseHandler):
+       url = r"/analytics/system/temperatures"
+       title = N_("Temperatures")
+
+       def get(self):
+               _ = self.locale.translate
+
+               graphs = [
+                       ui.graphs.Graph(self, "sensors-temperature"),
+                       ui.graphs.Graph(self, "processor-temperature"),
+               ]
+
+               self.render_graphs(graphs)
+
+
+class AnalyticsSystemContextSwitchesHandler(AnalyticsSystemBaseHandler):
+       url = r"/analytics/system/context-switches"
+       title = N_("Context Switches")
+
+       def get(self):
+               _ = self.locale.translate
+
+               graphs = [
+                       ui.graphs.Graph(self, "context-switches"),
+               ]
+
+               self.render_graphs(graphs)
+
+
+class AnalyticsSystemInterruptsHandler(AnalyticsSystemBaseHandler):
+       url = r"/analytics/system/interrupts"
+       title = N_("Interrupts")
+
+       def get(self):
+               _ = self.locale.translate
+
+               graphs = [
+                       ui.graphs.Graph(self, "interrupts"),
+               ]
+
+               self.render_graphs(graphs)
+
 
 class GraphExportHandler(base.BaseHandler):
        VALID_INTERVALS = ("hour", "day", "month", "week", "year")
@@ -97,9 +229,11 @@ class GraphExportHandler(base.BaseHandler):
 
        SUPPORTED_FORMATS = ("pdf", "png", "svg")
 
-       url = r"/graph/([\w\-]+)(?:/([\w\d]+))?.(%s)" % "|".join(SUPPORTED_FORMATS)
+       url = r"/graph(/thumbnail)?/([\w\-]+)(?:/([\w\d\.]+))?\.(%s)" % "|".join(SUPPORTED_FORMATS)
+
+       def get(self, thumbnail, template_name, object_id, format):
+               _ = self.locale.translate
 
-       def get(self, template_name, object_id, format):
                # Get the requested dimensions of the image
                height = self.get_argument_int("height", None)
                width  = self.get_argument_int("width", None)
@@ -109,15 +243,27 @@ class GraphExportHandler(base.BaseHandler):
                if interval and not interval in self.VALID_INTERVALS:
                        raise tornado.web.HTTPError(400, _("Invalid interval: %s") % interval)
 
+               # Create the graph object
+               g = ui.graphs.Graph(self, template_name, object_id=object_id)
+
                # Generate the graph image
-               g = self.backend.graphs.generate_graph(template_name, object_id=object_id,
-                       format=format.upper(), height=height, width=width, interval=interval)
+               kwargs = {
+                       "format"     : format.upper(),
+                       "interval"   : interval,
+                       "height"     : height,
+                       "width"      : width,
+                       "thumbnail"  : bool(thumbnail),
+
+                       # Include the title in the PDF exports
+                       "with_title" : format == "pdf",
+               }
+               image = g.generate_graph(**kwargs)
 
                # Set the HTTP headers
                self._make_headers(format, template_name, object_id)
 
                # Deliver the content
-               self.finish(g)
+               self.finish(image.get("image"))
 
        def _make_headers(self, extension, template_name, object_id):
                # Determine the mime type
@@ -135,3 +281,12 @@ class GraphExportHandler(base.BaseHandler):
                        self.set_header("Content-Disposition", "attachment; filename=%s" % filename)
                else:
                        self.set_header("Content-Disposition", "inline; filename=%s" % filename)
+
+
+class GraphHandler(base.BaseHandler):
+       url = r"/graph/([\w\-]+)(?:/([\w\d\.]+))?"
+
+       def get(self, template, object_id):
+               graph = ui.graphs.Graph(self, template, object_id=object_id)
+
+               self.render("graph.html", graph=graph)