1
2
3
4
5 """ provide plugin infrastructure """
6
7 __copyright__ = 'this file is in the public domain'
8
9 from gozerbot.datadir import datadir
10 from gozerbot.users import users
11 from gozerbot.monitor import outmonitor, saymonitor, jabbermonitor
12 from gozerbot.generic import rlog, handle_exception, checkchan, lockdec, \
13 plugnames, waitforqueue, uniqlist, makeoptions, makeargrest
14 from gozerbot.myimport import my_import
15 from gozerbot.persist import Persist
16 from gozerbot.persistconfig import PersistConfig
17 from gozerbot.config import config
18 from gozerbot.commands import cmnds
19 from gozerbot.callbacks import callbacks, jcallbacks
20 from gozerbot.redispatcher import rebefore, reafter
21 from gozerbot.ircevent import Ircevent
22 from gozerbot.aliases import aliascheck
23 from gozerbot.ignore import shouldignore
24 from gozerbot.thr import start_new_thread
25 from gozerbot.persiststate import PersistState
26 if config['jabberenable']:
27 from gozerbot.jabbermsg import Jabbermsg
28 import os, os.path, thread, time, Queue
29
30 loadlock = thread.allocate_lock()
31 locked = lockdec(loadlock)
32
33 plugstate = PersistState(datadir + os.sep + 'pluginsstate')
34 plugstate.define('plugallow', [])
35
36
40
42
43 """ hold all the plugins """
44
46 self.plugs = {}
47 self.reloadlock = thread.allocate_lock()
48 self.plugdeny = Persist(datadir + os.sep + 'plugdeny')
49 if not self.plugdeny.data:
50 self.plugdeny.data = []
51 self.loadlist = []
52 self.avail = []
53 self.ondisk = []
54
64
66 """ return plugin """
67 if self.plugs.has_key(item):
68 return self.plugs[item]
69 else:
70 return None
71
86
88 """ see if plugin <name> exists """
89 if self.plugs.has_key(name):
90 return 1
91
93 """ prevent plugins <name> to be loaded """
94 if name not in self.plugdeny.data:
95 self.plugdeny.data.append(name)
96 self.plugdeny.save()
97
99 """ enable plugin <name> """
100 if name in self.plugdeny.data:
101 self.plugdeny.data.remove(name)
102 self.plugdeny.save()
103
105 """ call the size() function in all plugins """
106 reslist = []
107 for i, j in self.plugs.iteritems():
108 try:
109 reslist.append("%s: %s" % (i, j.size()))
110 except AttributeError:
111 pass
112 return reslist
113
115 """ list of registered plugins """
116 self.avail.sort()
117 return self.avail
118
120 modname = mod + '.' + name
121 try:
122 plug = my_import(modname)
123 self.plugs[name] = plug
124 except Exception, ex:
125 self.unload(name)
126 handle_exception()
127 return
128
129 try:
130 rlog(0, 'plugins', 'calling %s init()' % name)
131 result = plug.init()
132 if not result:
133 return
134 except AttributeError:
135 pass
136 except:
137 handle_exception()
138 self.unload(name)
139 raise
140 self.avail.append(name)
141
143 """ register plugin """
144 name = name.lower()
145 mod = mod.lower()
146 modname = mod + '.' + name
147
148 if name in self.avail:
149 rlog(10, 'plugins', '%s already registered' % name)
150 return
151 if name in self.plugdeny.data:
152 rlog(10, 'plugins', '%s.%s in deny .. not loading' % \
153 (mod, name))
154 return 0
155 if self.loadlist and name not in self.loadlist and name not in \
156 plugstate['plugallow']:
157 rlog(8, 'plugins', 'not loading %s.%s' % (mod, name))
158 return 0
159
160 if self.plugs.has_key(name):
161 rlog(10, 'plugins', 'overloading %s plugin with %s version' \
162 % (name, mod))
163 self.unloadnosave(name)
164
165 self.plugimport(mod, name)
166 rlog(0, 'plugins', "%s.%s registered" % (mod, name))
167 return name
168
170 time.sleep(7)
171 self.avail.sort()
172 rlog(10, 'plugins', 'registered %s' % ' .. '.join(self.avail))
173
174 - def regdir(self, dirname, exclude=[]):
188
190 avail = []
191 if config['dbenable']:
192 dbplugs = my_import('gozerplugs.dbplugs')
193 for i in dbplugs.__plugs__:
194 start_new_thread(self.regplugin, ('gozerplugs.dbplugs', i))
195 avail.append(i)
196 plugs = my_import('gozerplugs.plugs')
197 for i in plugs.__plugs__:
198 if i not in avail:
199 start_new_thread(self.regplugin, ('gozerplugs.plugs', i))
200 avail.append(i)
201 self.ondisk.extend(avail)
202
216
218
219
220 try:
221 overloadfile = open(datadir + '/permoverload','r')
222 except IOError:
223 return
224 try:
225 for i in overloadfile:
226 i = i.strip()
227 splitted = i.split(',')
228 try:
229 funcname = splitted[0].strip()
230 perms = []
231 for j in splitted[1:]:
232 perms.append(j.strip())
233 except IndexError:
234 rlog(10, 'plugins', "permoverload: can't set perms of %s" \
235 % i)
236 continue
237 if not funcname:
238 rlog(10, 'plugins', "permoverload: no function provided")
239 continue
240 if not perms:
241 rlog(10, 'plugins', "permoverload: no permissions \
242 provided for %s" % funcname)
243 continue
244 if self.permoverload(funcname, perms):
245 rlog(9, 'plugins', '%s permission set to %s' % \
246 (funcname, perms))
247 else:
248 rlog(10, 'plugins', 'overload of %s failed' % funcname)
249 except:
250 handle_exception()
251
253 """ available plugins not yet registered """
254 self.ondisk.sort()
255 return self.ondisk
256
258 """ call save on items in plugins savelist """
259 try:
260 self.save_cfgname(plugname)
261 savelist = self.plugs[plugname].savelist
262 for saveitem in savelist:
263 try:
264 saveitem.save()
265 except:
266 handle_exception()
267 except AttributeError:
268 pass
269 except KeyError:
270 pass
271
273 """ call registered plugins save """
274 for plug in self.plugs.values():
275 try:
276 savelist = getattr(plug, 'savelist')
277 except AttributeError:
278 continue
279 for item in savelist:
280 try:
281 item.save()
282 except:
283 handle_exception()
284
286 """ call registered plugins configuration save """
287 for plug in self.plugs.values():
288 try:
289 cfg = getattr(plug, 'cfg')
290 if isinstance(cfg, PersistConfig):
291 try:
292 cfg.save()
293 except:
294 handle_exception()
295 except AttributeError:
296 continue
297
299 try:
300 plug = self.plugs[name]
301 cfg = getattr(plug, 'cfg')
302 if isinstance(cfg, PersistConfig):
303 try:
304 cfg.save()
305 except:
306 handle_exception()
307 except (AttributeError, KeyError):
308 pass
309
311 """ call registered plugins save """
312 self.save()
313
314 threadlist = []
315 for name, plug in self.plugs.iteritems():
316 try:
317 shutdown = getattr(plug, 'shutdown')
318 thread = start_new_thread(shutdown, ())
319