void CCommandPra::CmdAppLogLevel(CProtocol& a_clsRecvP, CProcessManager& a_clsPM)
{
	CConfigPra& clsCfg = CConfigPra::Instance();
	CAppQueue& clsQ = CAppQueue::Instance();
	
	CCmdAppLogLevel clsLog;				// Notify parsing
	string strBody;

	CCmdAppCtl clsCtl;					// APP에 보낼 body 메세지
	CProtocol clsSendP;					// APP에 보낼 message


	if (a_clsRecvP.IsFlagNotify() == false) {
		g_pclsLogPra->WARNING("CMD, 'LOG_LEVEL' not set notify flag");
	}

	if (clsLog.NotifyParse(a_clsRecvP.GetPayload().c_str()) == false) {
		g_pclsLogPra->ERROR("CMD, 'LOG_LEVEL' invalied body format");
		return;
	}
	
	// 프로세스 보낼 메세지 구성
	clsCtl.m_strAction = "LOG_LEVEL";
	clsCtl.m_nOption = clsLog.m_nLogLevel;

	clsSendP.SetCommand(CMD_APP_CTL);
	clsSendP.SetFlagRequest();
	clsSendP.SetSource(clsCfg.m_nNodeNo, clsCfg.m_nProcNo);
	clsSendP.SetSequence();
	clsSendP.SetPayload(clsCtl.RequestGen());

	if (clsLog.m_bIsAll) {
		// 전체 프로세스 loglevel 변경 요청
		vector<CProcessManager::ST_APPINFO> vecInfo;
		a_clsPM.GetAppInfo(vecInfo, CProcStatus::RUNNING);
		for (size_t i=0; i < vecInfo.size(); ++i) {
			clsSendP.SetDestination(clsCfg.m_nNodeNo, vecInfo[i].m_nProcNo);
			
			if (clsQ.SendCmd(clsSendP, vecInfo[i].m_strProcName.c_str()) == false) {
				g_pclsLogPra->ERROR("APP loglevel send failed");
			}
		}

	} else {
		// 지정 프로세스의 loglevel 변경 요청
		list<pair<int, string> >::iterator iter = clsLog.m_lstTarget.begin();
		for (; iter != clsLog.m_lstTarget.end(); ++iter) {
			clsSendP.SetDestination(clsCfg.m_nNodeNo, iter->first);
			
			if (clsQ.SendCmd(clsSendP, iter->second.c_str()) == false) {
				g_pclsLogPra->ERROR("APP loglevel send failed");
			}
		}
	}

	return;
}
Exemple #2
0
int CEmsInfo::SendProcess(int a_nCmdCode, int a_nFlag, char *a_chMessageBuffer, int a_nMessageBufferLen)
{
    bool blnRet = true;
    char strCmdCode[11];
    int nNodeNo = 0;
    int nProcNo = 0;
    CGlobal *cGlob = NULL;
    CModuleIPC *cIpc = NULL;
    CProtocol cProto;

    DEBUG_LOG("SEND PROCESS\n");

    cGlob = CGlobal::GetInstance();

    nNodeNo = cGlob->GetLocalNodeNo();
    nProcNo =  cGlob->GetLocalProcNo();

    cProto.SetSource(nNodeNo, nProcNo);

    /* TEST */
    cProto.SetDestination(m_nAtomNodeNo, m_nStmNo);

    /* flag setting */
    switch(a_nFlag){
        case CProtocol::FLAG_REQUEST:   cProto.SetFlagRequest();    break;
        case CProtocol::FLAG_RESPONSE:  cProto.SetFlagResponse();   break;
        case CProtocol::FLAG_NOTIFY:    cProto.SetFlagNotify();     break;
        case CProtocol::FLAG_RETRNS:    cProto.SetFlagRetransmit(); break;
        case CProtocol::FLAG_BROAD:     cProto.SetFlagBroadcast();  break;
        case CProtocol::FLAG_ERROR:     cProto.SetFlagError();      break;
        default:
                                        STA_LOG(STA_ERR,"Invalid Message flag(%d)\n",a_nFlag);
                                        return STA_NOK;
    }

    /* PKG CLASS ACTION 
     * 000 003 XXXX
     */
    snprintf(strCmdCode, 11,"00000%d",a_nCmdCode);
    strCmdCode[11] = '\0';
    cProto.SetCommand(strCmdCode);

    cProto.SetPayload(a_chMessageBuffer, a_nMessageBufferLen);

    cIpc = cGlob->GetModuleIPC();

    blnRet = cIpc->SendMesg(cProto);
    if(blnRet != true){
        STA_LOG(STA_ERR,"IPC Send failed(cmdCode=%d, flag=%d)\n", a_nCmdCode, a_nFlag);
        return STA_NOK;
    }

    m_nMessageBufferLen = 0;

    return STA_OK;
}
void CProcessManager::CheckAlive(void)
{
	CConfigPra& clsCfg = CConfigPra::Instance();
	CAppQueue& clsQ = CAppQueue::Instance();
	
	// Alive check를 위한 Ping 메세지 생성
	CProtocol clsProto;
	clsProto.SetCommand(CMD_PING);
	clsProto.SetFlagRequest();
	clsProto.SetSource(clsCfg.m_nNodeNo, clsCfg.m_nProcNo);
	clsProto.SetPayload(NULL, 0);
	
	time_t curtime = time(NULL);

	auto iter = m_mapProcess.begin();
	for (; iter != m_mapProcess.end(); iter++) {

		if (iter->second.m_pclsApp->GetStatus() != CProcStatus::RUNNING) {
			continue;
		}
		
		// Alive 체크
		// 조건1) 마지막 alive 시간 + hangup 시간 이내 인가?
		// 조건2) alive 체크 주기 인가?
		if (curtime <= (iter->second.m_nAliveTime + m_nHangupTime)) {
			if (curtime >= (iter->second.m_nAliveTime + m_nAlivePeriod)) {
				clsProto.SetDestination(clsCfg.m_nNodeNo, iter->first);
				clsProto.SetSequence();
				
				auto miter = m_mapProcess.find(iter->first);
				if (miter == m_mapProcess.end()) {
					continue;
				}
				
				if (clsQ.SendCmd(clsProto, 
						miter->second.m_stAppInfo.m_strProcName.c_str()) == false) {
					g_pclsLogPra->ERROR("PM, CMD 'PING' send failed");
					continue;
				}
			}
			continue;
		}

		// HANGUP 처리
		g_pclsLogPra->CRITICAL("PM, process hangup, pno: %d, pname: %s",
							iter->first, 
							iter->second.m_stAppInfo.m_strProcName.c_str());
		iter->second.m_pclsApp->SetStatus(CProcStatus::HANGUP);
		iter->second.m_pclsApp->SendSignal(SIGSEGV);
	}
	
	return;
}
int CClaInterface::RegReqFunc(CProtocol &cProto)
{
	CCliRegReqApi cReqApi;
	string strPayload;

	/* send reg message */

	cReqApi.Init(m_strUserId);
	cReqApi.EncodeMessage(strPayload);

	cProto.SetCommand("0000080002");
	cProto.SetFlagRequest();
	cProto.SetSource(0, 0);
	cProto.SetDestination(0, 0);
	cProto.SetPayload(strPayload);

	return RESULT_OK;
}