#include "StdAfx.h" #include ".\handler_sa.h" #include "SunUpdateAgent.h" #include "UpdateServerSession.h" #include #include #include "AgentInfoParser.h" #include #include #include #include "FileUtil.h" #ifdef _NA_006662_20130423_SVNPATCH #include #endif //_NA_006662_20130423_SVNPATCH Handler_SA::Handler_SA(void) { } Handler_SA::~Handler_SA(void) { } // ¼­¹ö ÀÎÁõ VOID Handler_SA::OnHandler_MSG_SA_SERVER_AUTH_ACK( UpdateServerSession *pSession, MSG_BASE *pMsg, int nSize ) { MSG_SA_SERVER_AUTH_ACK *pRecvMsg = (MSG_SA_SERVER_AUTH_ACK*)pMsg; if( !pRecvMsg ) return; if( pRecvMsg->m_byResult == RC_AGENT_AUTH_SUCCESS ) MSGOUT("Auth Success, AgentKey = %u", pRecvMsg->m_dwAgentKey ); else MSGOUT("Auth Fail, AgentKey = %u", pRecvMsg->m_dwAgentKey ); SunUpdateAgent::Instance()->SetAgentKey( pRecvMsg->m_dwAgentKey ); } VOID Handler_SA::OnHandler_MSG_SA_SERVER_TYPE_ACK( UpdateServerSession* pSession, MSG_BASE* pMsg, int nSize ) { MSG_SA_SERVER_TYPE_ACK *pRecvMsg = (MSG_SA_SERVER_TYPE_ACK*)pMsg; if( pRecvMsg ) { MSG_SA_SERVER_AUTH_SYN msg; pSession->SendPacket( &msg, sizeof(msg) ); } } // ¼­¹ö ½ÃÀÛ VOID Handler_SA::OnHandler_MSG_SA_SERVER_EXECUTE_SYN( UpdateServerSession *pSession, MSG_BASE *pMsg, int nSize ) { MSG_SA_SERVER_EXECUTE_SYN *pRecvMsg = (MSG_SA_SERVER_EXECUTE_SYN*)pMsg; MSG_SA_SERVER_EXECUTE_ACK AckMsg; AckMsg.m_dwUserKey = pRecvMsg->m_dwUserKey; memcpy( &AckMsg.m_ServerInfo, &pRecvMsg->m_ServerInfo, sizeof(SERVER_INFO) ); // ÇØ´ç¼­¹öÀÇ °æ·Î¸¦ ã´Â´Ù. std::string strPath; if( !AgentInfoParser::Instance()->GetGameServerPath( pRecvMsg->m_ServerInfo.m_byServerType, strPath ) ) { AckMsg.m_byResult = RC_SERVER_EXECUTE_FAIL_NOT_FIND_PATH; pSession->SendPacket( &AckMsg, sizeof(AckMsg) ); return; } PROCESS_INFORMATION pi; STARTUPINFO si = {0, }; si.cb = sizeof(si); std::string directory_path = strPath.substr(0, strPath.rfind('\\')); // ¼­¹ö¸¦ ½ÇÇà½ÃŲ´Ù. if( _access( strPath.c_str(), 0 ) != -1 ) //ÆÄÀÏÀÌ Á¸ÀçÇϸé { #ifdef __20080312__SOLARAUTH_SERVER_PATCH if( CreateProcess( strPath.c_str(), NULL, NULL, NULL, TRUE, CREATE_NEW_CONSOLE, NULL, directory_path.c_str(), &si, &pi) ) { MSGOUT( "¼­¹ö½ÇÇà ¼º°ø: %s", strPath.c_str() ); AckMsg.m_byResult = RC_SERVER_EXECUTE_SUCCESS; } #else if( WinExec( strPath.c_str(), SW_SHOW ) > 31 ) //¼º°øÇϸé { MSGOUT( "¼­¹ö½ÇÇà ¼º°ø: %s", strPath.c_str() ); AckMsg.m_byResult = RC_SERVER_EXECUTE_SUCCESS; } #endif //__20080312__SOLARAUTH_SERVER_PATCH else { MSGOUT( "¼­¹ö½ÇÇà ½ÇÆÐ: %s", strPath.c_str() ); AckMsg.m_byResult = RC_SERVER_EXECUTE_FAIL; } } else { MSGOUT( "¼­¹ö½ÇÇà ½ÇÆÐ(ÆÄÀÏÀÌ ¾ø½À´Ï´Ù): %s" , strPath.c_str() ); AckMsg.m_byResult = RC_SERVER_EXECUTE_FAIL_FILE_NOT_EXITE; } // ¼­¹ö½ÃÀÛ °á°ú¸¦ ¾Ë¸°´Ù. pSession->SendPacket( &AckMsg, sizeof(AckMsg) ); } #ifdef _NA_006662_20130423_SVNPATCH // ÆÐÄ¡ ½ÇÇà VOID Handler_SA::OnHandler_MSG_SA_PATCH_EXECUTE_SYN( UpdateServerSession *pSession, MSG_BASE *pMsg, int nSize ) { DWORD patch_style = AgentInfoParser::Instance()->GetPatchStyle(); if (patch_style == AgentInfoParser::ePATCH_STYLE::PATCHSTYLE_FTP) { //±âÁ¸ÀÇ FTP¹æ½ÄÀ¸·Î ó¸® _ProcessPatchUsingUpdateTool(pSession, pMsg, nSize); } else if(patch_style == AgentInfoParser::ePATCH_STYLE::PATCHSTYLE_SVN) { //SVNÀ¸·Î ½ºÅ©¸³Æ®¸¦ °ü¸®ÇÏ´Â °æ¿ì _ProcessPatchUsingBatchFile(pSession, pMsg, nSize); } } #endif //_NA_006662_20130423_SVNPATCH VOID Handler_SA::OnHandler_MSG_SA_CHECK_LOGFILE_SYN( UpdateServerSession* pSession, MSG_BASE* pMsg, int nSize ) { MSG_SA_CHECK_LOGFILE_SYN* pRecvMsg = (MSG_SA_CHECK_LOGFILE_SYN*)pMsg; MSGOUT( "·Î±×È®ÀÎ ¿äû. Type = %d", pRecvMsg->m_ServerInfo.m_byServerType ); std::string strFile, strLog; TCHAR szTime[MAX_PATH]; WZTime::GetTime( 2, szTime, MAX_PATH ); if (pRecvMsg->m_ServerInfo.m_byServerType < ACCOUNT_DBPROXY) strFile = AgentInfoParser::Instance()->GetAuthSystemLogViewPath(); else strFile = AgentInfoParser::Instance()->GetLogViewPath(); if( pRecvMsg->m_ServerInfo.m_byServerType == AUTH_SERVER ) strFile += "\\AuthServer__Date_"; else if( pRecvMsg->m_ServerInfo.m_byServerType == AUTH_AGENT_SERVER ) strFile += "\\AuthAgent__Date_"; else if( pRecvMsg->m_ServerInfo.m_byServerType == LOGIN_FRONT_SERVER ) strFile += "\\LoginFront__Date_"; else if( pRecvMsg->m_ServerInfo.m_byServerType == ACCOUNT_DBPROXY ) strFile += "\\AccountDBProxy__Date_"; else if( pRecvMsg->m_ServerInfo.m_byServerType == MASTER_SERVER ) strFile += "\\Master__Date_"; else if( pRecvMsg->m_ServerInfo.m_byServerType == GAME_DBPROXY ) strFile += "\\DBProxy__Date_"; else if( pRecvMsg->m_ServerInfo.m_byServerType == WORLD_SERVER ) strFile += "\\World__Date_"; else if( pRecvMsg->m_ServerInfo.m_byServerType == FIELD_SERVER ) strFile += "\\Field__Date_"; else if( pRecvMsg->m_ServerInfo.m_byServerType == BATTLE_SERVER ) strFile += "\\Battle__Date_"; else if( pRecvMsg->m_ServerInfo.m_byServerType == AGENT_SERVER ) strFile += "\\Agent__Date_"; else { MSGOUT( "Áö¿øµÇÁö ¾Ê´Â ¼­¹öŸÀÔÀÇ ·Î±×¸¦ ¿äûÇÏ¿´½À´Ï´Ù. Type = %d", pRecvMsg->m_ServerInfo.m_byServerType ); } strFile += szTime; strFile += ".wzl"; MSG_SA_CHECK_LOGFILE_ACK ack; ack.m_dwUserKey = pRecvMsg->m_dwUserKey; ack.m_ServerInfo = pRecvMsg->m_ServerInfo; //ack.m_NumAllLogPage = 100; ZeroMemory( ack.m_szLogFile, MAX_FILE_BUFFER_SIZE ); if( _access( strFile.c_str(), 0 ) != -1 ) //ÆÄÀÏÀÌ Á¸ÀçÇϸé. { ack.m_byResult = RC_CHECK_LOGFILE_SUCCESS; FILE* pFile = fopen( strFile.c_str(), "r" ); if( !pFile ) { fclose( pFile ); return; } char szFile[MAX_FILE_BUFFER_SIZE]; BYTE bySize = 0; DWORD dwFileSize = 0; WORD numRead = 0; fseek( pFile, 0, SEEK_END ); dwFileSize = ftell( pFile ); //ÆÄÀÏÀÇ ÃÑ ÆäÀÌÁö ¼ö¸¦ ±¸ÇÑ´Ù. ack.m_NumAllLogPage = (dwFileSize / MAX_FILE_BUFFER_SIZE); if( !( dwFileSize%MAX_FILE_BUFFER_SIZE ) ) ack.m_NumAllLogPage--;//0ÆäÀÌÁöºÎÅÍ ½ÃÀÛ, ³ª¸ÓÁö ÆäÀÌÁö ¾ø±â ¶§¹® //À¯Àú°¡ ¿äûÇÏ´Â ÇØ´ç ÆäÀÌÁöÀÇ ÆÄÀÏÀ» Àд´Ù. fseek( pFile, MAX_FILE_BUFFER_SIZE*pRecvMsg->m_CntLogPage, SEEK_SET); numRead = fread( szFile, sizeof(char), MAX_FILE_BUFFER_SIZE, pFile ); strncpy( ack.m_szLogFile, szFile, numRead ); ack.m_szLogFile[numRead-1] = 0; ack.m_wFileSize = numRead; /* while( !feof(pFile) ) { ZeroMemory( szFile, 200 ); fgets( szFile, 200 - 1, pFile ); strLog += szFile; } if( strLog.size() >= MAX_FILE_BUFFER_SIZE ) { //µÚ¿¡¼­ºÎÅÍ MAX_FILE_BUFFER_SIZE¸¸Å« µÚºÎÅÍ º¸³½´Ù. std::string strLogEx = strLog.substr( strLog.size() - MAX_FILE_BUFFER_SIZE ); strncpy( ack.m_szLogFile, strLogEx.c_str(), MAX_FILE_BUFFER_SIZE ); ack.m_szLogFile[MAX_FILE_BUFFER_SIZE-1] = 0; ack.m_wFileSize = MAX_FILE_BUFFER_SIZE; } else { //Àüü¸¦ º¸³½´Ù. strncpy( ack.m_szLogFile, strLog.c_str(), MAX_FILE_BUFFER_SIZE ); ack.m_szLogFile[strLog.size()-1] = 0; ack.m_wFileSize = (WORD)strLog.size(); } */ fclose( pFile ); } else { ack.m_byResult = RC_CHECK_LOGFILE_NOT_FOUND; ack.m_wFileSize = 0; } pSession->SendPacket( &ack, ack.GetSize() ); } VOID Handler_SA::OnHandler_MSG_SA_SERVER_FORCE_DISCONNECT_SYN( UpdateServerSession* pSession, MSG_BASE* pMsg, int nSize ) { MSG_SA_SERVER_FORCE_DISCONNECT_SYN* pRecvMsg = (MSG_SA_SERVER_FORCE_DISCONNECT_SYN*)pMsg; std::string strProcess; AgentInfoParser::Instance()->GetGameProcessName( pRecvMsg->m_ServerInfo.m_byServerType, strProcess ); DWORD dwPreGameServerProcID = 0; DWORD dwProID = 0; BOOL bRet = CheckLiveProcess( (TCHAR*)strProcess.c_str(), dwProID, dwPreGameServerProcID ); MSG_SA_SERVER_FORCE_DISCONNECT_ACK Ack; Ack.m_dwUserKey = pRecvMsg->m_dwUserKey; Ack.m_ServerInfo = pRecvMsg->m_ServerInfo; if( dwProID ) //Á¸ÀçÇϸé.. ÇöÀç ½ÇÁ¦ ½ÇÇàµÇ°í ÀÖ´Â ÇÁ·Î¼¼¼­ÀÌ´Ù. { if( ServerForceShutDown( dwProID ) ) { MSGOUT("°­Á¦¼­¹öÁ¾·á ¼º°ø: Name = %s", strProcess.c_str() ); Ack.m_byResult = RC_SERVER_FORCE_DISCONNECT_SUCCESS; // cmd.exe â Á¾·á½Ã۱â.. "cmd.exe" ==> ÇÁ·Î¼¼½º ¸í BYTE byCount = 0; while( byCount < 10 ) { DWORD dwCmdID = 0; BOOL bRet = CheckLiveProcess( "cmd.exe", dwCmdID, 0 ); if( dwCmdID ) ServerForceShutDown( dwCmdID ); else break; } } else { MSGOUT("°­Á¦¼­¹öÁ¾·á ½ÇÆÐ: Name = %s", strProcess.c_str() ); Ack.m_byResult = RC_SERVER_FORCE_DISCONNECT_FAIL; } } else { MSGOUT("°­Á¦¼­¹öÁ¾·á ½ÇÆÐ: ÇöÀç %s ¼­¹ö°¡ ½ÇÇàÁßÀÌÁö ¾Ê½À´Ï´Ù.", strProcess.c_str() ); Ack.m_byResult = RC_SERVER_FORCE_DISCONNECT_FAIL_SERVER_OFFLINE; } pSession->SendPacket( &Ack, sizeof(Ack) ); } VOID Handler_SA::OnHandler_MSG_SA_SERVER_BACKUP_SYN( UpdateServerSession* pSession, MSG_BASE* pMsg, int nSize ) { MSG_SA_SERVER_BACKUP_SYN* pRecvMsg = (MSG_SA_SERVER_BACKUP_SYN*)pMsg; std::string strDataFolder, strBackupFolder, strOriginal; MSG_SA_SERVER_BACKUP_ACK ack; ack.m_dwUserKey = pRecvMsg->m_dwUserKey; ack.m_ServerInfo = pRecvMsg->m_ServerInfo; if( pRecvMsg->m_ServerInfo.m_byServerType != SUN_SERVER ) { ack.m_byResult = RC_SERVER_BACKUP_FAIL; SunUpdateAgent::Instance()->SendToUpdateServer( &ack, sizeof(ack) ); return; } else { strOriginal = AgentInfoParser::Instance()->GetBasicServerPath(); strOriginal += "\\SunServer\\"; strDataFolder = strOriginal; strDataFolder += "data"; strBackupFolder = strOriginal; strBackupFolder += "backup"; } if( !FileUtil::CopyFoler( strDataFolder.c_str(), strBackupFolder.c_str() ) ) ack.m_byResult = RC_SERVER_BACKUP_FAIL; else ack.m_byResult = RC_SERVER_BACKUP_SUCCESS; SunUpdateAgent::Instance()->SendToUpdateServer( &ack, sizeof(ack) ); } VOID Handler_SA::OnHandler_MSG_SA_SERVER_RESTORE_SYN( UpdateServerSession* pSession, MSG_BASE* pMsg, int nSize ) { MSG_SA_SERVER_RESTORE_SYN* pRecvMsg = (MSG_SA_SERVER_RESTORE_SYN*)pMsg; MSG_SA_SERVER_RESTORE_ACK ack; ack.m_dwUserKey = pRecvMsg->m_dwUserKey; ack.m_ServerInfo = pRecvMsg->m_ServerInfo; std::string strDataFolder, strBackupFolder, strOriginal; if( pRecvMsg->m_ServerInfo.m_byServerType != SUN_SERVER ) { ack.m_byResult = RC_SERVER_BACKUP_FAIL; SunUpdateAgent::Instance()->SendToUpdateServer( &ack, sizeof(ack) ); return; } else { strOriginal = AgentInfoParser::Instance()->GetBasicServerPath(); strOriginal += "\\SunServer\\"; strDataFolder = strOriginal; strBackupFolder = strOriginal; strBackupFolder += "backup\\data"; } if( !FileUtil::CopyFoler( strBackupFolder.c_str(), strDataFolder.c_str() ) ) ack.m_byResult = RC_SERVER_RESTORE_FAIL; else ack.m_byResult = RC_SERVER_RESTORE_SUCCESS; SunUpdateAgent::Instance()->SendToUpdateServer( &ack, sizeof(ack) ); } // °øÁö»çÇ× // 2012.2.22 ±èÁøÈÖ VOID Handler_SA::OnHandler_MSG_SA_SERVER_NOTICE_SYN( UpdateServerSession* pSession, MSG_BASE* pMsg, int nSize ) { MSG_SA_SERVER_NOTICE_SYN* pRecvMsg = (MSG_SA_SERVER_NOTICE_SYN*)pMsg; if (pRecvMsg->m_ServerInfo.m_byServerType != WORLD_SERVER) return; std::string strPath = AgentInfoParser::Instance()->GetNoticePath(); strPath += "\\Notice.txt"; char szNotice[MAX_NOTICE_LEN+1]; ZeroMemory( szNotice, sizeof(szNotice) ); FILE *fp = fopen( strPath.c_str(), "rt"); if( !fp ) { // °øÁö»çÇ× ÆÄÀÏ Ã£±â ½ÇÆÐ FILE *wfp = fopen( strPath.c_str(), "wt" ); char szbuffer[MAX_NOTICE_LEN] = "¼­¹ö ÆÐÄ¡¸¦ À§ÇØ 10ÃÊ ÈÄ Ã¤³Î¼­¹ö¸¦ °­Á¦ Á¾·áÇϰڽÀ´Ï´Ù. ¾ÈÀüÇÑ °÷À¸·Î À̵¿ÇÏ¿© Á¾·áÇØ ÁֽʽÿÀ."; fwrite( szbuffer, sizeof(char), sizeof(szbuffer) , wfp ); memcpy( szNotice, szbuffer, sizeof(szbuffer) ); fclose( wfp ); } else { fread( szNotice, sizeof(char), MAX_NOTICE_LEN, fp ); fclose( fp ); } MSG_SA_SERVER_NOTICE_ACK Ackmsg; Ackmsg.m_dwUserKey = pRecvMsg->m_dwUserKey; Ackmsg.m_ServerInfo = pRecvMsg->m_ServerInfo; strcpy( Ackmsg.m_szNotice, szNotice ); pSession->SendPacket( &Ackmsg, sizeof(Ackmsg) ); } VOID Handler_SA::OnHandler_MSG_SA_SERVER_SEND_NOTICE_SYN( UpdateServerSession* pSession, MSG_BASE* pMsg, int nSize ) { MSG_SA_SERVER_SEND_NOTICE_SYN* pRecvMsg = (MSG_SA_SERVER_SEND_NOTICE_SYN*)pMsg; if( pRecvMsg->m_ServerInfo.m_byServerType != WORLD_SERVER ) return; std::string strPath = AgentInfoParser::Instance()->GetNoticePath(); strPath += "\\Notice.txt"; FILE *fp = fopen( strPath.c_str(), "wt"); if( fp ) { fwrite( pRecvMsg->m_szNotice, sizeof(char), strlen(pRecvMsg->m_szNotice), fp ); fclose( fp ); } MSG_SA_SERVER_SEND_NOTICE_ACK Ackmsg; Ackmsg.m_dwUserKey = pRecvMsg->m_dwUserKey; Ackmsg.m_ServerInfo = pRecvMsg->m_ServerInfo; // WorldServer.exe ã±â../////////////////////////////////////////////////////////////////////// std::string strWorldServer; AgentInfoParser::Instance()->GetGameProcessName( WORLD_SERVER, strWorldServer ); DWORD dwPreGameServerProcID = 0; DWORD dwID = 0; BOOL bRet = CheckLiveProcess( (TCHAR*)strWorldServer.c_str(), dwID, dwPreGameServerProcID); // Local¿¡¼­ WorldServer.exe°¡ ¾øÀ» ¶§.. if( !bRet ) { Ackmsg.m_bFlag = FALSE; pSession->SendPacket( &Ackmsg, sizeof(Ackmsg) ); return; } CallbackInfo st_Callback; st_Callback.m_dwPID = dwID; st_Callback.m_hWnd = NULL; EnumWindows(EnumProc, (LPARAM)&st_Callback); //////////////////////////////////////////////////////////////////////////////////////////////// // WorldServer.exeÀÇ Çڵ鰪À» ã¾Ò´Ù¸é.. if( st_Callback.m_hWnd ) { ::PostMessage( st_Callback.m_hWnd, WM_CHAR, 'n', (LPARAM)1 ); Ackmsg.m_bFlag = TRUE; } pSession->SendPacket( &Ackmsg, sizeof(Ackmsg) ); } #ifdef __20080312__SOLARAUTH_SERVER_PATCH // // default_path\data.encrypted.data -> default_path\backup\data.encrypted.China // VOID Handler_SA::OnHandler_MSG_SA_SOLARSCRIPT_BACKUP_SYN( UpdateServerSession* pSession, MSG_BASE* pMsg, int nSize ) { MSG_SA_SOLARSCRIPT_BACKUP_SYN *pRecvMsg = (MSG_SA_SOLARSCRIPT_BACKUP_SYN *)pMsg; MSG_SA_SOLARSCRIPT_BACKUP_ACK ack; ack.m_dwUserKey = pRecvMsg->m_dwUserKey; ack.m_ServerInfo = pRecvMsg->m_ServerInfo; ack.m_ScriptFolder = pRecvMsg->m_ScriptFolder; std::string strDefault( AgentInfoParser::Instance()->GetSCFolderPath()) , strToFolder , strFromFolder; if( pRecvMsg->m_ServerInfo.m_byServerType != SOLARAUTH_SERVER ) { ack.m_byResult = RC_SERVER_SCFOLDER_BACKUP_FAIL; SunUpdateAgent::Instance()->SendToUpdateServer( &ack, sizeof(ack) ); return; } else { strToFolder = strDefault + "\\backup\\"; strFromFolder = strDefault + "\\" + pRecvMsg->m_ScriptFolder.m_szName ; } if( !FileUtil::CopyFoler( strFromFolder.c_str(), strToFolder.c_str() ) ) ack.m_byResult = RC_SERVER_SCFOLDER_BACKUP_FILECOPY_FAIL; else ack.m_byResult = RC_SERVER_SCFOLDER_BACKUP_SUCCESS; SunUpdateAgent::Instance()->SendToUpdateServer( &ack, sizeof(ack) ); } // // default_patch\backup\data.encrypted.China - > default_path\data.encrypted.data // VOID Handler_SA::OnHandler_MSG_SA_SOLARSCRIPT_RESTORE_SYN( UpdateServerSession* pSession, MSG_BASE* pMsg, int nSize ) { MSG_SA_SOLARSCRIPT_RESTORE_SYN *pRecvMsg = (MSG_SA_SOLARSCRIPT_RESTORE_SYN *)pMsg; MSG_SA_SOLARSCRIPT_RESTORE_ACK ack; ack.m_dwUserKey = pRecvMsg->m_dwUserKey; ack.m_ServerInfo = pRecvMsg->m_ServerInfo; ack.m_ScriptFolder = pRecvMsg->m_ScriptFolder; std::string strDefault( AgentInfoParser::Instance()->GetSCFolderPath()) , strToFolder , strFromFolder; if( pRecvMsg->m_ServerInfo.m_byServerType != SOLARAUTH_SERVER ) { ack.m_byResult = RC_SERVER_SCFOLDER_RESTORE_FAIL; SunUpdateAgent::Instance()->SendToUpdateServer( &ack, sizeof(ack) ); return; } else { strToFolder = strDefault; strFromFolder = strDefault + "\\backup\\" + pRecvMsg->m_ScriptFolder.m_szName ; } if( !FileUtil::CopyFoler( strFromFolder.c_str(), strToFolder.c_str() ) ) ack.m_byResult = RC_SERVER_SCFOLDER_RESTORE_FAIL; else ack.m_byResult = RC_SERVER_SCFOLDER_RESTORE_SUCCESS; SunUpdateAgent::Instance()->SendToUpdateServer( &ack, sizeof(ack) ); } // // execute AutoPatchTool // VOID Handler_SA::OnHandler_MSG_SA_SOLARSCRIPT_EXECUTE_SYN( UpdateServerSession* pSession, MSG_BASE* pMsg, int nSize ) { MSG_SA_SOLARSCRIPT_EXECUTE_SYN *pRecvMsg = (MSG_SA_SOLARSCRIPT_EXECUTE_SYN *)pMsg; MSG_SA_SOLARSCRIPT_EXECUTE_ACK ack; ack.m_dwUserKey = pRecvMsg->m_dwUserKey; ack.m_ServerInfo = pRecvMsg->m_ServerInfo; ack.m_ScriptFolder = pRecvMsg->m_ScriptFolder; DWORD dwProcID = 0; if( CheckLiveProcess( "SunAutoUpdateTool.exe", dwProcID) || CheckLiveProcess( "SunAutoUpdateTool_d.exe", dwProcID) ) { ack.m_byResult = RC_SERVER_PATCH_EXECUTE_FAIL_UPDATETOOL_RUNNING; MSGOUT( "¾÷µ¥ÀÌÆ®ÅøÀÌ ½ÇÇàÁßÀÔ´Ï´Ù." ); pSession->SendPacket( &ack, sizeof(ack) ); return; } // Åø ½ÇÇà. TCHAR pszPath[MAX_PATH]; std::string strPath = AgentInfoParser::Instance()->GetToolPath(); _snprintf( pszPath, MAX_PATH, "%s <%d> <%d> <%d> <%d>", strPath.c_str(), 0, 0, pRecvMsg->m_ServerInfo.m_byServerType, pRecvMsg->m_dwUserKey ); if( _access( strPath.c_str(), 0 ) != -1 ) { if( WinExec( pszPath, SW_SHOW ) > 31 ) { ack.m_byResult = RC_SERVER_PATCH_EXECUTE_SUCCESS; MSGOUT( "¾÷µ¥ÀÌÆ®Åø ½ÇÇà ¼º°ø" ); } else { ack.m_byResult = RC_SERVER_PATCH_EXECUTE_FAIL; MSGOUT( "¾÷µ¥ÀÌÆ®Åø ½ÇÇà ½ÇÆÐ. °æ·Î = %s", pszPath ); } } else { ack.m_byResult = RC_SERVER_PATCH_EXECUTE_FAIL_UPDATETOOL_NOT_EXIST; MSGOUT( "¾÷µ¥ÀÌÆ®ÅøÀÌ Á¸ÀçÇÏÁö ¾Ê½À´Ï´Ù. °æ·Î = %s", pszPath ); } pSession->SendPacket( &ack, sizeof(ack)); } #endif ///////////////////////////////////////////////////////////////////////////////////////////////// #ifdef _NA_006543_20130318_HEARTBEAT VOID Handler_SA::OnHandler_MSG_SA_CHECK_HEARTBEAT_ACK( UpdateServerSession* pSession, MSG_BASE* pMsg, int nSize ) { //Update Agent¿¡¼­ »ç¿ë MSG_SA_CHECK_HEARTBEAT msg; pSession->SendPacket(&msg, sizeof(msg)); //DISPMSG("Recv/Send Heartbeat\n"); } #endif ////////////////////////////////////////////////////////////////////////////////////////////////////// #ifdef _NA_006662_20130423_SVNPATCH VOID Handler_SA::_ProcessPatchUsingUpdateTool(UpdateServerSession *pSession, MSG_BASE *pMsg, int nSize) { MSG_SA_PATCH_EXECUTE_SYN *pRecvMsg = (MSG_SA_PATCH_EXECUTE_SYN*)pMsg; MSG_SA_PATCH_EXECUTE_ACK AckMsg; AckMsg.m_dwUserKey = pRecvMsg->m_dwUserKey; memcpy( &AckMsg.m_ServerInfo, &pRecvMsg->m_ServerInfo, sizeof(SERVER_INFO) ); DWORD dwProcID = 0; //ÆÐġŸÀÌ »ì¾Æ ÀÖÀ¸¸é.. if( CheckLiveProcess( "SunAutoUpdateTool.exe", dwProcID ) || CheckLiveProcess( "SunAutoUpdateTool_d.exe", dwProcID ) ) { AckMsg.m_byResult = RC_SERVER_PATCH_EXECUTE_FAIL_UPDATETOOL_RUNNING; MSGOUT( "¾÷µ¥ÀÌÆ®ÅøÀÌ ½ÇÇàÁßÀÔ´Ï´Ù." ); pSession->SendPacket( &AckMsg, sizeof(AckMsg) ); return; } // ¾÷µ¥ÀÌÆ® ÅøÀ» ½ÇÇà½ÃŲ´Ù. TCHAR pszPath[MAX_PATH]; std::string strPath = AgentInfoParser::Instance()->GetToolPath(); _snprintf( pszPath, MAX_PATH, "%s <%d> <%d> <%d> <%d>", strPath.c_str(), pRecvMsg->m_ServerInfo.m_byWorld, pRecvMsg->m_ServerInfo.m_byChannel, pRecvMsg->m_ServerInfo.m_byServerType, pRecvMsg->m_dwUserKey ); if( _access( strPath.c_str(), 0 ) != -1 ) //ÆÄÀÏÀÌ Á¸ÀçÇϸé.. { #ifdef __20080312__SOLARAUTH_SERVER_PATCH PROCESS_INFORMATION pi; STARTUPINFO si = {0, }; si.cb = sizeof(si); std::string directory_path = strPath.substr(0, strPath.rfind('\\')); if( CreateProcess( NULL, pszPath, NULL, NULL, TRUE, CREATE_NEW_CONSOLE, NULL, directory_path.c_str(), &si, &pi) ) { MSGOUT( "¼­¹ö½ÇÇà ¼º°ø: %s", strPath.c_str() ); AckMsg.m_byResult = RC_SERVER_PATCH_EXECUTE_SUCCESS; } #else if( WinExec( strPath.c_str(), SW_SHOW ) > 31 ) //¼º°øÇϸé { MSGOUT( "¼­¹ö½ÇÇà ¼º°ø: %s", strPath.c_str() ); AckMsg.m_byResult = RC_SERVER_PATCH_EXECUTE_SUCCESS; } #endif //__20080312__SOLARAUTH_SERVER_PATCH else { AckMsg.m_byResult = RC_SERVER_PATCH_EXECUTE_FAIL; MSGOUT( "¾÷µ¥ÀÌÆ®Åø ½ÇÇà ½ÇÆÐ. °æ·Î = %s", pszPath ); } } else //ÆÄÀÏÀÌ Á¸ÀçÇÏÁö ¾ÊÀ¸¸é.. { AckMsg.m_byResult = RC_SERVER_PATCH_EXECUTE_FAIL_UPDATETOOL_NOT_EXIST; MSGOUT( "¾÷µ¥ÀÌÆ®ÅøÀÌ Á¸ÀçÇÏÁö ¾Ê½À´Ï´Ù. °æ·Î = %s", pszPath ); } //ÆÐÄ¡ ½ÃÀÛ°á°ú¿¡ ´ëÇØ ¾Ë¸°´Ù. pSession->SendPacket( &AckMsg, sizeof(AckMsg) ); } //---------------------------------------------------------------------------------------------------------- VOID Handler_SA::_ProcessPatchUsingBatchFile(UpdateServerSession *pSession, MSG_BASE *pMsg, int nSize) { MSG_SA_PATCH_EXECUTE_SYN *pRecvMsg = (MSG_SA_PATCH_EXECUTE_SYN*)pMsg; MSG_SA_PATCH_EXECUTE_ACK AckMsg; AckMsg.m_dwUserKey = pRecvMsg->m_dwUserKey; memcpy( &AckMsg.m_ServerInfo, &pRecvMsg->m_ServerInfo, sizeof(SERVER_INFO) ); DWORD dwProcID = 0; //ÆÐġŸÀÌ »ì¾Æ ÀÖÀ¸¸é.. if( CheckLiveProcess( "py.exe", dwProcID ) ) { AckMsg.m_byResult = RC_SERVER_PATCH_EXECUTE_FAIL_UPDATETOOL_RUNNING; MSGOUT( "¾÷µ¥ÀÌÆ®ÅøÀÌ ½ÇÇàÁßÀÔ´Ï´Ù." ); pSession->SendPacket( &AckMsg, sizeof(AckMsg) ); return; } // ¹èÄ¡ÆÄÀÏÀ» ½ÇÇà½ÃŲ´Ù. TCHAR pszPath[MAX_PATH]; std::string strPath = AgentInfoParser::Instance()->GetToolPath(); _snprintf( pszPath, MAX_PATH, "%s <%d> <%d> <%d> <%d>", strPath.c_str(), pRecvMsg->m_ServerInfo.m_byWorld, pRecvMsg->m_ServerInfo.m_byChannel, pRecvMsg->m_ServerInfo.m_byServerType, pRecvMsg->m_dwUserKey ); if( _access( strPath.c_str(), 0 ) != -1 ) //ÆÄÀÏÀÌ Á¸ÀçÇϸé.. { if(ShellExecute(NULL,"open", strPath.c_str(), NULL, NULL, SW_SHOW)) { MSGOUT( "batÆÄÀÏ ½ÇÇà ¼º°ø: %s", strPath.c_str() ); AckMsg.m_byResult = RC_SERVER_PATCH_EXECUTE_SUCCESS; SunUpdateAgent::Instance()->SetPatchingSVNmode(TRUE); SunUpdateAgent::Instance()->SetPatchingUserKey(pRecvMsg->m_dwUserKey); } else { AckMsg.m_byResult = RC_SERVER_PATCH_EXECUTE_FAIL; MSGOUT( "batÆÄÀÏ ½ÇÇà ½ÇÆÐ. °æ·Î = %s", pszPath ); } } else //ÆÄÀÏÀÌ Á¸ÀçÇÏÁö ¾ÊÀ¸¸é.. { AckMsg.m_byResult = RC_SERVER_PATCH_EXECUTE_FAIL_UPDATETOOL_NOT_EXIST; MSGOUT( "batfileÀÌ Á¸ÀçÇÏÁö ¾Ê½À´Ï´Ù. °æ·Î = %s", pszPath ); } //ÆÐÄ¡ ½ÃÀÛ°á°ú¿¡ ´ëÇØ ¾Ë¸°´Ù. pSession->SendPacket( &AckMsg, sizeof(AckMsg) ); #ifdef _NA_006662_20130423_SVNPATCH #else MSG_SA_PATCH_RESULT_NTF msg; msg.m_dwResult = MSG_MO_RTTG_PATCHRESULT_ANS::ERROR_PATCHSUCCESS; msg.m_dwUserKey = pRecvMsg->m_dwUserKey; msg.m_byNum = 0; msg.m_byServerType = SUN_SERVER; msg.m_PatchVer.m_byVer1 = 0; msg.m_PatchVer.m_byVer2 = 0; msg.m_PatchVer.m_byVer3 = 0; SunUpdateAgent::Instance()->SendToUpdateServer( &msg, sizeof(msg) ); #endif //_NA_006662_20130423_SVNPATCH } #else //_NA_006662_20130423_SVNPATCH---------------------------------------------------------------------- // ÆÐÄ¡ ½ÇÇà VOID Handler_SA::OnHandler_MSG_SA_PATCH_EXECUTE_SYN( UpdateServerSession *pSession, MSG_BASE *pMsg, int nSize ) { MSG_SA_PATCH_EXECUTE_SYN *pRecvMsg = (MSG_SA_PATCH_EXECUTE_SYN*)pMsg; MSG_SA_PATCH_EXECUTE_ACK AckMsg; AckMsg.m_dwUserKey = pRecvMsg->m_dwUserKey; memcpy( &AckMsg.m_ServerInfo, &pRecvMsg->m_ServerInfo, sizeof(SERVER_INFO) ); DWORD dwProcID = 0; //ÆÐġŸÀÌ »ì¾Æ ÀÖÀ¸¸é.. if( CheckLiveProcess( "SunAutoUpdateTool.exe", dwProcID ) || CheckLiveProcess( "SunAutoUpdateTool_d.exe", dwProcID ) ) { AckMsg.m_byResult = RC_SERVER_PATCH_EXECUTE_FAIL_UPDATETOOL_RUNNING; MSGOUT( "¾÷µ¥ÀÌÆ®ÅøÀÌ ½ÇÇàÁßÀÔ´Ï´Ù." ); pSession->SendPacket( &AckMsg, sizeof(AckMsg) ); return; } // ¾÷µ¥ÀÌÆ® ÅøÀ» ½ÇÇà½ÃŲ´Ù. TCHAR pszPath[MAX_PATH]; std::string strPath = AgentInfoParser::Instance()->GetToolPath(); _snprintf( pszPath, MAX_PATH, "%s <%d> <%d> <%d> <%d>", strPath.c_str(), pRecvMsg->m_ServerInfo.m_byWorld, pRecvMsg->m_ServerInfo.m_byChannel, pRecvMsg->m_ServerInfo.m_byServerType, pRecvMsg->m_dwUserKey ); if( _access( strPath.c_str(), 0 ) != -1 ) //ÆÄÀÏÀÌ Á¸ÀçÇϸé.. { #ifdef __20080312__SOLARAUTH_SERVER_PATCH PROCESS_INFORMATION pi; STARTUPINFO si = {0, }; si.cb = sizeof(si); std::string directory_path = strPath.substr(0, strPath.rfind('\\')); if( CreateProcess( NULL, pszPath, NULL, NULL, TRUE, CREATE_NEW_CONSOLE, NULL, directory_path.c_str(), &si, &pi) ) { MSGOUT( "¼­¹ö½ÇÇà ¼º°ø: %s", strPath.c_str() ); AckMsg.m_byResult = RC_SERVER_PATCH_EXECUTE_SUCCESS; } #else if( WinExec( strPath.c_str(), SW_SHOW ) > 31 ) //¼º°øÇϸé { MSGOUT( "¼­¹ö½ÇÇà ¼º°ø: %s", strPath.c_str() ); AckMsg.m_byResult = RC_SERVER_PATCH_EXECUTE_SUCCESS; } #endif //__20080312__SOLARAUTH_SERVER_PATCH else { AckMsg.m_byResult = RC_SERVER_PATCH_EXECUTE_FAIL; MSGOUT( "¾÷µ¥ÀÌÆ®Åø ½ÇÇà ½ÇÆÐ. °æ·Î = %s", pszPath ); } } else //ÆÄÀÏÀÌ Á¸ÀçÇÏÁö ¾ÊÀ¸¸é.. { AckMsg.m_byResult = RC_SERVER_PATCH_EXECUTE_FAIL_UPDATETOOL_NOT_EXIST; MSGOUT( "¾÷µ¥ÀÌÆ®ÅøÀÌ Á¸ÀçÇÏÁö ¾Ê½À´Ï´Ù. °æ·Î = %s", pszPath ); } //ÆÐÄ¡ ½ÃÀÛ°á°ú¿¡ ´ëÇØ ¾Ë¸°´Ù. pSession->SendPacket( &AckMsg, sizeof(AckMsg) ); } #endif //_NA_006662_20130423_SVNPATCH