From a7d7013639d8e1538c65c254de52d6fa77e54af2 Mon Sep 17 00:00:00 2001 From: nemunaire Date: Sun, 24 May 2015 16:47:22 +0200 Subject: [PATCH] Fix and improve reload process --- nemubot/__init__.py | 3 +++ nemubot/__main__.py | 15 +++++++++++---- nemubot/bot.py | 12 ++++++++---- nemubot/server/abstract.py | 2 +- 4 files changed, 23 insertions(+), 9 deletions(-) diff --git a/nemubot/__init__.py b/nemubot/__init__.py index 7b3d21f..7b6949e 100644 --- a/nemubot/__init__.py +++ b/nemubot/__init__.py @@ -87,6 +87,9 @@ def reload(): import imp + import nemubot.bot + imp.reload(nemubot.bot) + import nemubot.channel imp.reload(nemubot.channel) diff --git a/nemubot/__main__.py b/nemubot/__main__.py index 456dc3a..5c30695 100644 --- a/nemubot/__main__.py +++ b/nemubot/__main__.py @@ -139,7 +139,8 @@ def main(): # Register the hook for futur import from nemubot.importer import ModuleFinder - sys.meta_path.append(ModuleFinder(context.modules_paths, context.add_module)) + module_finder = ModuleFinder(context.modules_paths, context.add_module) + sys.meta_path.append(module_finder) # Load requested configuration files for path in args.files: @@ -162,6 +163,9 @@ def main(): def sighuphandler(signum, frame): """On SIGHUP, perform a deep reload""" import imp + nonlocal nemubot, context, module_finder + + logger.debug("SIGHUP receive, iniate reload procedure...") # Reload nemubot Python modules imp.reload(nemubot) @@ -171,6 +175,11 @@ def main(): import nemubot.bot context = nemubot.bot.hotswap(context) + # Reload ModuleFinder + sys.meta_path.remove(module_finder) + module_finder = ModuleFinder(context.modules_paths, context.add_module) + sys.meta_path.append(module_finder) + # Reload configuration file for path in args.files: if os.path.isfile(path): @@ -186,9 +195,6 @@ def main(): "".join(traceback.format_stack(stack))) signal.signal(signal.SIGUSR1, sigusr1handler) - # Here we go! - context.start() - if args.socketfile: from nemubot.server.socket import SocketListener context.add_server(SocketListener(context.add_server, "master_socket", @@ -198,6 +204,7 @@ def main(): oldcontext = None while oldcontext != context: oldcontext = context + context.start() context.join() # Wait for consumers diff --git a/nemubot/bot.py b/nemubot/bot.py index e449f35..8caf0ed 100644 --- a/nemubot/bot.py +++ b/nemubot/bot.py @@ -145,6 +145,7 @@ class Bot(threading.Thread): from select import select from nemubot.server import _lock, _rlist, _wlist, _xlist + logger.info("Starting main loop") self.stop = False while not self.stop: with _lock: @@ -211,6 +212,7 @@ class Bot(threading.Thread): self.load_file(path) logger.info("Configurations successfully loaded") self.sync_queue.task_done() + logger.info("Ending main loop") @@ -568,14 +570,16 @@ def hotswap(bak): bak.stop = True if bak.event_timer is not None: bak.event_timer.cancel() + + # Unload modules + for mod in [k for k in bak.modules.keys()]: + bak.unload_module(mod) + + # Save datastore bak.datastore.close() new = Bot(str(bak.ip), bak.modules_paths, bak.datastore) new.servers = bak.servers - new.modules = bak.modules - new.modules_configuration = bak.modules_configuration - new.events = bak.events - new.hooks = bak.hooks new._update_event_timer() return new diff --git a/nemubot/server/abstract.py b/nemubot/server/abstract.py index ebcb427..8e3dc3b 100644 --- a/nemubot/server/abstract.py +++ b/nemubot/server/abstract.py @@ -113,7 +113,7 @@ class AbstractServer(io.IOBase): """ self._sending_queue.put(self.format(message)) - self.logger.debug("Message '%s' appended to Queue", message) + self.logger.debug("Message '%s' appended to write queue", message) if self not in _wlist: _wlist.append(self)