import sys from flask import request, send_from_directory, json from importlib import import_module from modules.core.core import cbpi from git import Repo import os import requests import yaml import shutil from flask_classy import FlaskView, route modules = {} class PluginView(FlaskView): def merge(self, source, destination): """ Helper method to merge two dicts :param source: :param destination: :return: """ for key, value in source.items(): if isinstance(value, dict): # get node or create one node = destination.setdefault(key, {}) self.merge(value, node) else: destination[key] = value return destination @route('/', methods=['GET']) def get(self): """ Get Plugin List --- tags: - plugin responses: 200: description: List of all plugins """ response = requests.get("https://raw.githubusercontent.com/Manuel83/craftbeerpi-plugins/master/plugins.yaml") self.api.cache["plugins"] = self.merge(yaml.load(response.text), self.api.cache["plugins"]) for key, value in cbpi.cache["plugins"].iteritems(): value["installed"] = os.path.isdir("./plugins/%s/" % (key)) return json.dumps(cbpi.cache["plugins"]) @route('/', methods=['DELETE']) def delete(self,name): """ Delete Plugin --- tags: - plugin parameters: - in: path name: name schema: type: string required: true description: Plugin name responses: 200: description: Plugin deleted """ if os.path.isdir("./plugins/"+name) is False: return ('Dir not found', 500) shutil.rmtree("./plugins/"+name) cbpi.notify("Plugin deleted", "Plugin %s deleted successfully" % name) return ('', 204) @route('//download', methods=['POST']) def download(self, name): """ Download Plugin --- tags: - plugin parameters: - in: path name: name schema: type: string required: true description: Plugin name responses: 200: description: Plugin downloaded """ plugin = self.api.cache["plugins"].get(name) plugin["loading"] = True if plugin is None: return ('', 404) try: Repo.clone_from(plugin.get("repo_url"), "./modules/plugins/%s/" % (name)) self.api.notify("Download successful", "Plugin %s downloaded successfully" % name) finally: plugin["loading"] = False return ('', 204) @route('//update', methods=['POST']) def update(self, name): """ Pull Plugin Update --- tags: - plugin parameters: - in: path name: name schema: type: string required: true description: Plugin name responses: 200: description: Plugin updated """ repo = Repo("./modules/plugins/%s/" % (name)) o = repo.remotes.origin info = o.pull() self.api.notify("Plugin Updated", "Plugin %s updated successfully. Please restart the system" % name) return ('', 204) @cbpi.addon.core.initializer() def init(cbpi): cbpi.cache["plugins"] = {} PluginView.api = cbpi PluginView.register(cbpi._app, route_base='/api/plugin')