]> jfr.im git - erebus.git/blame - ctlmod.py
Added a few module featuresm depends needs testing!
[erebus.git] / ctlmod.py
CommitLineData
db50981b 1import sys
e4255e70 2import modlib
db50981b 3
4modules = {}
e4255e70 5dependents = {}
db50981b 6
7def isloaded(modname): return modname in modules
8def modhas(modname, attname): return getattr(self.modules[modname], attname, None) is not None
9
10def load(parent, modname):
11 if not isloaded(modname):
12 mod = __import__(modname)
e4255e70 13 reload(mod)
14
15 if 1 not in mod.modinfo['compatible']:
16 return modlib.error('API-incompatible')
17
db50981b 18 modules[modname] = mod
e4255e70 19 dependents[modname] = []
20
21 for dep in mod.modinfo['depends']:
22 if dep not in modules:
23 depret = load(parent, dep)
24 if not depret:
25 return
26 dependents[dep].append(modname)
27
28
db50981b 29 ret = mod.modstart(parent)
e4255e70 30 if ret is not None and not ret:
db50981b 31 del modules[modname]
e4255e70 32 del dependents[modname]
33 for dep in mod.modinfo['depends']:
34 dependents[dep].remove(modname)
db50981b 35 return ret
e4255e70 36 else: #if not isloaded...else:
37 return modlib.error('already loaded')
db50981b 38
39def unload(parent, modname):
40 if isloaded(modname):
e4255e70 41 for dependent in dependents[modname]:
42 unload(parent, dependent)
43 for dep in dependents[modname]:
44 dependents[dep].remove(modname)
db50981b 45 self.modules[modname].modstop(parent)
46 else:
e4255e70 47 return modlib.error('already unloaded')
db50981b 48
49def reloadmod(parent, modname):
50 if isloaded(modname):
51 if modhas(modname, 'modrestart'): self.modules[modname].modrestart(parent)
52 else: self.modules[modname].modstop(parent)
53
54 reload(self.modules[modname])
55
56 if modhas(modname, 'modrestarted'): self.modules[modname].modrestarted(parent)
57 else: self.modules[modname].modstart(parent)
58
59 else:
60 load(parent, modname)
61
62def loadall(parent, modlist):
63 for m in modlist: load(parent, m)
64def unloadall(parent, modlist):
65 for m in modlist: unload(parent, m)
66def reloadall(parent, modlist):
67 for m in modlist: reloadmod(parent, m)
68
69sys.path.append('modules')