def Sys_Schedule_RequestParamBlock(self): retParamBlockArray = [] while( self.s_iCanSendRequestParamCount > 0): # 检查时间符合? assignWebNameBlock = self.Viul_Internal_ParamBlock_ReadEach_CTUnit() if( assignWebNameBlock): self.s_iCanSendRequestParamCount -= 1 # 执行数-1 # 提交,发送 retParamBlockArray.append( assignWebNameBlock) # 加入参数到等待完成队列 self.s_bstrPromptWaitFinishParamSignArray.append(assignWebNameBlock.s_bstrUniqueSign) CTYLB_Log.ShowLog(0, 'send-task-center', 'prompt-run-param-block:%d [%s]' % (len(assignWebNameBlock.s_bstrDomainNameArray), assignWebNameBlock.s_bstrUniqueSign)) msgObject={ "monitor_type":"send-task-block", "level":"info", "target":"", "plugin_id":assignWebNameBlock.s_iRunPluginID, "block_id":assignWebNameBlock.s_bstrUniqueSign, "block_size":len(assignWebNameBlock.s_bstrDomainNameArray), "free_size":0, "wait_size":0, "success_size":0, "result_code":0, "msg":""} CTYLB_Log.ShowMonitor(msgType="PLC",msgObject=msgObject) else: break return retParamBlockArray
def Sys_Reply_ParamBlock_Result(self, bstrOrigParamBlockSign, iResultCode): bstrOrigParamBlockSign = CTYLB_MainSys_MiscFunc.SafeGetUTF8(bstrOrigParamBlockSign) self.Viul_FinishParamBlock( bstrOrigParamBlockSign, iResultCode) if( bstrOrigParamBlockSign in self.s_bstrPromptWaitFinishParamSignArray): bRemove = False if( iResultCode == CTYBot_CTUnit_CommonData.s_g_iIntValue_Task_Finish): bRemove = True elif( iResultCode == CTYBot_CTUnit_CommonData.s_g_iIntValue_Task_Finish_Fail): bRemove = True if( bRemove): self.s_bstrPromptWaitFinishParamSignArray.remove( bstrOrigParamBlockSign) CTYLB_Log.ShowLog( 0,'param-reply', 'block %s run-finish. %d, still_buff_len:[%d]' % ( bstrOrigParamBlockSign, iResultCode, len( self.s_bstrPromptWaitFinishParamSignArray)) ) msgObject={ "monitor_type":"block-finish-reply", "level":"info", "target":"", "plugin_id":self.s_iRunPluginID, "block_id":bstrOrigParamBlockSign, "block_size":0, "free_size":0, "wait_size":len( self.s_bstrPromptWaitFinishParamSignArray), "success_size":0, "result_code":iResultCode, "msg":""} CTYLB_Log.ShowMonitor(msgType="PLC",msgObject=msgObject) pass pass
def Sys_Reply_SendResultCount_Finish(self, iResultCount, bstrRequestCTUnitSign): CTYLB_Log.ShowLog( 0, 'recv-task-center', 'recv result count:%d' % (iResultCount)) msgObject={ "monitor_type":"send-task-block-reply", "level":"info", "target":"", "plugin_id":self.s_iRunPluginID, "block_id":"", "block_size":0, "free_size":0, "wait_size":0, "success_size":iResultCount, "result_code":0, "msg":""} CTYLB_Log.ShowMonitor(msgType="PLC",msgObject=msgObject)
def CTYBot_Frame_CommonData_CallBack(bstrFromName, param1, param2, commDataCTUnit, execCallBackUnit): if (commDataCTUnit.s_iType == CTYBot_CTUnit_CommonData.s_g_iType_int): CTYLB_Log.ShowLog( 0, 'common-callback', '>>> exactly, data receive %d - %d' % (commDataCTUnit.s_strParam1, commDataCTUnit.s_iValue)) elif (commDataCTUnit.s_iType == CTYBot_CTUnit_CommonData.s_g_iType_string): CTYLB_Log.ShowLog( 0, 'common-callback', '>>> exactly, data receive: [%s]' % (commDataCTUnit.s_strValue)) else: CTYLB_Log.ShowLog( 0, 'common-callback', 'unknown data receive, type:%d' % (commDataCTUnit.s_iType)) pass
def HandleSendDataToEchoSrv(): curExecTime = datetime.now() newCTUnit = CTYBot_CTUnit_CommonData() strLarge = 'xxsseefa' iLargeRandCount = random.randint(5200, 18000) for iSub in range(iLargeRandCount): strLarge += 'xx11223344xqwe333dd3xx11223344xqwe3333xx11223344xqwe3333xx11223344xqwe3333xx11223344xqwe3333xx11223344xqwe3333' strContent = '1 hello %s, huge:%d, mid-huge-size:%d,' % ( curExecTime.strftime('%H:%M:%S'), iLargeRandCount, len(strLarge)) strContent += strLarge newCTUnit.SetStrData(strContent) global g_strLastSendContent g_strLastSendContent = strContent CTYLB_Log.ShowLog( 0, 'send', "send huge count:%d total size:%d" % (iLargeRandCount, len(strContent))) newCTUnit1 = CTYBot_CTUnit_CommonData() strContent = '2 hello %s, I am %s' % (curExecTime.strftime('%H:%M:%S'), g_strSelfID) newCTUnit1.SetStrData(strContent) newCTUnit2 = CTYBot_CTUnit_CommonData() strContent = '3 hello %s, I am %s' % (curExecTime.strftime('%H:%M:%S'), g_strSelfID) newCTUnit2.SetStrData(strContent) retCTArray = [newCTUnit, newCTUnit1, newCTUnit2] return retCTArray
def HandleRecvSockCTUnit(self, cTUnit): if (cTUnit.s_iMyDataType == CTYLB_Bot_BaseDef.s_g_iDataType_TaskRegCenter_sk_v1 and cTUnit.s_iBotCmd_Main == CTYLB_Bot_BaseDef. s_g_iMainCmd_TaskRegCenter_Assign_WebNameBlock and cTUnit.s_iBotCmd_Sub == CTYLB_Bot_BaseDef. s_g_iSubCmd_TaskRegCenter_Assign_WebNameBlock): CTYLB_Log.ShowLog( 0, u'Recv-CallBack', u' Recv WebParamBlock cmd [%s]' % (cTUnit.s_bstrUniqueSign)) newRunParamUnit = CThreadRunParamUnit(u'n/a', cTUnit) self.s_waitRunParamUnit.append(newRunParamUnit) pass # 结果通用单元 elif (cTUnit.s_iMyDataType == CTYLB_Bot_BaseDef.s_g_iDataType_CommonTask and cTUnit.s_iBotCmd_Main == CTYLB_Bot_BaseDef.s_g_iMainCmd_CommonTask_SingleData): if (cTUnit.s_iBotCmd_Sub == CTYLB_TaskReg_Cmd_BaseDef.s_g_iSubCmd_Sample): pass elif (cTUnit.s_iBotCmd_Sub == CTYLB_Bot_BaseDef.s_g_iSubCmd_CommonTask_SingleData): if (cTUnit.s_iValue == CTYBot_CTUnit_CommonData. s_g_iIntValue_Query_DExecHost_Send_Result_Count): # [任务中心->执行插件主机] 查询完成的结果单元个数。strParam1=最大可发送个数。 # 在单位时间发送内容中,实现发送数据的功能 pass pass
def PopSizeResultCTUnitArray(self, iTotalExSize=1024000): iCurSendCount = 0 bLooping = True retResultCTUnitArray = [] iCurExSize = 0 # 查找任务完成等待取结果的单元 while (bLooping): bAllEmpty = True # 是否全部为空 for eachThread in self.s_runThreadMang: if (iCurExSize >= iTotalExSize): bLooping = False break bstrFromName, resultRunUnit = eachThread.Safe_Pop_Retrive_MiddleResult_Unit( ) if (bstrFromName and resultRunUnit): iCurSendCount += 1 # 发送个数 + 1 bAllEmpty = False # 至少一个有内容,不为空 strMsg = u'send type:%d cmd:%d-%d sign:%s' % ( resultRunUnit.s_iMyDataType, resultRunUnit.s_iBotCmd_Main, resultRunUnit.s_iBotCmd_Sub, resultRunUnit.s_bstrUniqueSign) CTYLB_Log.ShowLog(0, u'bot', strMsg) retResultCTUnitArray.append(resultRunUnit) iCurExSize += resultRunUnit.GetTotalSize() pass if (bAllEmpty): # 如果全部为空,那么,跳出循环 break return retResultCTUnitArray
def HandleRecvCTUnit_OPResult(hlSockMang, iEachAcceptSock, ctUnitArray): retDataArray = [] iReplyAddResultCount = 0 for eachCTUnit in ctUnitArray: eachRetCommCTUnit = None eachRetCommCTUnitArray = [] if( eachCTUnit.s_iMyDataType == CTYLB_Bot_BaseDef.s_g_iDataType_CommonTask): if( eachCTUnit.s_iValue == g_i_OpResult_SubCmd_AddResult): SubHandle_OPResult_AddResult( eachCTUnit.s_strValue, eachCTUnit.s_strParam1, eachCTUnit.s_strParam2) iReplyAddResultCount += 1 if( eachRetCommCTUnit): retDataArray.append(eachRetCommCTUnit) if( eachRetCommCTUnitArray): retDataArray.extend( eachRetCommCTUnitArray) if( iReplyAddResultCount>0): CTYLB_Log.ShowLog(0, u'result-write', u'write %d result count' % iReplyAddResultCount) retCommCTUnit = CTYBot_CTUnit_CommonData() retCommCTUnit.SetIntData( g_i_OpResult_SubCmd_ReplyAddResult) retCommCTUnit.SetStrData( str(iReplyAddResultCount).encode()) retDataArray.append(retCommCTUnit) hlSockMang.PassiveSend_To_AcceptSock(iEachAcceptSock, retDataArray) pass
def environment_event_handle(signum, frame): ''' 系统全局事件处理函数,主要处理Ctrl+C等终止事件 ''' CTYLB_Log.ShowLog(1, "Ctrl+C", "Ctrl+C keyboard event detected...[Exiting]") global IS_SYS_RUNNING IS_SYS_RUNNING = False
def CloseSockByIndex(self, iSockIndex): destCloseSock = self.__GetSockByIndex(iSockIndex) if (destCloseSock): # 搜索单元。 if (self.s_ExecMutex.acquire()): if (destCloseSock in self.s_sockArray): destCloseSock.Vilu_Close() CTYLB_Log.ShowLog(0, 'HLSockMang', 'sock closed.[%d]' % (iSockIndex)) else: CTYLB_Log.ShowLog( 1, 'HLSockMang', 'sock found but not exist.[%d]' % (iSockIndex)) self.s_ExecMutex.release() else: CTYLB_Log.ShowLog(1, 'HLSockMang', 'Close not exist sock.[%d]' % (iSockIndex)) pass
def CtrlCHandle(signum, frame): global g_bSysRunning CTYLB_Log.ShowLog(1, 'CTRL_C', "Ctrl+C Input, exiting") msgObject = { "monitor_type": "status", "level": "error", "target": "", "plugin_id": -1, "block_id": "", "block_size": 0, "free_size": 0, "wait_size": 0, "success_size": 0, "result_code": 0, "msg": "Ctrl+C keyboard detected, PLC exiting..." } CTYLB_Log.ShowMonitor(msgType="PLC", msgObject=msgObject) g_bSysRunning = False
def Sys_Reply_Plugin_RunParam_Count(self, iPluginID, iRemoteTaskCenterFreeCount): if( iPluginID == self.s_iRunPluginID): self.s_iCanSendRequestParamCount = iRemoteTaskCenterFreeCount CTYLB_Log.ShowLog( 0, 'recv-task-center', 'plugin:%d free:%d' % (iPluginID, iRemoteTaskCenterFreeCount)) msgObject={ "monitor_type":"recv-task-block-free", "level":"info", "target":"", "plugin_id":iPluginID, "block_id":"", "block_size":0, "free_size":iRemoteTaskCenterFreeCount, "wait_size":0, "success_size":0, "result_code":0, "msg":""} CTYLB_Log.ShowMonitor(msgType="PLC",msgObject=msgObject)
def HandleRecvSockCTUnit(hlSockMang, iEachAcceptSock, ctUnitArray): retDataArray = [] for eachCTUnit in ctUnitArray: if( eachCTUnit.s_iMyDataType == CTYLB_Bot_BaseDef.s_g_iDataType_CommonTask): retCommData = CTYBot_CTUnit_CommonData() retCommData.SetStrData( eachCTUnit.s_strValue) CTYLB_Log.ShowLog(0, u'recv & reply', eachCTUnit.s_strValue) retDataArray.append(retCommData) hlSockMang.PassiveSend_To_AcceptSock(iEachAcceptSock, retDataArray) pass
def Vilu_Close(self): bSendClose = True # 如果已经连接,发送关闭数据包 if (bSendClose): # 构造关闭数据包,发送远端 CTYLB_Log.ShowLog( 0, 'HLSockMang', 'send sock close to peer.[%d]' % (self.s_iLocalPort)) self.Exec_SendClose_To_RemotePeer() # 设置状态 CTYBot_SockUnit_Base.Vilu_Close(self)
def HandleRecv_OPWeiXin_CTUnit(recvCTUnit): if (recvCTUnit.s_iMyDataType == CTYLB_Bot_BaseDef.s_g_iDataType_CommonTask ): if (recvCTUnit.s_iValue == g_i_OpWeiXin_SubCmd_Reply_GetLoginCode): CTYLB_Log.ShowLog( 0, 'recv-wx-data', 'recv login-code-reply:[] param: [%s] : [%s]' % (recvCTUnit.s_strParam1, recvCTUnit.s_strParam2)) elif (recvCTUnit.s_iValue == g_i_OpWeiXin_SubCmd_Reply_Get_ChatText): CTYLB_Log.ShowLog( 0, 'recv-wx-data', 'recv reply-chat result:[%s] param: [%s] : [%s]' % (recvCTUnit.s_strValue, recvCTUnit.s_strParam1, recvCTUnit.s_strParam2)) elif (recvCTUnit.s_iValue == g_i_OpWeiXin_SubCmd_Reply_SendChatContent ): CTYLB_Log.ShowLog( 0, 'recv-wx', 'recv sendtext-reply:[%s] param: [%s] : [%s]' % (recvCTUnit.s_strValue, recvCTUnit.s_strParam1, recvCTUnit.s_strParam2)) pass
def Handle_SystemNotify_ClientStatus(self, iSystemNotifyClientStatus, strDestClientName): # 在 Tylb_Support_Client.py的 CTYLB_MidBalance_InOutBuffMang 中定义。 if (iSystemNotifyClientStatus == 0): # client restart # 搜索所有connect和accept的管套。如果是,则设置关闭标志 if (self.s_ExecMutex.acquire()): for eachSock in self.s_sockArray: if ((eachSock.s_iType == CTYBot_SockUnit_Base.s_g_iType_Accept) or (eachSock.s_iType == CTYBot_SockUnit_Base.s_g_iType_Connect)): if (eachSock.s_strRemoteID == strDestClientName): eachSock.Vilu_Close() CTYLB_Log.ShowLog( 0, u'HLSockMang', u'Client Restart, sock:%d->%s:%d closed' % (eachSock.s_iLocalPort, strDestClientName, eachSock.s_iRemotePort)) self.s_ExecMutex.release() pass elif (iSystemNotifyClientStatus == 1): # client init startup # 搜索所有connect和accept的管套。如果是,则设置关闭标志 if (self.s_ExecMutex.acquire()): for eachSock in self.s_sockArray: if ((eachSock.s_iType == CTYBot_SockUnit_Base.s_g_iType_Accept) or (eachSock.s_iType == CTYBot_SockUnit_Base.s_g_iType_Connect)): if (eachSock.s_strRemoteID == strDestClientName): eachSock.Vilu_Close() CTYLB_Log.ShowLog( 0, u'HLSockMang', u'Client Init-StartUP, sock:%d->%s:%d closed' % (eachSock.s_iLocalPort, strDestClientName, eachSock.s_iPeerPort)) self.s_ExecMutex.release() pass pass
def Viul_Notify_Recv_RunResult(self, bstrParamSign, iReplyPluginID, bstrOrigDomain, bstrResult): bstrParamSign = CTYLB_MainSys_MiscFunc.SafeGetUTF8(bstrParamSign) bstrOrigDomain = CTYLB_MainSys_MiscFunc.SafeGetUTF8(bstrOrigDomain) bstrResult = CTYLB_MainSys_MiscFunc.SafeGetUTF8(bstrResult) bstrShowResult = bstrResult s2 = bstrShowResult.replace(b'\r', b'') bstrShowResult = s2.replace(b'\n', b'') CTYLB_Log.ShowLog( 0, 'result-arrive', '[%s] - [%s] [%d] [%s]' % (bstrParamSign, bstrOrigDomain, iReplyPluginID, bstrShowResult)) msgObject={ "monitor_type":"result", "level":"info", "target":bstrOrigDomain, "plugin_id":self.s_iRunPluginID, "block_id":"", "block_size":0, "free_size":0, "wait_size":0, "success_size":0, "result_code":0, "msg":bstrResult } CTYLB_Log.ShowMonitor(msgType="PLC",msgObject=msgObject) pass
def Vilu_Close(self): bSendClose = False if (self.s_iStatus == CTYBot_SockUnit_Base.s_g_iStatus_Connecting): bSendClose = True elif (self.s_iStatus == CTYBot_SockUnit_Base.s_g_iStatus_Connected): bSendClose = True # 如果已经连接,发送关闭数据包 if (bSendClose): # 构造关闭数据包,发送远端 CTYLB_Log.ShowLog( 0, 'HLSockMang', 'connect sock send closed.[%d]' % (self.s_iLocalPort)) self.Exec_SendClose_To_RemotePeer() pass CTYBot_SockUnit_Base.Vilu_Close(self)
def __AssignFreeParamToExecPluginHost(self, execPluginHost): if (execPluginHost.s_lastClientStatusData and execPluginHost.s_lastClientStatusData.s_iCanRecvTaskCount > 0): # 找有空闲请求,而且等待时间最长的任务 freeRequestHost = self.__Query_RequestCanRunParam_MostWaitTime() if (freeRequestHost): freeParam = freeRequestHost.PopFrom_WaitArray_StoreSign_To_ExecParamArray( ) if (freeParam): # 分配,发送 iExecPluginID = CTYLB_TaskCenter_HostMang.GetParamUnit_PluginID( freeParam) if (iExecPluginID): # 完成发送,执行删除参数,放到运行队列. # 发送到远程执行主机 CTYLB_Log.ShowLog( 0, 'TRC_host_mang', "send param [%s] to [%s]" % (freeParam.s_bstrUniqueSign, execPluginHost.s_bstrHostIDName)) execPluginHost.s_toBeSendCTUnitArray.append(freeParam) # 加入到主机的执行队列 execPluginHost.s_bstrTaskParamSignArray.append( freeParam.s_bstrUniqueSign) # 分配一个,减少一个值 if (execPluginHost.s_lastClientStatusData): execPluginHost.s_lastClientStatusData.s_iCanRecvTaskCount -= 1 else: # 回复失败,设置任务完成。 freeRequestHost.SetTaskFinish( freeParam.s_bstrUniqueSign) # set task finish & failure. replyCommUnit = CTYBot_CTUnit_CommonData() replyCommUnit.SetIntData( CTYBot_CTUnit_CommonData. s_g_iIntValue_Task_BCast_Fail_No_Host) replyCommUnit.SetParam(freeParam.s_bstrUniqueSign, '') freeRequestHost.s_clientResultCTUnitArray.append( replyCommUnit) # 加入到结果队列 pass pass
eachCTUnit.s_strParam1, eachCTUnit.s_strParam2) # ################################################################################################ # 主程序入口 实现 # ################################################################################################ if __name__ == '__main__': #获取配置文件路径及文件名,文件夹不存在则创建 config_dir = os.path.join(os.path.dirname(os.path.realpath(__file__)), u"config") config_file = os.path.join(config_dir, u"config.ini") if not os.path.exists(config_dir): os.makedirs(config_dir) if not os.path.isfile(config_file): CTYLB_Log.ShowLog(0, u'Main', u'[%s] config file missing...Quit!' % g_strProgName) #配置文件不存在,直接退出 os._exit(-1) db_dir = os.path.join(os.path.dirname(os.path.realpath(__file__)), u"db") db_file = os.path.join(db_dir, u"data.db") if not os.path.exists(db_dir): os.makedirs(db_dir) # 创建机器人框架 g_LessTYLB_Bot_FrameThread = CLessTYBotFrameThread(config_file, db_file) # 设置默认环境处理 g_LessTYLB_Bot_FrameThread.SetDefaultConsoleCompatible(CtrlCHandle) # 准备运行 g_LessTYLB_Bot_FrameThread.Prepare_Start()
def CtrlCHandle(signum, frame): global g_bSysRunning CTYLB_Log.ShowLog(1, 'CTRL_C', "Ctrl+C Input, exiting") g_bSysRunning = False
newCTUnit2.SetStrData(strContent) retCTArray = [newCTUnit, newCTUnit1, newCTUnit2] return retCTArray # 主程序入口 if __name__ == '__main__': #获取配置文件路径及文件名,文件夹不存在则创建 config_dir = os.path.join(os.path.dirname(os.path.realpath(__file__)), "config") config_file = os.path.join(config_dir, "config.yaml") if not os.path.exists(config_dir): os.makedirs(config_dir) if not os.path.isfile(config_file): CTYLB_Log.ShowLog(0, 'Main', '[%s] config file missing...Quit!' % g_strProgName) #配置文件不存在,直接退出 os._exit(-1) db_dir = os.path.join(os.path.dirname(os.path.realpath(__file__)), "db") db_file = os.path.join(db_dir, "data.db") if not os.path.exists(db_dir): os.makedirs(db_dir) # 创建机器人框架 g_LessTYLB_Bot_FrameThread = CLessTYBotFrameThread(config_file, db_file) # 设置默认环境处理 g_LessTYLB_Bot_FrameThread.SetDefaultConsoleCompatible(CtrlCHandle) # 准备运行 g_LessTYLB_Bot_FrameThread.Prepare_Start() g_strSelfID = g_LessTYLB_Bot_FrameThread.GetMyName()
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
# 主程序入口 if __name__ == '__main__': 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 starting..." } CTYLB_Log.ShowMonitor(msgType="PLC", msgObject=msgObject) iNextFileReadPos = 0 iArgCount = len(sys.argv) if (iArgCount < 2): print('input run: [skip_block_count], default is 0') elif (iArgCount >= 2): iNextFileReadPos = int(sys.argv[1]) msgObject = { "monitor_type": "status", "level": "info", "target": "", "plugin_id": -1, "block_id": "", "block_size": 0,
def __init__(self, connect_to_socks=None, loop_event_callbacks=None, listen_socks=None, listen_accpet_callback=None, config_file="config/config.yaml", report_status=False, report_interval=60, comment=""): ''' 功能Bot初始化对象 :param connect_to_socks: 需要连接的套管对象集合,字典格式{"连接端的惟一ID":创建连接对应的指令值} :param loop_event_callbacks: 需要在每次主轮询时执行的函数回调集合,一般用于数据库检测操作,List集合 :param listen_socks: 需要监听的套管对象ID集合,List格式[ID] :param config_file: 配置文件路径,默认为"./config/config.ini" :param report_status: 是否向节点状态监测节点发送节点状态信息:True-发送当前节点状态信息,False-不发送当前节点状态信息,默认为False :param report_interval: 状态汇报时间间隔,单位秒,默认60秒 :param comment: 节点描述/备注,用于描述节点功能说明,默认为"" ''' # 功能Bot的名字,一般与配置文件中一致 self.__bot_name = get_config_value(config_file, 'client.myid') self.__connect_to_socks = connect_to_socks if connect_to_socks else {} self.__listen_socks = listen_socks if listen_socks else [] self.__listen_accept_callback = listen_accpet_callback self.__config_file = config_file self.__report_status = report_status self.__report_interval = report_interval self.__last_report_time = time.time() self.__node_comments = comment self.__connect_to_callbacks = {} self.__listen_callbacks = {} self.__loop_event_callbacks = loop_event_callbacks if loop_event_callbacks else [] self.__node_status = NodeStatus(name=self.__bot_name, comment=self.__node_comments) # 增加节点当前状态汇报 if self.__report_status: self.__add_report_status_sock_callbacks() assert (isinstance(self.__connect_to_socks, dict)) if len(self.__listen_socks) < 1 and len( self.__connect_to_socks.keys()) < 1: CTYLB_Log.ShowLog( 2, "Error Sock Pipes", "Connect to socks and Listen socks could not be zero at the same time." ) exit(-1) # 需要发送到服务端的数据队列数组,可能连接到多个服务端,因此以字典形式存储每个对应的发送队列数组 self.__connect_wait_to_send_arrays = {} # 监听模式下,只有一个监听行为 # 监听模式下需要发送的数据队列数组 self.__listen_wait_to_send_arrays = [] # 初始化客户端发送队列数组 for key in self.__connect_to_socks.keys(): for port in self.__connect_to_socks[key]: if key not in self.__connect_wait_to_send_arrays.keys(): self.__connect_wait_to_send_arrays[key] = {} self.__connect_wait_to_send_arrays[key][port] = [] if self.__report_status: sockInfo = SockInfo(name=key, operateId=self.__connect_to_socks[key]) obj = sockInfo.dump_obj() key = CTYLB_MainSys_MiscFunc.SafeGetUnicode(key) self.__node_status.SocksInfo['Socks'][key] = obj
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!")
def Handle_ExecPlugin_RecvSockCTUnit(self, hlSockMang, iExecPluginSock, ctUnitArray): execPluginHost = self.SearchHostUnitBySockIndex(iExecPluginSock, False) if (execPluginHost): execPluginHost.UpdateLastActiveTime() lastOrigReqHostUnit = None # 上次查询的主机单元值 for eachCTUnit in ctUnitArray: bUnitHandled = False if (not bUnitHandled): # 向任务中心报告当前状态 if (eachCTUnit.s_iMyDataType == CTYLB_Bot_BaseDef. s_g_iDataType_TaskRegCenter_sk_v1): if ((eachCTUnit.s_iBotCmd_Main == CTYLB_Bot_BaseDef. s_g_iMainCmd_TaskRegCenter_ReportMyStatus) and (eachCTUnit.s_iBotCmd_Sub == CTYLB_Bot_BaseDef. s_g_iSubCmd_TaskRegCenter_ReportMyStatus_None)): bUnitHandled = True execPluginHost.s_lastClientStatusData = eachCTUnit pass if (not bUnitHandled): # 结果报告的命令 if (eachCTUnit.s_iMyDataType == CTYLB_Bot_BaseDef. s_g_iDataType_TaskRegCenter_sk_v1): if ((eachCTUnit.s_iBotCmd_Main == CTYLB_Bot_BaseDef. s_g_iMainCmd_TaskRegCenter_ReportResult) and (eachCTUnit.s_iBotCmd_Sub == CTYLB_Bot_BaseDef. s_g_iSubCmd_TaskRegCenter_ReportResult_PingTraceWebCrawl )): bUnitHandled = True taskUnitReportResult = eachCTUnit bOrigParamExist, origReqHostUnit = self.Search_OrigTaskSign_ReqHostUnit_By_UniqueSign( taskUnitReportResult.s_bstrOrigTaskUniqueSign, lastOrigReqHostUnit) if (bOrigParamExist and origReqHostUnit): origReqHostUnit.s_clientResultCTUnitArray.append( taskUnitReportResult) lastOrigReqHostUnit = origReqHostUnit pass if (not bUnitHandled): # 结果报告单元V2 if (eachCTUnit.s_iMyDataType == CTYLB_Bot_BaseDef. s_g_iDataType_TaskRegCenter_sk_v1): if ((eachCTUnit.s_iBotCmd_Main == CTYLB_Bot_BaseDef. s_g_iMainCmd_TaskRegCenter_ReportResult_V2) and (eachCTUnit.s_iBotCmd_Sub == CTYLB_Bot_BaseDef. s_g_iSubCmd_TaskRegCenter_ReportResult_V2_PingTraceWebCrawl )): bUnitHandled = True taskUnitReportV2Result = eachCTUnit bOrigParamExist, origReqHostUnit = self.Search_OrigTaskSign_ReqHostUnit_By_UniqueSign( taskUnitReportV2Result. s_bstrOrigTaskUniqueSign, lastOrigReqHostUnit) if (bOrigParamExist and origReqHostUnit): origReqHostUnit.s_clientResultCTUnitArray.append( taskUnitReportV2Result) lastOrigReqHostUnit = origReqHostUnit pass if (not bUnitHandled): # 结果通用单元 if (eachCTUnit.s_iMyDataType == CTYLB_Bot_BaseDef.s_g_iDataType_CommonTask): if ((eachCTUnit.s_iBotCmd_Main == CTYLB_Bot_BaseDef. s_g_iMainCmd_CommonTask_SingleData) and (eachCTUnit.s_iBotCmd_Sub == CTYLB_Bot_BaseDef. s_g_iSubCmd_CommonTask_SingleData)): bUnitHandled = True lastOrigReqHostUnit = self.__Handle_ExecPluginHost_Recv_CommCTUnit( execPluginHost, eachCTUnit, lastOrigReqHostUnit) # 把主机空闲的参数块,分配到该主机。 self.__AssignFreeParamToExecPluginHost(execPluginHost) # 发送数据包。发送后,清除 if (len(execPluginHost.s_toBeSendCTUnitArray) > 0): toBeSendArray = execPluginHost.s_toBeSendCTUnitArray else: tmpCommCTUnit = CTYBot_CTUnit_CommonData() tmpCommCTUnit.SetIntData(0) toBeSendArray = [tmpCommCTUnit] hlSockMang.PassiveSend_To_AcceptSock(iExecPluginSock, toBeSendArray) execPluginHost.s_toBeSendCTUnitArray = [] else: CTYLB_Log.ShowLog( 1, 'TRC_host_mang', "Invalid ExecPluginSocket HL_Socket %d not exist" % (iExecPluginSock)) pass
def Handle_PromptorRequester_RecvSockCTUnit(self, hlSockMang, iPromptorSock, ctUnitArray): requestorHost = self.SearchHostUnitBySockIndex(iPromptorSock, True) if (requestorHost): for eachCTUnit in ctUnitArray: bUnitHandled = False if (not bUnitHandled): # 单个参数块分配 if (eachCTUnit.s_iMyDataType == CTYLB_Bot_BaseDef. s_g_iDataType_TaskRegCenter_sk_v1): if ((eachCTUnit.s_iBotCmd_Main == CTYLB_Bot_BaseDef. s_g_iMainCmd_TaskRegCenter_AssignTask) and (eachCTUnit.s_iBotCmd_Sub == CTYLB_Bot_BaseDef. s_g_iSubCmd_TaskRegCenter_AssignTask_Param)): bUnitHandled = True requestorHost.s_waitExecParamArray.append( eachCTUnit) pass if (not bUnitHandled): # 广播参数块分配 if (eachCTUnit.s_iMyDataType == CTYLB_Bot_BaseDef. s_g_iDataType_TaskRegCenter_sk_v1): if ((eachCTUnit.s_iBotCmd_Main == CTYLB_Bot_BaseDef. s_g_iMainCmd_TaskRegCenter_AssignTask) and (eachCTUnit.s_iBotCmd_Sub == CTYLB_Bot_BaseDef. s_g_iSubCmd_TaskRegCenter_AssignTask_BroadCast_Param )): bUnitHandled = True requestorHost.s_waitBroadCastParamArray.append( eachCTUnit) pass if (not bUnitHandled): # 域名参数块分配 if (eachCTUnit.s_iMyDataType == CTYLB_Bot_BaseDef. s_g_iDataType_TaskRegCenter_sk_v1): if ((eachCTUnit.s_iBotCmd_Main == CTYLB_Bot_BaseDef. s_g_iMainCmd_TaskRegCenter_Assign_WebNameBlock) and (eachCTUnit.s_iBotCmd_Sub == CTYLB_Bot_BaseDef. s_g_iSubCmd_TaskRegCenter_Assign_WebNameBlock)): bUnitHandled = True requestorHost.s_waitExecParamArray.append( eachCTUnit) pass if (not bUnitHandled): if (eachCTUnit.s_iMyDataType == CTYLB_Bot_BaseDef.s_g_iDataType_CommonTask): if ((eachCTUnit.s_iBotCmd_Main == CTYLB_Bot_BaseDef. s_g_iMainCmd_CommonTask_SingleData) and (eachCTUnit.s_iBotCmd_Sub == CTYLB_Bot_BaseDef. s_g_iSubCmd_CommonTask_SingleData)): bUnitHandled = True self.__Handle_PromptRequestor_Recv_CommCTUnit( requestorHost, eachCTUnit) # 调度数据包发送回去。 totalNeedSend = [] # 把最多某个个长度的数组存入 # 发送 回复单元 iCanSendCount = CTYLB_TaskCenter_HostMang.s_g_iMaxSendTotalCTUnitCount iArrayLen = len(requestorHost.s_toBeSendReplyCTUnitArray) if (iArrayLen > 0): iHaveSendCount = iArrayLen if ( iCanSendCount > iArrayLen) else iCanSendCount totalNeedSend.extend( requestorHost.s_toBeSendReplyCTUnitArray[:iHaveSendCount]) stillSaveArray = requestorHost.s_toBeSendReplyCTUnitArray[ iHaveSendCount:] requestorHost.s_toBeSendReplyCTUnitArray = stillSaveArray # 发送结果单元 iArrayLen = len(requestorHost.s_clientResultCTUnitArray) iCanSendCount = CTYLB_TaskCenter_HostMang.s_g_iMaxSendTotalCTUnitCount - len( totalNeedSend) if (iArrayLen > 0 and iCanSendCount > 0): iHaveSendCount = iArrayLen if ( iCanSendCount > iArrayLen) else iCanSendCount totalNeedSend.extend( requestorHost.s_clientResultCTUnitArray[:iHaveSendCount]) stillSaveArray = requestorHost.s_clientResultCTUnitArray[ iHaveSendCount:] requestorHost.s_clientResultCTUnitArray = stillSaveArray if (not totalNeedSend): # 如果为空的队列,增加临时单元,保证队列不为空 replyCommUnit = CTYBot_CTUnit_CommonData() totalNeedSend.append(replyCommUnit) hlSockMang.PassiveSend_To_AcceptSock(iPromptorSock, totalNeedSend) else: CTYLB_Log.ShowLog( 1, 'TRC_host_mang', "Invalid Promptor HL_Socket %d not exist" % (iPromptorSock)) pass
# 下面是主程序入口 # ################################################################################################ if __name__ == '__main__': s_g_iTaskMang_Listen_Port_PromptTask = 3 # 任务管理中心,对任务提交者的监听端口 s_g_iTaskMang_Listen_Port_PluginStatusResult = 4 # 任务管理中心,插件报告状态,和传回结果。收到后,发送参数块过去 # bot = FBot(name='TaskRegCenter', listen_mode=True, listen_operate_id=) #获取配置文件路径及文件名,文件夹不存在则创建 config_dir = os.path.join(os.path.dirname(os.path.realpath(__file__)), u"config") config_file = os.path.join(config_dir, u"config.ini") if not os.path.exists(config_dir): os.makedirs(config_dir) if not os.path.isfile(config_file): CTYLB_Log.ShowLog(0, u'Main', u'[%s] config file missing...Quit!' % g_strProgName) #配置文件不存在,直接退出 os._exit(-1) db_dir = os.path.join(os.path.dirname(os.path.realpath(__file__)), u"db") db_file = os.path.join(db_dir, u"data.db") if not os.path.exists(db_dir): os.makedirs(db_dir) # 创建机器人框架 g_LessTYLB_Bot_TRC_Srv_FrameThread = CLessTYBotFrameThread( config_file, db_file) # 设置默认环境处理 g_LessTYLB_Bot_TRC_Srv_FrameThread.SetDefaultConsoleCompatible(CtrlCHandle) # 注册用到的数据单元,当HLSession单元收到后,里面用到的单元数据 g_LessTYLB_Bot_TRC_Srv_FrameThread.RegisterNewCTUnit(
hlSockMang.PassiveSend_To_AcceptSock(iEachAcceptSock, retDataArray) pass # ################################################################################################ # 主程序入口 实现 # ################################################################################################ if __name__ == '__main__': #获取配置文件路径及文件名,文件夹不存在则创建 config_dir = os.path.join(os.path.dirname(os.path.realpath(__file__)), u"config") config_file = os.path.join(config_dir, u"config.ini") if not os.path.exists(config_dir): os.makedirs(config_dir) if not os.path.isfile(config_file): CTYLB_Log.ShowLog(0, u'Main', u'[%s] config file missing...Quit!' % g_strProgName) #配置文件不存在,直接退出 os._exit(-1) db_dir = os.path.join(os.path.dirname(os.path.realpath(__file__)), u"db") db_file = os.path.join(db_dir, u"data.db") if not os.path.exists(db_dir): os.makedirs(db_dir) # 链接主数据库 g_mainOperateWeiXinDB.ReConnect(u"172.16.56.130", 3306, u"testzhuangshiqi", u"abc888+222@@@", g_ustr_WeiXinBot_DBName) # 创建机器人框架 g_LessTYLB_Bot_FrameThread = CLessTYBotFrameThread(config_file, db_file) # 设置默认环境处理