@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.
- package/.env.example +5 -0
- package/AGENTS.md +43 -0
- package/CLAUDE.md +43 -0
- package/README-en.md +11 -0
- package/README.md +11 -0
- package/docker/Dockerfile +51 -69
- package/docker/Dockerfile.310 +94 -0
- package/docker/Dockerfile.debian +120 -0
- package/docker/{310.Dockerfile → Dockerfile.debian310} +13 -5
- package/docker/docker-entrypoint.sh +95 -3
- package/docs/PROJECT_ARCHITECTURE.md +550 -0
- package/package.json +28 -25
- package/sample/config.sample.sh +12 -1
- package/sample/notify.js +81 -9
- package/sample/notify.py +54 -11
- package/shell/api.sh +44 -20
- package/shell/bot.sh +30 -16
- package/shell/check.sh +21 -19
- package/shell/lang/en.sh +105 -0
- package/shell/lang/zh.sh +105 -0
- package/shell/otask.sh +114 -28
- package/shell/preload/client.js +20 -2
- package/shell/preload/esm-loader.mjs +41 -0
- package/shell/preload/sitecustomize.js +36 -0
- package/shell/pub.sh +8 -8
- package/shell/rmlog.sh +5 -5
- package/shell/share.sh +49 -30
- package/shell/start.sh +40 -27
- package/shell/task.sh +10 -2
- package/shell/update.sh +22 -22
- package/static/build/api/config.js +17 -7
- package/static/build/api/cron.js +38 -1
- package/static/build/api/dashboard.js +337 -0
- package/static/build/api/env.js +40 -2
- package/static/build/api/index.js +2 -0
- package/static/build/api/log.js +5 -4
- package/static/build/api/script.js +34 -9
- package/static/build/api/system.js +16 -1
- package/static/build/api/user.js +6 -5
- package/static/build/app.js +3 -0
- package/static/build/config/const.js +7 -6
- package/static/build/config/container.js +12 -0
- package/static/build/config/grpcCerts.js +150 -0
- package/static/build/config/index.js +6 -0
- package/static/build/config/util.js +66 -15
- package/static/build/data/cron.js +3 -1
- package/static/build/data/cronStats.js +59 -0
- package/static/build/data/env.js +2 -0
- package/static/build/data/notify.js +11 -1
- package/static/build/data/runningInstance.js +57 -0
- package/static/build/loaders/app.js +1 -1
- package/static/build/loaders/db.js +6 -0
- package/static/build/loaders/express.js +2 -1
- package/static/build/loaders/initData.js +19 -2
- package/static/build/loaders/initFile.js +2 -0
- package/static/build/schedule/api.js +1 -1
- package/static/build/schedule/client.js +9 -1
- package/static/build/schedule/health.js +1 -1
- package/static/build/services/config.js +19 -5
- package/static/build/services/cron.js +118 -8
- package/static/build/services/env.js +31 -3
- package/static/build/services/grpc.js +32 -6
- package/static/build/services/http.js +33 -18
- package/static/build/services/notify.js +40 -3
- package/static/build/services/open.js +2 -1
- package/static/build/services/sshKey.js +6 -3
- package/static/build/services/subscription.js +2 -1
- package/static/build/services/system.js +22 -7
- package/static/build/services/user.js +8 -7
- package/static/build/shared/i18n.js +105 -0
- package/static/build/shared/pLimit.js +12 -1
- package/static/build/shared/runCron.js +5 -0
- package/static/build/validation/schedule.js +1 -0
- package/static/dist/1089.0ecc5383.async.js +1 -0
- package/static/dist/1147.c420132e.async.js +1 -0
- package/static/dist/1192.4e5740f2.async.js +1 -0
- package/static/dist/1214.c6469b53.async.js +1 -0
- package/static/dist/134.54df9e38.async.js +1 -0
- package/static/dist/1352.96a77e1d.async.js +1 -0
- package/static/dist/{1765.d8e002d7.async.js → 1765.5ac01a93.async.js} +1 -1
- package/static/dist/1836.f0b74cf1.async.js +1 -0
- package/static/dist/{1885.e0d00d2d.async.js → 1885.e1ea09f6.async.js} +1 -1
- package/static/dist/1967.3f3945d0.async.js +1 -0
- package/static/dist/{2096.383c1047.async.js → 2096.6d98fd12.async.js} +1 -1
- package/static/dist/2208.f7ba3dfa.async.js +1 -0
- package/static/dist/2286.164bb089.async.js +1 -0
- package/static/dist/2476.4e9b0992.async.js +1 -0
- package/static/dist/2537.2b262ee0.async.js +1 -0
- package/static/dist/{255.12f03ab2.async.js → 255.8a80b983.async.js} +1 -1
- package/static/dist/2635.d4c59d23.async.js +1 -0
- package/static/dist/2808.cdc0995c.async.js +1 -0
- package/static/dist/{2821.be3dc88e.async.js → 2821.651f31e5.async.js} +1 -1
- package/static/dist/2986.4c49eef7.async.js +1 -0
- package/static/dist/300.08ac9875.async.js +1 -0
- package/static/dist/{3191.70bc19db.async.js → 3191.63263871.async.js} +1 -1
- package/static/dist/3714.8d6dba9e.async.js +1 -0
- package/static/dist/3906.a5eee612.async.js +1 -0
- package/static/dist/{6541.a6d499de.async.js → 3948.4fe809fd.async.js} +1 -1
- package/static/dist/{5171.7fc6d0a2.async.js → 4573.16f19278.async.js} +1 -1
- package/static/dist/{4859.93e63ea6.async.js → 4859.6592cebb.async.js} +1 -1
- package/static/dist/4887.8e3ae573.async.js +1 -0
- package/static/dist/{4902.54ecbdb5.async.js → 4902.555f92ab.async.js} +1 -1
- package/static/dist/{4934.1ca6b6b0.async.js → 4934.f3539d08.async.js} +1 -1
- package/static/dist/5077.cbd111cd.async.js +1 -0
- package/static/dist/{6247.b550d996.async.js → 5157.7c5af144.async.js} +1 -1
- package/static/dist/{540.481d4708.async.js → 540.19ddf020.async.js} +1 -1
- package/static/dist/{5970.10ac4f16.async.js → 5970.d3a6e7bd.async.js} +1 -1
- package/static/dist/{6013.2d7bb12a.async.js → 6013.4e38de36.async.js} +1 -1
- package/static/dist/{6016.9c379049.async.js → 6016.1e6574b6.async.js} +1 -1
- package/static/dist/{6035.5889ddc7.async.js → 6035.32ebfad9.async.js} +1 -1
- package/static/dist/6339.ab305e96.async.js +1 -0
- package/static/dist/6569.55177f6a.async.js +1 -0
- package/static/dist/6610.c111af7e.async.js +1 -0
- package/static/dist/{3034.6413c38e.async.js → 6638.87a163d2.async.js} +1 -1
- package/static/dist/{6646.5fc37228.async.js → 6646.95e92533.async.js} +1 -1
- package/static/dist/6665.1d099ad1.async.js +1 -0
- package/static/dist/{7355.b7c0562f.async.js → 7355.f9f263d8.async.js} +1 -1
- package/static/dist/{7384.065ccae2.async.js → 7384.1bb449d5.async.js} +1 -1
- package/static/dist/7441.ee1bf2bb.async.js +1 -0
- package/static/dist/{7508.a31662a3.async.js → 7508.7dcee91c.async.js} +1 -1
- package/static/dist/{7802.6b73f16a.async.js → 7802.34255805.async.js} +1 -1
- package/static/dist/{7984.e6bb9378.async.js → 7984.594296a5.async.js} +1 -1
- package/static/dist/{5653.4fce7ce8.async.js → 8033.5cb31493.async.js} +1 -1
- package/static/dist/8147.2fb55202.async.js +1 -0
- package/static/dist/8187.48c130d6.async.js +1 -0
- package/static/dist/8495.d53e15ca.async.js +1 -0
- package/static/dist/8587.315b06c0.async.js +1 -0
- package/static/dist/8826.2447a104.async.js +1 -0
- package/static/dist/{2742.4852aac8.async.js → 8865.ed665d31.async.js} +1 -1
- package/static/dist/901.7ee5c6d3.async.js +1 -0
- package/static/dist/9271.231db2ce.async.js +1 -0
- package/static/dist/9323.a33f47da.async.js +1 -0
- package/static/dist/{9730.30083c91.async.js → 9730.801665a3.async.js} +1 -1
- package/static/dist/{9761.627ca3b5.async.js → 9761.360a19d8.async.js} +1 -1
- package/static/dist/index.html +2 -2
- package/static/dist/layouts__index.a7a2bfe0.async.js +1 -0
- package/static/dist/layouts__index.adf0692f.chunk.css +1 -0
- package/static/dist/preload_helper.0431c0f3.js +1 -0
- package/static/dist/{src__pages__config__index.622b6ee8.async.js → src__pages__config__index.a22ff7dc.async.js} +1 -1
- package/static/dist/{src__pages__crontab__const.323d5124.async.js → src__pages__crontab__const.aba07deb.async.js} +1 -1
- package/static/dist/src__pages__crontab__detail.b9c36808.async.js +1 -0
- package/static/dist/src__pages__crontab__index.fed99fd0.async.js +1 -0
- package/static/dist/{src__pages__crontab__logModal.5e6a4bf2.async.js → src__pages__crontab__logModal.0b8cce8c.async.js} +1 -1
- package/static/dist/src__pages__crontab__modal.f7041c7c.async.js +1 -0
- package/static/dist/src__pages__crontab__type.d7af36e5.async.js +1 -0
- package/static/dist/{src__pages__crontab__viewCreateModal.ffcf7a24.async.js → src__pages__crontab__viewCreateModal.4d589f66.async.js} +1 -1
- package/static/dist/{src__pages__crontab__viewManageModal.c2724575.async.js → src__pages__crontab__viewManageModal.0e317746.async.js} +1 -1
- package/static/dist/src__pages__dashboard__index.b30f2f47.async.js +1 -0
- package/static/dist/{src__pages__dependence__logModal.f123e2ac.async.js → src__pages__dependence__logModal.0681830b.async.js} +1 -1
- package/static/dist/src__pages__dependence__modal.11124896.async.js +1 -0
- package/static/dist/src__pages__env__editNameModal.5d264b25.async.js +1 -0
- package/static/dist/src__pages__env__index.baa27d4e.async.js +1 -0
- package/static/dist/src__pages__env__modal.7f2ef1bc.async.js +1 -0
- package/static/dist/src__pages__error__index.f156b45e.async.js +1 -0
- package/static/dist/src__pages__initialization__index.e96d4ba8.async.js +1 -0
- package/static/dist/{src__pages__log__index.cf00c9af.async.js → src__pages__log__index.e0978bae.async.js} +1 -1
- package/static/dist/{src__pages__login__index.cd6e3152.async.js → src__pages__login__index.8c813eb1.async.js} +1 -1
- package/static/dist/{src__pages__script__components__UnsupportedFilePreview__index.39074c68.async.js → src__pages__script__components__UnsupportedFilePreview__index.c347a13a.async.js} +1 -1
- package/static/dist/src__pages__script__editNameModal.3e7e100d.async.js +1 -0
- package/static/dist/src__pages__script__index.2765d1b8.async.js +1 -0
- package/static/dist/src__pages__script__renameModal.5e987ef5.async.js +1 -0
- package/static/dist/src__pages__script__saveModal.3f9d23d6.async.js +1 -0
- package/static/dist/src__pages__script__setting.a535793a.async.js +1 -0
- package/static/dist/src__pages__setting__appModal.251cd14f.async.js +1 -0
- package/static/dist/src__pages__setting__dependence.8a7a9529.async.js +1 -0
- package/static/dist/src__pages__setting__index.cc85fdfb.async.js +1 -0
- package/static/dist/src__pages__setting__notification.390fc905.async.js +1 -0
- package/static/dist/src__pages__setting__other.b22d2165.async.js +1 -0
- package/static/dist/src__pages__setting__security.598720a8.async.js +1 -0
- package/static/dist/src__pages__setting__systemLog.67406721.async.js +1 -0
- package/static/dist/{src__pages__subscription__logModal.0caa7283.async.js → src__pages__subscription__logModal.3864b37f.async.js} +1 -1
- package/static/dist/src__pages__subscription__modal.3562c670.async.js +1 -0
- package/static/dist/{umi.ef8199a4.js → umi.ca04a019.js} +1 -1
- package/version.yaml +33 -4
- package/sample/notify.py.save +0 -1010
- package/static/dist/105.85a5c47a.async.js +0 -1
- package/static/dist/1083.f86ce804.async.js +0 -1
- package/static/dist/1147.32f41a88.async.js +0 -1
- package/static/dist/1352.ab6da08e.async.js +0 -1
- package/static/dist/1690.f0290540.async.js +0 -1
- package/static/dist/1742.6cbe5aca.async.js +0 -1
- package/static/dist/2208.8e3a7325.async.js +0 -1
- package/static/dist/5312.74b95311.async.js +0 -1
- package/static/dist/5691.931f59c5.async.js +0 -1
- package/static/dist/6159.55cb068a.async.js +0 -1
- package/static/dist/7025.f4080d63.async.js +0 -1
- package/static/dist/739.6be5552a.async.js +0 -1
- package/static/dist/7571.4f6240b1.async.js +0 -1
- package/static/dist/786.59fc381c.async.js +0 -1
- package/static/dist/8317.c44c1ebd.async.js +0 -1
- package/static/dist/8826.0291edfd.async.js +0 -1
- package/static/dist/955.3c9481f7.async.js +0 -1
- package/static/dist/layouts__index.1fce90e0.chunk.css +0 -1
- package/static/dist/layouts__index.8dcf1576.async.js +0 -1
- package/static/dist/preload_helper.116a62f6.js +0 -1
- package/static/dist/src__pages__crontab__detail.b07f0c0a.async.js +0 -1
- package/static/dist/src__pages__crontab__index.2e2e1096.async.js +0 -1
- package/static/dist/src__pages__crontab__modal.4d8c2a22.async.js +0 -1
- package/static/dist/src__pages__crontab__type.db7c1858.async.js +0 -1
- package/static/dist/src__pages__dependence__modal.631ffb5b.async.js +0 -1
- package/static/dist/src__pages__env__editNameModal.ff85ef8c.async.js +0 -1
- package/static/dist/src__pages__env__index.a0a2fece.async.js +0 -1
- package/static/dist/src__pages__env__modal.d1004662.async.js +0 -1
- package/static/dist/src__pages__error__index.1bc3c90b.async.js +0 -1
- package/static/dist/src__pages__initialization__index.8b1cbaf9.async.js +0 -1
- package/static/dist/src__pages__script__editNameModal.53424d49.async.js +0 -1
- package/static/dist/src__pages__script__index.e65df827.async.js +0 -1
- package/static/dist/src__pages__script__renameModal.4bbe7fb1.async.js +0 -1
- package/static/dist/src__pages__script__saveModal.cf449f3c.async.js +0 -1
- package/static/dist/src__pages__script__setting.b345d59a.async.js +0 -1
- package/static/dist/src__pages__setting__appModal.03faec89.async.js +0 -1
- package/static/dist/src__pages__setting__dependence.4495c7b6.async.js +0 -1
- package/static/dist/src__pages__setting__index.6919c399.async.js +0 -1
- package/static/dist/src__pages__setting__notification.d6a3884f.async.js +0 -1
- package/static/dist/src__pages__setting__other.0d931d6f.async.js +0 -1
- package/static/dist/src__pages__setting__security.91cb545f.async.js +0 -1
- package/static/dist/src__pages__setting__systemLog.1d433a48.async.js +0 -1
- 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
|
-
|
|
12
|
-
os_name
|
|
13
|
-
if [
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
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
|
-
|
|
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
|
-
|
|
47
|
+
t '\nbot文件下载成功...\n'
|
|
34
48
|
|
|
35
|
-
|
|
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
|
-
|
|
59
|
+
t '\npython3依赖安装成功...\n'
|
|
46
60
|
|
|
47
|
-
|
|
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
|
-
|
|
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
|
-
|
|
4
|
+
t '---> 1. 开始检测配置文件\n'
|
|
5
5
|
fix_config
|
|
6
|
-
|
|
6
|
+
t '---> 配置文件检测完成\n'
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
t '---> 2. 开始安装青龙依赖\n'
|
|
9
9
|
npm_install_2 $dir_root
|
|
10
|
-
|
|
10
|
+
t '---> 青龙依赖安装完成\n'
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
t '---> 脚本依赖安装完成\n'
|
|
13
13
|
}
|
|
14
14
|
|
|
15
15
|
copy_dep() {
|
|
16
|
-
|
|
17
|
-
|
|
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
|
-
|
|
20
|
+
t '---> 复制一份 %s 为 %s\n' "$file_notify_js_sample" "$file_notify_js"
|
|
21
21
|
cp -fv $file_notify_js_sample $file_notify_js
|
|
22
|
-
|
|
22
|
+
t '---> 通知文件复制完成\n'
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
pm2_log() {
|
|
26
|
-
|
|
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://
|
|
35
|
-
|
|
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
|
-
|
|
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://
|
|
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://
|
|
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
|
-
|
|
53
|
+
t '\n=====> 检测后台'
|
|
54
|
+
echo -e "\n\n$api\n"
|
|
53
55
|
if [[ $api =~ "{\"code\"" ]]; then
|
|
54
|
-
|
|
56
|
+
t '=====> 后台服务启动正常\n'
|
|
55
57
|
fi
|
|
56
58
|
}
|
|
57
59
|
|
|
58
60
|
main() {
|
|
59
|
-
|
|
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
|
-
|
|
69
|
+
t '\n=====> 检测结束\n'
|
|
68
70
|
}
|
|
69
71
|
|
|
70
72
|
main
|
package/shell/lang/en.sh
ADDED
|
@@ -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
|
+
)
|
package/shell/lang/zh.sh
ADDED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
200
|
-
local
|
|
201
|
-
if [[
|
|
202
|
-
|
|
203
|
-
|
|
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
|
-
|
|
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}"
|
package/shell/preload/client.js
CHANGED
|
@@ -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: `
|
|
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
|
-
|
|
79
|
+
GrpcClient.#loadTlsCredentials(),
|
|
62
80
|
grpcOptions,
|
|
63
81
|
);
|
|
64
82
|
} catch (error) {
|