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 "
address | request | successive errors | last_request |
"
- 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()