Events.php 10.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. <?php
  2. // by 请勿倒卖,已申请软著,否则追究法律责任
  3. include_once "source/system/db.class.php";
  4. use GatewayWorker\Lib\Gateway;
  5. use Workerman\Lib\Timer;
  6. use think\facade\Db;
  7. class Events
  8. {
  9. public static function onWorkerStart($worker)
  10. {
  11. $_SESSION["uid"] = $worker->id;
  12. self::clearLog();
  13. self::out("启动成功");
  14. $_SESSION["times"] = 0;
  15. Timer::add(1, function () {
  16. $_var_0 = Db::name("signlog")->where("in_status", "1")->find();
  17. if ($_var_0) {
  18. $_var_1 = Db::name("signlog")->where("in_id", $_var_0["in_id"])->update(["in_status" => 2]);
  19. if ($_var_1) {
  20. Db::name("sign")->where("in_aid", $_var_0["in_aid"])->update(["in_status" => 2]);
  21. self::zsign($_var_0);
  22. $_SESSION["times"]++;
  23. self::out("空闲 已执行任务 " . $_SESSION["times"] . " \n");
  24. }
  25. }
  26. });
  27. }
  28. static function zsign($sign)
  29. {
  30. $_var_2 = "[" . $sign["in_id"] . "]" . $sign["in_aname"];
  31. self::out($_var_2 . " 加入队列 ");
  32. $_var_3 = Db::name("cert")->where("in_name", $sign["in_cert"])->find();
  33. $_var_4 = trim(IN_CERT_PATH . $_var_3["in_dir"] . ".zip");
  34. $_var_5 = IN_TMP_PATH . $_var_3["in_dir"];
  35. if (!$_var_3 || !is_file($_var_4)) {
  36. Db::name("signlog")->where("in_id", $sign["in_id"])->update(["in_status" => -2]);
  37. Db::name("sign")->where("in_aid", $sign["in_aid"])->update(["in_status" => -2]);
  38. self::out($_var_2 . " 签名失败 证书文件不存在");
  39. return null;
  40. }
  41. $_var_6 = new PclZip($_var_4);
  42. $_var_6->extract(PCLZIP_OPT_PATH, $_var_5);
  43. $_var_7 = $_var_5 . "/" . $_var_3["in_dir"] . ".mobileprovision";
  44. $_var_8 = $_var_5 . "/" . $_var_3["in_dir"] . ".p12";
  45. if (!is_file($_var_7) || !is_file($_var_8)) {
  46. Db::name("signlog")->where("in_id", $sign["in_id"])->update(["in_status" => -2]);
  47. Db::name("sign")->where("in_aid", $sign["in_aid"])->update(["in_status" => -2]);
  48. self::out($_var_2 . " 签名失败 证书文件不存在");
  49. return null;
  50. }
  51. self::out($_var_2 . " 开始解析");
  52. $_var_9 = IN_ATTACHMENT_PATH . $sign["in_ipa"];
  53. if (!is_file($_var_9)) {
  54. Db::name("signlog")->where("in_id", $sign["in_id"])->update(["in_status" => -1]);
  55. Db::name("sign")->where("in_aid", $sign["in_aid"])->update(["in_status" => -1]);
  56. self::out($_var_2 . " 解析失败 IPA包不存在");
  57. return null;
  58. }
  59. $_var_10 = self::unzip($_var_9);
  60. $_var_11 = $_var_3["p12_pwd"];
  61. $_var_12 = str_replace("/data/attachment/", "/data/tmp/", $_var_9);
  62. $_var_13 = "export LANG=\"zh_CN.UTF-8\";export LC_ALL=\"zh_CN.UTF-8\";";
  63. $_var_14 = $_var_13 . " " . IN_STATIC_PATH . "sign_tools/zsign/zsign -k " . $_var_8 . " -p " . $_var_11 . " -m " . $_var_7 . " -o " . $_var_12 . " -z 9 " . $_var_10;
  64. Db::name("signlog")->where("in_id", $sign["in_id"])->update(["in_status" => 3]);
  65. Db::name("sign")->where("in_id", $sign["in_aid"])->update(["in_status" => 3]);
  66. self::out($_var_2 . " 解析完成 => 开始签名 ");
  67. exec($_var_14, $_var_15);
  68. $_var_15 = json_encode($_var_15);
  69. if (strstr($_var_15, "Signed OK!")) {
  70. Db::name("signlog")->where("in_id", $sign["in_id"])->update(["in_status" => 4]);
  71. Db::name("sign")->where("in_aid", $sign["in_aid"])->update(["in_status" => 4]);
  72. self::out($_var_2 . " 签名完成 => 开始打包 ");
  73. if (strstr($_var_15, "Archive OK!")) {
  74. $_var_16 = db("appid")->where("in_id", $sign["in_aid"])->find();
  75. if (IN_REMOTE && (IN_MANDATORY_REMOTE || $_var_16["remote"])) {
  76. $_var_17 = IN_REMOTE == 1 ? new Qiniuoss() : new Aliyunoss();
  77. $_var_18 = $_var_17->upload($_var_16["in_app"], $_var_12);
  78. if ($_var_18) {
  79. $_var_18 = $_var_17->refresh([$_var_18["domain_src"]]);
  80. }
  81. } else {
  82. @rename($_var_12, $_var_9);
  83. }
  84. Db::name("signlog")->where(array("in_id" => $sign["in_id"]))->update(array("in_status" => 5, "in_addtime" => date("Y-m-d H:i:s")));
  85. Db::name("sign")->where("in_aid", $sign["in_aid"])->update(["in_status" => 5, "in_time" => time()]);
  86. self::out("[" . $sign["in_id"] . "]" . $sign["in_aname"] . " 打包完成 ");
  87. Db::name("appid")->where(array("in_id" => $sign["in_aid"]))->dec("in_resign")->update(array("in_type" => 1, "in_team" => $sign["in_cert"], "in_updatetime" => time()));
  88. self::out("[" . $sign["in_id"] . "]" . $sign["in_aname"] . " 扣费完成 ");
  89. $_var_19 = $_var_16 = db("app")->where("in_appid", $sign["in_aid"])->order("in_id desc")->value("in_id");
  90. Db::name("app")->where(array("in_id" => $_var_19))->update(array("in_type" => 1, "in_team" => $sign["in_cert"], "in_desc" => "在线企业签名", "in_addtime" => time()));
  91. self::out("[" . $sign["in_id"] . "]" . $sign["in_aname"] . " 更新版本记录完成 ");
  92. } elseif (strstr($_var_15, "Archive Failed!")) {
  93. Db::name("signlog")->where("in_id", $sign["in_id"])->update(["in_status" => -3]);
  94. Db::name("sign")->where("in_aid", $sign["in_aid"])->update(["in_status" => -3]);
  95. self::out($_var_2 . " 打包失败 ");
  96. }
  97. } elseif (strstr($_var_15, "Signed Failed!")) {
  98. Db::name("signlog")->where("in_id", $sign["in_id"])->update(["in_status" => -2]);
  99. Db::name("sign")->where("in_aid", $sign["in_aid"])->update(["in_status" => -2]);
  100. self::out($_var_2 . " 签名失败 ");
  101. } else {
  102. Db::name("signlog")->where("in_id", $sign["in_id"])->update(["in_status" => -2]);
  103. Db::name("sign")->where("in_aid", $sign["in_aid"])->update(["in_status" => -2]);
  104. self::out($_var_2 . " 签名失败 IPA包有错误");
  105. }
  106. self::out($_var_2 . " 签名任务结束 \n");
  107. }
  108. static function unzip($_var_20)
  109. {
  110. $_var_21 = str_replace("/attachment/", "/ipadir/", $_var_20);
  111. if (is_empty_dir($_var_21)) {
  112. creatdir($_var_21);
  113. $_var_22 = "export LANG=\"zh_CN.UTF-8\";export LC_ALL=\"zh_CN.UTF-8\";";
  114. exec($_var_22 . " unzip -O CP936 -d " . $_var_21 . " " . $_var_20, $_var_23);
  115. }
  116. chmod($_var_21, 0755);
  117. if (is_dir($_var_21 . "/__MACOSX/")) {
  118. destroyDir($_var_21 . "/__MACOSX/");
  119. }
  120. if (file_exists($_var_21 . "/Entitlements.plist")) {
  121. @unlink($_var_21 . "/Entitlements.plist");
  122. }
  123. $_var_24 = scandir($_var_21 . "/Payload/");
  124. foreach ($_var_24 as $_var_25) {
  125. if ($_var_25 != "." && $_var_25 != ".." && is_dir($_var_21 . "/Payload/" . $_var_25)) {
  126. clearbom($_var_21 . "/Payload/" . $_var_25 . "/Info.plist");
  127. }
  128. }
  129. return is_empty_dir($_var_21) ? $_var_20 : $_var_21;
  130. }
  131. public static function onMessage($_var_26, $_var_27)
  132. {
  133. $_SESSION["uid"] = $_var_26;
  134. self::out($_var_26 . " onMessage " . $_SERVER["REMOTE_ADDR"]);
  135. $_var_28 = json_decode($_var_27, true);
  136. if (!$_var_28) {
  137. return;
  138. }
  139. $_var_29 = $_var_28["uid"] ?? $_SESSION["uid"] ?? "";
  140. $_var_30 = $_var_28["group"] ?? "";
  141. $_var_31 = $_var_28["type"] ?? "";
  142. $_var_32 = $_var_28["param"] ?? [];
  143. $_var_33 = md5("sign_mac");
  144. switch ($_var_31) {
  145. case "pong":
  146. return;
  147. case "oauth":
  148. if (isset($_var_32["site"])) {
  149. $_var_34 = Db::name("secret")->where("in_site", $_var_32["site"])->count();
  150. if ($_var_34) {
  151. $_SESSION["uid"] = $_var_29;
  152. Gateway::bindUid($_var_26, $_var_29);
  153. $_var_35["msg"] = "login success ! welcome " . $_var_29 . " !";
  154. if ($_var_30) {
  155. Gateway::joinGroup($_var_26, $_var_30);
  156. $_var_35["msg"] = "login success ! welcome " . $_var_30 . " " . $_var_29 . " !";
  157. }
  158. $_var_35 = array_merge($_var_35, action("test/index/cert", $_var_32));
  159. $_var_35["type"] = "cert";
  160. self::sendToCurrentClient($_var_35);
  161. } else {
  162. self::sendToCurrentClient(["msg" => $_var_29 . " - 未授权"]);
  163. }
  164. } else {
  165. self::sendToCurrentClient(["msg" => $_var_29 . " - 未授权"]);
  166. }
  167. return;
  168. case "sign":
  169. if ($_var_29) {
  170. if (Gateway::isUidOnline($_var_33)) {
  171. $_var_32["datetime"] = date("Y-m-d H:i:s");
  172. self::sendToUid(["type" => "sign", "param" => $_var_32], $_var_33);
  173. } else {
  174. self::sendToCurrentClient(["msg" => "签名设备无响应"]);
  175. }
  176. } else {
  177. self::sendToCurrentClient(["msg" => $_var_29 . " - 未授权"]);
  178. }
  179. return;
  180. case $_var_33:
  181. if ($_var_29 == $_var_33) {
  182. $_SESSION["uid"] = $_var_29;
  183. Gateway::bindUid($_var_26, $_var_29);
  184. $_var_35["msg"] = "login success ! welcome " . $_var_29 . " !";
  185. self::sendToCurrentClient($_var_35);
  186. } else {
  187. self::sendToCurrentClient(["msg" => $_var_29 . " - 未授权"]);
  188. }
  189. return;
  190. default:
  191. self::sendToCurrentClient(["msg" => "type : " . $_var_31 . " is undefined"]);
  192. self::sendToAll(["msg" => "sendToAll"]);
  193. }
  194. }
  195. public static function onClose($_var_36)
  196. {
  197. self::out("onClose");
  198. if (isset($_SESSION["uid"])) {
  199. Gateway::sendToAll(json_encode(["client_id" => $_var_36, "type" => "offline", "uid" => $_SESSION["uid"]]));
  200. }
  201. }
  202. public static function sendToUid($ret = [], $uid = '')
  203. {
  204. $ret["time"] = time();
  205. return Gateway::sendToUid($uid, json_encode($ret));
  206. }
  207. public static function sendToGroup($_var_37 = [], $_var_38 = '')
  208. {
  209. $_var_37["time"] = time();
  210. return Gateway::sendToGroup($_var_38, json_encode($_var_37));
  211. }
  212. public static function sendToAll($_var_39 = [], $_var_40 = '', $_var_41 = '')
  213. {
  214. $_var_39["time"] = time();
  215. return Gateway::sendToAll(json_encode($_var_39));
  216. }
  217. public static function sendToCurrentClient($_var_42 = [])
  218. {
  219. $_var_42["time"] = time();
  220. return Gateway::sendToCurrentClient(json_encode($_var_42));
  221. }
  222. static function out(string $msg = '', bool $worker = true)
  223. {
  224. $_var_43 = date("H:i:s");
  225. $_var_44 = $_SESSION["uid"];
  226. $_var_45 = debug_backtrace()[0]["line"];
  227. echo $msg = "进程" . $_var_44 . " [" . $_var_43 . "] (" . $_var_45 . ") >> " . $msg . " \n";
  228. self::log($msg);
  229. }
  230. static function log($_var_46)
  231. {
  232. $_var_47 = date("Y-m-d H");
  233. $_var_48 = $_SESSION["uid"];
  234. @file_put_contents("runtime/worker/[" . $_var_48 . "][" . $_var_47 . "].log", $_var_46, FILE_APPEND);
  235. }
  236. static function clearLog()
  237. {
  238. $_var_49 = date("Y-m-d H");
  239. $_var_50 = $_SESSION["uid"];
  240. @file_put_contents("runtime/worker/[" . $_var_50 . "][" . $_var_49 . "].log", "");
  241. }
  242. }
  243. function clearbom($f)
  244. {
  245. if (is_file($f)) {
  246. $_var_51 = file_get_contents($f);
  247. if (strstr($_var_51, "\xef\xbb\xbf")) {
  248. $_var_51 = trim($_var_51, "\xef\xbb\xbf");
  249. file_put_contents($f, $_var_51);
  250. }
  251. }
  252. }