Example #1
0
void CCommandPra::CmdPing(CProtocol& a_clsRecvP)
{
	CProtocol clsResp;
	clsResp.SetResponse(a_clsRecvP);

	CCmdBase clsBase;
	string strBody;
	if (a_clsRecvP.IsFlagRequest()) {
		strBody = clsBase.ErrorGen(0, "ok i am alive");
	} else { 
		strBody = clsBase.ErrorGen(0, "not set requst flag");
		clsResp.SetFlagError();
		g_pclsLogPra->ERROR("MSGP, ping, not set request flag");
	}
	
	clsResp.SetPayload(strBody);

	if (CModuleIPC::Instance().SendMesg(clsResp) == false) {
		g_pclsLogPra->ERROR("CMD, send message failed, %s", 
								CModuleIPC::Instance().m_strErrorMsg.c_str());
		clsResp.Print(g_pclsLogPra, LV_ERROR, true);
	}

	#ifdef PRA_DEBUG
	g_pclsLogPra->DEBUG("Send message");
	clsResp.Print(g_pclsLogPra, LV_DEBUG, true);
	#endif
	
	return;
}
Example #2
0
void CCommandPra::CmdAppStatus(CProtocol& a_clsRecvP, CProcessManager& a_clsPM)
{
	CCmdBase clsBase;
	bool bIsError = false;
	string strBody;


	if (a_clsRecvP.IsFlagRequest() == false) {
		strBody = clsBase.ErrorGen(1, "not set request flag");
		bIsError = true;
		goto JumpSend;
	}

	if (clsBase.RequestParse(a_clsRecvP.GetPayload().c_str()) == false) {
		strBody = clsBase.ErrorGen(1, "invalied body format");
		bIsError = true;
		goto JumpSend;
	}

	GetAppStatus(a_clsPM, clsBase);
	strBody = clsBase.ResponseGen();

JumpSend:
	CProtocol clsResp;
	clsResp.SetResponse(a_clsRecvP);
	if (bIsError) {
		clsResp.SetFlagError();
	}
	clsResp.SetPayload(strBody);

	if (CModuleIPC::Instance().SendMesg(clsResp) == false) {
		g_pclsLogPra->ERROR("CMD, send message failed, %s", 
								CModuleIPC::Instance().m_strErrorMsg.c_str());
		clsResp.Print(g_pclsLogPra, LV_ERROR, true);
	}

	#ifdef PRA_DEBUG
	g_pclsLogPra->DEBUG("Send message");
	clsResp.Print(g_pclsLogPra, LV_DEBUG, true);
	#endif
	
	return;
}
Example #3
0
void CCommandPra::CmdCli_InitProc(CProtocol& a_clsRecvP, CCliReq& clsCliReq,
													CProcessManager& a_clsPM)
{
	CConfigPra& clsCfg = CConfigPra::Instance();

	// 프로세스 보낼 메세지 구성
	CCmdAppCtl clsCtl;					// APP에 보낼 body 메세지
	clsCtl.m_strAction = "INIT";

	CProtocol clsSendP;					// APP에 보낼 message
	clsSendP.SetCommand(CMD_APP_CTL);
	clsSendP.SetFlagNotify();
	clsSendP.SetSource(clsCfg.m_nNodeNo, clsCfg.m_nProcNo);
	clsSendP.SetSequence();
	clsSendP.SetPayload(clsCtl.RequestGen());
	
	// CLI response 메세지 구성
	CCliRsp	clsCliRsp;
	clsCliRsp.SetSessionId(clsCliReq.GetSessionId());
	clsCliRsp.SetResultCode(1, "SUCCESS");
	clsCliRsp.SetText      ("");
	clsCliRsp.SetTextAppend("================================\n");
	clsCliRsp.SetTextAppend("    procno   procname    success\n");
	clsCliRsp.SetTextAppend("---------- ---------- ----------\n");
	
	CAppQueue& clsQ = CAppQueue::Instance();
	string strProcName;
	int nProcNo = -1;
	
	for (uint32_t i=0; i < clsCliReq.GetCount(); i++) {
		// Argument
		if (clsCliReq[i].GetName().compare("SERVICE_NAME") == 0) {
			// TODO
			// sevice name process invoke
			continue;
			
		} else if (clsCliReq[i].GetName().compare("PROCESS_NAME") == 0) {
			// Parameter
			for (uint32_t j=0; j < clsCliReq[i].GetCount(); j++) {
				strProcName = clsCliReq[i][j].GetString();
				
				nProcNo = a_clsPM.FindProcNo(strProcName);
				if (nProcNo <= 0) {
					g_pclsLogPra->ERROR("CMD 'CLI' uknown process no, pname: %s",
															strProcName.c_str());
					clsCliRsp.NPrintf(1024, "%10d %10s %10s\n",
						   					-1, strProcName.c_str(), "FAILED");
					continue;
				}

				// 프로세스의 init 요청
				clsSendP.SetDestination(clsCfg.m_nNodeNo, nProcNo);
				if (clsQ.SendCmd(clsSendP, clsCliReq[i][j].GetString().c_str()) == false) {
					g_pclsLogPra->ERROR("APP init send failed");
					clsCliRsp.NPrintf(1024, "%10d %10s %10s\n",
						   					-1, strProcName.c_str(), "FAILED");
					continue;
				}

				clsCliRsp.NPrintf(1024, "%10d %10s %10s\n", 
										nProcNo, strProcName.c_str(), "OK");
			}
		}
	}
	clsCliRsp.SetTextAppend("================================\n");
	
	string strBody;
	clsCliRsp.EncodeMessage(strBody);

	// 응답 메세지 생성
	clsSendP.SetResponse(a_clsRecvP);
	clsSendP.SetPayload(strBody);
	
	if (CModuleIPC::Instance().SendMesg(clsSendP) == false) {
		g_pclsLogPra->ERROR("CMD, send message failed, %s", 
								CModuleIPC::Instance().m_strErrorMsg.c_str());
		clsSendP.Print(g_pclsLogPra, LV_ERROR, true);
	}

	#ifdef PRA_DEBUG
	g_pclsLogPra->DEBUG("Send message");
	clsSendP.Print(g_pclsLogPra, LV_DEBUG, true);
	#endif
	
	return;	
}
Example #4
0
void CCommandPra::CmdCli_StopProc(CProtocol& a_clsRecvP, CCliReq& clsCliReq,
													CProcessManager& a_clsPM)
{
	vector<int> vecTarget;
	int nProcNo = -1;
	
	for (uint32_t i=0; i < clsCliReq.GetCount(); i++) {
		// Argument
		if (clsCliReq[i].GetName().compare("SERVICE_NAME") == 0) {
			// TODO
			// sevice name process invoke
			continue;
			
		} else if (clsCliReq[i].GetName().compare("PROCESS_NAME") == 0) {
			// Parameter
			for (uint32_t j=0; j < clsCliReq[i].GetCount(); j++) {
				nProcNo = a_clsPM.FindProcNo(clsCliReq[i][j].GetString());
				if (nProcNo <= 0) {
					g_pclsLogPra->ERROR("CMD 'CLI' uknown process no, pname: %s",
											clsCliReq[i][j].GetString().c_str());
					continue;
				}
				a_clsPM.Stop(nProcNo);
				
				vecTarget.push_back(nProcNo);
			}
		}
	}
	
	list<CProcessManager::ST_APPRUNINFO> lstInfo;
	list<CProcessManager::ST_APPRUNINFO>::iterator liter;

	struct tm ltm;
	char szStartTime[40] = {0x00,};
	char szStopTime[40] = {0x00,};

	CCliRsp	clsCliRsp;
	clsCliRsp.SetSessionId(clsCliReq.GetSessionId());
	clsCliRsp.SetResultCode(1, "SUCCESS");
	clsCliRsp.SetText      ("");
	clsCliRsp.SetTextAppend("===============================================================================================\n");
	clsCliRsp.SetTextAppend("       pid             procname     status           start time            stop time    version\n");
	clsCliRsp.SetTextAppend("---------- -------------------- ---------- -------------------- -------------------- ----------\n");

	for (size_t i=0; i < vecTarget.size(); i++) {

		if (a_clsPM.GetStatus(lstInfo, vecTarget[i]) != 1) {
			g_pclsLogPra->ERROR("CMD 'CLI' status not found, pno: %d", vecTarget[i]);
			continue;
		}
		liter = lstInfo.begin();

		if (liter->m_stRun.m_tStartTime > 0) {
			localtime_r(&liter->m_stRun.m_tStartTime, &ltm);
			snprintf(szStartTime, sizeof(szStartTime), "%04d-%02d-%02d %02d:%02d:%02d", 
									ltm.tm_year + 1900, ltm.tm_mon+1, ltm.tm_mday,
									ltm.tm_hour, ltm.tm_min, ltm.tm_sec);
		}
		if (liter->m_stRun.m_tStopTime > 0) {
			localtime_r(&liter->m_stRun.m_tStopTime, &ltm);
			snprintf(szStopTime, sizeof(szStopTime), "%04d-%02d-%02d %02d:%02d:%02d", 
									ltm.tm_year + 1900, ltm.tm_mon+1, ltm.tm_mday,
									ltm.tm_hour, ltm.tm_min, ltm.tm_sec);		
		}
		
		clsCliRsp.NPrintf(1024, "%10d %-20s %10s %20s %20s %10s\n",
								liter->m_stRun.m_nPid,
								liter->m_stInfo.m_strProcName.c_str(),
								CProcStatus::StatusToString(liter->m_stRun.m_enStatus),
								szStartTime,
								szStopTime,
								liter->m_stRun.m_strVersion.c_str());
	}
	clsCliRsp.SetTextAppend("===============================================================================================\n");
	
	string strBody;
	clsCliRsp.EncodeMessage(strBody);

	// 응답 메세지 생성
	CProtocol clsSendP;
	clsSendP.SetResponse(a_clsRecvP);
	clsSendP.SetPayload(strBody);
	
	if (CModuleIPC::Instance().SendMesg(clsSendP) == false) {
		g_pclsLogPra->ERROR("CMD, send message failed, %s", 
								CModuleIPC::Instance().m_strErrorMsg.c_str());
		clsSendP.Print(g_pclsLogPra, LV_ERROR, true);
	}

	#ifdef PRA_DEBUG
	g_pclsLogPra->DEBUG("Send message");
	clsSendP.Print(g_pclsLogPra, LV_DEBUG, true);
	#endif
	
	return;	
}
Example #5
0
void CCommandPra::CmdCli_DispProc(CProtocol& a_clsRecvP, CCliReq& clsCliReq,
													CProcessManager& a_clsPM)
{
	list<CProcessManager::ST_APPRUNINFO> lstInfo;
	a_clsPM.GetStatus(lstInfo, -1);
	string strWorst = CProcStatus::StatusToString(a_clsPM.GetStatusWorst());

	struct tm ltm;
	char szStartTime[40] = {0x00,};
	char szStopTime[40] = {0x00,};

	CCliRsp	clsCliRsp;
	clsCliRsp.SetSessionId(clsCliReq.GetSessionId());
	clsCliRsp.SetResultCode(1, "SUCCESS");
	clsCliRsp.SetText      ("");
	clsCliRsp.NPrintf(1024, "worst status: %s\n", strWorst.c_str());
	clsCliRsp.SetTextAppend("===============================================================================================\n");
	clsCliRsp.SetTextAppend("       pid             procname     status           start time            stop time    version\n");
	clsCliRsp.SetTextAppend("---------- -------------------- ---------- -------------------- -------------------- ----------\n");

	for (auto iter = lstInfo.begin(); iter != lstInfo.end(); ++iter) {
		if (iter->m_stRun.m_tStartTime > 0) {
			localtime_r(&iter->m_stRun.m_tStartTime, &ltm);
			snprintf(szStartTime, sizeof(szStartTime), "%04d-%02d-%02d %02d:%02d:%02d", 
									ltm.tm_year + 1900, ltm.tm_mon+1, ltm.tm_mday,
									ltm.tm_hour, ltm.tm_min, ltm.tm_sec);
		}
		if (iter->m_stRun.m_tStopTime > 0) {
			localtime_r(&iter->m_stRun.m_tStopTime, &ltm);
			snprintf(szStopTime, sizeof(szStopTime), "%04d-%02d-%02d %02d:%02d:%02d", 
									ltm.tm_year + 1900, ltm.tm_mon+1, ltm.tm_mday,
									ltm.tm_hour, ltm.tm_min, ltm.tm_sec);		
		}
		
		clsCliRsp.NPrintf(1024, "%10d %-20s %10s %20s %20s %10s\n",
								iter->m_stRun.m_nPid,
								iter->m_stInfo.m_strProcName.c_str(),
								CProcStatus::StatusToString(iter->m_stRun.m_enStatus),
								szStartTime,
								szStopTime,
								iter->m_stRun.m_strVersion.c_str());
	}
	clsCliRsp.SetTextAppend("===============================================================================================\n");
	
	string strBody;
	clsCliRsp.EncodeMessage(strBody);

	// 응답 메세지 생성
	CProtocol clsSendP;
	clsSendP.SetResponse(a_clsRecvP);
	clsSendP.SetPayload(strBody);
	
	if (CModuleIPC::Instance().SendMesg(clsSendP) == false) {
		g_pclsLogPra->ERROR("CMD, send message failed, %s", 
								CModuleIPC::Instance().m_strErrorMsg.c_str());
		clsSendP.Print(g_pclsLogPra, LV_ERROR, true);
	}

	#ifdef PRA_DEBUG
	g_pclsLogPra->DEBUG("Send message");
	clsSendP.Print(g_pclsLogPra, LV_DEBUG, true);
	#endif
	
	return;
}
Example #6
0
void CCommandPra::CmdBatchStart(CProtocol& a_clsRecvP, CProcessManager& a_clsPM)
{
	CCmdBatchStart clsBatch;
	bool bIsError = false;
	string strBody;
	CProcStatus::EN_STATUS nStatus = CProcStatus::NONE;


	if (a_clsRecvP.IsFlagRequest() == false) {
		strBody = clsBatch.ErrorGen(1, "not set request flag");
		bIsError = true;
		goto JumpSend;
	}

	if (clsBatch.RequestParse(a_clsRecvP.GetPayload().c_str()) == false) {
		strBody = clsBatch.ErrorGen(1, "invalied body format");
		bIsError = true;
		goto JumpSend;
	}

	// 배치 프로세스 실행
	a_clsPM.Run(clsBatch.m_nProcNo);

	// batch exit wait
	usleep(100);
	a_clsPM.CheckExit(clsBatch.m_nProcNo);


	nStatus = a_clsPM.GetStatus(clsBatch.m_nProcNo);
	switch (nStatus) {
		case CProcStatus::RUNNING :
			clsBatch.m_strStatus = "pending";
			break;
		case CProcStatus::STOPPED :
			clsBatch.m_strStatus = "normal";
			clsBatch.m_nExitCd = a_clsPM.GetExitCode(clsBatch.m_nProcNo);
			break;
		default :
			clsBatch.m_strStatus = "failed";
	}
	strBody = clsBatch.ResponseGen();

JumpSend:
	CProtocol clsResp;
	clsResp.SetResponse(a_clsRecvP);
	if (bIsError) {
		clsResp.SetFlagError();
	}
	clsResp.SetPayload(strBody);

	if (CModuleIPC::Instance().SendMesg(clsResp) == false) {
		g_pclsLogPra->ERROR("CMD, send message failed, %s", 
								CModuleIPC::Instance().m_strErrorMsg.c_str());
		clsResp.Print(g_pclsLogPra, LV_ERROR, true);
	}

	#ifdef PRA_DEBUG
	g_pclsLogPra->DEBUG("Send message");
	clsResp.Print(g_pclsLogPra, LV_DEBUG, true);
	#endif

	return;
}
Example #7
0
void CCommandPra::CmdAppInit(CProtocol& a_clsRecvP, CProcessManager& a_clsPM)
{
	CConfigPra& clsCfg = CConfigPra::Instance();
	CAppQueue& clsQ = CAppQueue::Instance();
	
	CCmdAppInit clsInit;				// Request body parsing
	CCmdAppInit::ST_RESPONSE stResponse;
	string strBody;
	bool bIsError = false;
			
	CCmdAppCtl clsCtl;					// APP에 보낼 body 메세지
	CProtocol clsSendP;					// APP에 보낼 message


	if (a_clsRecvP.IsFlagRequest() == false) {
		strBody = clsInit.ErrorGen(1, "CMD 'APP_INIT', not set request flag");
		bIsError = true;
		goto JumpSend;
	}

	if (clsInit.RequestParse(a_clsRecvP.GetPayload().c_str()) == false) {
		strBody = clsInit.ErrorGen(1, "CMD 'APP_INIT', invalied body format");
		bIsError = true;
		goto JumpSend;
	}
	
	// 프로세스 보낼 메세지 구성
	clsCtl.m_strAction = "INIT";
	clsSendP.SetCommand(CMD_APP_CTL);
	clsSendP.SetFlagNotify();
	clsSendP.SetSource(clsCfg.m_nNodeNo, clsCfg.m_nProcNo);
	clsSendP.SetSequence();
	clsSendP.SetPayload(clsCtl.RequestGen());

	if (clsInit.m_bIsAll) {
		// 전체 프로세스 init 요청
		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);
			
			stResponse.m_nProcNo = vecInfo[i].m_nProcNo;
			stResponse.m_strProcName = vecInfo[i].m_strProcName;
			stResponse.m_bSuccess = true;
			
			if (clsQ.SendCmd(clsSendP, vecInfo[i].m_strProcName.c_str()) == false) {
				g_pclsLogPra->ERROR("APP init send failed");
				stResponse.m_bSuccess = false;
			}
			
			clsInit.m_lstResponse.push_back(stResponse);
		}

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

			clsInit.m_lstResponse.push_back(stResponse);
		}
	}
	strBody = clsInit.ResponseGen();

JumpSend:
	CProtocol clsResp;
	clsResp.SetResponse(a_clsRecvP);
	if (bIsError) {
		clsResp.SetFlagError();
	}
	clsResp.SetPayload(strBody);

	if (CModuleIPC::Instance().SendMesg(clsResp) == false) {
		g_pclsLogPra->ERROR("CMD, send message failed, %s", 
								CModuleIPC::Instance().m_strErrorMsg.c_str());
		clsResp.Print(g_pclsLogPra, LV_ERROR, true);
	}

	#ifdef PRA_DEBUG
	g_pclsLogPra->DEBUG("Send message");
	clsResp.Print(g_pclsLogPra, LV_DEBUG, true);
	#endif
	
	return;
}