def uninstallPlugin(cls, plugin_name=None, plugin_pk=None, dev_mode=False): # Get plugin by name or pk if plugin_pk: plugin_list = Plugin.objects(pk=plugin_pk) else: plugin_list = Plugin.objects(name=plugin_name) # Should be only one result if not plugin_list or len(plugin_list) != 1: return {'status': 'fail', 'log': 'Plugin not installed'} plugin = plugin_list[0] # Uninstall pip package if not dev_mode: pip.main(['uninstall', '--quiet', 'lisa-plugin-' + plugin_name]) # Remove plugin crons for cron in Cron.objects(plugin=plugin): cron.delete() # Remove plugin intents for oIntent in Intent.objects(plugin=plugin): oIntent.delete() # Remove plugin plugin.delete() return {'status': 'success', 'log': 'Plugin uninstalled'}
def uninstallPlugin(cls, plugin_name = None, plugin_pk = None, dev_mode = False): # Get plugin by name or pk if plugin_pk: plugin_list = Plugin.objects(pk = plugin_pk) else: plugin_list = Plugin.objects(name = plugin_name) # Should be only one result if not plugin_list or len(plugin_list) != 1: return {'status': 'fail', 'log': 'Plugin not installed'} plugin = plugin_list[0] # Uninstall pip package if not dev_mode: pip.main(['uninstall', '--quiet', 'lisa-plugin-' + plugin_name]) # Remove plugin crons for cron in Cron.objects(plugin = plugin): cron.delete() # Remove plugin intents for oIntent in Intent.objects(plugin = plugin): oIntent.delete() # Remove plugin plugin.delete() return {'status': 'success', 'log': 'Plugin uninstalled'}
def updatePlugin(cls, plugin_name = None, plugin_pk = None): # Get plugin by name or pk if plugin_pk: plugin_list = Plugin.objects(pk = plugin_pk) else: plugin_list = Plugin.objects(name = plugin_name) # Should be only one result if not plugin_list or len(plugin_list) != 1: return {'status': 'fail', 'log': 'Plugin not installed'} plugin = plugin_list[0] # Update plugin cls._updatePlugin(plugin = plugin) return {'status': 'success', 'log': 'Plugin updated'}
def getPlugin(cls, plugin_name=None, plugin_uid=None): # Return fake core plugin if (plugin_uid is not None and plugin_uid == 0) or (plugin_name is not None and plugin_name == "Core"): class FakePlugin(): def __init__(self): self.name = "Core" self.pk = 0 self.uid = 0 self.steps = {'count': 0, 'first': None, 'last': None} return FakePlugin() # List enabled plugins plugin_list = Plugin.objects(enabled=True, lang=configuration['lang_short']) # Search plugin for plugin in plugin_list: # Search plugin by name if plugin_name is not None and plugin.name == plugin_name: return plugin # Search plugin by uid if plugin_uid is not None and plugin.pk == plugin_uid: return plugin # Not found return None
def getPlugin(cls, plugin_name = None, plugin_uid = None): # Return fake core plugin if (plugin_uid is not None and plugin_uid == 0) or (plugin_name is not None and plugin_name == "Core"): class FakePlugin(): def __init__(self): self.name = "Core" self.pk = 0 self.uid = 0 self.steps = {'count': 0, 'first': None, 'last': None} return FakePlugin() # List enabled plugins plugin_list = Plugin.objects(enabled = True, lang = configuration['lang_short']) # Search plugin for plugin in plugin_list: # Search plugin by name if plugin_name is not None and plugin.name == plugin_name: return plugin # Search plugin by uid if plugin_uid is not None and plugin.pk == plugin_uid: return plugin # Not found return None
def installPlugin(cls, plugin_name=None, test_mode=False, dev_mode=False): # If already installed if Plugin.objects(name=plugin_name): return {'status': 'fail', 'log': 'Plugin already installed'} # If not dev mode, download package if not dev_mode: if test_mode: pip.main([ 'install', '--quiet', '--install-option=--install-platlib=' + os.getcwd() + '/../', '--install-option=--install-purelib=' + os.getcwd() + '/../', 'lisa-plugin-' + plugin_name ]) else: pip.main(['install', 'lisa-plugin-' + plugin_name]) # Create new plugin plugin = Plugin() setattr(plugin, 'name', plugin_name) # Update plugin in DB cls._updatePlugin(plugin=plugin) return {'status': 'success', 'log': 'Plugin installed'}
def updatePlugin(cls, plugin_name=None, plugin_pk=None): # Get plugin by name or pk if plugin_pk: plugin_list = Plugin.objects(pk=plugin_pk) else: plugin_list = Plugin.objects(name=plugin_name) # Should be only one result if not plugin_list or len(plugin_list) != 1: return {'status': 'fail', 'log': 'Plugin not installed'} plugin = plugin_list[0] # Update plugin cls._updatePlugin(plugin=plugin) return {'status': 'success', 'log': 'Plugin updated'}
def getPluginMethods(cls, plugin_name = None): # Get plugin by name or pk if plugin_name: plugin_list = Plugin.objects(name = plugin_name) else: plugin_list = Plugin.objects # Parse plugins listallmethods = [] for plugin in plugin_list: plugininstance = namedAny('.'.join(('lisa.plugins', str(plugin.name), 'modules', str(plugin.name).lower(), str(plugin.name))))() listpluginmethods = [] for m in inspect.getmembers(plugininstance, predicate = inspect.ismethod): if not "__init__" in m and not m.startswith("_"): listpluginmethods.append(m[0]) listallmethods.append({'plugin': plugin.name, 'methods': listpluginmethods}) # Parse core plugins for f in os.listdir(os.path.normpath(server_path + '/core')): fileName, fileExtension = os.path.splitext(f) if os.path.isfile(os.path.join(os.path.normpath(server_path + '/core'), f)) and not f.startswith('__init__') and fileExtension != '.pyc': coreinstance = namedAny('.'.join(('lisa.server.core', str(fileName).lower(), str(fileName).capitalize())))() listcoremethods = [] for m in inspect.getmembers(coreinstance, predicate = inspect.ismethod): #init shouldn't be listed in methods and _ is for translation if not "__init__" in m and not m.startswith("_"): listcoremethods.append(m[0]) listallmethods.append({'core': fileName, 'methods': listcoremethods}) log.msg(listallmethods) return listallmethods
def getEnabledPluginNames(cls): # List enabled plugins plugin_list = Plugin.objects(enabled = True, lang = configuration['lang_short']) # Fill plugins name list enabled_plugins_names = [] for plugin in plugin_list: enabled_plugins_names.append(str(plugin['name'])) return enabled_plugins_names
def plugin_list(self): metareq = requests.get('/'.join( [configuration['plugin_store'], 'plugins.json'])) pluginDB = Plugin.objects() pluginlist_store = [] pluginlist_local = [] in_store = False if (metareq.ok): [ pluginlist_store.append(item['name']) for item in json.loads(metareq.text or metareq.content) ] [pluginlist_local.append(plugin['name']) for plugin in pluginDB] if pluginDB: for plugin in pluginDB: for plugin_name in pluginlist_store: if plugin['name'].lower() == plugin_name.lower(): self.plugins.append({ "name": plugin['name'], "installed": True, "enabled": plugin['enabled'] }) in_store = True if not in_store: self.plugins.append({ "name": plugin['name'], "installed": True, "enabled": plugin['enabled'] }) else: in_store = False for plugin_store in pluginlist_store: if not plugin_store in pluginlist_local: self.plugins.append({ "name": plugin_store, "installed": False, "enabled": False }) else: self.stdout.write(self.FAIL + "The plugin list seems to no be available" + self.ENDC) for pluginDict in self.plugins: if pluginDict['installed']: installed = "[" + self.OKGREEN + "Installed" + self.ENDC + "]" else: installed = "[" + self.FAIL + "Not installed" + self.ENDC + "]" if pluginDict['enabled']: enabled = "[" + self.OKGREEN + "Enabled" + self.ENDC + "]" else: enabled = "[" + self.FAIL + "Not enabled" + self.ENDC + "]" self.stdout.write("%s => %s %s" % (pluginDict['name'], installed, enabled))
def getEnabledPluginNames(cls): # List enabled plugins plugin_list = Plugin.objects(enabled=True, lang=configuration['lang_short']) # Fill plugins name list enabled_plugins_names = [] for plugin in plugin_list: enabled_plugins_names.append(str(plugin['name'])) return enabled_plugins_names
def uninstallPlugin(self, plugin_name=None, plugin_pk=None, dev_mode=False): if plugin_pk: plugin_list = Plugin.objects(pk=plugin_pk) else: plugin_list = Plugin.objects(name=plugin_name) if not plugin_list: return {'status': 'fail', 'log': unicode(_('Plugin not installed'))} else: for plugin in plugin_list: if not dev_mode: pip.main(['uninstall', '--quiet', 'lisa-plugin-' + plugin_name]) plugin.delete() for cron in Cron.objects(plugin=plugin): cron.delete() for rule in Rule.objects(plugin=plugin): rule.delete() intent_list = Intent.objects(plugin=plugin) for oIntent in intent_list: oIntent.delete() return {'status': 'success', 'log': unicode(_('Plugin uninstalled'))}
def _set_plugin_enabled(cls, enabled, plugin_name=None, plugin_pk=None): # Log string if enabled == True: astr = "enabled" else: astr = "disabled" # Get plugin by name or pk if plugin_pk: plugin_list = Plugin.objects(pk=plugin_pk) else: plugin_list = Plugin.objects(name=plugin_name) # Should be only one result if not plugin_list or len(plugin_list) != 1: return {'status': 'fail', 'log': 'Plugin not installed'} plugin = plugin_list[0] # If already done if enabled == True and plugin.enabled == enabled: return {'status': 'fail', 'log': 'Plugin already ' + astr} if enabled == False and plugin.enabled == enabled: return {'status': 'fail', 'log': 'Plugin already ' + astr} # Enable plugin plugin.enabled = enabled plugin.save() # Enable plugin crons for cron in Cron.objects(plugin=plugin): cron.enabled = enabled cron.save() # Enable plugin intents for intent in Intent.objects(plugin=plugin): intent.enabled = enabled intent.save() return {'status': 'success', 'log': 'Plugin ' + astr}
def _set_plugin_enabled(cls, enabled, plugin_name = None, plugin_pk = None): # Log string if enabled == True: astr = "enabled" else: astr = "disabled" # Get plugin by name or pk if plugin_pk: plugin_list = Plugin.objects(pk = plugin_pk) else: plugin_list = Plugin.objects(name = plugin_name) # Should be only one result if not plugin_list or len(plugin_list) != 1: return {'status': 'fail', 'log': 'Plugin not installed'} plugin = plugin_list[0] # If already done if enabled == True and plugin.enabled == enabled: return {'status': 'fail', 'log': 'Plugin already ' + astr} if enabled == False and plugin.enabled == enabled: return {'status': 'fail', 'log': 'Plugin already ' + astr} # Enable plugin plugin.enabled = enabled plugin.save() # Enable plugin crons for cron in Cron.objects(plugin = plugin): cron.enabled = enabled cron.save() # Enable plugin intents for intent in Intent.objects(plugin = plugin): intent.enabled = enabled intent.save() return {'status': 'success', 'log': 'Plugin ' + astr}
def enablePlugin(self, plugin_name=None, plugin_pk=None): if plugin_pk: plugin_list = Plugin.objects(pk=plugin_pk) else: plugin_list = Plugin.objects(name=plugin_name) for plugin in plugin_list: if plugin.enabled: return {'status': 'fail', 'log': unicode(_('Plugin already enabled'))} else: plugin.enabled = True plugin.save() for cron in Cron.objects(plugin=plugin): cron.enabled = True cron.save() for rule in Rule.objects(plugin=plugin): rule.enabled = True rule.save() intent_list = Intent.objects(plugin=plugin) for oIntent in intent_list: oIntent.enabled = True oIntent.save() return {'status': 'success', 'log': unicode(_('Plugin enabled'))}
def disablePlugin(self, plugin_name=None, plugin_pk=None): if plugin_pk: plugin_list = Plugin.objects(pk=plugin_pk) else: plugin_list = Plugin.objects(name=plugin_name) for plugin in plugin_list: if not plugin.enabled: return {'status': 'fail', 'log': 'Plugin already disabled'} else: plugin.enabled = False plugin.save() for cron in Cron.objects(plugin=plugin): cron.enabled = False cron.save() for rule in Rule.objects(plugin=plugin): rule.enabled = False rule.save() intent_list = Intent.objects(plugin=plugin) for oIntent in intent_list: oIntent.enabled = False oIntent.save() return {'status': 'success', 'log': 'Plugin disabled'}
def getPluginMethods(cls, plugin_name=None): # Get plugin by name or pk if plugin_name: plugin_list = Plugin.objects(name=plugin_name) else: plugin_list = Plugin.objects # Parse plugins listallmethods = [] for plugin in plugin_list: plugininstance = namedAny('.'.join( ('lisa.plugins', str(plugin.name), 'modules', str(plugin.name).lower(), str(plugin.name))))() listpluginmethods = [] for m in inspect.getmembers(plugininstance, predicate=inspect.ismethod): if not "__init__" in m and not m.startswith("_"): listpluginmethods.append(m[0]) listallmethods.append({ 'plugin': plugin.name, 'methods': listpluginmethods }) # Parse core plugins for f in os.listdir(os.path.normpath(server_path + '/core')): fileName, fileExtension = os.path.splitext(f) if os.path.isfile( os.path.join(os.path.normpath(server_path + '/core'), f) ) and not f.startswith('__init__') and fileExtension != '.pyc': coreinstance = namedAny('.'.join( ('lisa.server.core', str(fileName).lower(), str(fileName).capitalize())))() listcoremethods = [] for m in inspect.getmembers(coreinstance, predicate=inspect.ismethod): #init shouldn't be listed in methods and _ is for translation if not "__init__" in m and not m.startswith("_"): listcoremethods.append(m[0]) listallmethods.append({ 'core': fileName, 'methods': listcoremethods }) log.msg(listallmethods) return listallmethods
def installPlugin(cls, plugin_name = None, test_mode = False, dev_mode = False): # If already installed if Plugin.objects(name = plugin_name): return {'status': 'fail', 'log': 'Plugin already installed'} # If not dev mode, download package if not dev_mode: if test_mode: pip.main(['install', '--quiet', '--install-option=--install-platlib=' + os.getcwd() + '/../', '--install-option=--install-purelib=' + os.getcwd() + '/../', 'lisa-plugin-' + plugin_name]) else: pip.main(['install', 'lisa-plugin-' + plugin_name]) # Create new plugin plugin = Plugin() setattr(plugin, 'name', plugin_name) # Update plugin in DB cls._updatePlugin(plugin = plugin) return {'status': 'success', 'log': 'Plugin installed'}
def plugin_list(self): metareq = requests.get('/'.join([configuration['plugin_store'], 'plugins.json'])) pluginDB = Plugin.objects() pluginlist_store = [] pluginlist_local = [] in_store = False if(metareq.ok): [pluginlist_store.append(item['name']) for item in json.loads(metareq.text or metareq.content)] [pluginlist_local.append(plugin['name']) for plugin in pluginDB] if pluginDB: for plugin in pluginDB: for plugin_name in pluginlist_store: if plugin['name'].lower() == plugin_name.lower(): self.plugins.append({"name": plugin['name'], "installed": True, "enabled": plugin['enabled']}) in_store = True if not in_store: self.plugins.append({"name": plugin['name'], "installed": True, "enabled": plugin['enabled']}) else: in_store = False for plugin_store in pluginlist_store: if not plugin_store in pluginlist_local: self.plugins.append({"name": plugin_store, "installed": False, "enabled": False}) else: self.stdout.write(self.FAIL + "The plugin list seems to no be available" + self.ENDC) for pluginDict in self.plugins: if pluginDict['installed']: installed = "["+ self.OKGREEN + "Installed" + self.ENDC + "]" else: installed = "["+ self.FAIL + "Not installed" + self.ENDC + "]" if pluginDict['enabled']: enabled = "["+ self.OKGREEN + "Enabled" + self.ENDC + "]" else: enabled = "["+ self.FAIL + "Not enabled" + self.ENDC + "]" self.stdout.write("%s => %s %s" % (pluginDict['name'], installed, enabled))
def getEnabledPlugins(cls): # List enabled plugins return Plugin.objects(enabled = True, lang = configuration['lang_short'])
def get_pk(self, name): pluginDB = Plugin.objects(name=name) if pluginDB: return pluginDB['pk']
def upgradePlugin(self, plugin_name=None, plugin_pk=None, test_mode=False, dev_mode=False): if plugin_pk: plugin_list = Plugin.objects(pk=plugin_pk) else: plugin_list = Plugin.objects(name=plugin_name) if not plugin_list: return {'status': 'fail', 'log': unicode(_('Plugin not installed'))} if not dev_mode: # This test mode is here only for travis to allow installing plugin in a readable directory if test_mode: pip.main(['install', '--quiet', '--install-option=--install-platlib=' + os.getcwd() + '/../', '--install-option=--install-purelib=' + os.getcwd() + '/../', 'lisa-plugin-' + plugin_name, '--upgrade']) else: pip.main(['install', 'lisa-plugin-' + plugin_name, '--upgrade']) jsonfile = self.pkgpath + '/' + plugin_name + '/' + plugin_name.lower() + '.json' try: metadata = json.load(open(jsonfile)) except: return {'status': 'fail', 'log': unicode(_("The json of the plugin can't be loaded"))} for plugin in plugin_list: if self.versioncompare(version1=metadata['version'], version2=plugin.version) > 0: description_list = [] for item in metadata: if item != 'crons' and item != 'rules': if item == 'description': # Does we really need to update description object ? pass elif item == 'configuration': #TODO Shouldn't override the configuration of the user # But we should add only the missing entries (only adding) pass elif item == 'enabled': # Shouldn't override the choice of the user pass else: setattr(plugin, item, metadata[item]) plugin.save() for item in metadata: if item == 'rules': for rule_item in metadata['rules']: oRule_list = Rule.objects(name=rule_item['name']) for rule in oRule_list: for parameter in rule_item: if parameter == 'enabled': if rule_item[parameter] == 0: setattr(rule, parameter, False) else: setattr(rule, parameter, True) else: setattr(rule, parameter, rule_item[parameter]) rule.plugin = plugin rule.save() if item == 'crons': for cron_item in metadata['crons']: oCron_list = Cron.objects(name=cron_item['name']) for cron in oCron_list: for parameter in cron_item: if parameter == 'enabled': if cron_item[parameter] == 0: setattr(cron, parameter, False) else: setattr(cron, parameter, True) else: setattr(cron, parameter, cron_item[parameter]) cron.plugin = plugin cron.save() for intent, value in metadata['configuration']['intents'].iteritems(): oIntent_list = Intent.objects(name=intent) for oIntent in oIntent_list: oIntent.name = intent oIntent.function = value['method'] oIntent.module = '.'.join(['lisa.plugins', plugin_name, 'modules', plugin_name.lower(), plugin_name]) oIntent.enabled = True oIntent.plugin = plugin oIntent.save() else: return {'status': 'fail', 'log': unicode(_('Plugin already up to date'))} return {'status': 'success', 'log': unicode(_('Plugin upgraded'))}
def getEnabledPlugins(cls): # List enabled plugins return Plugin.objects(enabled=True, lang=configuration['lang_short'])
def installPlugin(self, plugin_name=None, test_mode=False, dev_mode=False, version=None): version_str = "" if Plugin.objects(name=plugin_name): return {'status': 'fail', 'log': unicode(_('Plugin already installed'))} if version: version_str = ''.join(["==", version]) if not dev_mode: # This test mode is here only for travis to allow installing plugin in a readable directory if test_mode: pip.main(['install', '--quiet', '--install-option=--install-platlib=' + os.getcwd() + '/../', '--install-option=--install-purelib=' + os.getcwd() + '/../', 'lisa-plugin-' + plugin_name + version_str]) else: pip.main(['install', 'lisa-plugin-' + plugin_name + version_str]) jsonfile = self.pkgpath + '/' + plugin_name + '/' + plugin_name.lower() + '.json' metadata = json.load(open(jsonfile)) plugin = Plugin() description_list = [] for item in metadata: if item != 'crons' and item != 'rules': if item == 'description': for description in metadata[item]: oDescription = Description() for k,v in description.iteritems(): setattr(oDescription, k, v) description_list.append(oDescription) setattr(plugin, item, description_list) elif item == 'enabled': if metadata[item] == 0: setattr(plugin, item, False) else: setattr(plugin, item, True) else: setattr(plugin, item, metadata[item]) plugin.save() for item in metadata: if item == 'rules': for rule_item in metadata['rules']: rule = Rule() for parameter in rule_item: if parameter == 'enabled': if rule_item[parameter] == 0: setattr(rule, parameter, False) else: setattr(rule, parameter, True) else: setattr(rule, parameter, rule_item[parameter]) rule.plugin = plugin rule.save() if item == 'crons': for cron_item in metadata['crons']: cron = Cron() for parameter in cron_item: if parameter == 'enabled': if cron_item[parameter] == 0: setattr(cron, parameter, False) else: setattr(cron, parameter, True) else: setattr(cron, parameter, cron_item[parameter]) cron.plugin = plugin cron.save() for intent, value in metadata['configuration']['intents'].iteritems(): oIntent = Intent() oIntent.name = intent oIntent.function = value['method'] oIntent.module = '.'.join(['lisa.plugins', plugin_name, 'modules', plugin_name.lower(), plugin_name]) oIntent.enabled = True oIntent.plugin = plugin oIntent.save() return {'status': 'success', 'log': unicode(_('Plugin installed'))}