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: | ||||
|             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): | ||||
|         """ | ||||
|         Reply over IRC to replypath or return a string with the reply. | ||||
|  | ||||
| @ -188,39 +188,47 @@ class IrcAdmin(Module): | ||||
|         except ImportError: | ||||
|             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): | ||||
|         """ | ||||
|         Attempt to unload and del a module if it's loaded. | ||||
|         """ | ||||
| 
 | ||||
|         whats = what.split(' ') | ||||
| 
 | ||||
|         modname = whats[1] | ||||
|         modstr = 'modules.'+modname | ||||
| 
 | ||||
|         for module in self.modlist: | ||||
|             if modname == module.__class__.__name__: | ||||
|                 # do anything the module needs to do to clean up | ||||
|                 module.shutdown() | ||||
| 
 | ||||
|                 # remove module references | ||||
|                 self.modlist.remove(module) | ||||
|                 module.unregister_handlers() | ||||
| 
 | ||||
|                 # del it | ||||
|                 del module | ||||
|                 return self.reply(connection, replypath, modname + ' unloaded.') | ||||
|                 del(sys.modules[modstr]) | ||||
|                 del(module) | ||||
| 
 | ||||
|                 return self.reply(connection, replypath, 'Module ' + modname + ' unloaded.') | ||||
| 
 | ||||
|         # 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. | ||||
|     def save_config(self): | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user