X-Git-Url: https://jfr.im/git/erebus.git/blobdiff_plain/5a81c82b9a94a1a2f66552c78ca53b4e10d38a77..c889fbb1f64a7eac7de813eb24326139c58c7b18:/ctlmod.py diff --git a/ctlmod.py b/ctlmod.py index b8244a8..db8a5b8 100644 --- a/ctlmod.py +++ b/ctlmod.py @@ -12,13 +12,20 @@ def modhas(modname, attname): return getattr(modules[modname], attname, None) is def load(parent, modname): if not isloaded(modname): - mod = __import__(modname) - reload(mod) + sys.path.insert(0, 'modules') + try: + mod = __import__(modname) + reload(mod) #in case it's been previously loaded. + except BaseException as e: #we don't want even sys.exit() to crash us (in case of malicious module) so use BaseException + return modlib.error(e) + finally: + del sys.path[0] #remove ./modules from path, in case there's a name conflict + if not hasattr(mod, 'modinfo'): return modlib.error('no modinfo') - if 1 not in mod.modinfo['compatible']: + if parent.APIVERSION not in mod.modinfo['compatible']: return modlib.error('API-incompatible') modules[modname] = mod @@ -59,13 +66,18 @@ def reloadmod(parent, modname): if modhas(modname, 'modrestart'): modules[modname].modrestart(parent) else: modules[modname].modstop(parent) - reload(modules[modname]) + try: + reload(modules[modname]) + except BaseException as e: + return modlib.error(e) - if modhas(modname, 'modrestarted'): modules[modname].modrestarted(parent) - else: modules[modname].modstart(parent) + if modhas(modname, 'modrestarted'): ret = modules[modname].modrestarted(parent) + else: ret = modules[modname].modstart(parent) + return ret else: - load(parent, modname) + return load(parent, modname) + def loadall(parent, modlist): for m in modlist: load(parent, m)