예제 #1
0
    def run_check(self) -> None:
        """
        本地运行--检查队列残缺
        # 所有类型任务的节点行为的同时发起 or 所有类型任务的节点行为按序执行,node任务之间互不影响

            --v2rayChain
                --vNode_1
                --vNode_2
                --....
            --ssrChain
                --sNode_1
                --sNode_2
                --...
            --..
                                    -----> runtime v2rayChain
        IF USE vsu -> runtime allTask =====> runtime ...
                                    -----> runtime ssrChain

            ELSE -> runtime allTask -> Chain_1 -> Chain_2 -> ...

                                    -----> runtime node_1
        IF USE go -> runtime allNode =====> runtime ...
                                    -----> runtime node_N

            ELSE -> runtime allNode-> the_node_1 -> the_node_2 -> ...

        @return:
        """
        vsu(
            core=GeventSchedule(
                go=self.speed_up),  # 此项加速设置用于限制同一类型任务的所有节点的并发行为
            user_cluster=self.check_seq,
            interface='run_check').run(self.speed_up)  # 此项加速设置用于限制多类任务的并发行为

        logger.success('<Gevent>任务结束')
예제 #2
0
    def run_check(self, at_once=True) -> None:
        """
        本地运行--检查队列残缺
        # 所有类型任务的节点行为的同时发起 or 所有类型任务的节点行为按序执行,node任务之间互不影响

            --v2rayChain
                --vNode_1
                --vNode_2
                --....
            --ssrChain
                --sNode_1
                --sNode_2
                --...
            --..
                                    -----> runtime v2rayChain
        IF USE vsu -> runtime allTask =====> runtime ...
                                    -----> runtime ssrChain

            ELSE -> runtime allTask -> Chain_1 -> Chain_2 -> ...

                                    -----> runtime node_1
        IF USE go -> runtime allNode =====> runtime ...
                                    -----> runtime node_N

            ELSE -> runtime allNode-> the_node_1 -> the_node_2 -> ...

        @return:
        """
        # 加载任务队列(广度优先)
        for task in self.check_seq:
            loads_task(task, startup=False, at_once=at_once)

        # 任务启动 并发执行
        vsu(core=PuppetCore(), docker=Middleware.poseidon).run(self.speed_up)

        print('Easter eggs')
        # fixme 数据存储 节拍同步
        if not at_once:
            FlexibleDistribute().start()

        # 任务结束
        logger.success('<Gevent>任务结束')

        # 执行一次数据迁移
        GeventSchedule().ddt()
예제 #3
0
def loads_task(class_: str = '',
               use_plugin: bool = False,
               one_step=False,
               startup=True,
               loads_=True,
               at_once=True) -> bool:
    """
    加载任务
    @param at_once:
    @param loads_:
    @param startup:
    @param one_step:
    @param class_: 任务类型,必须在 crawler seq内,如 ssr,v2ray or trojan
    @param use_plugin: 使用加速插件
    @return:
    """

    # 检查输入
    if class_ not in CRAWLER_SEQUENCE or not isinstance(class_, str):
        return False

    # 加载任务
    if loads_:

        # 刷新节点
        read_actions(class_)

        # 乱序入队
        exec("import random\nrandom.shuffle(eval('task_' + class_))")
        for task_name in eval("task_" + class_):
            expr = f'from BusinessLogicLayer.cluster.slavers.actions import {task_name}\n' \
                   f'{task_name}(at_once={at_once}).run()'
            Middleware.poseidon.put_nowait(expr)
            if one_step:
                break

    # 启动任务
    if startup:
        # 如果使用插件加速,则调入speed_up封装方法
        # 否则按list顺序执行
        vsu(core=PuppetCore(), docker=Middleware.poseidon).run(use_plugin)

    return True
예제 #4
0
def manage_task(class_: str = 'v2ray',
                speedup: bool = True,
                only_sync=False,
                startup=None,
                beat_sync=True,
                force_run=None) -> bool:
    """
    加载任务
    @param force_run: debug模式下的强制运行,可逃逸队列满载检测
    @param startup:创建协程工作空间,并开始并发执行队列任务。
    @param only_sync:节拍同步线程锁。当本机任务数大于0时,将1枚原子任务推送至Poseidon协程空间。
    @param class_: 任务类型,必须在 crawler seq内,如 ssr,v2ray or trojan。
    @param speedup: 使用加速插件。默认使用coroutine-speedup。
    @param beat_sync:
    @return:
    """

    # ----------------------------------------------------
    # 参数审查与转译
    # ----------------------------------------------------

    # 检查输入
    if class_ not in CRAWLER_SEQUENCE or not isinstance(class_, str):
        return False

    # 审核采集权限,允许越权传参。当手动指定参数时,可授予本机采集权限,否则使用配置权限
    local_work: bool = startup if startup else ENABLE_DEPLOY.get('tasks').get(
        'collector')

    # 强制运行:指定参数优先级更高,若不指定则以是否单机部署模式决定运行force_run是否开启
    # 默认单机模式下开启force_run
    # 若未传参时也未定义部署形式(null),则默认不使用force_run
    force_run = force_run if force_run else SINGLE_DEPLOYMENT

    # ----------------------------------------------------
    # 解析同步模式
    # ----------------------------------------------------
    # 以本机是否有采集权限来区分download 以及upload两种同步模式
    mode_sync = "download" if local_work else "upload"

    # 以更高优先级的`force_run` 替代传统同步模式,执行强制采集方案
    mode_sync = "force_run" if force_run else mode_sync

    # ----------------------------------------------------
    # 同步消息(任务)队列
    # ----------------------------------------------------
    # 当本机可采集时,将任务同步至本机执行,若消息队列为空则
    # 若本机不可采集,则生成任务加入消息队列
    response: str or bool = _sync_actions(
        class_=class_,
        only_sync=only_sync,
        beat_sync=beat_sync,
        mode_sync=mode_sync,
    )

    # ----------------------------------------------------
    # 初始化协程空间(执行任务)
    # ----------------------------------------------------
    # 若本机开启了采集器权限则创建协程空间
    # 若从control-deploy进入此函数,则说明本机必定具备创建协程空间权限
    if force_run:
        if response == 'offload':
            logger.info(f'<TaskManager> ForceRun || <{class_}>采集任务启动')
            vsu(core=PuppetCore(), docker=Middleware.poseidon).run(speedup)
        logger.success(f'<TaskManager> ForceWorkFinish || <{class_}>采集任务结束')
        return True

    # if 'force_run' is False and the node has the permissions of collector
    if local_work:
        # if task queue can be work
        if response == 'offload':
            logger.info(f'<TaskManager> Run || <{class_}>采集任务启动')
            vsu(core=PuppetCore(), docker=Middleware.poseidon).run(speedup)
        logger.success(f'<TaskManager> Finish || <{class_}>采集任务结束')
        return True
    else:
        logger.warning(f"<TaskManager> Hijack<{class_}> || 当前节点不具备采集权限")
        return False