svc.cpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366
  1. #include "precompile.h"
  2. #include "sp_mod.h"
  3. #include "svc.h"
  4. #include "app.h"
  5. #include "SpBase.h"
  6. #include "SpHelper.h"
  7. #include "sp_btr.h"
  8. #include "sp_gui.h"
  9. #include "sp_dbg_export.h"
  10. #include "sp_iom.h"
  11. #include "sp_svc.h"
  12. #include "sp_def.h"
  13. #include "sp_cfg.h"
  14. #include "sp_rpc.h"
  15. #include <memory>
  16. #include "osutil.h"
  17. #include "fileutil.h"
  18. #include <winpr/library.h>
  19. void on_bluesceen_display(sp_rpc_server_t *server, int epid, int svc_id, int call_type, iobuffer_t **info_pkt)
  20. {
  21. app_t *app = get_app_instance();
  22. char *msg = NULL;
  23. //int iBlueScreen=0;
  24. //iobuffer_format_read(*info_pkt, "s4", &msg, &iBlueScreen);
  25. iobuffer_format_read(*info_pkt, "s", &msg);
  26. sp_gui_show_running_info(app->bsc_gui, msg, 1);
  27. toolkit_free(msg);
  28. }
  29. void on_fatal_error_display(sp_rpc_server_t *server, int epid, int svc_id, int call_type, iobuffer_t **info_pkt)
  30. {
  31. app_t *app = get_app_instance();
  32. char *msg = NULL;
  33. //int iBlueScreen=0;
  34. //iobuffer_format_read(*info_pkt, "s4", &msg, &iBlueScreen);
  35. iobuffer_format_read(*info_pkt, "s", &msg);
  36. sp_gui_show_running_info(app->bsc_gui, msg, 2);
  37. toolkit_free(msg);
  38. }
  39. void on_startup_info_display(sp_rpc_server_t *server, int epid, int svc_id, int call_type, iobuffer_t **info_pkt)
  40. {
  41. app_t *app = get_app_instance();
  42. char *msg = NULL;
  43. iobuffer_format_read(*info_pkt, "s", &msg);
  44. sp_gui_show_running_info(app->bsc_gui, msg, 3);
  45. toolkit_free(msg);
  46. }
  47. void on_bluesceen_undisplay(sp_rpc_server_t *server, int epid, int svc_id, int call_type, iobuffer_t **info_pkt)
  48. {
  49. app_t *app = get_app_instance();
  50. sp_gui_undisplay(app->bsc_gui);
  51. }
  52. DWORD getExePath(char *exePath)
  53. {
  54. char pathbuf[MAX_PATH] = "";
  55. int pathlen = ::GetModuleFileName(NULL, pathbuf, MAX_PATH);
  56. // 替换掉单杠
  57. while (pathlen > 0)
  58. {
  59. if (pathbuf[pathlen--] == SPLIT_SLASH)
  60. break;
  61. }
  62. pathbuf[++pathlen] = '\0';
  63. sprintf(exePath, "%s", pathbuf);
  64. return strlen(exePath);
  65. }
  66. int KickoffSpRestart(bool bRestart)
  67. {
  68. #ifdef _WIN32
  69. STARTUPINFO si;
  70. PROCESS_INFORMATION pi;
  71. ZeroMemory(&si, sizeof(si));
  72. si.cb = sizeof(si);
  73. ZeroMemory(&pi, sizeof(pi));
  74. // LPTSTR szCmdline[] = _tcsdup(TEXT("\"C:\\Program Files\\MyApp\" -L -S"));
  75. //CreateProcess(NULL, szCmdline, /*...*/);
  76. // Start the child process.
  77. char exepath[MAX_PATH] = "";
  78. getExePath(exepath);
  79. CSimpleStringA csRestart, csVerPath, csAll, csSep("\""), csBlank(" "), csScript("wscript.exe"), csReFlag("r");
  80. csRestart = CSimpleStringA(exepath) + "\\sprestart.exe";
  81. sp_env_t* env = sp_get_env();
  82. csVerPath = env->dir->root_ver_path;
  83. csVerPath += "\\spexplorerfast.vbs";
  84. if (!bRestart)
  85. csReFlag = "n";
  86. csAll = csRestart + csBlank + csSep + csScript + csBlank + csVerPath + csSep
  87. + csBlank + csSep + csReFlag + csSep;
  88. Dbg("allpath[%s]", (LPCTSTR)csAll);
  89. LPTSTR szCmdline = _strdup(csAll);
  90. if (!CreateProcess(NULL, szCmdline, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) {
  91. Dbg("CreateProcess failed (%d).\n", GetLastError());
  92. return -1;
  93. }
  94. Dbg("CreateProcess Success PID:%d.\n", pi.dwProcessId);
  95. CloseHandle(pi.hProcess);
  96. CloseHandle(pi.hThread);
  97. return 0;
  98. #else
  99. return -1;
  100. #endif //_WIN32
  101. }
  102. void on_machine_reboot(sp_rpc_server_t *server, int epid, int svc_id, int call_type, iobuffer_t **info_pkt)
  103. {
  104. int reason(0), way(0);
  105. sp_env_t *env = sp_get_env();
  106. sp_cfg_t *cfg = env->cfg;
  107. iobuffer_read(*info_pkt, IOBUF_T_I4, &reason, 0);
  108. iobuffer_read(*info_pkt, IOBUF_T_I4, &way, 0);
  109. const RebootWayEnum eRebootWay = (RebootWayEnum)way;
  110. const RebootTriggerEnum eRebootTrigger = (RebootTriggerEnum)reason;
  111. Dbg("now reboot: reason = %s, way = %s", SpStrRebootTrigger(eRebootTrigger), SpStrRebootWay(eRebootWay));
  112. CSimpleStringA strPath = env->dir->root_runinfo_path;
  113. strPath += SPLIT_SLASH_STR "BootLog";
  114. sp_btr_write_on_shutdown(strPath, env->btr_ctx, reason, way);
  115. // 只处理框架重启及操作系统重启,电源重启由健康实体处理
  116. if (eRebootWay == RebootWay_Framework && eRebootTrigger != RebootTrigger_DeadForever)
  117. {
  118. Dbg("reboot framework now");
  119. KickoffSpRestart(true);
  120. }
  121. else if (eRebootWay == RebootWay_OS)
  122. {
  123. Dbg("reboot windows now");
  124. osutil_restart_system();
  125. }
  126. app_t *app = get_app_instance();
  127. sp_iom_post_quit(app->iom);
  128. }
  129. void on_entity_quit(sp_rpc_server_t *server, int epid, int svc_id, int call_type, iobuffer_t **info_pkt)
  130. {
  131. int entity_id;
  132. sp_env_t *env = sp_get_env();
  133. iobuffer_read(*info_pkt, IOBUF_T_I4, &entity_id, NULL);
  134. sp_mod_mgr_stop_entity(env->mod_mgr, entity_id, svc_id, CloseCause_Self);
  135. }
  136. void on_output_console_on(sp_rpc_server_t *server, int epid, int svc_id, int call_type, iobuffer_t **info_pkt)
  137. {
  138. Dbg("set output console on");
  139. #ifdef _WIN32
  140. auto app = get_app_instance();
  141. sp_gui_display(app->bsc_gui);
  142. #else
  143. //sp_dbg_start_console("可视柜台终端运行监控");
  144. #endif //_WIN32
  145. }
  146. void on_output_console_off(sp_rpc_server_t *server, int epid, int svc_id, int call_type, iobuffer_t **info_pkt)
  147. {
  148. Dbg("set output console off");
  149. #ifdef _WIN32
  150. auto app = get_app_instance();
  151. sp_gui_undisplay(app->bsc_gui);
  152. #else
  153. //sp_dbg_close_console();
  154. #endif //_WIN32
  155. }
  156. typedef struct
  157. {
  158. sp_rpc_server_t* server;
  159. int epid;
  160. int rpc_id;
  161. int svc_id;
  162. int Entity_id;
  163. char cmdline[1024];
  164. }EntityStartParam;
  165. static unsigned int __stdcall on_entity_startThread(void* param)
  166. {
  167. EntityStartParam *dst = (EntityStartParam*)param;
  168. auto ans_pkt = on_entity_start(dst->svc_id, dst->Entity_id, dst->cmdline);
  169. //自己发送
  170. if (ans_pkt) {
  171. int rc = sp_rpc_server_send_answer(dst->server, dst->epid, dst->svc_id, dst->rpc_id, &ans_pkt);
  172. if (rc != 0)
  173. sp_dbg_warn("send answer failed!");
  174. if (ans_pkt)
  175. iobuffer_dec_ref(ans_pkt);
  176. }
  177. //delete dst;
  178. return 0;
  179. }
  180. iobuffer_t* on_entity_startEx(sp_rpc_server_t* server, int epid, int svc_id, int rpc_id, int call_type, iobuffer_t** req_pkt)
  181. {
  182. int entity_id;
  183. char* cmdline = NULL;
  184. iobuffer_read(*req_pkt, IOBUF_T_I4, &entity_id, NULL);
  185. sp_dbg_debug("handle start entityEx req: %d", entity_id);
  186. iobuffer_format_read(*req_pkt, "s", &cmdline);
  187. EntityStartParam *param = new EntityStartParam();
  188. param->server = server;
  189. param->epid = epid;
  190. param->rpc_id = rpc_id;
  191. param->svc_id = svc_id;
  192. param->Entity_id = entity_id;
  193. sprintf(param->cmdline, "%s", cmdline);
  194. toolkit_free(cmdline);
  195. CloseHandle(CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&on_entity_startThread, param, 0, NULL));
  196. return NULL;
  197. }
  198. iobuffer_t *on_entity_start(sp_rpc_server_t *server, int epid, int svc_id, int rpc_id, int call_type, iobuffer_t **req_pkt)
  199. {
  200. sp_env_t *env = sp_get_env();
  201. int entity_id;
  202. int result;
  203. char *cmdline = NULL;
  204. iobuffer_t *ans_pkt = NULL;
  205. iobuffer_read(*req_pkt, IOBUF_T_I4, &entity_id, NULL);
  206. sp_dbg_debug("handle start entity req: %d", entity_id);
  207. iobuffer_format_read(*req_pkt, "s", &cmdline);
  208. result = sp_mod_mgr_start_entity(env->mod_mgr, entity_id, cmdline, svc_id);
  209. toolkit_free(cmdline);
  210. ans_pkt = iobuffer_create(-1, -1);
  211. iobuffer_write(ans_pkt, IOBUF_T_I4, &result, 0);
  212. return ans_pkt;
  213. }
  214. iobuffer_t* on_entity_start(int svc_id, int entity_id, const char* cmdline)
  215. {
  216. sp_env_t* env = sp_get_env();
  217. int result;
  218. iobuffer_t* ans_pkt = NULL;
  219. result = sp_mod_mgr_start_entity(env->mod_mgr, entity_id, cmdline, svc_id);
  220. ans_pkt = iobuffer_create(-1, -1);
  221. iobuffer_write(ans_pkt, IOBUF_T_I4, &result, 0);
  222. return ans_pkt;
  223. }
  224. iobuffer_t *on_entity_stop(sp_rpc_server_t *server, int epid, int svc_id, int rpc_id, int call_type, iobuffer_t **req_pkt)
  225. {
  226. sp_env_t *env = sp_get_env();
  227. int entity_id;
  228. int result;
  229. int cause_code;
  230. iobuffer_t *ans_pkt = NULL;
  231. iobuffer_read(*req_pkt, IOBUF_T_I4, &entity_id, NULL);
  232. if (svc_id == SP_SHELL_SVC_ID) {
  233. cause_code = CloseCause_ShellQuit;
  234. } else if (svc_id == SP_INVALID_SVC_ID) {
  235. cause_code = CloseCause_Lost;
  236. } else if (svc_id == entity_id) {
  237. cause_code = CloseCause_Self;
  238. } else {
  239. cause_code = CloseCause_Other;
  240. }
  241. sp_dbg_debug("handle stop entity req: %d", entity_id);
  242. result = sp_mod_mgr_stop_entity(env->mod_mgr, entity_id, svc_id, cause_code);
  243. ans_pkt = iobuffer_create(-1, -1);
  244. iobuffer_write(ans_pkt, IOBUF_T_I4, &result, 0);
  245. return ans_pkt;
  246. }
  247. iobuffer_t *on_entity_continue(sp_rpc_server_t *server, int epid, int svc_id, int rpc_id, int call_type, iobuffer_t **req_pkt)
  248. {
  249. sp_env_t *env = sp_get_env();
  250. int entity_id;
  251. int result;
  252. iobuffer_t *ans_pkt = NULL;
  253. iobuffer_read(*req_pkt, IOBUF_T_I4, &entity_id, NULL);
  254. sp_dbg_debug("handle continue entity req: %d", entity_id);
  255. result = sp_mod_mgr_continue_entity(env->mod_mgr, entity_id, svc_id);
  256. ans_pkt = iobuffer_create(-1, -1);
  257. iobuffer_write(ans_pkt, IOBUF_T_I4, &result, 0);
  258. return ans_pkt;
  259. }
  260. iobuffer_t *on_entity_pause(sp_rpc_server_t *server, int epid, int svc_id, int rpc_id, int call_type, iobuffer_t **req_pkt)
  261. {
  262. sp_env_t *env = sp_get_env();
  263. int entity_id;
  264. int result;
  265. iobuffer_t *ans_pkt = NULL;
  266. iobuffer_read(*req_pkt, IOBUF_T_I4, &entity_id, NULL);
  267. sp_dbg_debug("handle pause entity req: %d", entity_id);
  268. result = sp_mod_mgr_pause_entity(env->mod_mgr, entity_id, svc_id);
  269. ans_pkt = iobuffer_create(-1, -1);
  270. iobuffer_write(ans_pkt, IOBUF_T_I4, &result, 0);
  271. return ans_pkt;
  272. }
  273. iobuffer_t *on_entity_test(sp_rpc_server_t *server, int epid, int svc_id, int rpc_id, int call_type, iobuffer_t **req_pkt)
  274. {
  275. sp_env_t *env = sp_get_env();
  276. int entity_id;
  277. int test_type;
  278. int result;
  279. iobuffer_t *ans_pkt = NULL;
  280. iobuffer_read(*req_pkt, IOBUF_T_I4, &entity_id, NULL);
  281. iobuffer_read(*req_pkt, IOBUF_T_I4, &test_type, NULL);
  282. //sp_dbg_debug("handle test entity req: %d", entity_id);
  283. result = sp_mod_mgr_test_entity(env->mod_mgr, entity_id, svc_id, test_type);
  284. ans_pkt = iobuffer_create(-1, -1);
  285. iobuffer_write(ans_pkt, IOBUF_T_I4, &result, 0);
  286. return ans_pkt;
  287. }
  288. iobuffer_t *on_entity_termination(sp_rpc_server_t *server, int epid, int svc_id, int rpc_id, int call_type, iobuffer_t **req_pkt)
  289. {
  290. sp_env_t *env = sp_get_env();
  291. int entity_id;
  292. int result;
  293. iobuffer_t *ans_pkt = NULL;
  294. iobuffer_read(*req_pkt, IOBUF_T_I4, &entity_id, NULL);
  295. sp_dbg_debug("handle terminate entity req: %d", entity_id);
  296. result = sp_mod_mgr_terminate_entity(env->mod_mgr, entity_id, svc_id);
  297. ans_pkt = iobuffer_create(-1, -1);
  298. iobuffer_write(ans_pkt, IOBUF_T_I4, &result, 0);
  299. return ans_pkt;
  300. }
  301. iobuffer_t *on_get_bcast_receiver(sp_rpc_server_t *server, int epid, int svc_id, int rpc_id, int call_type, iobuffer_t **req_pkt)
  302. {
  303. sp_env_t *env = sp_get_env();
  304. iobuffer_t *ans_pkt = NULL;
  305. int result = 0;
  306. int i;
  307. array_header_t *arr = sp_bcm_daemon_get_receiver(get_app_instance()->bcm_daemon, svc_id);
  308. ans_pkt = iobuffer_create(-1, -1);
  309. iobuffer_write(ans_pkt, IOBUF_T_I4, &result, 0);
  310. iobuffer_write(ans_pkt, IOBUF_T_I4, &arr->nelts, 0);
  311. for (i = 0; i < arr->nelts; ++i) {
  312. sp_bcm_receiver_t *recver = ARRAY_IDX(arr, i, sp_bcm_receiver_t*);
  313. iobuffer_write(ans_pkt, IOBUF_T_I8, &recver->id, 0);
  314. iobuffer_write(ans_pkt, IOBUF_T_I4, &recver->receiver_id, 0);
  315. iobuffer_write(ans_pkt, IOBUF_T_STR, &recver->param, -1);
  316. }
  317. sp_bcm_daemon_free_receiver_array(arr);
  318. return ans_pkt;
  319. }