| import sys |
| from typing import Optional, Type, TypeVar |
| import traceback |
| from importlib import import_module |
|
|
| from .base_task import BaseTask |
| from .util import GET_CLASS, get_client_ip, debug_log |
|
|
|
|
| def load_task_cls_by_function( |
| name: str, |
| func_name: str, |
| is_model: bool = False, |
| model_index: str = '', |
| args: Optional[dict] = None, |
| sub_name: Optional[str] = None, |
| ) -> Optional[Type[BaseTask]]: |
| """ |
| 从执行函数的结果中获取任务类 |
| @param model_index: 模块来源,例如:新场景就是mod |
| @param name: 名称 |
| @param func_name: 函数名称 |
| @param is_model: 是否在Model中,不在Model中,就应该在插件中 |
| @param args: 请求这个接口的参数, 默认为空 |
| @param sub_name: 自分类名称, 如果有,则会和主名称name做拼接 |
| @return: 返回None 或者有效的任务类 |
| """ |
| import PluginLoader |
| real_name = name |
| if isinstance(sub_name, str): |
| real_name = "{}/{}".format(name, sub_name) |
|
|
| get_obj = GET_CLASS() |
| if args is not None and isinstance(args, dict): |
| for key, value in args.items(): |
| setattr(get_obj, key, value) |
| try: |
| if is_model: |
| get_obj.model_index = model_index |
| res = PluginLoader.module_run(real_name, func_name, get_obj) |
| else: |
| get_obj.fun = func_name |
| get_obj.s = func_name |
| get_obj.client_ip = get_client_ip |
| res = PluginLoader.plugin_run(name, func_name, get_obj) |
| except: |
| debug_log(traceback.format_exc()) |
| return None |
| if isinstance(res, dict): |
| return None |
| elif isinstance(res, BaseTask): |
| return res.__class__ |
| elif issubclass(res, BaseTask): |
| return res |
| return None |
|
|
|
|
| def load_task_cls_by_path(path: str, cls_name: str) -> Optional[Type[BaseTask]]: |
| try: |
| import os |
| path_sep = path.split(".") |
| if len(path_sep) >= 2 and path_sep[0] == "plugin": |
| plugin_path = "/www/server/panel/plugin/{}".format(path_sep[1]) |
| if not os.path.isdir(plugin_path): |
| return None |
|
|
| module = import_module(path) |
| cls = getattr(module, cls_name, None) |
| if issubclass(cls, BaseTask): |
| return cls |
| elif isinstance(cls, BaseTask): |
| return cls.__class__ |
| else: |
| return None |
| except: |
| debug_log(traceback.format_exc()) |
| return None |
|
|
|
|
| def load_task_cls(load_cls_data) -> Optional[Type[BaseTask]]: |
| if "load_type" not in load_cls_data: |
| return None |
| if load_cls_data["load_type"] == "func": |
| cls = load_task_cls_by_function( |
| name=load_cls_data["name"], |
| func_name=load_cls_data["func_name"], |
| is_model=load_cls_data.get("is_model", False), |
| model_index=load_cls_data.get("is_model", ''), |
| args=load_cls_data.get("args", None), |
| sub_name=load_cls_data.get("sub_name", None), |
| ) |
| else: |
| cls_path = load_cls_data["cls_path"] |
| cls = load_task_cls_by_path(cls_path, load_cls_data["name"]) |
|
|
| return cls |