small but significant unload/reload changes.
IrcAdmin: * have sub_unload_module() call the module's shutdown() before deleting stuff * sub_unload_module() needs to delete the sys.modules entry too * slightly more verbose output in sub_unload_module() * sub_reload_module() now does a self.sub_unload_module() + self.sub_load_module() Module: * remove reload() --- modules must now safely handle shutdown
This commit is contained in:
parent
99b474c85b
commit
ea0fd9d509
17
Module.py
17
Module.py
|
@ -205,23 +205,6 @@ class Module(object):
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print('EXCEPTION: ' + str(e))
|
print('EXCEPTION: ' + str(e))
|
||||||
|
|
||||||
def reload(self):
|
|
||||||
"""Reload this module's code and then create a new object of it, removing the old."""
|
|
||||||
|
|
||||||
# re-read and re-compile module from source on disk
|
|
||||||
reload(sys.modules[self.__module__])
|
|
||||||
|
|
||||||
# find the class declaration for the current module
|
|
||||||
for name, obj in inspect.getmembers(sys.modules[self.__module__]):
|
|
||||||
if inspect.isclass(obj) and str(obj).find(self.__module__) > 0:
|
|
||||||
# remove existing object from in-memory stuff
|
|
||||||
self.modlist.remove(self)
|
|
||||||
self.unregister_handlers()
|
|
||||||
|
|
||||||
# create new object, like how we did initially
|
|
||||||
obj(self.config, self.server, self.modlist)
|
|
||||||
self.register_handlers(self.server)
|
|
||||||
|
|
||||||
def reply(self, connection, replypath, replystr):
|
def reply(self, connection, replypath, replystr):
|
||||||
"""
|
"""
|
||||||
Reply over IRC to replypath or return a string with the reply.
|
Reply over IRC to replypath or return a string with the reply.
|
||||||
|
|
|
@ -188,39 +188,47 @@ class IrcAdmin(Module):
|
||||||
except ImportError:
|
except ImportError:
|
||||||
return self.reply(connection, replypath, 'Module ' + modname + ' not found.')
|
return self.reply(connection, replypath, 'Module ' + modname + ' not found.')
|
||||||
|
|
||||||
def sub_reload_module(self, connection, event, nick, userhost, replypath, what, admin_unlocked):
|
|
||||||
"""
|
|
||||||
Attempt to reload a module, by seeing if it's loaded and, if so, calling its reload()
|
|
||||||
"""
|
|
||||||
|
|
||||||
whats = what.split(' ')
|
|
||||||
|
|
||||||
modname = whats[1]
|
|
||||||
for module in self.modlist:
|
|
||||||
if modname == module.__class__.__name__:
|
|
||||||
module.reload()
|
|
||||||
return self.reply(connection, replypath, modname + ' reloaded.')
|
|
||||||
|
|
||||||
def sub_unload_module(self, connection, event, nick, userhost, replypath, what, admin_unlocked):
|
def sub_unload_module(self, connection, event, nick, userhost, replypath, what, admin_unlocked):
|
||||||
"""
|
"""
|
||||||
Attempt to unload and del a module if it's loaded.
|
Attempt to unload and del a module if it's loaded.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
whats = what.split(' ')
|
whats = what.split(' ')
|
||||||
|
|
||||||
modname = whats[1]
|
modname = whats[1]
|
||||||
|
modstr = 'modules.'+modname
|
||||||
|
|
||||||
for module in self.modlist:
|
for module in self.modlist:
|
||||||
if modname == module.__class__.__name__:
|
if modname == module.__class__.__name__:
|
||||||
|
# do anything the module needs to do to clean up
|
||||||
|
module.shutdown()
|
||||||
|
|
||||||
# remove module references
|
# remove module references
|
||||||
self.modlist.remove(module)
|
self.modlist.remove(module)
|
||||||
module.unregister_handlers()
|
module.unregister_handlers()
|
||||||
|
|
||||||
# del it
|
# del it
|
||||||
del module
|
del(sys.modules[modstr])
|
||||||
return self.reply(connection, replypath, modname + ' unloaded.')
|
del(module)
|
||||||
|
|
||||||
|
return self.reply(connection, replypath, 'Module ' + modname + ' unloaded.')
|
||||||
|
|
||||||
# guess it was never loaded
|
# guess it was never loaded
|
||||||
return self.reply(connection, replypath, modname + ' is not loaded.')
|
return self.reply(connection, replypath, 'Module ' + modname + ' is not loaded.')
|
||||||
|
|
||||||
|
def sub_reload_module(self, connection, event, nick, userhost, replypath, what, admin_unlocked):
|
||||||
|
"""
|
||||||
|
Attempt to reload a module, by removing it from memory and then re-initializing it.
|
||||||
|
"""
|
||||||
|
|
||||||
|
whats = what.split(' ')
|
||||||
|
modname = whats[1]
|
||||||
|
ret = self.sub_unload_module(connection, event, nick, userhost, None, what, admin_unlocked)
|
||||||
|
if ret == 'Module ' + modname + ' unloaded.':
|
||||||
|
ret = self.sub_load_module(connection, event, nick, userhost, None, what, admin_unlocked)
|
||||||
|
if ret == 'Module ' + modname + ' loaded.':
|
||||||
|
return self.reply(connection, replypath, 'Module ' + modname + ' reloaded.')
|
||||||
|
|
||||||
|
return self.reply(connection, replypath, 'Module ' + modname + ' reload failed. Check the console.')
|
||||||
|
|
||||||
# Save the config file.
|
# Save the config file.
|
||||||
def save_config(self):
|
def save_config(self):
|
||||||
|
|
Loading…
Reference in New Issue