예제 #1
0
class CTYBot_Sock_D_PromptTask:
    # 远程管套定义
    s_g_iTaskMang_Listen_Port_PromptTask = 3   # 任务管理中心,对任务提交者的监听端口

    def __init__(self, ustrCfgFileName, ustrDbFileName):
        ustrCfgFileName = CTYLB_MainSys_MiscFunc.SafeGetUnicode(ustrCfgFileName)
        ustrDbFileName = CTYLB_MainSys_MiscFunc.SafeGetUnicode(ustrDbFileName)

        # 设置运行任务提交
        self.s_RunnDTaskArray = []   # 正在运行的任务队列

        # 创建机器人框架
        self.s_LessTYLB_Bot_FrameThread = CLessTYBotFrameThread(ustrCfgFileName, ustrDbFileName)
        # 设置默认环境处理
        # self.s_LessTYLB_Bot_FrameThread.SetDefaultConsoleCompatible( CtrlCHandle)
        # 准备运行
        self.s_LessTYLB_Bot_FrameThread.Prepare_Start()
        self.s_strSelfID = self.s_LessTYLB_Bot_FrameThread.GetMyName()
        # 注册 单元到达的通知,HLSession的新数据单元创建
        self.s_LessTYLB_Bot_FrameThread.RegisterNewCTUnit( CTYLB_Bot_BaseDef.s_g_iDataType_TaskRegCenter_sk_v1,
                                                           CTYLB_Bot_BaseDef.s_g_iMainCmd_TaskRegCenter_ReportResult_V2,
                                                           CTYLB_Bot_BaseDef.s_g_iSubCmd_TaskRegCenter_ReportResult_V2_PingTraceWebCrawl,
                                                           CTYBot_CTUnit_TaskRegCenter_CreateNewUnit_V2_ReportResult)
        self.s_LessTYLB_Bot_FrameThread.RegisterNewCTUnit( CTYLB_Bot_BaseDef.s_g_iDataType_TaskRegCenter_sk_v1,
                                                           CTYLB_Bot_BaseDef.s_g_iMainCmd_TaskRegCenter_ReportResult,
                                                           CTYLB_Bot_BaseDef.s_g_iSubCmd_TaskRegCenter_ReportResult_PingTraceWebCrawl,
                                                           CTYBot_CTUnit_TaskRegCenter_CreateNewUnit_ReportResult)

        # 获得管套管理对象
        self.s_hlSockMang = self.s_LessTYLB_Bot_FrameThread.s_HLSockMang
        # 读取配置参数
        ustrTaskRegCenterID = self.s_LessTYLB_Bot_FrameThread.s_execTYLB_Bot_Sample.ReadIniSectionValue( ustrCfgFileName,
                                                            u'client', u'taskcenter_id',
                                                            CTYLB_Bot_BaseDef.s_g_strBotName_TaskRegCenter_sk_v1)
        self.s_bstrTaskRegCenterID = CTYLB_MainSys_MiscFunc.SafeGetUTF8(ustrTaskRegCenterID)
        # 创建连接管套
        self.s_x_TaskRegCenter_Sock = CTYFBot_OpSession_ConnectSock(self.s_hlSockMang, self.s_bstrTaskRegCenterID,
                                                                    self.s_g_iTaskMang_Listen_Port_PromptTask)
        pass

    # 提交分布任务进行运行, 参数1-dRunTask = CTYBot_DTask_Base 单元
    # start by sk. 170226
    def PromptDTask(self, dRunTask):
        self.s_RunnDTaskArray.append( dRunTask)
        pass

    # 运行前的准备 - 子类可继承
    # start by sk. 170226
    def Vilu_Prepare_Run(self):
        # 对每个任务的准备函数进行调用
        for eachDTask in self.s_RunnDTaskArray:
            eachDTask.Viul_Internal_ParamBlock_PrePare(self.s_bstrTaskRegCenterID)
        pass

    # 单位时间调度 - 子类可继承
    # start by sk. 170226
    def Vilu_TimerCheck(self):
        bRetValue = False

        # 对每个扫描任务进行检查调度
        for eachPromptTask in self.s_RunnDTaskArray:
            if( eachPromptTask.Vilu_ExecTimerCheck()):
                bRetValue = True

        if( self.s_x_TaskRegCenter_Sock.ExecNextCheck()):
            bRetValue = True
        if( self.s_x_TaskRegCenter_Sock.CanExecSendData()):
            bRetValue = True
            # 对每个任务的准备函数进行调用
            needPromptParamArray = []
            for eachDTask in self.s_RunnDTaskArray:
                curParamArray = eachDTask.Sys_Schedule_RequestParamBlock()
                needPromptParamArray.extend(curParamArray)
                # 请求插件ID的空余数量
                newCommDataCTUnit = CTYBot_CTUnit_CommonData()
                newCommDataCTUnit.SetIntData(CTYBot_CTUnit_CommonData.s_g_iIntValue_Query_PluginID_Run_ParamBlock_Count)
                newCommDataCTUnit.SetParam(str(eachDTask.s_iRunPluginID).encode(), b'')
                needPromptParamArray.append(newCommDataCTUnit)
            # 提交发送
            if( not needPromptParamArray):
                newCommDataCTUnit = CTYBot_CTUnit_CommonData()
                needPromptParamArray.append( newCommDataCTUnit)
            self.s_x_TaskRegCenter_Sock.ExecSendData( needPromptParamArray)
            pass

        recvCTArray = self.s_x_TaskRegCenter_Sock.PopRetriveRecvCTArray()
        if( recvCTArray):
            bRetValue = True
            bstrPeerName, iPeerPort = self.s_hlSockMang.GetSockPeerAddr(self.s_x_TaskRegCenter_Sock.s_iExecConnectSockIndex)
            for eachUnit in recvCTArray:
                # CTYLB_Log.ShowLog(0, 'data-receive', 'from [%s:%d] recv [%d]' % (strPeerName, iPeerPort, eachUnit.s_iMyDataType))
                msgObject = {
                    "monitor_type": "status",
                    "level": "info",
                    "target": "",
                    "plugin_id": -1,
                    "block_id": "",
                    "block_size": 0,
                    "free_size": 0,
                    "wait_size": 0,
                    "success_size": 0,
                    "result_code": 0,
                    "msg": "PLC received <%d> bytes from <%s:%d>" % (eachUnit.s_iMyDataType, bstrPeerName, iPeerPort)
                }
                CTYLB_Log.ShowMonitor(msgType="PLC", msgObject=msgObject)

                if (eachUnit.s_iMyDataType == CTYLB_Bot_BaseDef.s_g_iDataType_CommonTask):
                    self.HandleRecv_CommonData(bstrPeerName, eachUnit)
                elif (eachUnit.s_iMyDataType == CTYLB_Bot_BaseDef.s_g_iDataType_TaskRegCenter_sk_v1):
                    if (eachUnit.s_iBotCmd_Main == CTYLB_Bot_BaseDef.s_g_iMainCmd_TaskRegCenter_ReportResult_V2):
                        self.HandleRecv_Result_V2(bstrPeerName, eachUnit)
                        self.s_x_TaskRegCenter_Sock.SetNextTempSendWaitTick(0)   # 有结果到达,可能还有结果数据,这时候不等待,立即再发送获取
                    elif (eachUnit.s_iBotCmd_Main == CTYLB_Bot_BaseDef.s_g_iMainCmd_TaskRegCenter_ReportResult):
                        self.HandleRecv_Result(bstrPeerName, eachUnit)
                        self.s_x_TaskRegCenter_Sock.SetNextTempSendWaitTick(0)   # 有结果到达,可能还有结果数据,这时候不等待,立即再发送获取
                else:
                    CTYLB_Log.ShowLog(1, 'data-receive', 'Unknown packet:%d-%d-%d' % (eachUnit.s_iMyDataType,
                                                                                      eachUnit.s_iBotCmd_Main,
                                                                                      eachUnit.s_iBotCmd_Sub))
                    msgObject = {
                        "monitor_type": "status",
                        "level": "warning",
                        "target": "",
                        "plugin_id": -1,
                        "block_id": "",
                        "block_size": 0,
                        "free_size": 0,
                        "wait_size": 0,
                        "success_size": 0,
                        "result_code": 0,
                        "msg": "PLC unknown package received <Type:%d,MainCMD:%d,SubCMD:%d>"
                               % (eachUnit.s_iMyDataType, eachUnit.s_iBotCmd_Main, eachUnit.s_iBotCmd_Sub)
                    }
                    CTYLB_Log.ShowMonitor(msgType="PLC", msgObject=msgObject)

                pass

        return bRetValue

    # 处理接收数据的回调 - 通用数据 - CTYBot_CTUnit_CommonData
    # start by sk. 170226
    def HandleRecv_CommonData(self, bstrFromUser, commuCTUnit):
        if (commuCTUnit.s_iType == CTYBot_CTUnit_CommonData.s_g_iType_int):
            bHandleParamResult = False  # 处理参数结果
            bReplyBlockCount = False   # 处理块个数
            bCenterReplyResult = False  # 处理中心回应结果到达

            if (commuCTUnit.s_iValue == CTYBot_CTUnit_CommonData.s_g_iIntValue_Task_Finish):
                bHandleParamResult = True
            elif(commuCTUnit.s_iValue == CTYBot_CTUnit_CommonData.s_g_iIntValue_Task_BCast_Fail_No_Host):
                bHandleParamResult = True
            elif(commuCTUnit.s_iValue == CTYBot_CTUnit_CommonData.s_g_iIntValue_Task_Finish_Fail):
                bHandleParamResult = True
            elif ( commuCTUnit.s_iValue == CTYBot_CTUnit_CommonData.s_g_iIntValue_Reply_PluginID_Run_ParamBlock_Count):
                bReplyBlockCount = True
            elif ( commuCTUnit.s_iValue == CTYBot_CTUnit_CommonData.s_g_iIntValue_Reply_TaskCenter_Send_Promptor_Result_Finish):
                # [任务中心->提交者] 返回当前提交者的结果个数。strParam1=结果个数, strParam2=请求包标识符
                bCenterReplyResult = True

            # 处理块个数
            if( bReplyBlockCount):
                try:
                    iQueryPluginID = int(commuCTUnit.s_bstrParam1)
                    iCanRunCount = int(commuCTUnit.s_bstrParam2)
                    for eachDTask in self.s_RunnDTaskArray:
                        eachDTask.Sys_Reply_Plugin_RunParam_Count( iQueryPluginID, iCanRunCount)
                except Exception as e:
                    pass

            # 处理参数结果
            if( bHandleParamResult):
                for eachDTask in self.s_RunnDTaskArray:
                    if (eachDTask.Sys_IsParamSign_MyRunningParamArray(commuCTUnit.s_bstrParam1)):
                        eachDTask.Sys_Reply_ParamBlock_Result(commuCTUnit.s_bstrParam1, commuCTUnit.s_iValue)
                        break

            # 处理结果到达完成
            if( bCenterReplyResult):
                iResultCount = int(commuCTUnit.s_bstrParam1)
                bstrOrigSign = commuCTUnit.s_bstrParam2
                for eachDTask in self.s_RunnDTaskArray:
                    eachDTask.Sys_Reply_SendResultCount_Finish(iResultCount, bstrOrigSign)
            pass

    # 处理接收数据的回调 - 结果数据 - CTYBot_CTUnit_TaskRegCenter_ReportResult
    # start by sk. 170226
    def HandleRecv_Result(self, bstrFromName, resultCTUnit):
        for eachDTask in self.s_RunnDTaskArray:
            if( eachDTask.IsParamBlockSignInMyArray(resultCTUnit.s_bstrOrigTaskUniqueSign)):
                bstrFixOrigResult = CTYLB_P2P_ContentUnit_Base_bytes.SafeConvertBase64Str_ToUTF8( resultCTUnit.s_bstrRunResult)
                eachDTask.Viul_Notify_Recv_RunResult( resultCTUnit.s_bstrOrigTaskUniqueSign,
                                                      resultCTUnit.s_iExecPluginID,
                                                      resultCTUnit.s_bstrExecDomainName,
                                                      bstrFixOrigResult)
                break
        pass

    # 处理接收数据的回调 - 结果数据V2 - CTYBot_CTUnit_TaskRegCenter_ReportResult_V2
    # start by sk. 170226
    def HandleRecv_Result_V2(self, bstrFromName, resultV2CTUnit):
        for eachDTask in self.s_RunnDTaskArray:
            if( eachDTask.IsParamBlockSignInMyArray(resultV2CTUnit.s_bstrOrigTaskUniqueSign)):
                for eachSubUnit in resultV2CTUnit.s_subResultUnitArray:
                    bstrFixOrigResult = CTYLB_P2P_ContentUnit_Base_bytes.SafeConvertBase64Str_ToUTF8(
                        eachSubUnit.s_bstrRunResult)
                    eachDTask.Viul_Notify_Recv_RunResult( resultV2CTUnit.s_bstrOrigTaskUniqueSign,
                                                          eachSubUnit.s_iExecPluginID,
                                                          eachSubUnit.s_bstrExecDomainName,
                                                          bstrFixOrigResult)
                break
        pass

    def StopQuit(self):
        self.s_x_TaskRegCenter_Sock.Close()
        self.s_LessTYLB_Bot_FrameThread.SafeStop()
    connectEchoSock = CTYFBot_OpSession_ConnectSock(
        hlSockMang, bstrTaskRegCenterName,
        s_g_iTaskMang_Listen_Port_PluginStatusResult)
    CTYLB_Log.ShowLog(
        0, u'RunPlugin', u'start HLSock connect remote TRC_Center.[%s:%d]' %
        (bstrTaskRegCenterName, s_g_iTaskMang_Listen_Port_PluginStatusResult))

    while (g_bSysRunning):
        bTaskBusy = False
        if (connectEchoSock.ExecNextCheck()):
            bTaskBusy = True

        # 检查发送数据.如果有结果数据未发送,那么,立即返回结果数据,不等待
        iNextExecCheckCount = g_hostExecPluginBot.GetTotalResultCount()
        if (iNextExecCheckCount > 0):
            connectEchoSock.SetNextTempSendWaitTick(1)

        if (connectEchoSock.CanExecSendData()):
            execSendCTArray = g_hostExecPluginBot.RetriveSendStatusResultDataOut(
            )
            connectEchoSock.ExecSendData(execSendCTArray)
            bTaskBusy = True
        # 检查接收的数据
        recvCTArray = connectEchoSock.PopRetriveRecvCTArray()
        if (recvCTArray):
            bTaskBusy = True
            bstrPeerName, iPeerPort = hlSockMang.GetSockPeerAddr(
                connectEchoSock.s_iExecConnectSockIndex)
            for eachUnit in recvCTArray:
                g_hostExecPluginBot.HandleRecvSockCTUnit(eachUnit)
            # 如果还有结果数据为发送,那么,立即调度下一步进行发送