@whyour/qinglong 2.20.2-3 → 2.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (218) hide show
  1. package/.env.example +5 -0
  2. package/AGENTS.md +43 -0
  3. package/CLAUDE.md +43 -0
  4. package/README-en.md +11 -0
  5. package/README.md +11 -0
  6. package/docker/Dockerfile +51 -69
  7. package/docker/Dockerfile.310 +94 -0
  8. package/docker/Dockerfile.debian +120 -0
  9. package/docker/{310.Dockerfile → Dockerfile.debian310} +13 -5
  10. package/docker/docker-entrypoint.sh +95 -3
  11. package/docs/PROJECT_ARCHITECTURE.md +550 -0
  12. package/package.json +28 -25
  13. package/sample/config.sample.sh +12 -1
  14. package/sample/notify.js +81 -9
  15. package/sample/notify.py +54 -11
  16. package/shell/api.sh +44 -20
  17. package/shell/bot.sh +30 -16
  18. package/shell/check.sh +21 -19
  19. package/shell/lang/en.sh +105 -0
  20. package/shell/lang/zh.sh +105 -0
  21. package/shell/otask.sh +114 -28
  22. package/shell/preload/client.js +20 -2
  23. package/shell/preload/esm-loader.mjs +41 -0
  24. package/shell/preload/sitecustomize.js +36 -0
  25. package/shell/pub.sh +8 -8
  26. package/shell/rmlog.sh +5 -5
  27. package/shell/share.sh +49 -30
  28. package/shell/start.sh +40 -27
  29. package/shell/task.sh +10 -2
  30. package/shell/update.sh +22 -22
  31. package/static/build/api/config.js +17 -7
  32. package/static/build/api/cron.js +38 -1
  33. package/static/build/api/dashboard.js +337 -0
  34. package/static/build/api/env.js +40 -2
  35. package/static/build/api/index.js +2 -0
  36. package/static/build/api/log.js +5 -4
  37. package/static/build/api/script.js +34 -9
  38. package/static/build/api/system.js +16 -1
  39. package/static/build/api/user.js +6 -5
  40. package/static/build/app.js +3 -0
  41. package/static/build/config/const.js +7 -6
  42. package/static/build/config/container.js +12 -0
  43. package/static/build/config/grpcCerts.js +150 -0
  44. package/static/build/config/index.js +6 -0
  45. package/static/build/config/util.js +66 -15
  46. package/static/build/data/cron.js +3 -1
  47. package/static/build/data/cronStats.js +59 -0
  48. package/static/build/data/env.js +2 -0
  49. package/static/build/data/notify.js +11 -1
  50. package/static/build/data/runningInstance.js +57 -0
  51. package/static/build/loaders/app.js +1 -1
  52. package/static/build/loaders/db.js +6 -0
  53. package/static/build/loaders/express.js +2 -1
  54. package/static/build/loaders/initData.js +19 -2
  55. package/static/build/loaders/initFile.js +2 -0
  56. package/static/build/schedule/api.js +1 -1
  57. package/static/build/schedule/client.js +9 -1
  58. package/static/build/schedule/health.js +1 -1
  59. package/static/build/services/config.js +19 -5
  60. package/static/build/services/cron.js +118 -8
  61. package/static/build/services/env.js +31 -3
  62. package/static/build/services/grpc.js +32 -6
  63. package/static/build/services/http.js +33 -18
  64. package/static/build/services/notify.js +40 -3
  65. package/static/build/services/open.js +2 -1
  66. package/static/build/services/sshKey.js +6 -3
  67. package/static/build/services/subscription.js +2 -1
  68. package/static/build/services/system.js +22 -7
  69. package/static/build/services/user.js +8 -7
  70. package/static/build/shared/i18n.js +105 -0
  71. package/static/build/shared/pLimit.js +12 -1
  72. package/static/build/shared/runCron.js +5 -0
  73. package/static/build/validation/schedule.js +1 -0
  74. package/static/dist/1089.0ecc5383.async.js +1 -0
  75. package/static/dist/1147.c420132e.async.js +1 -0
  76. package/static/dist/1192.4e5740f2.async.js +1 -0
  77. package/static/dist/1214.c6469b53.async.js +1 -0
  78. package/static/dist/134.54df9e38.async.js +1 -0
  79. package/static/dist/1352.96a77e1d.async.js +1 -0
  80. package/static/dist/{1765.d8e002d7.async.js → 1765.5ac01a93.async.js} +1 -1
  81. package/static/dist/1836.f0b74cf1.async.js +1 -0
  82. package/static/dist/{1885.e0d00d2d.async.js → 1885.e1ea09f6.async.js} +1 -1
  83. package/static/dist/1967.3f3945d0.async.js +1 -0
  84. package/static/dist/{2096.383c1047.async.js → 2096.6d98fd12.async.js} +1 -1
  85. package/static/dist/2208.f7ba3dfa.async.js +1 -0
  86. package/static/dist/2286.164bb089.async.js +1 -0
  87. package/static/dist/2476.4e9b0992.async.js +1 -0
  88. package/static/dist/2537.2b262ee0.async.js +1 -0
  89. package/static/dist/{255.12f03ab2.async.js → 255.8a80b983.async.js} +1 -1
  90. package/static/dist/2635.d4c59d23.async.js +1 -0
  91. package/static/dist/2808.cdc0995c.async.js +1 -0
  92. package/static/dist/{2821.be3dc88e.async.js → 2821.651f31e5.async.js} +1 -1
  93. package/static/dist/2986.4c49eef7.async.js +1 -0
  94. package/static/dist/300.08ac9875.async.js +1 -0
  95. package/static/dist/{3191.70bc19db.async.js → 3191.63263871.async.js} +1 -1
  96. package/static/dist/3714.8d6dba9e.async.js +1 -0
  97. package/static/dist/3906.a5eee612.async.js +1 -0
  98. package/static/dist/{6541.a6d499de.async.js → 3948.4fe809fd.async.js} +1 -1
  99. package/static/dist/{5171.7fc6d0a2.async.js → 4573.16f19278.async.js} +1 -1
  100. package/static/dist/{4859.93e63ea6.async.js → 4859.6592cebb.async.js} +1 -1
  101. package/static/dist/4887.8e3ae573.async.js +1 -0
  102. package/static/dist/{4902.54ecbdb5.async.js → 4902.555f92ab.async.js} +1 -1
  103. package/static/dist/{4934.1ca6b6b0.async.js → 4934.f3539d08.async.js} +1 -1
  104. package/static/dist/5077.cbd111cd.async.js +1 -0
  105. package/static/dist/{6247.b550d996.async.js → 5157.7c5af144.async.js} +1 -1
  106. package/static/dist/{540.481d4708.async.js → 540.19ddf020.async.js} +1 -1
  107. package/static/dist/{5970.10ac4f16.async.js → 5970.d3a6e7bd.async.js} +1 -1
  108. package/static/dist/{6013.2d7bb12a.async.js → 6013.4e38de36.async.js} +1 -1
  109. package/static/dist/{6016.9c379049.async.js → 6016.1e6574b6.async.js} +1 -1
  110. package/static/dist/{6035.5889ddc7.async.js → 6035.32ebfad9.async.js} +1 -1
  111. package/static/dist/6339.ab305e96.async.js +1 -0
  112. package/static/dist/6569.55177f6a.async.js +1 -0
  113. package/static/dist/6610.c111af7e.async.js +1 -0
  114. package/static/dist/{3034.6413c38e.async.js → 6638.87a163d2.async.js} +1 -1
  115. package/static/dist/{6646.5fc37228.async.js → 6646.95e92533.async.js} +1 -1
  116. package/static/dist/6665.1d099ad1.async.js +1 -0
  117. package/static/dist/{7355.b7c0562f.async.js → 7355.f9f263d8.async.js} +1 -1
  118. package/static/dist/{7384.065ccae2.async.js → 7384.1bb449d5.async.js} +1 -1
  119. package/static/dist/7441.ee1bf2bb.async.js +1 -0
  120. package/static/dist/{7508.a31662a3.async.js → 7508.7dcee91c.async.js} +1 -1
  121. package/static/dist/{7802.6b73f16a.async.js → 7802.34255805.async.js} +1 -1
  122. package/static/dist/{7984.e6bb9378.async.js → 7984.594296a5.async.js} +1 -1
  123. package/static/dist/{5653.4fce7ce8.async.js → 8033.5cb31493.async.js} +1 -1
  124. package/static/dist/8147.2fb55202.async.js +1 -0
  125. package/static/dist/8187.48c130d6.async.js +1 -0
  126. package/static/dist/8495.d53e15ca.async.js +1 -0
  127. package/static/dist/8587.315b06c0.async.js +1 -0
  128. package/static/dist/8826.2447a104.async.js +1 -0
  129. package/static/dist/{2742.4852aac8.async.js → 8865.ed665d31.async.js} +1 -1
  130. package/static/dist/901.7ee5c6d3.async.js +1 -0
  131. package/static/dist/9271.231db2ce.async.js +1 -0
  132. package/static/dist/9323.a33f47da.async.js +1 -0
  133. package/static/dist/{9730.30083c91.async.js → 9730.801665a3.async.js} +1 -1
  134. package/static/dist/{9761.627ca3b5.async.js → 9761.360a19d8.async.js} +1 -1
  135. package/static/dist/index.html +2 -2
  136. package/static/dist/layouts__index.a7a2bfe0.async.js +1 -0
  137. package/static/dist/layouts__index.adf0692f.chunk.css +1 -0
  138. package/static/dist/preload_helper.0431c0f3.js +1 -0
  139. package/static/dist/{src__pages__config__index.622b6ee8.async.js → src__pages__config__index.a22ff7dc.async.js} +1 -1
  140. package/static/dist/{src__pages__crontab__const.323d5124.async.js → src__pages__crontab__const.aba07deb.async.js} +1 -1
  141. package/static/dist/src__pages__crontab__detail.b9c36808.async.js +1 -0
  142. package/static/dist/src__pages__crontab__index.fed99fd0.async.js +1 -0
  143. package/static/dist/{src__pages__crontab__logModal.5e6a4bf2.async.js → src__pages__crontab__logModal.0b8cce8c.async.js} +1 -1
  144. package/static/dist/src__pages__crontab__modal.f7041c7c.async.js +1 -0
  145. package/static/dist/src__pages__crontab__type.d7af36e5.async.js +1 -0
  146. package/static/dist/{src__pages__crontab__viewCreateModal.ffcf7a24.async.js → src__pages__crontab__viewCreateModal.4d589f66.async.js} +1 -1
  147. package/static/dist/{src__pages__crontab__viewManageModal.c2724575.async.js → src__pages__crontab__viewManageModal.0e317746.async.js} +1 -1
  148. package/static/dist/src__pages__dashboard__index.b30f2f47.async.js +1 -0
  149. package/static/dist/{src__pages__dependence__logModal.f123e2ac.async.js → src__pages__dependence__logModal.0681830b.async.js} +1 -1
  150. package/static/dist/src__pages__dependence__modal.11124896.async.js +1 -0
  151. package/static/dist/src__pages__env__editNameModal.5d264b25.async.js +1 -0
  152. package/static/dist/src__pages__env__index.baa27d4e.async.js +1 -0
  153. package/static/dist/src__pages__env__modal.7f2ef1bc.async.js +1 -0
  154. package/static/dist/src__pages__error__index.f156b45e.async.js +1 -0
  155. package/static/dist/src__pages__initialization__index.e96d4ba8.async.js +1 -0
  156. package/static/dist/{src__pages__log__index.cf00c9af.async.js → src__pages__log__index.e0978bae.async.js} +1 -1
  157. package/static/dist/{src__pages__login__index.cd6e3152.async.js → src__pages__login__index.8c813eb1.async.js} +1 -1
  158. package/static/dist/{src__pages__script__components__UnsupportedFilePreview__index.39074c68.async.js → src__pages__script__components__UnsupportedFilePreview__index.c347a13a.async.js} +1 -1
  159. package/static/dist/src__pages__script__editNameModal.3e7e100d.async.js +1 -0
  160. package/static/dist/src__pages__script__index.2765d1b8.async.js +1 -0
  161. package/static/dist/src__pages__script__renameModal.5e987ef5.async.js +1 -0
  162. package/static/dist/src__pages__script__saveModal.3f9d23d6.async.js +1 -0
  163. package/static/dist/src__pages__script__setting.a535793a.async.js +1 -0
  164. package/static/dist/src__pages__setting__appModal.251cd14f.async.js +1 -0
  165. package/static/dist/src__pages__setting__dependence.8a7a9529.async.js +1 -0
  166. package/static/dist/src__pages__setting__index.cc85fdfb.async.js +1 -0
  167. package/static/dist/src__pages__setting__notification.390fc905.async.js +1 -0
  168. package/static/dist/src__pages__setting__other.b22d2165.async.js +1 -0
  169. package/static/dist/src__pages__setting__security.598720a8.async.js +1 -0
  170. package/static/dist/src__pages__setting__systemLog.67406721.async.js +1 -0
  171. package/static/dist/{src__pages__subscription__logModal.0caa7283.async.js → src__pages__subscription__logModal.3864b37f.async.js} +1 -1
  172. package/static/dist/src__pages__subscription__modal.3562c670.async.js +1 -0
  173. package/static/dist/{umi.ef8199a4.js → umi.ca04a019.js} +1 -1
  174. package/version.yaml +33 -4
  175. package/sample/notify.py.save +0 -1010
  176. package/static/dist/105.85a5c47a.async.js +0 -1
  177. package/static/dist/1083.f86ce804.async.js +0 -1
  178. package/static/dist/1147.32f41a88.async.js +0 -1
  179. package/static/dist/1352.ab6da08e.async.js +0 -1
  180. package/static/dist/1690.f0290540.async.js +0 -1
  181. package/static/dist/1742.6cbe5aca.async.js +0 -1
  182. package/static/dist/2208.8e3a7325.async.js +0 -1
  183. package/static/dist/5312.74b95311.async.js +0 -1
  184. package/static/dist/5691.931f59c5.async.js +0 -1
  185. package/static/dist/6159.55cb068a.async.js +0 -1
  186. package/static/dist/7025.f4080d63.async.js +0 -1
  187. package/static/dist/739.6be5552a.async.js +0 -1
  188. package/static/dist/7571.4f6240b1.async.js +0 -1
  189. package/static/dist/786.59fc381c.async.js +0 -1
  190. package/static/dist/8317.c44c1ebd.async.js +0 -1
  191. package/static/dist/8826.0291edfd.async.js +0 -1
  192. package/static/dist/955.3c9481f7.async.js +0 -1
  193. package/static/dist/layouts__index.1fce90e0.chunk.css +0 -1
  194. package/static/dist/layouts__index.8dcf1576.async.js +0 -1
  195. package/static/dist/preload_helper.116a62f6.js +0 -1
  196. package/static/dist/src__pages__crontab__detail.b07f0c0a.async.js +0 -1
  197. package/static/dist/src__pages__crontab__index.2e2e1096.async.js +0 -1
  198. package/static/dist/src__pages__crontab__modal.4d8c2a22.async.js +0 -1
  199. package/static/dist/src__pages__crontab__type.db7c1858.async.js +0 -1
  200. package/static/dist/src__pages__dependence__modal.631ffb5b.async.js +0 -1
  201. package/static/dist/src__pages__env__editNameModal.ff85ef8c.async.js +0 -1
  202. package/static/dist/src__pages__env__index.a0a2fece.async.js +0 -1
  203. package/static/dist/src__pages__env__modal.d1004662.async.js +0 -1
  204. package/static/dist/src__pages__error__index.1bc3c90b.async.js +0 -1
  205. package/static/dist/src__pages__initialization__index.8b1cbaf9.async.js +0 -1
  206. package/static/dist/src__pages__script__editNameModal.53424d49.async.js +0 -1
  207. package/static/dist/src__pages__script__index.e65df827.async.js +0 -1
  208. package/static/dist/src__pages__script__renameModal.4bbe7fb1.async.js +0 -1
  209. package/static/dist/src__pages__script__saveModal.cf449f3c.async.js +0 -1
  210. package/static/dist/src__pages__script__setting.b345d59a.async.js +0 -1
  211. package/static/dist/src__pages__setting__appModal.03faec89.async.js +0 -1
  212. package/static/dist/src__pages__setting__dependence.4495c7b6.async.js +0 -1
  213. package/static/dist/src__pages__setting__index.6919c399.async.js +0 -1
  214. package/static/dist/src__pages__setting__notification.d6a3884f.async.js +0 -1
  215. package/static/dist/src__pages__setting__other.0d931d6f.async.js +0 -1
  216. package/static/dist/src__pages__setting__security.91cb545f.async.js +0 -1
  217. package/static/dist/src__pages__setting__systemLog.1d433a48.async.js +0 -1
  218. package/static/dist/src__pages__subscription__modal.0b84f6cf.async.js +0 -1
package/shell/bot.sh CHANGED
@@ -8,19 +8,33 @@ else
8
8
  repo_path="${dir_repo}/diybot"
9
9
  fi
10
10
 
11
- echo -e "\n1、安装bot依赖...\n"
12
- os_name=$(source /etc/os-release && echo "$ID")
13
- if [[ $os_name == 'alpine' ]]; then
14
- apk --no-cache add -f zlib-dev gcc jpeg-dev python3-dev musl-dev freetype-dev
15
- elif [[ $os_name == 'debian' ]] || [[ $os_name == 'ubuntu' ]]; then
16
- apt-get install -y gcc python3-dev musl-dev
17
- else
18
- echo -e "暂不支持此系统 $os_name"
19
- exit 1
11
+ t '\n1、安装bot依赖...\n'
12
+ os_name="${QL_OS_TYPE:-}"
13
+ if [ -z "$os_name" ]; then
14
+ os_name=$(source /etc/os-release && echo "$ID")
15
+ fi
16
+
17
+ # 非 root 用户使用 sudo
18
+ SUDO=""
19
+ if [ "$(id -u)" -ne 0 ]; then
20
+ SUDO="sudo"
20
21
  fi
21
- echo -e "\nbot依赖安装成功...\n"
22
22
 
23
- echo -e "2、下载bot所需文件...\n"
23
+ case "$os_name" in
24
+ alpine)
25
+ $SUDO apk --no-cache add -f zlib-dev gcc jpeg-dev python3-dev musl-dev freetype-dev
26
+ ;;
27
+ debian|ubuntu)
28
+ $SUDO apt-get install -y gcc python3-dev musl-dev zlib1g-dev libjpeg-dev libfreetype-dev
29
+ ;;
30
+ *)
31
+ t '暂不支持此系统 %s' "$os_name"
32
+ exit 1
33
+ ;;
34
+ esac
35
+ t '\nbot依赖安装成功...\n'
36
+
37
+ t '2、下载bot所需文件...\n'
24
38
  if [[ ! -d ${repo_path}/.git ]]; then
25
39
  rm -rf ${repo_path}
26
40
  git_clone_scripts ${url} ${repo_path} "main"
@@ -30,9 +44,9 @@ cp -rf "$repo_path/jbot" $dir_data
30
44
  if [[ ! -f "$dir_config/bot.json" ]]; then
31
45
  cp -f "$repo_path/config/bot.json" "$dir_config"
32
46
  fi
33
- echo -e "\nbot文件下载成功...\n"
47
+ t '\nbot文件下载成功...\n'
34
48
 
35
- echo -e "3、安装python3依赖...\n"
49
+ t '3、安装python3依赖...\n'
36
50
  cp -f "$repo_path/jbot/requirements.txt" "$dir_data"
37
51
 
38
52
  cd $dir_data
@@ -42,11 +56,11 @@ cat requirements.txt | while read LREAD; do
42
56
  fi
43
57
  done
44
58
 
45
- echo -e "\npython3依赖安装成功...\n"
59
+ t '\npython3依赖安装成功...\n'
46
60
 
47
- echo -e "4、启动bot程序...\n"
61
+ t '4、启动bot程序...\n'
48
62
  make_dir $dir_log/bot
49
63
  cd $dir_data
50
64
  ps -eo pid,command | grep "python3 -m jbot" | grep -v grep | awk '{print $1}' | xargs kill -9 2>/dev/null
51
65
  nohup python3 -m jbot >$dir_log/bot/nohup.log 2>&1 &
52
- echo -e "bot启动成功...\n"
66
+ t 'bot启动成功...\n'
package/shell/check.sh CHANGED
@@ -1,29 +1,29 @@
1
1
  #!/usr/bin/env bash
2
2
 
3
3
  reset_env() {
4
- echo -e "---> 1. 开始检测配置文件\n"
4
+ t '---> 1. 开始检测配置文件\n'
5
5
  fix_config
6
- echo -e "---> 配置文件检测完成\n"
6
+ t '---> 配置文件检测完成\n'
7
7
 
8
- echo -e "---> 2. 开始安装青龙依赖\n"
8
+ t '---> 2. 开始安装青龙依赖\n'
9
9
  npm_install_2 $dir_root
10
- echo -e "---> 青龙依赖安装完成\n"
10
+ t '---> 青龙依赖安装完成\n'
11
11
 
12
- echo -e "---> 脚本依赖安装完成\n"
12
+ t '---> 脚本依赖安装完成\n'
13
13
  }
14
14
 
15
15
  copy_dep() {
16
- echo -e "---> 1. 复制通知文件\n"
17
- echo -e "---> 复制一份 $file_notify_py_sample$file_notify_py\n"
16
+ t '---> 1. 复制通知文件\n'
17
+ t '---> 复制一份 %s%s\n' "$file_notify_py_sample" "$file_notify_py"
18
18
  cp -fv $file_notify_py_sample $file_notify_py
19
19
  echo
20
- echo -e "---> 复制一份 $file_notify_js_sample$file_notify_js\n"
20
+ t '---> 复制一份 %s%s\n' "$file_notify_js_sample" "$file_notify_js"
21
21
  cp -fv $file_notify_js_sample $file_notify_js
22
- echo -e "---> 通知文件复制完成\n"
22
+ t '---> 通知文件复制完成\n'
23
23
  }
24
24
 
25
25
  pm2_log() {
26
- echo -e "---> pm2日志"
26
+ t '---> pm2日志'
27
27
  local panelOut="/root/.pm2/logs/qinglong-out.log"
28
28
  local panelError="/root/.pm2/logs/qinglong-error.log"
29
29
  tail -n 300 "$panelOut"
@@ -31,10 +31,11 @@ pm2_log() {
31
31
  }
32
32
 
33
33
  check_ql() {
34
- local api=$(curl -s --noproxy "*" "http://0.0.0.0:${ql_port}")
35
- echo -e "\n=====> 检测面板\n\n$api\n"
34
+ local api=$(curl -s --noproxy "*" "http://localhost:${ql_port}")
35
+ t '\n=====> 检测面板'
36
+ echo -e "\n\n$api\n"
36
37
  if [[ $api =~ "<div id=\"root\"></div>" ]]; then
37
- echo -e "=====> 面板服务启动正常\n"
38
+ t '=====> 面板服务启动正常\n'
38
39
  fi
39
40
  }
40
41
 
@@ -42,21 +43,22 @@ check_pm2() {
42
43
  pm2_log
43
44
  local currentTimeStamp=$(date +%s)
44
45
  local api=$(
45
- curl -s --noproxy "*" "http://0.0.0.0:${ql_port}/api/system?t=$currentTimeStamp" \
46
+ curl -s --noproxy "*" "http://localhost:${ql_port}/api/system?t=$currentTimeStamp" \
46
47
  -H 'Accept: */*' \
47
48
  -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36' \
48
- -H "Referer: http://0.0.0.0:${ql_port}/crontab" \
49
+ -H "Referer: http://localhost:${ql_port}/crontab" \
49
50
  -H 'Accept-Language: en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7' \
50
51
  --compressed
51
52
  )
52
- echo -e "\n=====> 检测后台\n\n$api\n"
53
+ t '\n=====> 检测后台'
54
+ echo -e "\n\n$api\n"
53
55
  if [[ $api =~ "{\"code\"" ]]; then
54
- echo -e "=====> 后台服务启动正常\n"
56
+ t '=====> 后台服务启动正常\n'
55
57
  fi
56
58
  }
57
59
 
58
60
  main() {
59
- echo -e "=====> 开始检测"
61
+ t '=====> 开始检测'
60
62
  npm i -g pnpm@8.3.1 pm2 ts-node
61
63
 
62
64
  reset_env
@@ -64,7 +66,7 @@ main() {
64
66
  check_ql
65
67
  check_pm2
66
68
  reload_pm2
67
- echo -e "\n=====> 检测结束\n"
69
+ t '\n=====> 检测结束\n'
68
70
  }
69
71
 
70
72
  main
@@ -0,0 +1,105 @@
1
+ # English language pack
2
+ declare -gA LANG_MESSAGES=(
3
+ ['任务随机延迟 %s 秒,将于 %s 开始,配置文件参数 RandomDelay 置空可取消延迟\n']='Task delayed %s seconds, will start at %s. Set RandomDelay to empty to cancel delay\n'
4
+ ['开始执行...\n']='Starting execution...\n'
5
+ ['已停止']='Stopped'
6
+ ['完成']='Completed'
7
+ ['失败(退出码 %s)']='Failed (exit code %s)'
8
+ ['安装 %s 依赖包...\n']='Installing %s dependencies...\n'
9
+ ['开始拉取仓库 %s 到 %s\n']='Cloning repository %s to %s\n'
10
+ ['添加成功']='Added successfully'
11
+ ['添加失败(%s)']='Add failed (%s)'
12
+ ['更新成功']='Updated successfully'
13
+ ['更新失败(%s)']='Update failed (%s)'
14
+ ['成功']='Success'
15
+ ['失败(%s)']='Failed (%s)'
16
+ ['通知发送成功🎉']='Notification sent successfully 🎉'
17
+ ['通知失败(%s)']='Notification failed (%s)'
18
+ ['当前有以下脚本可以运行:']='Available scripts:'
19
+ ['暂无脚本可以执行']='No scripts available'
20
+ ['警告:工作目录不存在 %s']='Warning: working directory does not exist: %s'
21
+ ['\n缺少并发运行的环境变量参数']='\nMissing concurrency environment variable'
22
+ ['\n缺少单独运行的参数 task xxx.js desi Test']='\nMissing parameter: task xxx.js desi Test'
23
+ ['暂不支持此系统 %s']='Unsupported system: %s'
24
+ ['检测到 pm2 服务正在运行']='pm2 service is running'
25
+ ['npm 模块位置: %s']='npm module location: %s'
26
+ ['导入数据成功 %s']='Data imported successfully: %s'
27
+ ['导出数据成功 %s']='Data exported successfully: %s'
28
+ ['当前版本: %s / 最新版本: %s']='Current: %s / Latest: %s'
29
+ ['已是最新版本']='Already up to date'
30
+ ['%s 个定时任务正在运行']='%s scheduled tasks running'
31
+ ['执行前置命令\n']='Running pre-command\n'
32
+ ['\n执行前置命令结束\n']='\nPre-command finished\n'
33
+ ['\n执行后置命令\n']='\nRunning post-command\n'
34
+ ['\n执行后置命令结束']='\nPost-command finished'
35
+ ['警告: PM2 启动失败 (退出码: %s),可能是由于硬件不兼容']='Warning: PM2 start failed (exit code: %s), possibly due to hardware incompatibility'
36
+ ['正在尝试直接使用 Node.js 启动服务...']='Attempting to start service with Node.js directly...'
37
+ ['已使用 Node.js 直接启动服务 (PID: %s)']='Service started with Node.js directly (PID: %s)'
38
+ ['注意: 使用此模式时,部分 PM2 管理功能将不可用']='Note: some PM2 management features are unavailable in this mode'
39
+ ['## 开始执行... %s\n']='## Starting... %s\n'
40
+ ['\n## 已停止 🛑... %s 耗时 %s 秒%s']='\n## Stopped 🛑... %s took %s seconds%s'
41
+ ['\n## 完成 ✅... %s 耗时 %s 秒%s']='\n## Completed ✅... %s took %s seconds%s'
42
+ ['\n## 失败 ❌(退出码 %s)... %s 耗时 %s 秒%s']='\n## Failed ❌(exit code %s)... %s took %s seconds%s'
43
+ ['%s -> 添加成功']='%s -> Added successfully'
44
+ ['%s -> 添加失败(%s)']='%s -> Add failed (%s)'
45
+ ['%s -> 更新成功']='%s -> Updated successfully'
46
+ ['%s -> 更新失败(%s)']='%s -> Update failed (%s)'
47
+ ['%s成功🎉']='%s succeeded 🎉'
48
+ ['%s失败(%s)']='%s failed (%s)'
49
+ ['检测到有%s的定时任务:']='Found %s scheduled tasks:'
50
+ ['\n开始尝试自动删除失效的定时任务...']='\nAttempting to remove invalid scheduled tasks...'
51
+ ['\n开始尝试自动添加定时任务...']='\nAttempting to add scheduled tasks...'
52
+ ['拉取 %s 成功...\n']='Pull %s succeeded...\n'
53
+ ['拉取 %s 失败,请检查日志...\n']='Pull %s failed, check logs...\n'
54
+ ['开始下载:%s 保存路径:%s\n']='Downloading: %s to: %s\n'
55
+ ['下载 %s 成功...\n']='Download %s succeeded...\n'
56
+ ['下载 %s 失败,保留之前正常下载的版本...\n']='Download %s failed, keeping previous version...\n'
57
+ ['%s文件不存在,跳过执行...\n']='%s does not exist, skipping...\n'
58
+ ['使用 %s 源更新...\n']='Updating using %s mirror...\n'
59
+ ['更新青龙源文件成功...\n']='Qinglong source updated successfully\n'
60
+ ['更新青龙源文件失败,请检查网络...\n']='Qinglong source update failed, check network\n'
61
+ ['更新青龙静态资源成功...\n']='Static assets updated successfully\n'
62
+ ['更新青龙静态资源失败,请检查网络...\n']='Static assets update failed, check network\n'
63
+ ['\n开始检测依赖...\n']='\nChecking dependencies...\n'
64
+ ['\n依赖检测安装成功...\n']='\nDependencies installed successfully\n'
65
+ ['更新包下载成功...\n']='Package download succeeded\n'
66
+ ['\n依赖检测安装失败,请检查网络...\n']='\nDependency installation failed, check network\n'
67
+ ['\n1、安装bot依赖...\n']='\n1. Installing bot dependencies...\n'
68
+ ['\nbot依赖安装成功...\n']='\nBot dependencies installed\n'
69
+ ['2、下载bot所需文件...\n']='2. Downloading bot files...\n'
70
+ ['\nbot文件下载成功...\n']='\nBot files downloaded\n'
71
+ ['3、安装python3依赖...\n']='3. Installing python3 dependencies...\n'
72
+ ['\npython3依赖安装成功...\n']='\nPython3 dependencies installed\n'
73
+ ['4、启动bot程序...\n']='4. Starting bot...\n'
74
+ ['bot启动成功...\n']='Bot started successfully\n'
75
+ # check.sh
76
+ ['---> 1. 开始检测配置文件\n']='---> 1. Checking config...\n'
77
+ ['---> 配置文件检测完成\n']='---> Config check complete\n'
78
+ ['---> 2. 开始安装青龙依赖\n']='---> 2. Installing qinglong dependencies...\n'
79
+ ['---> 青龙依赖安装完成\n']='---> Dependencies installed\n'
80
+ ['---> 脚本依赖安装完成\n']='---> Script dependencies installed\n'
81
+ ['---> 1. 复制通知文件\n']='---> 1. Copying notification files...\n'
82
+ ['---> 复制一份 %s 为 %s\n']='---> Copying %s to %s\n'
83
+ ['---> 通知文件复制完成\n']='---> Notification files copied\n'
84
+ ['---> pm2日志']='---> pm2 log'
85
+ ['\n=====> 检测面板']='\n=====> Checking panel'
86
+ ['=====> 面板服务启动正常\n']='=====> Panel service running normally\n'
87
+ ['\n=====> 检测后台']='\n=====> Checking backend'
88
+ ['=====> 后台服务启动正常\n']='=====> Backend service running normally\n'
89
+ ['=====> 开始检测']='=====> Starting check'
90
+ ['\n=====> 检测结束\n']='\n=====> Check complete\n'
91
+ # rmlog.sh
92
+ ['查询文件 %s']='Checking file: %s'
93
+ ['删除中~']='Deleting...'
94
+ ['正在被 %s 使用,跳过~']='In use by %s, skipping...'
95
+ ['查找旧日志文件中...\n']='Looking for old log files...\n'
96
+ ['删除旧日志执行完毕\n']='Old log cleanup complete\n'
97
+ # start.sh
98
+ ['未找到 qinglong 模块,请先执行 npm i -g @whyour/qinglong 安装']='Module not found. Run: npm i -g @whyour/qinglong'
99
+ ['请先手动设置 export QL_DIR=%s,环境变量,并手动添加到系统环境变量,然后再次执行命令 qinglong 启动服务']='Set env: export QL_DIR=%s, then run qinglong to start'
100
+ ['请先手动设置数据存储目录 export QL_DATA_DIR 环境变量,目录必须以斜杠开头的绝对路径,并且以 /data 结尾,例如 /ql/data 并手动添加到系统环境变量']='Set QL_DATA_DIR (absolute path ending with /data, e.g. /ql/data)'
101
+ ['QL_DATA_DIR 必须以 /data 结尾,例如 /ql/data,如果有历史数据,请新建 data 目录,把历史数据放到 data 目录中']='QL_DATA_DIR must end with /data, e.g. /ql/data'
102
+ ['暂不支持此系统部署 %s']='Unsupported system for deployment: %s'
103
+ # update.sh
104
+ ['命令输入错误...\n']='Invalid command...\n'
105
+ )
@@ -0,0 +1,105 @@
1
+ # 中文语言包(zh key → zh value 恒等,en 包做实际翻译)
2
+ declare -gA LANG_MESSAGES=(
3
+ ['任务随机延迟 %s 秒,将于 %s 开始,配置文件参数 RandomDelay 置空可取消延迟\n']='任务随机延迟 %s 秒,将于 %s 开始,配置文件参数 RandomDelay 置空可取消延迟\n'
4
+ ['开始执行...\n']='开始执行...\n'
5
+ ['已停止']='已停止'
6
+ ['完成']='完成'
7
+ ['失败(退出码 %s)']='失败(退出码 %s)'
8
+ ['安装 %s 依赖包...\n']='安装 %s 依赖包...\n'
9
+ ['开始拉取仓库 %s 到 %s\n']='开始拉取仓库 %s 到 %s\n'
10
+ ['添加成功']='添加成功'
11
+ ['添加失败(%s)']='添加失败(%s)'
12
+ ['更新成功']='更新成功'
13
+ ['更新失败(%s)']='更新失败(%s)'
14
+ ['成功']='成功'
15
+ ['失败(%s)']='失败(%s)'
16
+ ['通知发送成功🎉']='通知发送成功🎉'
17
+ ['通知失败(%s)']='通知失败(%s)'
18
+ ['当前有以下脚本可以运行:']='当前有以下脚本可以运行:'
19
+ ['暂无脚本可以执行']='暂无脚本可以执行'
20
+ ['警告:工作目录不存在 %s']='警告:工作目录不存在 %s'
21
+ ['\n缺少并发运行的环境变量参数']='\n缺少并发运行的环境变量参数'
22
+ ['\n缺少单独运行的参数 task xxx.js desi Test']='\n缺少单独运行的参数 task xxx.js desi Test'
23
+ ['暂不支持此系统 %s']='暂不支持此系统 %s'
24
+ ['检测到 pm2 服务正在运行']='检测到 pm2 服务正在运行'
25
+ ['npm 模块位置: %s']='npm 模块位置: %s'
26
+ ['导入数据成功 %s']='导入数据成功 %s'
27
+ ['导出数据成功 %s']='导出数据成功 %s'
28
+ ['当前版本: %s / 最新版本: %s']='当前版本: %s / 最新版本: %s'
29
+ ['已是最新版本']='已是最新版本'
30
+ ['%s 个定时任务正在运行']='%s 个定时任务正在运行'
31
+ ['执行前置命令\n']='执行前置命令\n'
32
+ ['\n执行前置命令结束\n']='\n执行前置命令结束\n'
33
+ ['\n执行后置命令\n']='\n执行后置命令\n'
34
+ ['\n执行后置命令结束']='\n执行后置命令结束'
35
+ ['警告: PM2 启动失败 (退出码: %s),可能是由于硬件不兼容']='警告: PM2 启动失败 (退出码: %s),可能是由于硬件不兼容'
36
+ ['正在尝试直接使用 Node.js 启动服务...']='正在尝试直接使用 Node.js 启动服务...'
37
+ ['已使用 Node.js 直接启动服务 (PID: %s)']='已使用 Node.js 直接启动服务 (PID: %s)'
38
+ ['注意: 使用此模式时,部分 PM2 管理功能将不可用']='注意: 使用此模式时,部分 PM2 管理功能将不可用'
39
+ ['## 开始执行... %s\n']='## 开始执行... %s\n'
40
+ ['\n## 已停止 🛑... %s 耗时 %s 秒%s']='\n## 已停止 🛑... %s 耗时 %s 秒%s'
41
+ ['\n## 完成 ✅... %s 耗时 %s 秒%s']='\n## 完成 ✅... %s 耗时 %s 秒%s'
42
+ ['\n## 失败 ❌(退出码 %s)... %s 耗时 %s 秒%s']='\n## 失败 ❌(退出码 %s)... %s 耗时 %s 秒%s'
43
+ ['%s -> 添加成功']='%s -> 添加成功'
44
+ ['%s -> 添加失败(%s)']='%s -> 添加失败(%s)'
45
+ ['%s -> 更新成功']='%s -> 更新成功'
46
+ ['%s -> 更新失败(%s)']='%s -> 更新失败(%s)'
47
+ ['%s成功🎉']='%s成功🎉'
48
+ ['%s失败(%s)']='%s失败(%s)'
49
+ ['检测到有%s的定时任务:']='检测到有%s的定时任务:'
50
+ ['\n开始尝试自动删除失效的定时任务...']='\n开始尝试自动删除失效的定时任务...'
51
+ ['\n开始尝试自动添加定时任务...']='\n开始尝试自动添加定时任务...'
52
+ ['拉取 %s 成功...\n']='拉取 %s 成功...\n'
53
+ ['拉取 %s 失败,请检查日志...\n']='拉取 %s 失败,请检查日志...\n'
54
+ ['开始下载:%s 保存路径:%s\n']='开始下载:%s 保存路径:%s\n'
55
+ ['下载 %s 成功...\n']='下载 %s 成功...\n'
56
+ ['下载 %s 失败,保留之前正常下载的版本...\n']='下载 %s 失败,保留之前正常下载的版本...\n'
57
+ ['%s文件不存在,跳过执行...\n']='%s文件不存在,跳过执行...\n'
58
+ ['使用 %s 源更新...\n']='使用 %s 源更新...\n'
59
+ ['更新青龙源文件成功...\n']='更新青龙源文件成功...\n'
60
+ ['更新青龙源文件失败,请检查网络...\n']='更新青龙源文件失败,请检查网络...\n'
61
+ ['更新青龙静态资源成功...\n']='更新青龙静态资源成功...\n'
62
+ ['更新青龙静态资源失败,请检查网络...\n']='更新青龙静态资源失败,请检查网络...\n'
63
+ ['\n开始检测依赖...\n']='\n开始检测依赖...\n'
64
+ ['\n依赖检测安装成功...\n']='\n依赖检测安装成功...\n'
65
+ ['更新包下载成功...\n']='更新包下载成功...\n'
66
+ ['\n依赖检测安装失败,请检查网络...\n']='\n依赖检测安装失败,请检查网络...\n'
67
+ ['\n1、安装bot依赖...\n']='\n1、安装bot依赖...\n'
68
+ ['\nbot依赖安装成功...\n']='\nbot依赖安装成功...\n'
69
+ ['2、下载bot所需文件...\n']='2、下载bot所需文件...\n'
70
+ ['\nbot文件下载成功...\n']='\nbot文件下载成功...\n'
71
+ ['3、安装python3依赖...\n']='3、安装python3依赖...\n'
72
+ ['\npython3依赖安装成功...\n']='\npython3依赖安装成功...\n'
73
+ ['4、启动bot程序...\n']='4、启动bot程序...\n'
74
+ ['bot启动成功...\n']='bot启动成功...\n'
75
+ # check.sh
76
+ ['---> 1. 开始检测配置文件\n']='---> 1. 开始检测配置文件\n'
77
+ ['---> 配置文件检测完成\n']='---> 配置文件检测完成\n'
78
+ ['---> 2. 开始安装青龙依赖\n']='---> 2. 开始安装青龙依赖\n'
79
+ ['---> 青龙依赖安装完成\n']='---> 青龙依赖安装完成\n'
80
+ ['---> 脚本依赖安装完成\n']='---> 脚本依赖安装完成\n'
81
+ ['---> 1. 复制通知文件\n']='---> 1. 复制通知文件\n'
82
+ ['---> 复制一份 %s 为 %s\n']='---> 复制一份 %s 为 %s\n'
83
+ ['---> 通知文件复制完成\n']='---> 通知文件复制完成\n'
84
+ ['---> pm2日志']='---> pm2日志'
85
+ ['\n=====> 检测面板']='\n=====> 检测面板'
86
+ ['=====> 面板服务启动正常\n']='=====> 面板服务启动正常\n'
87
+ ['\n=====> 检测后台']='\n=====> 检测后台'
88
+ ['=====> 后台服务启动正常\n']='=====> 后台服务启动正常\n'
89
+ ['=====> 开始检测']='=====> 开始检测'
90
+ ['\n=====> 检测结束\n']='\n=====> 检测结束\n'
91
+ # rmlog.sh
92
+ ['查询文件 %s']='查询文件 %s'
93
+ ['删除中~']='删除中~'
94
+ ['正在被 %s 使用,跳过~']='正在被 %s 使用,跳过~'
95
+ ['查找旧日志文件中...\n']='查找旧日志文件中...\n'
96
+ ['删除旧日志执行完毕\n']='删除旧日志执行完毕\n'
97
+ # start.sh
98
+ ['未找到 qinglong 模块,请先执行 npm i -g @whyour/qinglong 安装']='未找到 qinglong 模块,请先执行 npm i -g @whyour/qinglong 安装'
99
+ ['请先手动设置 export QL_DIR=%s,环境变量,并手动添加到系统环境变量,然后再次执行命令 qinglong 启动服务']='请先手动设置 export QL_DIR=%s,环境变量,并手动添加到系统环境变量,然后再次执行命令 qinglong 启动服务'
100
+ ['请先手动设置数据存储目录 export QL_DATA_DIR 环境变量,目录必须以斜杠开头的绝对路径,并且以 /data 结尾,例如 /ql/data 并手动添加到系统环境变量']='请先手动设置数据存储目录 export QL_DATA_DIR 环境变量,目录必须以斜杠开头的绝对路径,并且以 /data 结尾,例如 /ql/data 并手动添加到系统环境变量'
101
+ ['QL_DATA_DIR 必须以 /data 结尾,例如 /ql/data,如果有历史数据,请新建 data 目录,把历史数据放到 data 目录中']='QL_DATA_DIR 必须以 /data 结尾,例如 /ql/data,如果有历史数据,请新建 data 目录,把历史数据放到 data 目录中'
102
+ ['暂不支持此系统部署 %s']='暂不支持此系统部署 %s'
103
+ # update.sh
104
+ ['命令输入错误...\n']='命令输入错误...\n'
105
+ )
package/shell/otask.sh CHANGED
@@ -24,7 +24,13 @@ random_delay() {
24
24
  done
25
25
 
26
26
  local delay_second=$(($(gen_random_num "$random_delay_max") + 1))
27
- echo -e "任务随机延迟 $delay_second 秒,配置文件参数 RandomDelay 置空可取消延迟 \n"
27
+ local start_time
28
+ if [[ $is_macos -eq 1 ]]; then
29
+ start_time=$(date -v "+${delay_second}S" "+%Y-%m-%d %H:%M:%S")
30
+ else
31
+ start_time=$(date -d "+${delay_second} seconds" "+%Y-%m-%d %H:%M:%S")
32
+ fi
33
+ t '任务随机延迟 %s 秒,将于 %s 开始,配置文件参数 RandomDelay 置空可取消延迟\n' "$delay_second" "$start_time"
28
34
  sleep $delay_second
29
35
  fi
30
36
  }
@@ -83,6 +89,58 @@ clear_non_sh_env() {
83
89
  fi
84
90
  }
85
91
 
92
+ append_node_dependency_path() {
93
+ export PREV_NODE_PATH="${NODE_PATH:=}"
94
+
95
+ local pnpm_global_path=$(pnpm root -g 2>/dev/null)
96
+ if [[ -n "$pnpm_global_path" ]]; then
97
+ export QL_NODE_GLOBAL_PATH="$pnpm_global_path"
98
+ export NODE_PATH="${NODE_PATH:+${NODE_PATH}:}${pnpm_global_path}"
99
+ fi
100
+ }
101
+
102
+ enter_script_workdir() {
103
+ local use_dot_prefix="$1"
104
+
105
+ # 如果定时任务显式指定了工作目录,优先使用
106
+ if [[ -n "${work_dir:=}" ]]; then
107
+ local _target_dir
108
+ if [[ "${work_dir}" == /* ]]; then
109
+ _target_dir="${work_dir}"
110
+ else
111
+ _target_dir="${dir_scripts}/${work_dir}"
112
+ fi
113
+ if [[ -d "${_target_dir}" ]]; then
114
+ cd "${_target_dir}"
115
+ if [[ ${file_param} =~ "/" ]]; then
116
+ local script_name="${file_param##*/}"
117
+ if [[ "${use_dot_prefix}" == "true" ]]; then
118
+ file_param="./${script_name}"
119
+ else
120
+ file_param="${script_name}"
121
+ fi
122
+ fi
123
+ return
124
+ fi
125
+ t '警告:工作目录不存在 %s' "${_target_dir}"
126
+ fi
127
+
128
+ cd $dir_scripts
129
+ if [[ ${file_param} =~ "/" ]]; then
130
+ local script_dir="${file_param%/*}"
131
+ local script_name="${file_param##*/}"
132
+
133
+ if [[ -d ${script_dir} ]]; then
134
+ cd ${script_dir}
135
+ if [[ "${use_dot_prefix}" == "true" ]]; then
136
+ file_param="./${script_name}"
137
+ else
138
+ file_param="${script_name}"
139
+ fi
140
+ fi
141
+ fi
142
+ }
143
+
86
144
  ## 正常运行单个脚本,$1:传入参数
87
145
  run_normal() {
88
146
  local file_param=$1
@@ -90,12 +148,7 @@ run_normal() {
90
148
  random_delay "$file_param"
91
149
  fi
92
150
 
93
- cd $dir_scripts
94
- local relative_path="${file_param%/*}"
95
- if [[ ${file_param} != /* ]] && [[ ! -z ${relative_path} ]] && [[ ${file_param} =~ "/" ]]; then
96
- cd ${relative_path}
97
- file_param=${file_param/$relative_path\//}
98
- fi
151
+ enter_script_workdir
99
152
 
100
153
  if [[ $isJsOrPythonFile == 'false' ]]; then
101
154
  clear_non_sh_env
@@ -120,7 +173,7 @@ run_concurrent() {
120
173
  local env_param="$2"
121
174
  local num_param=$(echo "$3" | perl -pe "s|.*$2(.*)|\1|" | awk '{$1=$1};1')
122
175
  if [[ ! $env_param ]]; then
123
- echo -e "\n 缺少并发运行的环境变量参数"
176
+ t '\n缺少并发运行的环境变量参数'
124
177
  exit 1
125
178
  fi
126
179
 
@@ -128,12 +181,7 @@ run_concurrent() {
128
181
  time=$(date "+$mtime_format")
129
182
  single_log_time=$(format_log_time "$mtime_format" "$time")
130
183
 
131
- cd $dir_scripts
132
- local relative_path="${file_param%/*}"
133
- if [[ ! -z ${relative_path} ]] && [[ ${file_param} =~ "/" ]]; then
134
- cd ${relative_path}
135
- file_param=${file_param/$relative_path\//}
136
- fi
184
+ enter_script_workdir
137
185
 
138
186
  local j=0
139
187
  for i in ${array_run[@]}; do
@@ -162,7 +210,7 @@ run_designated() {
162
210
  local env_param="$2"
163
211
  local num_param=$(echo "$3" | perl -pe "s|.*$2(.*)|\1|" | awk '{$1=$1};1')
164
212
  if [[ ! $env_param ]]; then
165
- echo -e "\n 缺少单独运行的参数 task xxx.js desi Test"
213
+ t '\n缺少单独运行的参数 task xxx.js desi Test'
166
214
  exit 1
167
215
  fi
168
216
 
@@ -182,12 +230,7 @@ run_designated() {
182
230
  clear_non_sh_env
183
231
  fi
184
232
 
185
- cd $dir_scripts
186
- local relative_path="${file_param%/*}"
187
- if [[ ! -z ${relative_path} ]] && [[ ${file_param} =~ "/" ]]; then
188
- cd ${relative_path}
189
- file_param=${file_param/$relative_path\//}
190
- fi
233
+ enter_script_workdir
191
234
 
192
235
  envParam="${env_param}" numParam="${num_param}" $timeoutCmd $which_program $file_param "${script_params[@]}"
193
236
  }
@@ -196,14 +239,53 @@ run_designated() {
196
239
  run_else() {
197
240
  local file_param="$1"
198
241
 
199
- cd $dir_scripts
200
- local relative_path="${file_param%/*}"
201
- if [[ ! -z ${relative_path} ]] && [[ ${file_param} =~ "/" ]]; then
202
- cd ${relative_path}
203
- file_param=${file_param/$relative_path\//.\/}
242
+ # 判断 file_param 本身是否是脚本文件
243
+ local is_file_script="false"
244
+ if [[ "$file_param" == *.js || "$file_param" == *.mjs ||
245
+ "$file_param" == *.py || "$file_param" == *.pyc ||
246
+ "$file_param" == *.sh || "$file_param" == *.ts ]]; then
247
+ is_file_script="true"
204
248
  fi
205
249
 
206
- shift
250
+ if [[ "$is_file_script" != "true" ]]; then
251
+ # file_param 不是脚本,从后续参数中查找脚本路径来确定工作目录
252
+ local script_for_dir=""
253
+ for arg in "$@"; do
254
+ if [[ "$arg" == *.js || "$arg" == *.mjs ||
255
+ "$arg" == *.py || "$arg" == *.pyc ||
256
+ "$arg" == *.sh || "$arg" == *.ts ]]; then
257
+ script_for_dir="$arg"
258
+ break
259
+ fi
260
+ done
261
+
262
+ if [[ -n "$script_for_dir" ]]; then
263
+ local saved_file_param="$file_param"
264
+ file_param="$script_for_dir"
265
+ enter_script_workdir true
266
+ local adjusted_script="$file_param"
267
+ file_param="$saved_file_param"
268
+
269
+ shift
270
+ local new_args=()
271
+ for arg in "$@"; do
272
+ if [[ "$arg" == "$script_for_dir" ]]; then
273
+ new_args+=("$adjusted_script")
274
+ else
275
+ new_args+=("$arg")
276
+ fi
277
+ done
278
+ set -- "${new_args[@]}"
279
+ else
280
+ # 没有找到脚本参数,只 cd 到 scripts 目录
281
+ enter_script_workdir true
282
+ shift
283
+ fi
284
+ else
285
+ # file_param 本身就是脚本,直接用 enter_script_workdir 处理
286
+ enter_script_workdir true
287
+ shift
288
+ fi
207
289
 
208
290
  clear_non_sh_env
209
291
  $timeoutCmd $which_program $file_param "$@"
@@ -242,7 +324,7 @@ check_nounset() {
242
324
  }
243
325
 
244
326
  main() {
245
- if [[ $1 == *.js ]] || [[ $1 == *.py ]] || [[ $1 == *.pyc ]] || [[ $1 == *.sh ]] || [[ $1 == *.ts ]]; then
327
+ if [[ $1 == *.js ]] || [[ $1 == *.mjs ]] || [[ $1 == *.py ]] || [[ $1 == *.pyc ]] || [[ $1 == *.sh ]] || [[ $1 == *.ts ]]; then
246
328
  if [[ $1 == *.sh ]]; then
247
329
  timeoutCmd=""
248
330
  fi
@@ -278,15 +360,19 @@ main() {
278
360
 
279
361
  handle_task_start "${task_shell_params[@]}"
280
362
  check_file "${task_shell_params[@]}"
363
+ append_node_dependency_path
281
364
  if [[ $isJsOrPythonFile == 'false' ]]; then
282
365
  run_task_before "${task_shell_params[@]}"
283
366
  fi
284
367
  set_u_on="false"
285
368
  check_nounset
286
369
  main "${task_shell_params[@]}"
370
+ _task_exit_code=$?
287
371
  if [[ "$set_u_on" == 'true' ]]; then
288
372
  set -u
289
373
  fi
374
+ export NODE_PATH="${PREV_NODE_PATH}"
375
+ unset QL_NODE_GLOBAL_PATH
290
376
  if [[ $isJsOrPythonFile == 'true' ]]; then
291
377
  export NODE_OPTIONS="${PREV_NODE_OPTIONS}"
292
378
  export PYTHONPATH="${PREV_PYTHONPATH}"
@@ -1,11 +1,29 @@
1
1
  const grpc = require('@grpc/grpc-js');
2
2
  const protoLoader = require('@grpc/proto-loader');
3
+ const { readFileSync } = require('fs');
3
4
  const { join } = require('path');
4
5
 
5
6
  class GrpcClient {
7
+ static #certDir = join(
8
+ process.env.QL_DATA_DIR || join(process.env.QL_DIR, 'data'),
9
+ 'config/grpc',
10
+ );
11
+
12
+ static #loadTlsCredentials() {
13
+ try {
14
+ return grpc.credentials.createSsl(
15
+ readFileSync(join(GrpcClient.#certDir, 'ca.crt')),
16
+ readFileSync(join(GrpcClient.#certDir, 'client.key')),
17
+ readFileSync(join(GrpcClient.#certDir, 'client.crt')),
18
+ );
19
+ } catch {
20
+ return grpc.credentials.createInsecure();
21
+ }
22
+ }
23
+
6
24
  static #config = {
7
25
  protoPath: join(process.env.QL_DIR, 'back/protos/api.proto'),
8
- serverAddress: `0.0.0.0:${process.env.GRPC_PORT || '5500'}`,
26
+ serverAddress: `localhost:${process.env.GRPC_PORT || '5500'}`,
9
27
  protoOptions: {
10
28
  keepCase: true,
11
29
  longs: String,
@@ -58,7 +76,7 @@ class GrpcClient {
58
76
 
59
77
  this.#client = new apiProto.Api(
60
78
  serverAddress,
61
- grpc.credentials.createInsecure(),
79
+ GrpcClient.#loadTlsCredentials(),
62
80
  grpcOptions,
63
81
  );
64
82
  } catch (error) {