mod_healthmanager.h 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353
  1. #ifndef __MOD_HEALTHMANAGER_H
  2. #define __MOD_HEALTHMANAGER_H
  3. #include <map>
  4. #include "SpBase.h"
  5. #if defined(RVC_OS_LINUX)
  6. #include "modVer.h"
  7. #include "SpTest.h"
  8. #endif
  9. #include "HealthManagerFSM.h"
  10. #include "EventCode.h"
  11. #include "HealthManager_server_g.h"
  12. using namespace HealthManager;
  13. #include "UpgradeManager_client_g.h"
  14. using namespace std;
  15. using namespace UpgradeManager;
  16. #include "GuardianBase.h"
  17. typedef ErrorCodeEnum (*pfShakeHands)(WorkStateEnum &eState);
  18. typedef ErrorCodeEnum (*pfPushUpdateTask)(const char *pszPackName);
  19. typedef bool (*pfIsInstalling)();
  20. typedef ErrorCodeEnum (*pfUpgradeRestart)(const DWORD dwParam1,const DWORD dwParam2);
  21. typedef ErrorCodeEnum (*pfFrameworkQuit)(RebootTriggerEnum eReason);
  22. #define DEPLOYSTATE_NOTINIT 0
  23. #define DEPLOYSTATE_DONE 1
  24. #define DEPLOYSTATE_FAILED 2
  25. enum ModuleReMode
  26. {
  27. RESTART_MODE_DEFAULT,
  28. RESTART_MODE_LOW,
  29. RESTART_MODE_HIGH,
  30. };
  31. enum DealType
  32. {
  33. Deal_Start = 1,
  34. Deal_Close,
  35. Deal_Pause,
  36. Deal_Continue,
  37. Deal_Kill,
  38. Deal_Test,
  39. Deal_Restart
  40. };
  41. struct ModuleRunInfo
  42. {
  43. DWORD dwStart;
  44. int count;
  45. };
  46. struct RestartModeInfo
  47. {
  48. DWORD dwTimes;
  49. DWORD dwInternal;
  50. };
  51. #define MACSESION 6
  52. #include <winpr/sysinfo.h>
  53. static void GetLocalTimeRVC(SYSTEMTIME& stTime)
  54. {
  55. GetLocalTime(&stTime);
  56. }
  57. class HealthManagerSession : public HealthManagerService_ServerSessionBase
  58. {
  59. public:
  60. HealthManagerSession(CHealthManagerEntity *pEntity):m_pEntity(pEntity){}
  61. virtual ~HealthManagerSession(){}
  62. virtual void Handle_EnterState(SpReqAnsContext<HealthManagerService_EnterState_Req, HealthManagerService_EnterState_Ans>::Pointer ctx);
  63. virtual void Handle_ExitState(SpReqAnsContext<HealthManagerService_ExitState_Req, HealthManagerService_ExitState_Ans>::Pointer ctx);
  64. virtual void Handle_DoEvent(SpReqAnsContext<HealthManagerService_DoEvent_Req, HealthManagerService_DoEvent_Ans>::Pointer ctx);
  65. virtual void Handle_GetEntityCfgInfo(SpReqAnsContext<HealthManagerService_GetEntityCfgInfo_Req, HealthManagerService_GetEntityCfgInfo_Ans>::Pointer ctx);
  66. virtual void Handle_GetNetworkState(SpReqAnsContext<HealthManagerService_GetNetworkState_Req, HealthManagerService_GetNetworkState_Ans>::Pointer ctx);
  67. virtual void Handle_QueryHardwareInfo(SpReqAnsContext<HealthManagerService_QueryHardwareInfo_Req, HealthManagerService_QueryHardwareInfo_Ans>::Pointer ctx);
  68. virtual void Handle_ReadCenterConfigStr(SpReqAnsContext<HealthManagerService_ReadCenterConfigStr_Req, HealthManagerService_ReadCenterConfigStr_Ans>::Pointer ctx);
  69. virtual void Handle_GetAuthErrMsg(SpReqAnsContext<HealthManagerService_GetAuthErrMsg_Req, HealthManagerService_GetAuthErrMsg_Ans>::Pointer ctx);
  70. virtual void Handle_ControlTerminalLife(SpReqAnsContext<HealthManagerService_ControlTerminalLife_Req, HealthManagerService_ControlTerminalLife_Ans>::Pointer ctx);
  71. virtual void Handle_DeployTerminal(SpReqAnsContext<HealthManagerService_DeployTerminal_Req, HealthManagerService_DeployTerminal_Ans>::Pointer ctx);
  72. virtual void Handle_ControlEntityLife(SpReqAnsContext<HealthManagerService_ControlEntityLife_Req, HealthManagerService_ControlEntityLife_Ans>::Pointer ctx);
  73. virtual void Handle_Gateway(SpReqAnsContext<HealthManagerService_Gateway_Req, HealthManagerService_Gateway_Ans>::Pointer ctx);
  74. private:
  75. CHealthManagerEntity *m_pEntity;
  76. };
  77. class CHealthManagerEntity : public CEntityBase, public ILogListener, public IEntityStateListener, public ISysVarListener, public IBroadcastListener,public ITimerListener
  78. {
  79. public:
  80. CHealthManagerEntity() :m_bInit(true)
  81. , xxx(0), m_MCStart(0), m_bWaitRestartPC(false)
  82. , m_bScreenLock(false), m_bToRestart(false)
  83. , m_bSayIdle(false), m_bGuardianRun(false), m_guardianCount(1), m_pUpgMgr(NULL)
  84. , m_bVerRollback(false), m_eRebootTrigger(RebootTrigger_Resource), m_eRebootWay(RebootWay_Unknown)
  85. , m_menuChoice(""), m_menuPre(""), m_netState("N"), m_bBrowserIdleFirst(true)
  86. , m_bNeedToRestartPAD(false), m_preDay(99), m_bInMainPage(false), m_maxRunDays(7)
  87. , m_bEnterMainPageEver(false), m_connectStatus(0), m_bHaveThrowMainPage(false)
  88. ,m_bNeedAuthRetry(false), m_bNeedGuardianRestart(true), m_bNeedGuardian(true)
  89. ,m_worktimeStart(9),m_worktimeEnd(17), m_bToRestartByCenterSetting(false), m_fConfigMode(false){}
  90. virtual ~CHealthManagerEntity() {}
  91. virtual const char *GetEntityName() const { return "HealthManager"; }
  92. const char* GetEntityVersion() const { return MODULE_VERSION_FULL; }
  93. virtual void OnPreStart(CAutoArray<CSimpleStringA> strArgs,CSmartPointer<ITransactionContext> pTransactionContext)
  94. {
  95. int curStep(0);
  96. #if defined(RVC_OS_LINUX)
  97. bool isNeedConfig = IsLackOfConfig(curStep);
  98. if (isNeedConfig) {
  99. if (curStep == -1) { /** 无root.ini [Gifur@2022422]*/
  100. CSimpleStringA strNow(true);
  101. RecordInstallBeginTimeStamp(strNow);
  102. }
  103. m_fsm.SetConfigMode(true);
  104. }
  105. #else
  106. bool isNeedConfig(false);
  107. #endif
  108. ErrorCodeEnum eErrCode = m_fsm.Init(this);
  109. if (eErrCode == Error_Succeed && !isNeedConfig) {
  110. DoRestart();
  111. }
  112. GetFunction()->SubscribeLog(m_uuidUpdate,this,Log_Event,Severity_Middle,Error_IgnoreAll,-1,"UpgradeManager");
  113. GetFunction()->SubscribeLog(m_uuidAccessAuth,this,Log_Event,Severity_Middle,Error_IgnoreAll,-1,"AccessAuthorization");
  114. GetFunction()->SubscribeLog(m_uuidAccessAuth,this,Log_Error,Severity_Middle,Error_IgnoreAll,-1,"AccessAuthorization");
  115. GetFunction()->SubscribeLog(m_uuidFaceTracking,this,Log_Error,Severity_High,Error_IgnoreAll,-1,"FaceTracking");
  116. GetFunction()->SubscribeLog(m_uuidMediaController,this,Log_Error,Severity_High,Error_IgnoreAll,-1,"MediaController");
  117. GetFunction()->SubscribeLog(m_uuidSelfChecker,this,Log_Event,Severity_Middle,Error_IgnoreAll,-1,"SelfChecker");
  118. GetFunction()->SubscribeLog(m_uuidRemoteController,this,Log_Event,Severity_Middle,Error_IgnoreAll,-1,"RemoteController");
  119. GetFunction()->SubscribeLog(m_uuidGUIConsole,this,Log_Event,Severity_Middle,Error_IgnoreAll,-1,"GUIConsole");
  120. GetFunction()->SubscribeLog(m_uuidHeartBeat,this,Log_Event,Severity_Middle,Error_IgnoreAll,-1,"HeartBeat",false);
  121. GetFunction()->SubscribeLog(m_uuidCenterS, this, Log_Event, Severity_Middle, Error_IgnoreAll, -1, "CenterSetting");
  122. GetFunction()->SubscribeLog(m_uuidPublic, this, Log_Event, Severity_Middle, Error_IgnoreAll, -1, "Chromium");
  123. eErrCode = GetFunction()->SubscribeLog(m_uuidVtmLoader, this, Log_Event, Severity_Middle, Error_IgnoreAll, -1, "VtmLoader");
  124. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("SubscribeLog VtmLoader eErrCode:%d", eErrCode);
  125. GetFunction()->RegistSysVarEvent("UIState", this);
  126. CSmartPointer<IEntityFunction> pFunc = GetFunction();
  127. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  128. eErrCode = pFuncPrivilege->RegistEntityStateEvent(NULL, this);
  129. if (eErrCode != Error_Succeed)
  130. {
  131. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("RegistEntityState failed(%d).", eErrCode);
  132. pTransactionContext->SendAnswer(eErrCode);
  133. return;
  134. }
  135. //UpgradeManager
  136. #if defined(RVC_OS_WIN)
  137. GetFunction()->SubscribeLog(m_uuidCardSwiper, this, Log_Event, Severity_Middle, Error_IgnoreAll, -1, "CardSwiper");
  138. GetFunction()->SubscribeLog(m_uuidPublic, this, Log_Event, Severity_Middle, Error_IgnoreAll, -1, "PinPad");
  139. GetFunction()->SubscribeLog(m_uuidCardSwiper, this, Log_Error, Severity_Middle, Error_IgnoreAll, -1, "CardSwiper");
  140. GetFunction()->SubscribeBroadcast("CardSwiper", "", this, m_uuidCardSwiper);
  141. GetFunction()->SubscribeLog(m_uuid4SIPPhone, this, Log_Event, Severity_High, Error_IgnoreAll, -1, "SIPPhone");
  142. #endif //RVC_OS_WIN
  143. pTransactionContext->SendAnswer(eErrCode) ;
  144. }
  145. virtual void OnPreClose(EntityCloseCauseEnum eCloseCause,CSmartPointer<ITransactionContext> pTransactionContext)
  146. {
  147. pTransactionContext->SendAnswer(Error_Succeed);
  148. }
  149. virtual void OnPrePause(CSmartPointer<ITransactionContext> pTransactionContext)
  150. {
  151. pTransactionContext->SendAnswer(Error_Succeed);
  152. }
  153. virtual void OnPreContinue(CSmartPointer<ITransactionContext> pTransactionContext)
  154. {
  155. LOG_FUNCTION();
  156. pTransactionContext->SendAnswer(Error_Succeed);
  157. m_fsm.QuitFrameworkAndSaveInfo(RebootTrigger_FrameUpgrade, RebootWay_Framework);
  158. }
  159. void EnterState(SpReqAnsContext<HealthManagerService_EnterState_Req, HealthManagerService_EnterState_Ans>::Pointer ctx)
  160. {
  161. if (ctx->Req.state == "M")
  162. {
  163. FSMEvent *pEvt = new FSMEvent(USER_EVT_MAITAIN);
  164. m_fsm.PostEventFIFO(pEvt);
  165. }
  166. ctx->Answer(Error_Succeed);
  167. }
  168. void ExitState(SpReqAnsContext<HealthManagerService_ExitState_Req, HealthManagerService_ExitState_Ans>::Pointer ctx)
  169. {
  170. if (ctx->Req.state == "M")
  171. {
  172. FSMEvent *pEvt = new FSMEvent(USER_EVT_MAITAIN_FINISHED);
  173. m_fsm.PostEventFIFO(pEvt);
  174. }
  175. ctx->Answer(Error_Succeed);
  176. }
  177. void DoEvent(SpReqAnsContext<HealthManagerService_DoEvent_Req, HealthManagerService_DoEvent_Ans>::Pointer ctx)
  178. {
  179. //oiltest
  180. if (ctx->Req.code == Event_VtmLoader_EntityLoad_Finished || ctx->Req.code == Event_VtmLoader_EntityLoad_Failed)
  181. {
  182. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("receive %x", ctx->Req.code);
  183. FSMEvent* pEvt = new FSMEvent(USER_EVT_VTMLOADER_FINISHED);
  184. if (ctx->Req.code == Event_VtmLoader_EntityLoad_Finished)
  185. pEvt->param1 = 0;
  186. else
  187. pEvt->param1 = 1;
  188. m_fsm.PostEventFIFO(pEvt);
  189. }
  190. ctx->Answer(Error_Succeed);
  191. }
  192. void GetNetworkState(SpReqAnsContext<HealthManagerService_GetNetworkState_Req, HealthManagerService_GetNetworkState_Ans>::Pointer ctx)
  193. {
  194. ctx->Ans.netDeviceState = m_netState;
  195. ctx->Ans.reserved1 = m_fsm.QueryAccessAuthStatus();
  196. Dbg("current net state %s,auth state:%d", (LPCTSTR)m_netState, ctx->Ans.reserved1);
  197. ctx->Answer(Error_Succeed);
  198. }
  199. virtual CServerSessionBase *OnNewSession(const char* /*pszRemoteEntityName*/, const char * /*pszParam*/)
  200. {
  201. return new HealthManagerSession(this);
  202. }
  203. virtual bool IsService()const{return true;}
  204. virtual bool IsMultiThread()const{return true;}
  205. int SystemRestart(bool bPeriod,bool bUpsImmediately,bool bNow=false);
  206. int SystemShutdown(BOOL bReboot=FALSE);
  207. int FrameworkShutdown(bool bRestart=true);
  208. void QueryHardwareInfo(SpReqAnsContext<HealthManagerService_QueryHardwareInfo_Req, HealthManagerService_QueryHardwareInfo_Ans>::Pointer ctx)
  209. {
  210. QueryHardwareInfoTask* pTask = new QueryHardwareInfoTask(&m_fsm);
  211. pTask->ctx = ctx;
  212. GetFunction()->PostThreadPoolTask(pTask);
  213. }
  214. void ReadCenterConfigStr(SpReqAnsContext<HealthManagerService_ReadCenterConfigStr_Req, HealthManagerService_ReadCenterConfigStr_Ans>::Pointer ctx);
  215. void GetAuthErrMsg(SpReqAnsContext<HealthManagerService_GetAuthErrMsg_Req, HealthManagerService_GetAuthErrMsg_Ans>::Pointer ctx);
  216. bool StartManagerDesktopPage(CSimpleStringA pageName);
  217. void WarnAndRestartFramwork();
  218. void ControlTerminalLife(SpReqAnsContext<HealthManagerService_ControlTerminalLife_Req, HealthManagerService_ControlTerminalLife_Ans>::Pointer ctx);
  219. void ControlEntityLife(SpReqAnsContext<HealthManagerService_ControlEntityLife_Req, HealthManagerService_ControlEntityLife_Ans>::Pointer ctx);
  220. void Gateway(SpReqAnsContext<HealthManagerService_Gateway_Req, HealthManagerService_Gateway_Ans>::Pointer ctx);
  221. virtual void OnLog(const CAutoArray<CUUID> &SubIDs, const CUUID nLogID,const LogTypeEnum eLogType, const SeverityLevelEnum eLevel,
  222. const DWORD dwSysError,const DWORD dwUserCode,const DWORD dwEntityInstanceID, const WORD wEntityDevelID,
  223. const CAutoArray<DWORD> &Param, const char *pszEntityName, const char *pszModuleName,const char *pszMessage, const linkContext &pLinkInfo);
  224. virtual void OnSysVarEvent(const char *pszKey,
  225. const char *pszValue, const char *pszOldValue, const char *pszEntityName);
  226. virtual void OnBroadcastEvent(CUUID SubID, const char *pszEntityName, DWORD dwMessageId, DWORD dwMessageSignature, CAutoBuffer Buffer);
  227. virtual void OnTimeout(DWORD dwTimerID);
  228. void DeployTerminal(SpReqAnsContext<HealthManagerService_DeployTerminal_Req, HealthManagerService_DeployTerminal_Ans>::Pointer ctx);
  229. /*!
  230. * @brief 判断是否为未配置模式
  231. * @param[out] 如果为未配置模式,stepMode 等于 0 为从头开始配置,其他为阶段性配置,详情见 DeployStep_* 定义
  232. * @return : true: 为未配置模式,false:正常模式
  233. */
  234. bool IsLackOfConfig(int& stepMode);
  235. virtual void OnEntityStateHook(const char* pszEntityName, const char* pszTriggerEntity, EntityStateEnum eState, EntityStateEnum eLastState);
  236. virtual void OnUserStateHook(const char* pszEntityName, DWORD dwState, DWORD dwLastState) { return; }
  237. virtual void OnCeateConnection(const char* pszCallerEntity, const char* pszServiceEntity) { return; }
  238. virtual void OnCloseConnection(const char* pszCallerEntity, const char* pszServiceEntity) { return; }
  239. private:
  240. CHealthManagerFSM m_fsm;
  241. //the following is useless?just one var is ok? oiltmp
  242. CUUID m_uuidUpdate,m_uuidMediaController,m_uuidFaceTracking,m_uuidAccessAuth,m_uuidSelfChecker
  243. , m_uuidRemoteController, m_uuidGUIConsole, m_uuidHeartBeat, m_uuidIE, m_uuidCenterS, m_uuidVtmLoader;
  244. CUUID m_uuidCardSwiper,m_uuidPublic, m_uuid4SIPPhone;
  245. int m_devCfgNum,m_connectStatus;
  246. int m_restartHour, m_restartMinute, m_lastHour, m_restartTimes, m_maxRestartTimes, m_preDay, m_dayNum, m_maxRunDays, m_guardianCount;
  247. bool m_bInit, m_bWaitRestartPC, m_bScreenLock, m_bToRestart, m_testFlag, m_bSayIdle
  248. , m_bGuardianRun, m_bVerRollback, m_bBrowserIdleFirst, m_bNeedToRestartPAD
  249. , m_bInMainPage, m_bEnterMainPageEver, m_bHaveThrowMainPage, m_bToRestartByCenterSetting;
  250. bool m_bNeedAuthRetry/*需要重试准入*/, m_bNeedGuardianRestart/*需要重启*/, m_bNeedGuardian;
  251. DWORD m_wDayOfWeek,m_MCStart,m_MCEnd,m_dwTimeOfAuthSuc;
  252. int xxx,m_worktimeStart, m_worktimeEnd,m_maxWaitMainpageTime;
  253. RebootTriggerEnum m_eRebootTrigger;
  254. RebootWayEnum m_eRebootWay;
  255. CSimpleStringA m_menuChoice,m_currentVer,m_menuPre,m_netState, m_versionEx;
  256. map<CSimpleStringA,ModuleRunInfo> m_modRunInfo;
  257. map<CSimpleStringA,ModuleReMode> m_modCfgInfo;
  258. map<ModuleReMode,RestartModeInfo> m_restartMode;
  259. UpgradeMgrService_ClientBase *m_pUpgMgr;
  260. pfShakeHands m_pfShake;
  261. pfUpgradeRestart m_pfUpgradeRestart;
  262. CSystemStaticInfo m_sysStaticInfo;
  263. bool m_fConfigMode;
  264. /** 启动限制配置读取以及监护模块初始化*/
  265. bool DoRestart();
  266. void OnCheckTimeTimeout();
  267. ErrorCodeEnum RestartModule(const char* pEntityName);
  268. void AfterWaitRestartPC();
  269. void SplitModuleNames(CSimpleStringA csLine,ModuleReMode eMode);
  270. bool SaveCurrentVersion();
  271. bool SaveFrameStartTimeForUpgrade();
  272. //reture value:
  273. //0:no need guardian; 1:guardian is running; -1:guardian is not running
  274. int CheckGuardianIsRun(bool bStart=false);
  275. bool StopGuardian();
  276. bool StartGuardian();
  277. bool VersionRollBack(const char *pVerion);
  278. CSimpleStringA __ReadCenterConfigStr(CSimpleStringA key, CSimpleStringA entityName);
  279. bool IsTestMode();
  280. ErrorCodeEnum GetTmpRootFilePath(CSimpleStringA& rootPath, CSimpleStringA& rootTmpPath, CSimpleStringA& rootBackPath);
  281. void RecordInstallBeginTimeStamp(const CSimpleString& strTimeStamp, BOOL forceReset = FALSE);
  282. ErrorCodeEnum GetInstallBeginTimeStamp(CSimpleString& strTimeStamp);
  283. ErrorCodeEnum GetGuidePageUrlWithStep(int whichStep, CSimpleStringA& strUrl);
  284. ErrorCodeEnum TellChromiumOpenGuidePage(const CSimpleStringA& pageUrl);
  285. ErrorCodeEnum DealSpecifiedEntity(DealType type, LPCTSTR lpcszEntityName, LPCTSTR lpcszCmdline, bool bForce, CSimpleStringA& strErrMsg);
  286. void ToCalcRebootHourAndMinute(int restartBegin, int restartEnd);
  287. };
  288. #endif // __MOD_HEALTHMANAGER_H
  289. struct FrameworkRestartTask : public ITaskSp
  290. {
  291. CHealthManagerEntity* m_entity;
  292. FrameworkRestartTask(CHealthManagerEntity* entity) : m_entity(entity) {}
  293. void Process()
  294. {
  295. m_entity->WarnAndRestartFramwork();
  296. }
  297. };
  298. struct WarnPromptTask : public ITaskSp
  299. {
  300. CHealthManagerEntity* m_entity;
  301. WarnPromptTask(CHealthManagerEntity* entity) : m_entity(entity) {}
  302. void Process()
  303. {
  304. m_entity->StartManagerDesktopPage("warnPrompt.html");
  305. }
  306. };