diff --git a/plugins/Chart/ChartCollector.py b/plugins/Chart/ChartCollector.py index f379e0df..776343af 100644 --- a/plugins/Chart/ChartCollector.py +++ b/plugins/Chart/ChartCollector.py @@ -25,7 +25,8 @@ class ChartCollector(object): def getCollectors(self): collectors = {} - file_server = sys.modules["main"].file_server + import main + file_server = main.file_server sites = file_server.sites if not sites: return collectors @@ -100,7 +101,8 @@ class ChartCollector(object): return site_collectors def getUniquePeers(self): - sites = sys.modules["main"].file_server.sites + import main + sites = main.file_server.sites return set(itertools.chain.from_iterable( [site.peers.keys() for site in sites.values()] )) @@ -168,7 +170,8 @@ class ChartCollector(object): def collector(self): collectors = self.getCollectors() site_collectors = self.getSiteCollectors() - sites = sys.modules["main"].file_server.sites + import main + sites = main.file_server.sites i = 0 while 1: self.collectGlobal(collectors, self.last_values) diff --git a/plugins/Chart/ChartDb.py b/plugins/Chart/ChartDb.py index c31c27e8..af5816b2 100644 --- a/plugins/Chart/ChartDb.py +++ b/plugins/Chart/ChartDb.py @@ -1,5 +1,5 @@ from Config import config -from Db import Db +from Db.Db import Db import time diff --git a/plugins/Newsfeed/NewsfeedPlugin.py b/plugins/Newsfeed/NewsfeedPlugin.py index 3f306126..10acd7cc 100644 --- a/plugins/Newsfeed/NewsfeedPlugin.py +++ b/plugins/Newsfeed/NewsfeedPlugin.py @@ -2,7 +2,7 @@ import time import re from Plugin import PluginManager -from Db import DbQuery +from Db.DbQuery import DbQuery from Debug import Debug diff --git a/plugins/Stats/StatsPlugin.py b/plugins/Stats/StatsPlugin.py index 12ad4868..9d436d8d 100644 --- a/plugins/Stats/StatsPlugin.py +++ b/plugins/Stats/StatsPlugin.py @@ -8,6 +8,7 @@ from Plugin import PluginManager from Config import config from util import helper from Debug import Debug +from Db import Db @PluginManager.registerTo("UiRequest") @@ -40,8 +41,8 @@ class UiRequestPlugin(object): import gc import sys from Ui import UiRequest - from Db import Db from Crypt import CryptConnection + import main hpy = None @@ -58,7 +59,6 @@ class UiRequestPlugin(object): return s = time.time() - main = sys.modules["main"] # Style yield """ @@ -142,7 +142,8 @@ class UiRequestPlugin(object): # Trackers yield "

Trackers:
" yield "" - for tracker_address, tracker_stat in sorted(sys.modules["Site.SiteAnnouncer"].global_stats.items()): + 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), ("%s", tracker_stat["num_request"]), @@ -173,7 +174,7 @@ class UiRequestPlugin(object): # Db yield "

Db:
" - for db in sys.modules["Db.Db"].opened_dbs: + for db in Db.opened_dbs: tables = [row["name"] for row in db.execute("SELECT name FROM sqlite_master WHERE type = 'table'").fetchall()] table_rows = {} for table in tables: @@ -341,7 +342,7 @@ class UiRequestPlugin(object): for obj in objs: yield " - %.1fkb: %s
" % (self.getObjSize(obj, hpy), html.escape(repr(obj))) - from Site import Site + from Site.Site import Site objs = [obj for obj in gc.get_objects() if isinstance(obj, Site)] yield "
Sites (%s):
" % len(objs) for obj in objs: @@ -636,7 +637,6 @@ class UiRequestPlugin(object): assert data == data_unpacked, "%s != %s" % (data_unpacked, data) # Db - from Db import Db import sqlite3 yield "
Db: (version: %s, API: %s)
" % (sqlite3.sqlite_version, sqlite3.version) @@ -668,12 +668,12 @@ class UiRequestPlugin(object): with benchmark("Open x 10", 0.13): for i in range(10): - db = Db(schema, "%s/benchmark.db" % config.data_dir) + db = Db.Db(schema, "%s/benchmark.db" % config.data_dir) db.checkTables() db.close() yield "." - db = Db(schema, "%s/benchmark.db" % config.data_dir) + db = Db.Db(schema, "%s/benchmark.db" % config.data_dir) db.checkTables() import json diff --git a/plugins/Trayicon/TrayiconPlugin.py b/plugins/Trayicon/TrayiconPlugin.py index fd47cf39..8a1294cb 100644 --- a/plugins/Trayicon/TrayiconPlugin.py +++ b/plugins/Trayicon/TrayiconPlugin.py @@ -19,8 +19,9 @@ class ActionsPlugin(object): global notificationicon, winfolders from .lib import notificationicon, winfolders import gevent.threadpool + import main - self.main = sys.modules["main"] + self.main = main fs_encoding = sys.getfilesystemencoding() diff --git a/plugins/disabled-Multiuser/MultiuserPlugin.py b/plugins/disabled-Multiuser/MultiuserPlugin.py index 84dcd6ff..de4b27cc 100644 --- a/plugins/disabled-Multiuser/MultiuserPlugin.py +++ b/plugins/disabled-Multiuser/MultiuserPlugin.py @@ -5,6 +5,7 @@ import json from Config import config from Plugin import PluginManager from Crypt import CryptBitcoin +from User import UserManager from . import UserPlugin try: @@ -16,7 +17,7 @@ except Exception as err: @PluginManager.registerTo("UiRequest") class UiRequestPlugin(object): def __init__(self, *args, **kwargs): - self.user_manager = sys.modules["User.UserManager"].user_manager + self.user_manager = UserManager.user_manager super(UiRequestPlugin, self).__init__(*args, **kwargs) # Create new user and inject user welcome message if necessary @@ -135,7 +136,7 @@ class UiWebsocketPlugin(object): script += "$('#button_notification').on('click', function() { zeroframe.cmd(\"userLoginForm\", []); });" self.cmd("injectScript", script) # Delete from user_manager - user_manager = sys.modules["User.UserManager"].user_manager + user_manager = UserManager.user_manager if self.user.master_address in user_manager.users: if not config.multiuser_local: del user_manager.users[self.user.master_address] @@ -149,7 +150,7 @@ class UiWebsocketPlugin(object): # Login form submit def responseUserLogin(self, master_seed): - user_manager = sys.modules["User.UserManager"].user_manager + user_manager = UserManager.user_manager user = user_manager.get(CryptBitcoin.privatekeyToAddress(master_seed)) if not user: user = user_manager.create(master_seed=master_seed) diff --git a/src/Config.py b/src/Config.py index 479c3fa2..a1ac637b 100644 --- a/src/Config.py +++ b/src/Config.py @@ -501,6 +501,7 @@ class Config(object): def getServerInfo(self): from Plugin import PluginManager + import main info = { "platform": sys.platform, @@ -520,9 +521,9 @@ class Config(object): } try: - info["ip_external"] = sys.modules["main"].file_server.port_opened - info["tor_enabled"] = sys.modules["main"].file_server.tor_manager.enabled - info["tor_status"] = sys.modules["main"].file_server.tor_manager.status + info["ip_external"] = main.file_server.port_opened + info["tor_enabled"] = main.file_server.tor_manager.enabled + info["tor_status"] = main.file_server.tor_manager.status except: pass diff --git a/src/Content/ContentDb.py b/src/Content/ContentDb.py index 07421dfe..b42a6e27 100644 --- a/src/Content/ContentDb.py +++ b/src/Content/ContentDb.py @@ -1,7 +1,7 @@ import time import os -from Db import Db +from Db.Db import Db from Config import config from Plugin import PluginManager from Debug import Debug diff --git a/src/Db/__init__.py b/src/Db/__init__.py index 93c5b911..e69de29b 100644 --- a/src/Db/__init__.py +++ b/src/Db/__init__.py @@ -1,3 +0,0 @@ -from .Db import Db -from .DbQuery import DbQuery -from .DbCursor import DbCursor \ No newline at end of file diff --git a/src/Debug/DebugHook.py b/src/Debug/DebugHook.py index 72c46778..e7baa51d 100644 --- a/src/Debug/DebugHook.py +++ b/src/Debug/DebugHook.py @@ -13,12 +13,13 @@ last_error = None def shutdown(reason="Unknown"): logging.info("Shutting down (reason: %s)..." % reason) - if "file_server" in dir(sys.modules["main"]) and sys.modules["main"].file_server.running: + import main + if "file_server" in dir(main) and main.file_server.running: try: - if "file_server" in dir(sys.modules["main"]): - gevent.spawn(sys.modules["main"].file_server.stop) - if "ui_server" in dir(sys.modules["main"]): - gevent.spawn(sys.modules["main"].ui_server.stop) + if "file_server" in dir(main): + gevent.spawn(main.file_server.stop) + if "ui_server" in dir(main): + gevent.spawn(main.ui_server.stop) except Exception as err: print("Proper shutdown error: %s" % err) sys.exit(0) diff --git a/src/Peer/Peer.py b/src/Peer/Peer.py index 159ee41a..63928c02 100644 --- a/src/Peer/Peer.py +++ b/src/Peer/Peer.py @@ -91,7 +91,8 @@ class Peer(object): elif self.site: connection_server = self.site.connection_server else: - connection_server = sys.modules["main"].file_server + import main + connection_server = main.file_server self.connection = connection_server.getConnection(self.ip, self.port, site=self.site, is_tracker_connection=self.is_tracker_connection) self.reputation += 1 self.connection.sites += 1 diff --git a/src/Site/Site.py b/src/Site/Site.py index a80de082..1a45066f 100644 --- a/src/Site/Site.py +++ b/src/Site/Site.py @@ -55,14 +55,15 @@ class Site(object): self.storage = SiteStorage(self, allow_create=allow_create) # Save and load site files self.content_manager = ContentManager(self) self.content_manager.loadContents() # Load content.json files - if "main" in sys.modules and "file_server" in dir(sys.modules["main"]): # Use global file server by default if possible - self.connection_server = sys.modules["main"].file_server - else: - if "main" in sys.modules: - sys.modules["main"].file_server = FileServer() - self.connection_server = sys.modules["main"].file_server + if "main" in sys.modules: # import main has side-effects, breaks tests + import main + if "file_server" in dir(main): # Use global file server by default if possible + self.connection_server = main.file_server else: - self.connection_server = FileServer() + main.file_server = FileServer() + self.connection_server = main.file_server + else: + self.connection_server = FileServer() self.announcer = SiteAnnouncer(self) # Announce and get peer list from other nodes diff --git a/src/Site/SiteStorage.py b/src/Site/SiteStorage.py index 609c3121..8a1b539b 100644 --- a/src/Site/SiteStorage.py +++ b/src/Site/SiteStorage.py @@ -11,7 +11,7 @@ import gevent.event import util from util import SafeRe -from Db import Db +from Db.Db import Db from Debug import Debug from Config import config from util import helper diff --git a/src/Site/__init__.py b/src/Site/__init__.py index 340385b3..e69de29b 100644 --- a/src/Site/__init__.py +++ b/src/Site/__init__.py @@ -1,3 +0,0 @@ -from .Site import Site -from .SiteStorage import SiteStorage -from .SiteAnnouncer import SiteAnnouncer diff --git a/src/Test/TestDbQuery.py b/src/Test/TestDbQuery.py index 214704a4..597bc950 100644 --- a/src/Test/TestDbQuery.py +++ b/src/Test/TestDbQuery.py @@ -1,6 +1,6 @@ import re -from Db import DbQuery +from Db.DbQuery import DbQuery class TestDbQuery: diff --git a/src/Test/TestSiteDownload.py b/src/Test/TestSiteDownload.py index 972ddd3c..8628b340 100644 --- a/src/Test/TestSiteDownload.py +++ b/src/Test/TestSiteDownload.py @@ -8,7 +8,7 @@ from Connection import ConnectionServer from Config import config from File import FileRequest from File import FileServer -from Site import Site +from Site.Site import Site from . import Spy diff --git a/src/Test/conftest.py b/src/Test/conftest.py index d6104202..60fba465 100644 --- a/src/Test/conftest.py +++ b/src/Test/conftest.py @@ -89,7 +89,7 @@ config.trackers = [] config.data_dir = TEST_DATA_PATH # Use test data for unittests config.initLogging() -from Site import Site +from Site.Site import Site from Site import SiteManager from User import UserManager from File import FileServer @@ -104,7 +104,7 @@ from Db import Db def cleanup(): - sys.modules["Db.Db"].dbCloseAll() + Db.dbCloseAll() for dir_path in [config.data_dir, config.data_dir + "-temp"]: for file_name in os.listdir(dir_path): ext = file_name.rsplit(".", 1)[-1] @@ -388,7 +388,7 @@ def db(request): if os.path.isfile(db_path): os.unlink(db_path) - db = Db(schema, db_path) + db = Db.Db(schema, db_path) db.checkTables() def stop(): diff --git a/src/Tor/TorManager.py b/src/Tor/TorManager.py index a33a4697..253b2382 100644 --- a/src/Tor/TorManager.py +++ b/src/Tor/TorManager.py @@ -82,8 +82,10 @@ class TorManager(object): def setStatus(self, status): self.status = status - if "ui_server" in dir(sys.modules.get("main", {})): - sys.modules["main"].ui_server.updateWebsocket() + if "main" in sys.modules: # import main has side-effects, breaks tests + import main + if "ui_server" in dir(main): + main.ui_server.updateWebsocket() def startTor(self): if sys.platform.startswith("win"): diff --git a/src/Ui/UiRequest.py b/src/Ui/UiRequest.py index 104daaa5..b4f4235a 100644 --- a/src/Ui/UiRequest.py +++ b/src/Ui/UiRequest.py @@ -745,8 +745,8 @@ class UiRequest(object): # Debug last error def actionDebug(self): # Raise last error from DebugHook - import sys - last_error = sys.modules["main"].DebugHook.last_error + import main + last_error = main.DebugHook.last_error if last_error: raise last_error[0](last_error[1]).with_traceback(last_error[2]) else: diff --git a/src/Ui/UiServer.py b/src/Ui/UiServer.py index 3c1adfb8..ef927e85 100644 --- a/src/Ui/UiServer.py +++ b/src/Ui/UiServer.py @@ -34,16 +34,16 @@ class UiWSGIHandler(WSGIHandler): except Exception as err: logging.error("UiWSGIHandler websocket error: %s" % Debug.formatException(err)) if config.debug: # Allow websocket errors to appear on /Debug - import sys - sys.modules["main"].DebugHook.handleError() + import main + main.DebugHook.handleError() else: # Standard HTTP request try: super(UiWSGIHandler, self).run_application() except Exception as err: logging.error("UiWSGIHandler error: %s" % Debug.formatException(err)) if config.debug: # Allow websocket errors to appear on /Debug - import sys - sys.modules["main"].DebugHook.handleError() + import main + main.DebugHook.handleError() def handle(self): # Save socket to be able to close them properly on exit @@ -160,7 +160,8 @@ class UiServer: self.server.serve_forever() except Exception as err: self.log.error("Web interface bind error, must be running already, exiting.... %s" % err) - sys.modules["main"].file_server.stop() + import main + main.file_server.stop() self.log.debug("Stopped.") def stop(self): diff --git a/src/Ui/UiWebsocket.py b/src/Ui/UiWebsocket.py index 882755f4..6df95032 100644 --- a/src/Ui/UiWebsocket.py +++ b/src/Ui/UiWebsocket.py @@ -50,7 +50,8 @@ class UiWebsocket(object): if self.site.address == config.homepage and not self.site.page_requested: # Add open fileserver port message or closed port error to homepage at first request after start self.site.page_requested = True # Dont add connection notification anymore - file_server = sys.modules["main"].file_server + import main + file_server = main.file_server if not file_server.port_opened or file_server.tor_manager.start_onions is None: self.site.page_requested = False # Not ready yet, check next time else: @@ -84,7 +85,8 @@ class UiWebsocket(object): self.handleRequest(req) except Exception as err: if config.debug: # Allow websocket errors to appear on /Debug - sys.modules["main"].DebugHook.handleError() + import main + main.DebugHook.handleError() self.log.error("WebSocket handleRequest error: %s \n %s" % (Debug.formatException(err), message)) if not self.hasPlugin("Multiuser"): self.cmd("error", "Internal error: %s" % Debug.formatException(err, "html")) @@ -105,7 +107,8 @@ class UiWebsocket(object): "Please check your configuration.") ]) - file_server = sys.modules["main"].file_server + import main + file_server = main.file_server if any(file_server.port_opened.values()): self.site.notifications.append([ "done", @@ -233,7 +236,8 @@ class UiWebsocket(object): self.response(args[0], result) except Exception as err: if config.debug: # Allow websocket errors to appear on /Debug - sys.modules["main"].DebugHook.handleError() + import main + main.DebugHook.handleError() self.log.error("WebSocket handleRequest error: %s" % Debug.formatException(err)) self.cmd("error", "Internal error: %s" % Debug.formatException(err, "html")) @@ -318,7 +322,8 @@ class UiWebsocket(object): return ret def formatServerInfo(self): - file_server = sys.modules["main"].file_server + import main + file_server = main.file_server if file_server.port_opened == {}: ip_external = None else: @@ -548,7 +553,8 @@ class UiWebsocket(object): self.response(to, "ok") else: if len(site.peers) == 0: - if any(sys.modules["main"].file_server.port_opened.values()) or sys.modules["main"].file_server.tor_manager.start_onions: + import main + if any(main.file_server.port_opened.values()) or main.file_server.tor_manager.start_onions: if notification: self.cmd("notification", ["info", _["No peers found, but your content is ready to access."]]) if callback: @@ -1106,10 +1112,11 @@ class UiWebsocket(object): ) websocket.cmd("updating") - sys.modules["main"].update_after_shutdown = True + import main + main.update_after_shutdown = True SiteManager.site_manager.save() - sys.modules["main"].file_server.stop() - sys.modules["main"].ui_server.stop() + main.file_server.stop() + main.ui_server.stop() self.cmd( "confirm", @@ -1118,15 +1125,17 @@ class UiWebsocket(object): ) def actionServerPortcheck(self, to): - file_server = sys.modules["main"].file_server + import main + file_server = main.file_server file_server.portCheck() self.response(to, file_server.port_opened) def actionServerShutdown(self, to, restart=False): + import main if restart: - sys.modules["main"].restart_after_shutdown = True - sys.modules["main"].file_server.stop() - sys.modules["main"].ui_server.stop() + main.restart_after_shutdown = True + main.file_server.stop() + main.ui_server.stop() def actionServerShowdirectory(self, to, directory="backup", inner_path=""): if self.request.env["REMOTE_ADDR"] != "127.0.0.1": @@ -1182,7 +1191,8 @@ class UiWebsocket(object): value = False else: value = True - tor_manager = sys.modules["main"].file_server.tor_manager + import main + tor_manager = main.file_server.tor_manager tor_manager.request("SETCONF UseBridges=%i" % value) if key == "trackers_file": @@ -1192,6 +1202,6 @@ class UiWebsocket(object): logging.getLogger('').setLevel(logging.getLevelName(config.log_level)) if key == "ip_external": - gevent.spawn(sys.modules["main"].file_server.portCheck) + gevent.spawn(main.file_server.portCheck) self.response(to, "ok") diff --git a/src/main.py b/src/main.py index 81cae756..c3ea2176 100644 --- a/src/main.py +++ b/src/main.py @@ -151,7 +151,7 @@ class Actions(object): logging.info("Please, secure it now, you going to need it to modify your site!") logging.info("Creating directory structure...") - from Site import Site + from Site.Site import Site from Site import SiteManager SiteManager.site_manager.load() @@ -167,7 +167,7 @@ class Actions(object): logging.info("Site created!") def siteSign(self, address, privatekey=None, inner_path="content.json", publish=False, remove_missing_optional=False): - from Site import Site + from Site.Site import Site from Site import SiteManager from Debug import Debug SiteManager.site_manager.load() @@ -196,7 +196,7 @@ class Actions(object): def siteVerify(self, address): import time - from Site import Site + from Site.Site import Site from Site import SiteManager SiteManager.site_manager.load() @@ -230,7 +230,7 @@ class Actions(object): logging.error("[ERROR] Error during verifying site files!") def dbRebuild(self, address): - from Site import Site + from Site.Site import Site from Site import SiteManager SiteManager.site_manager.load() @@ -241,7 +241,7 @@ class Actions(object): logging.info("Done in %.3fs" % (time.time() - s)) def dbQuery(self, address, query): - from Site import Site + from Site.Site import Site from Site import SiteManager SiteManager.site_manager.load() @@ -272,7 +272,7 @@ class Actions(object): print(site.peers) def siteDownload(self, address): - from Site import Site + from Site.Site import Site from Site import SiteManager SiteManager.site_manager.load() @@ -301,7 +301,7 @@ class Actions(object): def siteNeedFile(self, address, inner_path): - from Site import Site + from Site.Site import Site from Site import SiteManager SiteManager.site_manager.load() @@ -357,7 +357,7 @@ class Actions(object): def sitePublish(self, address, peer_ip=None, peer_port=15441, inner_path="content.json"): global file_server - from Site import Site + from Site.Site import Site from Site import SiteManager from File import FileServer # We need fileserver to handle incoming file requests from Peer import Peer diff --git a/zeronet.py b/zeronet.py index a05e6098..a8852493 100755 --- a/zeronet.py +++ b/zeronet.py @@ -26,7 +26,7 @@ def main(): import update # Close lock file - sys.modules["main"].lock.close() + main.lock.close() # Update try: @@ -49,7 +49,7 @@ def main(): import atexit print("Restarting...") # Close log files - logger = sys.modules["main"].logging.getLogger() + logger = main.logging.getLogger() for handler in logger.handlers[:]: handler.flush()
address request successive errors last_request