From 56419a83554770dc6d3a10241f0a6af536a48627 Mon Sep 17 00:00:00 2001 From: flaskfarm Date: Wed, 19 Oct 2022 19:50:38 +0900 Subject: [PATCH] update --- lib/framework/static/js/ff_global1.js | 4 +- lib/framework/version.py | 2 +- lib/support/base/sub_process.py | 29 ++-- lib/system/mod_tool.py | 26 +++- lib/system/page_command.py | 2 +- lib/system/setup.py | 6 +- lib/system/templates/system_tool_python.html | 141 ++++++++++--------- 7 files changed, 126 insertions(+), 84 deletions(-) diff --git a/lib/framework/static/js/ff_global1.js b/lib/framework/static/js/ff_global1.js index e0c5301..501281f 100644 --- a/lib/framework/static/js/ff_global1.js +++ b/lib/framework/static/js/ff_global1.js @@ -42,7 +42,9 @@ frameSocket.on('refresh', function(data){ }); -$('#command_modal').on('hide.bs.modal', function (event) { +$('#command_modal').on('hide.bs.modal', function (e) { + //e.preventDefault(); 있으면 동작 안함. + console.log("ff global command_modal hide.bs.modal CATCH") $.ajax({ url: `/global/ajax/command_modal_hide`, type: 'POST', diff --git a/lib/framework/version.py b/lib/framework/version.py index 7e2e1d0..1abd467 100644 --- a/lib/framework/version.py +++ b/lib/framework/version.py @@ -1 +1 @@ -VERSION="4.0.27" \ No newline at end of file +VERSION="4.0.28" \ No newline at end of file diff --git a/lib/support/base/sub_process.py b/lib/support/base/sub_process.py index 30f146a..c61eb19 100644 --- a/lib/support/base/sub_process.py +++ b/lib/support/base/sub_process.py @@ -87,7 +87,7 @@ class SupportSubprocess(object): logger.error('command : %s', command) - instance_list = [] + __instance_list = [] def __init__(self, command, print_log=False, shell=False, env=None, timeout=None, uid=None, gid=None, stdout_callback=None, call_id=None): @@ -107,7 +107,7 @@ class SupportSubprocess(object): def start(self, join=True): try: - self.thread = threading.Thread(target=self.execute_thread_function, args=()) + self.thread = threading.Thread(target=self.__execute_thread_function, args=()) self.thread.setDaemon(True) self.thread.start() if join: @@ -117,7 +117,7 @@ class SupportSubprocess(object): logger.error(traceback.format_exc()) - def execute_thread_function(self): + def __execute_thread_function(self): try: if platform.system() == 'Windows': tmp = [] @@ -137,15 +137,16 @@ class SupportSubprocess(object): self.process = subprocess.Popen(self.command, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True, shell=self.shell, env=self.env, encoding='utf8', bufsize=0) else: self.process = subprocess.Popen(self.command, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True, shell=self.shell, env=self.env, preexec_fn=demote(self.uid, self.gid), encoding='utf8', bufsize=0) - SupportSubprocess.instance_list.append(self) - self.start_communicate() - self.start_send_callback() + SupportSubprocess.__instance_list.append(self) + self.__start_communicate() + self.__start_send_callback() if self.process is not None: self.process.wait() logger.info(f"{self.command} END") except Exception as e: logger.error(f'Exception:{str(e)}') logger.error(traceback.format_exc()) + logger.warning(self.command) if self.stdout_callback != None: self.stdout_callback('error', str(e)) self.stdout_callback('error', str(traceback.format_exc())) @@ -154,7 +155,7 @@ class SupportSubprocess(object): self.stdout_callback('thread_end', None) - def start_communicate(self): + def __start_communicate(self): self.stdout_queue = queue.Queue() sout = io.open(self.process.stdout.fileno(), 'rb', closefd=False) @@ -199,7 +200,7 @@ class SupportSubprocess(object): Pump(sout) - def start_send_callback(self): + def __start_send_callback(self): def func(): while self.stdout_queue: line = self.stdout_queue.get() @@ -245,29 +246,29 @@ class SupportSubprocess(object): @classmethod def all_process_close(cls): - for instance in cls.instance_list: + for instance in cls.__instance_list: instance.process_close() - cls.instance_list = [] + cls.__instance_list = [] @classmethod def remove_instance(cls, remove_instance): new = [] - for instance in cls.instance_list: + for instance in cls.__instance_list: if remove_instance.timestamp == instance.timestamp: continue new.append(instance) - cls.instance_list = new + cls.__instance_list = new @classmethod def print(cls): - for instance in cls.instance_list: + for instance in cls.__instance_list: logger.info(instance.command) @classmethod def get_instance_by_call_id(cls, call_id): - for instance in cls.instance_list: + for instance in cls.__instance_list: if instance.call_id == call_id: return instance \ No newline at end of file diff --git a/lib/system/mod_tool.py b/lib/system/mod_tool.py index c836f7f..29a7ac3 100644 --- a/lib/system/mod_tool.py +++ b/lib/system/mod_tool.py @@ -1,4 +1,5 @@ -from support import SupportFile +from support import SupportSubprocess +from tool import ToolModalCommand from .page_command import PageCommand from .setup import * @@ -36,4 +37,27 @@ class PageCrypt(PluginPageBase): class PagePython(PluginPageBase): def __init__(self, P, parent): super(PagePython, self).__init__(P, parent, name='python') + self.db_default = { + f'{self.parent.name}_{self.name}_name': '', + } + def process_command(self, command, arg1, arg2, arg3, req): + ret = {'ret':'success'} + if command == 'get_freeze': + command = ['pip', 'freeze'] + result = SupportSubprocess.execute_command_return(command) + if result['status'] == 'finish': + ret['data'] = [] + for tmp in result['log'].split('\n'): + ret['data'].append(tmp.split('==')) + else: + ret['ret'] = 'danger' + ret['msg'] = "실패" + elif command == 'upgrade': + P.ModelSetting.set(f'{self.parent.name}_{self.name}_name', arg1) + cmd = ['pip', 'install', '--upgrade', arg1] + ToolModalCommand.start("pip 설치", [cmd]) + elif command == 'remove': + cmd = ['pip', 'uninstall', '-y', arg1] + ToolModalCommand.start("pip 삭제", [cmd]) + return jsonify(ret) diff --git a/lib/system/page_command.py b/lib/system/page_command.py index dbed9e6..3ecbe72 100644 --- a/lib/system/page_command.py +++ b/lib/system/page_command.py @@ -112,7 +112,7 @@ class PageCommand(PluginPageBase): import io from contextlib import redirect_stdout load_log_list = io.StringIO() - with redirect_stdout(self.load_log_list): + with redirect_stdout(load_log_list): start_communicate_load(load_log_list) if job_id is not None: command_logger = get_logger(f'command_{job_id}') diff --git a/lib/system/setup.py b/lib/system/setup.py index 34fb39d..8f49c1f 100644 --- a/lib/system/setup.py +++ b/lib/system/setup.py @@ -22,7 +22,7 @@ __menu = { 'list': [ #{'uri': 'setting', 'name': '설정'}, {'uri': 'list', 'name': '로딩 플러그인'}, - {'uri': 'all', 'name': '플러그인 목록'}, + #{'uri': 'all', 'name': '플러그인 목록'}, ], }, { @@ -32,8 +32,8 @@ __menu = { {'uri': 'command', 'name': 'Command'}, {'uri': 'upload', 'name': '업로드'}, {'uri': 'python', 'name': 'Python'}, - {'uri': 'db', 'name': 'DB'}, - {'uri': 'crypt', 'name': '암호화'}, + #{'uri': 'db', 'name': 'DB'}, + #{'uri': 'crypt', 'name': '암호화'}, ] }, { diff --git a/lib/system/templates/system_tool_python.html b/lib/system/templates/system_tool_python.html index 4d040dc..7dc3649 100644 --- a/lib/system/templates/system_tool_python.html +++ b/lib/system/templates/system_tool_python.html @@ -1,76 +1,91 @@ {% extends "base.html" %} {% block content %} -
- {{ macros.m_button_group([['globalSettingSaveBtn', '설정 저장']])}} - {{ macros.m_row_start('5') }} - {{ macros.m_row_end() }} - -
- -
-
+{{ macros.setting_input_text_and_buttons('pip', 'pip 패키지 설치', [['install_btn', '설치 & 업그레이드']], value=arg['tool_python_name'], desc=None) }} + + +
{% endblock %}