Forking what is left of ZeroNet and hopefully adding an AT Proto Frontend/Proxy
1import time
2import itertools
3
4import gevent
5
6from Config import config
7from util import helper
8from util.Flag import flag
9from Plugin import PluginManager
10from .ChartDb import ChartDb
11from .ChartCollector import ChartCollector
12
13if "db" not in locals().keys(): # Share on reloads
14 db = ChartDb()
15 gevent.spawn_later(10 * 60, db.archive)
16 helper.timer(60 * 60 * 6, db.archive)
17 collector = ChartCollector(db)
18
19@PluginManager.registerTo("SiteManager")
20class SiteManagerPlugin(object):
21 def load(self, *args, **kwargs):
22 back = super(SiteManagerPlugin, self).load(*args, **kwargs)
23 collector.setInitialLastValues(self.sites.values())
24 return back
25
26 def delete(self, address, *args, **kwargs):
27 db.deleteSite(address)
28 return super(SiteManagerPlugin, self).delete(address, *args, **kwargs)
29
30@PluginManager.registerTo("UiWebsocket")
31class UiWebsocketPlugin(object):
32 @flag.admin
33 def actionChartDbQuery(self, to, query, params=None):
34 if config.debug or config.verbose:
35 s = time.time()
36 rows = []
37 try:
38 if not query.strip().upper().startswith("SELECT"):
39 raise Exception("Only SELECT query supported")
40 res = db.execute(query, params)
41 except Exception as err: # Response the error to client
42 self.log.error("ChartDbQuery error: %s" % err)
43 return {"error": str(err)}
44 # Convert result to dict
45 for row in res:
46 rows.append(dict(row))
47 if config.verbose and time.time() - s > 0.1: # Log slow query
48 self.log.debug("Slow query: %s (%.3fs)" % (query, time.time() - s))
49 return rows
50
51 @flag.admin
52 def actionChartGetPeerLocations(self, to):
53 peers = {}
54 for site in self.server.sites.values():
55 peers.update(site.peers)
56 peer_locations = self.getPeerLocations(peers)
57 return peer_locations