import sys import os import re from S2Wrapper import ConsoleParser class Plugin(object): pass class ConsolePlugin(ConsoleParser, object): pass _instances = {} _modules = {} def discover_plugins(): plugin_dir = "%s/plugins" % os.path.dirname (os.path.realpath (__file__)) plugins = [x[:-3] for x in os.listdir(plugin_dir) if x.endswith(".py")] sys.path.insert (0, plugin_dir) for plugin in plugins: print "Plugin discovered: %s\n" % plugin try: mod = __import__ (plugin, None, None, ['']) name = re.match ("" , str(mod)).group (1) _modules [name] = mod except: print "Syntax error for plugin %s.\n" % plugin def get_enabled_plugins(type): rtn = [] for name in _instances: rtn.append (_instances[name]) return rtn def reload_by_name(name, type): for _mod in _modules: if (_mod == name): try: print "Reloaded plugin %s" % _mod _modules[_mod] = reload(_modules [_mod]) except: print "Error reloading plugin %s" % _mod def disable_by_name(name, type): plugins = list_plugin_names (type) if name not in plugins: print "plugin %s does not exist.\n" % name return False _plugin = type.__subclasses__ () [plugins.index (name)] if not _plugin: print "Plugin %s has not been found.\n" % name return False else: if _plugin in _instances: del _instances [_plugin] #print "Plugin %s has been disabled.\n" % name return True else: print "plugin %s is _already_ disabled\n" % name return False def enable_by_name(name, type): plugins = list_plugin_names (type) if name not in plugins: print "plugin %s does not exist.\n" % name return False _plugin = type.__subclasses__ () [plugins.index (name)] if not _plugin: print "Plugin has not been found.\n" %_plugin return False else: if not _plugin in _instances: _instances[_plugin] = _plugin () #print "plugin %s has been enabled\n" % name return True else: print "plugin %s has _already_ been enabled\n" % name return False def list_plugins(type): return type.__subclasses__() def list_plugin_names(type): rtn = [] for plugin in type.__subclasses__(): rtn.append (re.match ("" , str(plugin)).group (1)) return rtn