From b104d5dd41c815fcbe98f45a301e68e3ed5a983e Mon Sep 17 00:00:00 2001 From: Tamas Kocsis Date: Tue, 3 Nov 2020 02:44:31 +0100 Subject: [PATCH] Refactor /Stats page rendering to seprate functions --- plugins/Stats/StatsPlugin.py | 119 +++++++++++++++++++++-------------- 1 file changed, 73 insertions(+), 46 deletions(-) diff --git a/plugins/Stats/StatsPlugin.py b/plugins/Stats/StatsPlugin.py index f164ce8f..536719c9 100644 --- a/plugins/Stats/StatsPlugin.py +++ b/plugins/Stats/StatsPlugin.py @@ -2,7 +2,8 @@ import time import html import os import json -from collections import OrderedDict +import sys +import itertools from Plugin import PluginManager from Config import config @@ -35,40 +36,9 @@ class UiRequestPlugin(object): else: return 0 - # /Stats entry point - @helper.encodeResponse - def actionStats(self): - import gc - import sys - from Ui import UiRequest - from Crypt import CryptConnection + def renderHead(self): import main - - - hpy = None - if self.get.get("size") == "1": # Calc obj size - try: - import guppy - hpy = guppy.hpy() - except: - pass - self.sendHeader() - - if "Multiuser" in PluginManager.plugin_manager.plugin_names and not config.multiuser_local: - yield "This function is disabled on this proxy" - return - - s = time.time() - - # Style - yield """ - - """ + from Crypt import CryptConnection # Memory yield "rev%s | " % config.rev @@ -99,9 +69,13 @@ class UiRequestPlugin(object): pass yield "
" + def renderConnectionsTable(self): + import main + # Connections yield "Connections (%s, total made: %s, in: %s, out: %s):
" % ( - len(main.file_server.connections), main.file_server.last_connection_id, main.file_server.num_incoming, main.file_server.num_outgoing + len(main.file_server.connections), main.file_server.last_connection_id, + main.file_server.num_incoming, main.file_server.num_outgoing ) yield "" yield "" @@ -140,10 +114,11 @@ class UiRequestPlugin(object): ]) yield "
id type ip open crypt pingbuff bad idle open delay cpu out in last sent
" + def renderTrackers(self): # Trackers yield "

Trackers:
" yield "" - from Site import SiteAnnouncer # importing at the top of the file breaks plugins + from Site import SiteAnnouncer # importing at the top of the file breaks plugins for tracker_address, tracker_stat in sorted(SiteAnnouncer.global_stats.items()): yield self.formatTableRow([ ("%s", tracker_address), @@ -168,12 +143,13 @@ class UiRequestPlugin(object): ]) yield "
address request successive errors last_request
" - # Tor hidden services + def renderTor(self): + import main yield "

Tor hidden services (status: %s):
" % main.file_server.tor_manager.status for site_address, onion in list(main.file_server.tor_manager.site_onions.items()): yield "- %-34s: %s
" % (site_address, onion) - # Db + def renderDbStats(self): yield "

Db:
" for db in Db.opened_dbs: tables = [row["name"] for row in db.execute("SELECT name FROM sqlite_master WHERE type = 'table'").fetchall()] @@ -185,8 +161,7 @@ class UiRequestPlugin(object): time.time() - db.last_query_time, db.db_path, db_size, json.dumps(table_rows, sort_keys=True) ) - - # Sites + def renderSites(self): yield "

Sites:" yield "" yield "" @@ -226,7 +201,7 @@ class UiRequestPlugin(object): yield "
" yield "
address connected peers content.json out in
" - # Big files + def renderBigfiles(self): yield "

Big files:
" for site in list(self.server.sites.values()): if not site.settings.get("has_bigfile"): @@ -250,7 +225,8 @@ class UiRequestPlugin(object): yield "" yield "" - # Cmd stats + def renderRequests(self): + import main yield "
" yield "

Sent commands:
" yield "" @@ -268,9 +244,18 @@ class UiRequestPlugin(object): yield "" yield "
" - # No more if not in debug mode - if not config.debug: - return + def renderMemory(self): + import gc + from Ui import UiRequest + + hpy = None + if self.get.get("size") == "1": # Calc obj size + try: + import guppy + hpy = guppy.hpy() + except Exception: + pass + self.sendHeader() # Object types @@ -371,6 +356,48 @@ class UiRequestPlugin(object): for module_name, module in objs: yield " - %.3fkb: %s %s
" % (self.getObjSize(module, hpy), module_name, html.escape(repr(module))) + # /Stats entry point + @helper.encodeResponse + def actionStats(self): + import gc + + self.sendHeader() + + if "Multiuser" in PluginManager.plugin_manager.plugin_names and not config.multiuser_local: + yield "This function is disabled on this proxy" + return + + s = time.time() + + # Style + yield """ + + """ + + renderers = [ + self.renderHead(), + self.renderConnectionsTable(), + self.renderTrackers(), + self.renderTor(), + self.renderDbStats(), + self.renderSites(), + self.renderBigfiles(), + self.renderRequests() + + ] + + for part in itertools.chain(*renderers): + yield part + + if config.debug: + for part in self.renderMemory(): + yield part + gc.collect() # Implicit grabage collection yield "Done in %.1f" % (time.time() - s) @@ -457,7 +484,7 @@ class UiRequestPlugin(object): yield "%.1fkb %s... " % ( float(sys.getsizeof(obj)) / 1024, html.escape(str(obj)), html.escape(str(obj)[0:100].ljust(100)) ) - except: + except Exception: continue for ref in refs: yield " ["