lars
de3280806f
plugin interface changed ("prepareForm" removed) plugins do not raise exceptions anymore first part of the partitioning plugin device-specific stuff moved to CryptoBoxTools
81 lines
2.3 KiB
Python
81 lines
2.3 KiB
Python
# $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"):
|
|
import neo_cgi, neo_util
|
|
for plfile in self.__getPluginFiles():
|
|
plname = os.path.basename(plfile)[:-3]
|
|
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)
|
|
lang_hdf = neo_util.HDF()
|
|
lang_hdf.readFile(langfile)
|
|
## add the language data below "Lang.Plugins.PLUGINNAME"
|
|
hdf.copy("Lang.Plugins." + plname, lang_hdf)
|
|
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()
|
|
|