def run(self): global IS_SYS_RUNNING IS_SYS_RUNNING = True # 获取配置文件路径及文件名,文件夹不存在则创建 config_file = os.path.abspath(self.__config_file) if not os.path.isfile(config_file): CTYLB_Log.ShowLog( 0, 'Main', '[%s] config file missing...Quit!' % self.__bot_name) # 配置文件不存在,直接退出 os._exit(-1) db_dir = os.path.join(os.path.abspath("."), u"db") db_file = os.path.join(db_dir, "{0}.db".format(self.__bot_name)) if not os.path.exists(db_dir): os.makedirs(db_dir) # 创建机器人框架 botFrameThread = CLessTYBotFrameThread(config_file, db_file) # 设置默认对环境全局事件处理 botFrameThread.SetDefaultConsoleCompatible( FBotV4.environment_event_handle) # 准备运行 botFrameThread.Prepare_Start() # 获得通讯管套管理对象 sockManager = botFrameThread.s_HLSockMang connectToSocks = {} # 获得通讯管套管理对象、操作结果以及操作参数块 for key in self.__connect_to_socks.keys(): connectToSocks[key] = {} for port in self.__connect_to_socks[key]: # 若为状态汇报,则间隔时间由用户指定 if key == TYFBOT_STATUS_MANAGER_IDENTIFY_NAME: sock = CTYFBot_OpSession_ConnectSock( hlSockMang=sockManager, strDestSrvName=key, iDestPort=port, iDefaultIdleTick=self.__report_interval) else: sock = CTYFBot_OpSession_ConnectSock( hlSockMang=sockManager, strDestSrvName=key, iDestPort=port, iDefaultIdleTick=1) connectToSocks[key][port] = sock CTYLB_Log.ShowLog( 0, 'exec', 'Start HLSock connect remote [{0}:{1}] --{2}'.format( key, port, self.__bot_name)) listenSocks = [] acceptSocks = [] for sockID in self.__listen_socks: listenSock = sockManager.CreateListenSock(sockID) listenSocks.append(listenSock) iFreeCount = 0 while IS_SYS_RUNNING: isTaskBusy = False for key in connectToSocks.keys(): for port in connectToSocks[key].keys(): sock = connectToSocks[key][port] if (sock.ExecNextCheck()): isTaskBusy = True if (sock.CanExecSendData()): for port in self.__connect_to_callbacks[key].keys(): execSendCTArray = self.__connect_send_package_handle( key, port) sock.ExecSendData(execSendCTArray) isTaskBusy = True if self.__report_status: if key in self.__node_status.SocksInfo[ 'Socks'].keys(): self.__node_status.SocksInfo['Socks'][key][ 'Status'] = "Up" self.__node_status.SocksInfo['Socks'][key][ 'TotalSend'] += len(execSendCTArray) self.__node_status.SocksInfo['Socks'][key][ 'LastSendTime'] = NodeStatus.get_now_timestamp( ) self.__node_status.SocksInfo[ 'TotalSend'] += len(execSendCTArray) recvCTArray = sock.PopRetriveRecvCTArray() if (not recvCTArray): bSockExist, recvCTArray = sockManager.PassiveRecv_From_ConnectSock( sock.s_iExecConnectSockIndex) if (not bSockExist): CTYLB_Log.ShowLog( 0, 'exec', 'sock close by remote. restarting.') sock.Close() if (recvCTArray): isTaskBusy = True strPeerName, iPeerPort = sockManager.GetSockPeerAddr( sock.s_iExecConnectSockIndex) if isinstance(strPeerName, bytes): strPeerName = strPeerName.decode() isNonePackageReply = True arrayLen = len(recvCTArray) if self.__report_status: if key in self.__node_status.SocksInfo[ 'Socks'].keys(): self.__node_status.SocksInfo['Socks'][key][ 'Status'] = "Up" self.__node_status.SocksInfo['Socks'][key][ 'TotalRecv'] += arrayLen self.__node_status.SocksInfo['Socks'][key][ 'LastRecvTime'] = NodeStatus.get_now_timestamp( ) self.__node_status.SocksInfo[ 'TotalRecv'] += arrayLen packageCount = 0 for eachUnit in recvCTArray: packageCount += 1 eachRetCommCTUnitArray = self.__connect_to_basic_handle( key, port, eachUnit, packageCount == arrayLen) if eachRetCommCTUnitArray: isNonePackageReply = False self.__connect_wait_to_send_arrays[key][ port].extend(eachRetCommCTUnitArray) if isNonePackageReply: defaultPackage = CTYBot_CTUnit_CommonData() self.__connect_wait_to_send_arrays[key][ port].append(defaultPackage) # 若存在监听服务 for listenSock in listenSocks: # 监听服务通信检查,检查新接受的连接 newClientSockIndex = sockManager.ExAcceptNewListenArriveSock( listenSock) if newClientSockIndex: strPeerName, iPeerPort = sockManager.GetSockPeerAddr( newClientSockIndex) if isinstance(strPeerName, bytes): strPeerName = strPeerName.decode() if self.__listen_accept_callback: self.__listen_accept_callback( listen_sock_id=listenSock, peer_name=strPeerName, peer_port=iPeerPort, client_index=newClientSockIndex) CTYLB_Log.ShowLog( 0, u'New Client Accept', u'From [%s:%d] new HLConnect %d accept.' % (strPeerName, iPeerPort, newClientSockIndex)) bTaskBusy = True acceptSocks.append(newClientSockIndex) if self.__report_status: # 添加Listen端SockInfo sockInfo = SockInfo(name=strPeerName, operateId=key, sockType='Listen') self.__node_status.SocksInfo['Socks'][ strPeerName] = sockInfo.dump_obj() self.__node_status.SocksInfo['Socks'][strPeerName][ 'Status'] = "Up" pass for iEachAcceptSock in acceptSocks: # 检查有否新数据包到达 strPeerName, iPeerPort = sockManager.GetSockPeerAddr( iEachAcceptSock) if isinstance(strPeerName, bytes): strPeerName = strPeerName.decode() bSockExist, ctUnitArray = sockManager.ActiveRecv_From_AcceptSock( iEachAcceptSock) if (not bSockExist): # 检查是否管套已经关闭 if self.__report_status: if strPeerName in self.__node_status.SocksInfo[ 'Socks'].keys(): self.__node_status.SocksInfo['Socks'][ strPeerName]['Status'] = "Down" CTYLB_Log.ShowLog( 0, u'Accept Client Closed', u'Accept sock %d closed' % (iEachAcceptSock)) acceptSocks.remove(iEachAcceptSock) break else: if (ctUnitArray): bTaskBusy = True self.__listen_basic_handle(sockManager, iEachAcceptSock, ctUnitArray) if self.__report_status: if strPeerName in self.__node_status.SocksInfo[ 'Socks'].keys(): self.__node_status.SocksInfo['Socks'][ strPeerName]['Status'] = "Up" self.__node_status.SocksInfo['Socks'][ strPeerName]['TotalRecv'] += len( ctUnitArray) self.__node_status.SocksInfo['Socks'][ strPeerName][ 'LastRecvTime'] = NodeStatus.get_now_timestamp( ) self.__node_status.SocksInfo[ 'TotalRecv'] += len(ctUnitArray) # 循环需要调用的回调处理,比如定时从数据库读取任务发送等 for loop_event_callback in self.__loop_event_callbacks: loop_event_callback() if (not isTaskBusy): iFreeCount += 1 if (iFreeCount > 50): time.sleep(0.01) else: iFreeCount = 0 for key in connectToSocks.keys(): for port in connectToSocks[key]: connectToSocks[key][port].Close() connectToSocks = {} listenSocks = [] botFrameThread.SafeStop() CTYLB_Log.ShowLog(0, "System Exited", "Bye Bye!")
0, u'exec', u'start HLSock connect remote [%s:%d] op-Exec-Action-Brain Func' % (g_str_RealAction_BrainBot_Name, g_i_ListenSock_TYFBot_ReAction_Brain_Operate)) CTYLB_Log.ShowLog( 0, u'exec', u'start HLSock connect remote [%s:%d] op-Exec-Monitor-Ctrl Func' % (g_str_RealAction_MonitorCtrlBot_Name, g_i_ListenSock_TYFBot_OP_Monitor_Operate)) while (g_bSysRunning): bTaskBusy = False if (connect_ActionOperate_Sock.ExecNextCheck()): bTaskBusy = True if (connect_ActionOperate_Sock.CanExecSendData()): execSendCTArray = HandleSend_OpReActBrain_Srv() connect_ActionOperate_Sock.ExecSendData(execSendCTArray) bTaskBusy = True recvCTArray = connect_ActionOperate_Sock.PopRetriveRecvCTArray() if (recvCTArray): bTaskBusy = True strPeerName, iPeerPort = hlSockMang.GetSockPeerAddr( connect_ActionOperate_Sock.s_iExecConnectSockIndex) for eachUnit in recvCTArray: # CTYLB_Log.ShowLog(0, 'recv-RealAction-Brain-reply', 'from [%s:%d] recv len:[%d]' % ( strPeerName, iPeerPort, len(eachUnit.s_strValue))) HandleRecv_OpReActBrain_CTUnit(eachUnit) ##################################### #大脑任务发送到屏幕控制端的指令解析
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()
class CTYFBot_DTask_OPDB_Prompter(CTYBot_WebName_DTask2_Base): s_g_iStep_WaitConnect = 0 s_g_iStep_SendObjRegister = 1 s_g_iStep_Wait_ObjRegister_Reply = 2 s_g_iStep_Can_SendParam = 2 def __init__(self, hlSockMang, bstrResultAppName, bstrResultSubTaskName, bstrObjParamName, bstrParamDBName, bstrParamTableName, bstrParamContentField, bstrParamSignIDField, iDestPluginID, iEachBlockCount=50): CTYBot_WebName_DTask2_Base.__init__(self, iDestPluginID, '', iEachBlockCount) self.s_bstrResultAppName = CTYLB_MainSys_MiscFunc.SafeGetUTF8(bstrResultAppName) self.s_bstrResultSubTaskName = CTYLB_MainSys_MiscFunc.SafeGetUTF8(bstrResultSubTaskName) self.s_bstrObjParamName = CTYLB_MainSys_MiscFunc.SafeGetUTF8(bstrObjParamName) self.s_bstrParamDBName = CTYLB_MainSys_MiscFunc.SafeGetUTF8(bstrParamDBName) self.s_bstrParamTableName = CTYLB_MainSys_MiscFunc.SafeGetUTF8(bstrParamTableName) self.s_bstrParamContentFieldName = CTYLB_MainSys_MiscFunc.SafeGetUTF8(bstrParamContentField) self.s_bstrIDSignFieldName = CTYLB_MainSys_MiscFunc.SafeGetUTF8(bstrParamSignIDField) self.s_parentHLSockMang = hlSockMang self.s_connectOPDBSrv_Param_Sock = CTYFBot_OpSession_ConnectSock( hlSockMang, g_bstrTYFBot_OPDB_SrvName, g_i_ListenSock_TYFBot_OP_DB_Operate_ParamBlock) self.s_connectOPDBSrv_Result_Sock = CTYFBot_OpSession_ConnectSock( hlSockMang, g_bstrTYFBot_OPDB_SrvName, g_i_ListenSock_TYFBot_OP_DB_Operate_Result) self.s_iExecStep = CTYFBot_DTask_OPDB_Prompter.s_g_iStep_WaitConnect self.s_midRecvCanUseParamBlockArray = [] # 中间存储的参数块队列 self.s_iCanSend_ReqParamCount = 0 # request param count, need send self.s_midStore_NeedSend_ResultData = [] # 中间存储的Result队列 self.s_midStore_NeedSend_FinishParamBlockArray = [] # 中间存储需要发送的的参数结果队列 pass def Vilu_CloseQuit(self): self.s_connectOPDBSrv_Param_Sock.Close() self.s_connectOPDBSrv_Result_Sock.Close() # 时间调度 def Vilu_ExecTimerCheck(self): bRetValue = False if( self.s_connectOPDBSrv_Param_Sock.ExecNextCheck()): bRetValue = True if( self.s_connectOPDBSrv_Result_Sock.ExecNextCheck()): bRetValue = True # 接收参数管套的数据 recvCTArray = self.s_connectOPDBSrv_Param_Sock.PopRetriveRecvCTArray() if( recvCTArray): bTaskBusy = True bstrPeerName, iPeerPort = self.s_parentHLSockMang.GetSockPeerAddr(self.s_connectOPDBSrv_Param_Sock.s_iExecConnectSockIndex) for eachUnit in recvCTArray: # CTYLB_Log.ShowLog(0, 'recv-reply', 'from [%s:%d] recv [%s]' % ( bstrPeerName, iPeerPort, eachUnit.s_bstrValue)) self.__HandleRecvCTUnit( eachUnit) # 接收结果管套的数据 recvCTArray = self.s_connectOPDBSrv_Result_Sock.PopRetriveRecvCTArray() if( self.s_connectOPDBSrv_Param_Sock.CanExecSendData()): needSendCTArray = [] if( self.s_iExecStep == CTYFBot_DTask_OPDB_Prompter.s_g_iStep_WaitConnect): bstrCombArray = [self.s_bstrObjParamName, self.s_bstrParamDBName, self.s_bstrParamTableName, self.s_bstrParamContentFieldName, self.s_bstrIDSignFieldName, b'0'] bstrFixValue = b';'.join(bstrCombArray) sendCTUnit = CTYBot_CTUnit_CommonData() sendCTUnit.SetIntData(g_i_OpParamBlock_SubCmd_RegiestDbTableField_Param) sendCTUnit.SetStrData(bstrFixValue) needSendCTArray.append(sendCTUnit) self.s_iExecStep = CTYFBot_DTask_OPDB_Prompter.s_g_iStep_Wait_ObjRegister_Reply elif( self.s_iExecStep == CTYFBot_DTask_OPDB_Prompter.s_g_iStep_Can_SendParam): if( self.s_iCanSend_ReqParamCount>0): sendCTUnit = CTYBot_CTUnit_CommonData() sendCTUnit.SetIntData(g_i_OpParamBlock_SubCmd_GetRunParamBlock) sendCTUnit.SetStrData(str(self.s_iCanSend_ReqParamCount)) sendCTUnit.SetParam(self.s_bstrObjParamName, str(self.s_iEachParamBlockCount).encode()) needSendCTArray.append(sendCTUnit) self.s_iCanSend_ReqParamCount = 0 # after send, reset to 0 sendCTUnit = CTYBot_CTUnit_CommonData() sendCTUnit.SetIntData(g_i_OpParamBlock_SubCmd_GetUnExecRecCount) sendCTUnit.SetParam(self.s_bstrObjParamName, b'') needSendCTArray.append(sendCTUnit) if( self.s_midStore_NeedSend_FinishParamBlockArray): needSendCTArray.extend( self.s_midStore_NeedSend_FinishParamBlockArray) self.s_midStore_NeedSend_FinishParamBlockArray = [] if( not needSendCTArray): # 增加临时单元,方便会话的持续 sendCTUnit = CTYBot_CTUnit_CommonData() needSendCTArray.append(sendCTUnit) self.s_connectOPDBSrv_Param_Sock.ExecSendData( needSendCTArray) if( self.s_connectOPDBSrv_Result_Sock.CanExecSendData()): needSendCTArray = self.s_midStore_NeedSend_ResultData if( not needSendCTArray): # 增加临时单元,方便会话的持续 sendCTUnit = CTYBot_CTUnit_CommonData() needSendCTArray.append(sendCTUnit) else: self.s_midStore_NeedSend_ResultData = [] self.s_connectOPDBSrv_Result_Sock.ExecSendData( needSendCTArray) return bRetValue # [子类可继承实现] - 内部调用- 准备参数块。 返回:无 def Viul_Internal_ParamBlock_PrePare(self, bstrRegCenterID): pass # [子类可继承实现] - 内部调用- 输出一个参数块. 返回:stringArray, 要提交扫描的目标数组,返回空表示无内容 def Viul_Internal_ParamBlock_ReadEach_CTUnit(self): # 如果缓冲太满了,减少参数块读取的速度 iCanRetriveCount = 0 if( len(self.s_bstrPromptWaitFinishParamSignArray) > CTYBot_WebName_DTask2_Base.s_g_iMaxWaitParamStillCount): iCanRetriveCount = 1 else: iCanRetriveCount = 10 retWebBlockParam = self.__ASync_Retrive_OneParamBlock(iCanRetriveCount) return retWebBlockParam # 处理接收到数据单元 def __HandleRecvCTUnit(self, recvCTUnit): if( recvCTUnit.s_iMyDataType == CTYLB_Bot_BaseDef.s_g_iDataType_CommonTask): if( recvCTUnit.s_iValue == g_i_OpParamBlock_SubCmd_Reply_RegiestDbTableField_Param): if( self.__IsRecvCTUnitObjNameMe(recvCTUnit)): if( self.s_iExecStep == CTYFBot_DTask_OPDB_Prompter.s_g_iStep_Wait_ObjRegister_Reply): self.s_iExecStep = CTYFBot_DTask_OPDB_Prompter.s_g_iStep_Can_SendParam elif (recvCTUnit.s_iValue == g_i_OpParamBlock_SubCmd_Reply_GetUnExecRecCount): if( self.__IsRecvCTUnitObjNameMe(recvCTUnit)): iUnHandleCount = int(recvCTUnit.s_bstrValue) iTotalCount = int(recvCTUnit.s_bstrParam2) self.__HandleRecvParamUnExecCount( iUnHandleCount, iTotalCount) elif( recvCTUnit.s_iValue == g_i_OpParamBlock_SubCmd_Reply_GetRunParamBlock): if( self.__IsRecvCTUnitObjNameMe(recvCTUnit)): self.__HandleRecvParamBlockUnit( recvCTUnit.s_bstrValue, recvCTUnit.s_bstrParam2) # 处理接收到未执行参数命令个数的数据包 def __HandleRecvParamUnExecCount(self, iUnHandleCount, iTotalCount): CTYLB_Log.ShowLog(0, 'recv-param-count', '%s total:[%d], not run:[%d]' % (self.s_bstrObjParamName, iTotalCount, iUnHandleCount)) # 判断接收到的单元,是否我单元对象名字相同 def __IsRecvCTUnitObjNameMe(self, ctUnit): bRetValue = False if( CTYLB_MainSys_MiscFunc.SafeCompareAnyStrValue( ctUnit.s_bstrParam1, self.s_bstrObjParamName)): bRetValue = True return bRetValue # 处理接收到的参数块 def __HandleRecvParamBlockUnit(self, bstrParamContentLine, bstrParamSignID): bstrParamContentLine = CTYLB_MainSys_MiscFunc.SafeGetUTF8(bstrParamContentLine) bstrParamSignID = CTYLB_MainSys_MiscFunc.SafeGetUTF8(bstrParamSignID) bstrBlockArray = bstrParamContentLine.split(b'\n') if( bstrBlockArray): assignWebNameBlock = CTYBot_CTUnit_TaskRegCenter_Assign_WebNameBlock() # 提交到任务模块 assignWebNameBlock.s_iRunPluginID = self.s_iRunPluginID assignWebNameBlock.s_bstrDomainNameArray = bstrBlockArray assignWebNameBlock.s_bstrUniqueSign = bstrParamSignID # 提交,发送 self.s_midRecvCanUseParamBlockArray.append(assignWebNameBlock) # [子类可继承实现] - 异步读取可用参数块. 返回:webNameParamBlock,返回空表示无内容 def __ASync_Retrive_OneParamBlock(self, iMaxRetriveCount): retWebNameParamBlock = None if( self.s_midRecvCanUseParamBlockArray): retWebNameParamBlock = self.s_midRecvCanUseParamBlockArray.pop(0) else: # 设置发送请求参数块的值,等待调度发送 self.s_iCanSend_ReqParamCount = iMaxRetriveCount return retWebNameParamBlock # [子类可继承实现] - paramblock is finish def Viul_FinishParamBlock(self, bstrOrigParamBlockSign, iResultCode): bstrOrigParamBlockSign = CTYLB_MainSys_MiscFunc.SafeGetUTF8(bstrOrigParamBlockSign) sendCTUnit = CTYBot_CTUnit_CommonData() sendCTUnit.SetIntData(g_i_OpParamBlock_SubCmd_Finish_ParamBlock) sendCTUnit.SetStrData( bstrOrigParamBlockSign) sendCTUnit.SetParam(self.s_bstrObjParamName, str(iResultCode)) self.s_midStore_NeedSend_FinishParamBlockArray.append(sendCTUnit) # 当运行结果到达的通知 def Viul_Notify_Recv_RunResult(self, bstrParamSign, iReplyPluginID, bstrOrigTitleDomain, bstrResult): bstrParamSign = CTYLB_MainSys_MiscFunc.SafeGetUTF8(bstrParamSign) bstrOrigTitleDomain = CTYLB_MainSys_MiscFunc.SafeGetUTF8(bstrOrigTitleDomain) bstrResult = CTYLB_MainSys_MiscFunc.SafeGetUTF8(bstrResult) contentArray = [self.s_bstrResultAppName, self.s_bstrResultSubTaskName, bstrParamSign] bstrParam2Content = g_bstr_ResultContentSplit.join(contentArray) sendCTUnit = CTYBot_CTUnit_CommonData() sendCTUnit.SetIntData(g_i_OpResult_SubCmd_AddResult) sendCTUnit.SetStrData( bstrResult) sendCTUnit.SetParam(bstrOrigTitleDomain, bstrParam2Content) self.s_midStore_NeedSend_ResultData.append(sendCTUnit) pass pass
# 准备运行 g_LessTYLB_Bot_FrameThread.Prepare_Start() # 获得管套管理对象 hlSockMang = g_LessTYLB_Bot_FrameThread.s_HLSockMang # 获得管套管理对象, 操作结果,操作参数块 connect_ActionOperate_Sock = CTYFBot_OpSession_ConnectSock( hlSockMang, g_str_RealAction_BrainBot_Name, g_i_ListenSock_TYFBot_ReAction_Brain_Operate) CTYLB_Log.ShowLog(0, u'exec', u'start HLSock connect remote [%s:%d] op-Exec-Action-Brain Func' % (g_str_RealAction_BrainBot_Name, g_i_ListenSock_TYFBot_ReAction_Brain_Operate)) while(g_bSysRunning): bTaskBusy = False if( connect_ActionOperate_Sock.ExecNextCheck()): bTaskBusy = True if( connect_ActionOperate_Sock.CanExecSendData()): execSendCTArray = HandleSend_OpReActBrain_Srv() connect_ActionOperate_Sock.ExecSendData( execSendCTArray) bTaskBusy = True recvCTArray = connect_ActionOperate_Sock.PopRetriveRecvCTArray() if( recvCTArray): bTaskBusy = True strPeerName, iPeerPort = hlSockMang.GetSockPeerAddr(connect_ActionOperate_Sock.s_iExecConnectSockIndex) for eachUnit in recvCTArray: # CTYLB_Log.ShowLog(0, 'recv-RealAction-Brain-reply', 'from [%s:%d] recv len:[%d]' % ( strPeerName, iPeerPort, len(eachUnit.s_strValue))) HandleRecv_OpReActBrain_CTUnit( eachUnit) if( not bTaskBusy): time.sleep(0.1)
# 创建行动监听管套 iOP_ActionBrain_ListenSock = hlSockMang.CreateListenSock( g_i_ListenSock_TYFBot_ReAction_Brain_Operate) iAccept_OP_ActionBrain_Sock_Array = [] reactBotTrackChecker = CTYReActBrainBot_Track_Checker() while (g_bSysRunning): bTaskBusy = False # 下面执行 对微信新内容的通信检查 if (connect_weixin_op_Sock.ExecNextCheck()): bTaskBusy = True if (connect_weixin_op_Sock.CanExecSendData()): execSendCTArray = HandleSend_OpWeiXin_Srv() connect_weixin_op_Sock.ExecSendData(execSendCTArray) bTaskBusy = True recvCTArray = connect_weixin_op_Sock.PopRetriveRecvCTArray() if (recvCTArray): bTaskBusy = True strPeerName, iPeerPort = hlSockMang.GetSockPeerAddr( connect_weixin_op_Sock.s_iExecConnectSockIndex) for eachUnit in recvCTArray: # CTYLB_Log.ShowLog(0, 'recv-WeiXin-reply', 'from [%s:%d] recv len:[%d]' % ( strPeerName, iPeerPort, len(eachUnit.s_strValue))) HandleRecv_OPWeiXin_CTUnit(eachUnit) # 下面执行 对 执行行动大脑 监听服务的 通信检查 # 检查新接收的连接
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) # 如果还有结果数据为发送,那么,立即调度下一步进行发送 if (g_hostExecPluginBot.GetTotalResultCount() > 0): connectEchoSock.SetNextTempSendWaitTick(1)