# $Id$ import imp import os import logging class PluginManager: """manage available plugins""" def __init__(self, plugin_dirs=None): self.log = logging.getLogger("CryptoBox") if hasattr(plugin_dirs, "__iter__"): self.plugin_dirs = [os.path.abspath(dir) for dir in plugin_dirs] else: self.plugin_dirs = [os.path.abspath(plugin_dirs)] def allPlugins(self): for plfile in self.__getPluginFiles(): yield os.path.basename(plfile)[:-3] def getPlugin(self, name): for plfile in self.__getPluginFiles(): if name == os.path.basename(plfile)[:-3]: return imp.load_source(name, plfile) else: return None def getTemplateFileName(self, plname, template_name): """return the name of the template file, if it is part of the mentioned plugin """ result = [os.path.join(os.path.dirname(cur_file), template_name + ".cs") for cur_file in self.__getPluginFiles() if plname == os.path.basename(cur_file)[:-3]] for templ_file in result: if os.access(templ_file, os.R_OK) and os.path.isfile(templ_file): return templ_file else: return None def loadLanguageData(self, hdf, lang="en"): for plfile in self.__getPluginFiles(): langdir = os.path.join(os.path.dirname(plfile), "lang") selected_langfile = os.path.join(langdir, lang + ".hdf") default_langfile = os.path.join(langdir, "en.hdf") for langfile in (selected_langfile, default_langfile): if os.access(langfile, os.R_OK): self.log.debug("Loading plugin language file: %s" % langfile) hdf.readFile(langfile) break else: self.log.debug("Couldn't find a plugin language file (%s)" % default_langfile) def __getPluginFiles(self): result = [] for dir in [os.path.abspath(e) for e in self.plugin_dirs if os.access(e, os.R_OK) and os.path.isdir(e)]: for plname in [f for f in os.listdir(dir)]: pldir = os.path.join(dir, plname) plfile = os.path.join(pldir, plname + ".py") if os.path.isfile(plfile) and os.access(plfile, os.R_OK): result.append(plfile) return result if __name__ == "__main__": x = PluginManager("../plugins") for a in x.allPlugins(): print "Plugin: %s" % a print x.getPlugin(a).getStatus()