From b012174e653e7629dc5d4b4bb5ceea3cce8ffa6e Mon Sep 17 00:00:00 2001 From: Andrew Date: Thu, 25 Mar 2021 01:58:20 -0500 Subject: [PATCH] Plugin and Restart changes --- stashr/api.py | 89 ++++++++++++++++++++- stashr/server.py | 15 ++-- stashr/templates/settings_page_plugins.html | 56 ++++++++++++- stashr/templates/settings_page_tasks.html | 19 ++++- stashr/utils.py | 7 ++ 5 files changed, 173 insertions(+), 13 deletions(-) diff --git a/stashr/api.py b/stashr/api.py index 51650a8..d584c0a 100644 --- a/stashr/api.py +++ b/stashr/api.py @@ -56,7 +56,7 @@ from operator import itemgetter, attrgetter from validate import Validator """ --- STASHR CORE IMPORTS --- """ -from stashr import log, database, utils, paths, folders, naming, forms, tasks +from stashr import log, database, utils, paths, folders, naming, forms, tasks, server from stashr.config import stashrconfig from stashr.comicvine import cv @@ -2261,6 +2261,93 @@ def api_put_directories_edit(scrape_id): return jsonify(create_json_return('200')) +""" --- PLUGIN UPLOAD/INSTALL --- """ + + +@api.route('/plugins/upload', methods=['POST']) +def api_post_upload_plugin(): + """To Update Later + This is using docstrings for specifications. + --- + tags: + - plugins + """ + + user = current_user + + if not user.is_authenticated: + if not request.json: + return jsonify(create_json_return('400')) + if "api_key" not in request.json: + return jsonify(create_json_return('400')) + if request.json['api_key'] == "": + return jsonify(create_json_return('100')) + + user = database.session \ + .query(database.Users) \ + .filter(database.Users.api_key == request.json['api_key']) \ + .first() + + if user is None: + return jsonify(create_json_return('100')) + + if user.role != 'admin': + return jsonify(create_json_return('401')) + + if 'file' not in request.files: + return jsonify(create_json_return('400')) + + # DO THINGS HERE + file = request.files['file'] + + file_path =os.path.join( + folders.StashrFolders().temp_folder(), + file.filename + ) + + file.save(file_path) + + utils.install_plugin(file_path) + + return jsonify(create_json_return('200')) + +""" --- RESTART SERVER --- """ + +@api.route('/restart', methods=['POST']) +def restart_server(): + """To Update Later + This is using docstrings for specifications. + --- + tags: + - plugins + """ + + user = current_user + + if not user.is_authenticated: + if not request.json: + return jsonify(create_json_return('400')) + if "api_key" not in request.json: + return jsonify(create_json_return('400')) + if request.json['api_key'] == "": + return jsonify(create_json_return('100')) + + user = database.session \ + .query(database.Users) \ + .filter(database.Users.api_key == request.json['api_key']) \ + .first() + + if user is None: + return jsonify(create_json_return('100')) + + if user.role != 'admin': + return jsonify(create_json_return('401')) + + server.server.restart_server() + + return create_json_return('200') + + """ --- API WRAPPER --- """ """--------------------- diff --git a/stashr/server.py b/stashr/server.py index 2f1916a..98f0c44 100644 --- a/stashr/server.py +++ b/stashr/server.py @@ -86,26 +86,23 @@ class Server: app.logger.debug('Unknown Error while starting gevent') def start_server(self): - app.logger.debug('STARTING SERVER') + app.logger.info('STARTING SERVER') self.define_wsgi() self.wsgiserver.serve_forever() if self.restart: - app.logger.info('Restarting Server') + app.logger.info('RESTARTING SERVER) try: - subprocess.check_call([sys.executable, 'start.py']) + subprocess.call([sys.executable, 'start.py'], close_fds=True) except subprocess.CalledProcessError as e: print(e) - def stop_server(self): - app.logger.debug('STOPPING SERVER') + app.logger.info('STOPPING SERVER') self.wsgiserver.stop() - def restart_server(self, ignored_signum, ignored_frame): + def restart_server(self, ignored_signum=None, ignored_frame=None): self.restart = True - app.logger.debug('Restarting Server') if self.wsgiserver is not None : - self.wsgiserver.stop() - + self.wsgiserver.close() server = Server() diff --git a/stashr/templates/settings_page_plugins.html b/stashr/templates/settings_page_plugins.html index 5a290b8..ec0459c 100644 --- a/stashr/templates/settings_page_plugins.html +++ b/stashr/templates/settings_page_plugins.html @@ -8,12 +8,64 @@
+
{% endblock %} {% block script %} +Vue.component('modals', { + props: [], + template: ` +
+ + `, + methods: { + uploadFile() { + let formData = new FormData(); + var pluginfile = document.querySelector('#pluginupload'); + formData.append("file", pluginfile.files[0]); + bootstrap.Modal.getInstance(document.getElementById('modalUpload')).hide(); + stashrToast('Uploading Plugin', 'info'); + axios.post('{{ url_for('api.api_post_upload_plugin') }}', formData, { + headers: { + 'Content-Type': 'multipart/form-data' + } + }) + .then(res => { + if(res.data.status_code == 200) { + stashrToast('Plugin Uploaded', 'success') + } else { + stashrToast(res.data.message, 'error') + } + }) + }, + }, + delimiters: ["[[","]]"] +}) + Vue.component('plugin',{ props:['plugin'], template: ` @@ -57,7 +109,7 @@ Vue.component('plugins',{

Plugins

- +

@@ -104,7 +156,7 @@ var app = new Vue({ .then(res => { this.plugins = res.data.results }) - } + }, }, delimiters: ["[[","]]"] }) diff --git a/stashr/templates/settings_page_tasks.html b/stashr/templates/settings_page_tasks.html index 738fddc..bd18fbc 100644 --- a/stashr/templates/settings_page_tasks.html +++ b/stashr/templates/settings_page_tasks.html @@ -1,5 +1,9 @@ {% extends "settings_page.html" %} +{% block header_script_files %} + +{% endblock %} + {% block settings_pane %}
@@ -28,7 +32,7 @@ Clean Database - Restart Server + Restart Server {{ emit_tep('settings_page_tasks_task') }} @@ -36,4 +40,17 @@
+{% endblock %} + +{% block script %} + +function restartServer() { + axios.post('{{ url_for('api.restart_server') }}') + .then(res=>{ + console.log(res) + stashrToast('Restarting Server', 'info') + }) + .catch() +} + {% endblock %} \ No newline at end of file diff --git a/stashr/utils.py b/stashr/utils.py index c49cd1a..2106a32 100644 --- a/stashr/utils.py +++ b/stashr/utils.py @@ -1082,6 +1082,7 @@ def install_plugin(filepath): if install['code'] == 0: logger.info(f'Plugin {filepath} installed') else: + print(install) logger.warning(f'Error occurred installing {filepath}') @@ -1095,5 +1096,11 @@ def uninstall_plugin(package_name): logger.warning(f'Error uninstalling {package_name}') +def enable_plugin(plugin): + stashr.pm.enable_plugin(plugin) + +def disable_plugin(plugin): + stashr.pm.disable_plugin(plugin) + def install_package(package): subprocess.check_call([sys.executable, '-m', 'pip', 'install', package]) \ No newline at end of file