AsyncJobs.php 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. <?php
  2. Lib::loadClass('RouteBase');
  3. Lib::loadClass('Core_AsyncJobs');
  4. class Route_AsyncJobs extends RouteBase {
  5. function isInstalled() { return Core_AsyncJobs::isInstalled(); }
  6. function defaultAction() { UI::layout([ $this, 'defaultView' ]); }
  7. function defaultView() {
  8. echo UI::h('h1', [], "Async jobs (wps server)");
  9. if (!User::isAdmin()) throw new Exception("Access Denied");
  10. DBG::nicePrint(Config::getConfFile(), "Config::getConfFile()");
  11. echo UI::h('div', [ 'style' => "padding:12px 0; border-bottom:1px solid #ddd" ], [
  12. UI::hButtonPost("Check", [
  13. 'class' => "btn btn-default",
  14. 'title' => "check if async process manager is working",
  15. 'data' => [
  16. '_route' => 'AsyncJobs',
  17. '_postTask' => "pm2Check",
  18. ]
  19. ]),
  20. " ",
  21. UI::h('a', [
  22. 'href' => $this->getLink('list'),
  23. 'class' => "btn btn-default",
  24. ], "Lista"),
  25. " ",
  26. UI::hButtonPost("pm2 list", [
  27. 'class' => "btn btn-warning",
  28. 'data' => [
  29. '_route' => 'AsyncJobs',
  30. '_postTask' => "pm2List",
  31. ]
  32. ]),
  33. " ",
  34. UI::hButtonPost("pm2 kill", [
  35. 'class' => "btn btn-warning",
  36. 'data' => [
  37. '_route' => 'AsyncJobs',
  38. '_postTask' => "pm2Kill",
  39. ]
  40. ]),
  41. " ",
  42. UI::hButtonPost("pm2 run1", [
  43. 'class' => "btn btn-warning",
  44. 'data' => [
  45. '_route' => 'AsyncJobs',
  46. '_postTask' => "mp2Start1",
  47. ]
  48. ]),
  49. " ",
  50. UI::hButtonPost("pm2 run2", [
  51. 'class' => "btn btn-warning",
  52. 'data' => [
  53. '_route' => 'AsyncJobs',
  54. '_postTask' => "mp2Start2",
  55. ]
  56. ]),
  57. " ",
  58. UI::hButtonPost("pm2 run3", [
  59. 'class' => "btn btn-warning",
  60. 'data' => [
  61. '_route' => 'AsyncJobs',
  62. '_postTask' => "mp2Start3",
  63. ]
  64. ]),
  65. " ",
  66. UI::hButtonPost("pm2 delete stopped", [
  67. 'class' => "btn btn-warning",
  68. 'data' => [
  69. '_route' => 'AsyncJobs',
  70. '_postTask' => "mp2DeleteStopped",
  71. ]
  72. ]),
  73. ]);
  74. $postTask = V::get('_postTask', '', $_POST);
  75. switch ($postTask) {
  76. case "pm2Check": UI::tryCatchView([ $this, 'pm2CheckPostTask' ]); break;
  77. case "pm2List": UI::tryCatchView([ $this, 'pm2ListPostTask' ]); break;
  78. case "pm2Kill": UI::tryCatchView([ $this, 'pm2KillPostTask' ]); break;
  79. case "mp2Start1": UI::tryCatchView([ $this, 'mp2Start1PostTask' ]); break;
  80. case "mp2Start2": UI::tryCatchView([ $this, 'mp2Start2PostTask' ]); break;
  81. case "mp2Start3": UI::tryCatchView([ $this, 'mp2Start3PostTask' ]); break;
  82. case "mp2DeleteStopped": UI::tryCatchView([ $this, 'mp2DeleteStoppedPostTask' ]); break;
  83. }
  84. }
  85. function pm2CheckPostTask() {
  86. $cmd = "pm2 ping";
  87. V::exec($cmd, $out, $ret);
  88. echo "cmd: <code>{$cmd}</code><br>RETURN CODE: '{$ret}'<br><pre>OUTPUT:\n" . implode("\n", $out) . "</pre>";
  89. // expected: end($out) === "{ msg: 'pong' }"
  90. }
  91. function listAction() { UI::layout([ $this, 'listView' ]); }
  92. function listView() {
  93. echo UI::h('ol', [ 'class' => "breadcrumb", 'style' => "font-size:14px" ], [
  94. UI::h('li', [], [
  95. UI::h('i', [ 'class' => "glyphicon glyphicon-home" ]),
  96. " ",
  97. UI::h('a', [ 'href' => $this->getLink() ], "Async jobs"),
  98. ]),
  99. UI::h('li', [ 'class' => "active" ], [
  100. "Lista"
  101. ]),
  102. UI::h('a', [
  103. 'href' => $this->getLink('list'),
  104. 'class' => "pull-right btn btn-link",
  105. 'style' => "padding:0; line-height:1em",
  106. ], "odśwież"),
  107. ]);
  108. $postTask = V::get('_postTask', '', $_POST);
  109. switch ($postTask) {
  110. case "stopJob": UI::tryCatchView([ $this, 'stopJobPostTask' ]); break;
  111. case "startJob": UI::tryCatchView([ $this, 'startJobPostTask' ]); break;
  112. }
  113. echo UI::hTable([
  114. 'rows' => array_map([ $this, 'viewTableRowAsyncJob' ], Core_AsyncJobs::getSimpleList()),
  115. ]);
  116. }
  117. function stopJobPostTask() {
  118. $idJob = V::get('idJob', 0, $_POST, 'int'); // $jobInfo['pm_id'],
  119. $name = V::get('name', '', $_POST); // $jobInfo['name'],
  120. if ($idJob < 0) throw new Exception("Wrong param idJob");
  121. if ($idJob === 0 && $_POST['idJob'] !== '0') throw new Exception("Wrong param idJob 0");
  122. Core_AsyncJobs::stopJob($idJob);
  123. }
  124. function startJobPostTask() {
  125. $idJob = V::get('idJob', 0, $_POST, 'int'); // $jobInfo['pm_id'],
  126. $name = V::get('name', '', $_POST); // $jobInfo['name'],
  127. if ($idJob < 0) throw new Exception("Wrong param idJob");
  128. if ($idJob === 0 && $_POST['idJob'] !== '0') throw new Exception("Wrong param idJob 0");
  129. Core_AsyncJobs::startJob($idJob);
  130. }
  131. function pm2ListPostTask() {
  132. $cmd = "pm2 list";
  133. V::exec($cmd, $out, $ret);
  134. echo "cmd: <code>{$cmd}</code><br>RETURN CODE: '{$ret}'<br><pre>OUTPUT:\n" . implode("\n", $out) . "</pre>";
  135. $cmd = "pm2 jlist";
  136. V::exec($cmd, $out, $ret);
  137. echo "cmd: <code>{$cmd}</code><br>RETURN CODE: '{$ret}'<br><pre>OUTPUT:\n" . implode("\n", $out) . "</pre>";
  138. echo '<hr style="margin:24px auto">';
  139. $parsedJobList = Core_AsyncJobs::getFullList();
  140. DBG::nicePrint($parsedJobList, "\$parsedJobList");
  141. echo '<hr style="margin:24px auto">';
  142. UI::table([
  143. 'rows' => array_map([ $this, 'viewTableRowAsyncJob' ], Core_AsyncJobs::getSimpleList()),
  144. ]);
  145. }
  146. function viewTableRowAsyncJob($jobInfo) {
  147. return [
  148. 'name' => $jobInfo['name'],
  149. 'pid' => $jobInfo['pid'],
  150. 'pm_id' => $jobInfo['pm_id'],
  151. 'status' => $jobInfo['pm2_env.status'],
  152. 'memory' => $jobInfo['monit.memory'],
  153. 'cpu' => $jobInfo['monit.cpu'],
  154. '#' => UI::h(null, [], [
  155. UI::h('a', [
  156. 'href' => $this->getLink('jobLog', [
  157. 'idJob' => $jobInfo['pm_id'],
  158. 'name' => $jobInfo['name'],
  159. ]),
  160. 'class' => "btn btn-xs btn-warning",
  161. ], "logi"),
  162. " ",
  163. UI::hButtonPost("stop", [
  164. 'class' => "btn btn-xs btn-default",
  165. 'data' => [
  166. '_route' => 'AsyncJobs',
  167. '_postTask' => "stopJob",
  168. 'idJob' => $jobInfo['pm_id'],
  169. 'name' => $jobInfo['name'],
  170. ]
  171. ]),
  172. " ",
  173. UI::hButtonPost("start", [
  174. 'class' => "btn btn-xs btn-default",
  175. 'data' => [
  176. '_route' => 'AsyncJobs',
  177. '_postTask' => "startJob",
  178. 'idJob' => $jobInfo['pm_id'],
  179. 'name' => $jobInfo['name'],
  180. ]
  181. ]),
  182. ]),
  183. ];
  184. }
  185. function jobLogAction() { UI::layout([ $this, 'jobLogView' ]); }
  186. function jobLogView() {
  187. $idJob = V::get('idJob', 0, $_GET, 'int'); // $jobInfo['pm_id'],
  188. $name = V::get('name', '', $_GET); // $jobInfo['name'],
  189. echo UI::h('ol', [ 'class' => "breadcrumb", 'style' => "font-size:14px" ], [
  190. UI::h('li', [], [
  191. UI::h('i', [ 'class' => "glyphicon glyphicon-home" ]),
  192. " ",
  193. UI::h('a', [ 'href' => $this->getLink() ], "Async jobs"),
  194. ]),
  195. UI::h('li', [], [
  196. UI::h('a', [ 'href' => $this->getLink('list') ], "Lista"),
  197. ]),
  198. UI::h('li', [ 'class' => "active" ], [
  199. "Log dla '{$idJob}'",
  200. ]),
  201. ]);
  202. if ($idJob < 0) throw new Exception("Wrong param idJob");
  203. if ($idJob === 0 && $_GET['idJob'] !== '0') throw new Exception("Wrong param idJob 0");
  204. $out = Core_AsyncJobs::getJobLogs($idJob, 10);
  205. echo UI::h('div', [ 'style' => "background-color:#ddd; padding:4px 12px" ], "Logi dla zadania '{$idJob}'");
  206. echo UI::h('pre', [ 'style' => "border:1px solid #ddd; border-radius:0; padding:12px" ], $out);
  207. }
  208. function pm2KillPostTask() {
  209. $cmd = "pm2 kill";
  210. V::exec($cmd, $out, $ret);
  211. echo "cmd: <code>{$cmd}</code><br>RETURN CODE: '{$ret}'<br><pre>OUTPUT:\n" . implode("\n", $out) . "</pre>";
  212. }
  213. function mp2Start1PostTask() {
  214. $cmd = "pm2 start " . APP_PATH_ROOT . "/../sbin/test-sleep-loop.php --name='test-job-1'";
  215. V::exec($cmd . " 2>&1", $out, $ret);
  216. echo "cmd: <code>{$cmd}</code><br>RETURN CODE: '{$ret}'<br><pre>OUTPUT:\n" . implode("\n", $out) . "</pre>";
  217. }
  218. function mp2Start2PostTask() {
  219. $cmd = "pm2 start " . APP_PATH_ROOT . "/../sbin/test-sleep-loop.php --name='test-job-2'";
  220. V::exec($cmd . " 2>&1", $out, $ret);
  221. echo "cmd: <code>{$cmd}</code><br>RETURN CODE: '{$ret}'<br><pre>OUTPUT:\n" . implode("\n", $out) . "</pre>";
  222. }
  223. function mp2Start3PostTask() {
  224. $jobName = implode("&", [
  225. "ant=default_db.in7_dziennik_koresp/test-bash",
  226. "task=test-loop",
  227. "ns=default_db:IN7_DZIENNIK_KORESP",
  228. "pk=66263",
  229. ]);
  230. $jobNamespace = "p5";
  231. $cmd = implode(" ", [
  232. "pm2 start",
  233. APP_PATH_ROOT . "/../sbin/test-sleep-loop.php",
  234. "--name='{$jobName}'",
  235. "--namespace='{$jobNamespace}'",
  236. ]);
  237. V::exec($cmd . " 2>&1", $out, $ret);
  238. echo "cmd: <code>{$cmd}</code><br>RETURN CODE: '{$ret}'<br><pre>OUTPUT:\n" . implode("\n", $out) . "</pre>";
  239. }
  240. function mp2DeleteStoppedPostTask() {
  241. Core_AsyncJobs::deleteStopped();
  242. UI::alert("DONE");
  243. }
  244. }