aaden-cli 1.6.104 → 1.6.107
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/AadenDeploy/Utils/writeGdpduService.sh +43 -10
- package/AadenDeploy/aadensetup.sh +2 -0
- package/AadenDeploy/upgrade.sh +27 -8
- package/dist/index.js +35 -6
- package/dist/patch/202610031600ensureGdpduDaemon.sh +6 -0
- package/index.js +34 -5
- package/package.json +1 -1
- package/patch/202610031600ensureGdpduDaemon.sh +6 -0
|
@@ -1,10 +1,29 @@
|
|
|
1
1
|
#!/bin/bash
|
|
2
|
+
# 确保日结物化守护进程 aaden-gdpdu(PHP/autoWriteGdpdu.php)在跑。`aaden-cli auto-write-gdpdu`、装机脚本 aadensetup.sh、
|
|
3
|
+
# patch/202610031600ensureGdpduDaemon.sh 都调这一个脚本;幂等,重复跑安全。
|
|
4
|
+
#
|
|
5
|
+
# 为什么必须有它:每日数据库备份由日结物化流程 ZBon.php?op=writeCombinedZbonClosing 触发,而这个流程只由该守护进程
|
|
6
|
+
# 循环调用;没有它,csv_* 日结不物化(DSFinV-K 导出缺日结),备份也从不执行(10-03 发现 35 台新店漏装)。
|
|
7
|
+
#
|
|
8
|
+
# 已经在跑就不动;有 systemd 装成服务;没有 systemd(老 WSL)写 /etc/cron.d 每分钟调一次。
|
|
9
|
+
# writeCombinedZbonClosing 内部 select … for update 加锁,重复调用也只会串行处理。
|
|
10
|
+
PW='Innerken322.'
|
|
11
|
+
sudoS(){ echo "$PW" | sudo -S bash -c "$*"; }
|
|
12
|
+
PHP_SCRIPT=/var/www/html/PHP/autoWriteGdpdu.php
|
|
13
|
+
UNIT=/etc/systemd/system/aaden-gdpdu.service
|
|
14
|
+
CRON=/etc/cron.d/aaden-gdpdu
|
|
2
15
|
|
|
3
|
-
|
|
16
|
+
if [ -n "${AADEN_CLOUD_MODE:-}" ]; then echo "云端模式,跳过"; exit 0; fi
|
|
17
|
+
if [ ! -f "$PHP_SCRIPT" ]; then echo "没有 $PHP_SCRIPT,跳过"; exit 0; fi
|
|
18
|
+
# 只认真正用 php 跑这个脚本的进程(命令行里恰好带着文件名的 tail/grep 之类不算)
|
|
19
|
+
if systemctl is-active --quiet aaden-gdpdu.service 2>/dev/null \
|
|
20
|
+
|| pgrep -f '^(/usr/bin/)?php[0-9.]* .*autoWriteGdpdu\.php' >/dev/null; then
|
|
21
|
+
echo "aaden-gdpdu 已在运行,不动"; exit 0
|
|
22
|
+
fi
|
|
4
23
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
24
|
+
if [ -d /run/systemd/system ]; then
|
|
25
|
+
TMP=$(mktemp)
|
|
26
|
+
cat > "$TMP" <<EOF
|
|
8
27
|
[Unit]
|
|
9
28
|
Description=Gdpdu Service For Aaden
|
|
10
29
|
|
|
@@ -13,13 +32,27 @@ Type=simple
|
|
|
13
32
|
Restart=always
|
|
14
33
|
RestartSec=1
|
|
15
34
|
User=root
|
|
16
|
-
ExecStart=/usr/bin/php
|
|
35
|
+
ExecStart=/usr/bin/php $PHP_SCRIPT
|
|
17
36
|
|
|
18
37
|
[Install]
|
|
19
38
|
WantedBy=multi-user.target
|
|
20
|
-
|
|
39
|
+
EOF
|
|
40
|
+
sudoS "install -m 644 '$TMP' '$UNIT' && systemctl daemon-reload && systemctl enable --now aaden-gdpdu.service"
|
|
41
|
+
rm -f "$TMP"
|
|
42
|
+
sleep 3
|
|
43
|
+
if systemctl is-active --quiet aaden-gdpdu.service; then
|
|
44
|
+
echo "aaden-gdpdu 已装成 systemd 服务并启动"; exit 0
|
|
45
|
+
fi
|
|
46
|
+
echo "aaden-gdpdu 服务没起来,下次重试"; systemctl status aaden-gdpdu.service --no-pager 2>&1 | tail -5; exit 1
|
|
47
|
+
fi
|
|
21
48
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
49
|
+
# 没有 systemd:由 cron 每分钟调一次(和守护进程循环做的是同一件事)
|
|
50
|
+
TMP=$(mktemp)
|
|
51
|
+
cat > "$TMP" <<'EOF'
|
|
52
|
+
# aaden-cli auto-write-gdpdu(AadenDeploy/Utils/writeGdpduService.sh):没有 systemd 的设备由 cron 代替 aaden-gdpdu 守护进程
|
|
53
|
+
* * * * * root flock -n /var/tmp/aaden-gdpdu.lock sh -c 'curl -s -o /dev/null --max-time 900 "http://localhost/PHP/ZBon.php?op=writeCombinedZbonClosing"; curl -s -o /dev/null --max-time 300 "http://localhost/PHP/ZBon.php?op=writeZbonLiteral&countLimit=10"'
|
|
54
|
+
EOF
|
|
55
|
+
sudoS "install -m 644 '$TMP' '$CRON'"
|
|
56
|
+
rm -f "$TMP"
|
|
57
|
+
echo "没有 systemd,已写入 $CRON(每分钟一次)"
|
|
58
|
+
exit 0
|
|
@@ -147,6 +147,8 @@ cd /var/www/html/PHP || exit
|
|
|
147
147
|
vendor/bin/phinx migrate
|
|
148
148
|
|
|
149
149
|
aaden-cli patch
|
|
150
|
+
# 日结物化守护进程:每日数据库备份和 DSFinV-K 日结物化都靠它(以前漏在装机脚本外,靠手动补)
|
|
151
|
+
aaden-cli auto-write-gdpdu
|
|
150
152
|
aaden-cli fix-cronjob
|
|
151
153
|
aaden-cli upgrade
|
|
152
154
|
aaden-cli update-ngrok-config $DeviceId
|
package/AadenDeploy/upgrade.sh
CHANGED
|
@@ -9,22 +9,41 @@
|
|
|
9
9
|
# 写死 /usr/local/bin/aaden-cli 在那种设备上会失败,而保留 "$PATH" 两者都能命中。
|
|
10
10
|
export PATH="/usr/local/bin:$PATH"
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
# 每一步的退出码和耗时写进 $AADEN_UPGRADE_STEPS(auto-upgrade 读出来随「自动执行了更新aaden-cli」事件上报),
|
|
13
|
+
# 失败的那步再带上输出末尾。起因:2026-10 约 35 台在 cron 里 auto-upgrade 3 秒跑完、后端从不更新,
|
|
14
|
+
# 同样的命令 SSH 进去跑却正常,而 /var/log/aaden-auto-upgrade.log 远程读不到。
|
|
15
|
+
# 输出照常打到 stdout(cron 重定向进日志);单独跑这个脚本、没设变量时写 /dev/null。
|
|
16
|
+
STEPS="${AADEN_UPGRADE_STEPS:-/dev/null}"
|
|
17
|
+
step() {
|
|
18
|
+
local name=$1 start=$SECONDS out code
|
|
19
|
+
shift
|
|
20
|
+
out=$("$@" 2>&1)
|
|
21
|
+
code=$?
|
|
22
|
+
printf '%s\n' "$out"
|
|
23
|
+
if [ "$code" = 0 ]; then
|
|
24
|
+
echo "$name=0/$((SECONDS - start))s" >>"$STEPS"
|
|
25
|
+
else
|
|
26
|
+
echo "$name=$code/$((SECONDS - start))s($(printf '%s' "$out" | tail -n 2 | tr '\n' ' ' | cut -c1-160))" >>"$STEPS"
|
|
27
|
+
fi
|
|
28
|
+
}
|
|
14
29
|
|
|
15
|
-
|
|
16
|
-
sudo npm i aaden-cli -g
|
|
30
|
+
step config sh -c 'mkdir -p /etc/aaden/config && chmod -R 777 /etc/aaden/config'
|
|
17
31
|
|
|
18
|
-
aaden-cli
|
|
32
|
+
# npm 全局重装会先把旧目录改名成 .aaden-cli-<随机串>;上次失败留下的这种目录会让之后每次都 ENOTEMPTY 失败,
|
|
33
|
+
# CLI 永远停在老版本(10-03 车队里有几台卡在 1.6.88~1.6.98)。以前这里只删一个写死名字的目录,现在全删。
|
|
34
|
+
step clean sudo sh -c 'rm -rf /usr/local/lib/node_modules/.aaden-cli-*'
|
|
35
|
+
step npm sudo npm i aaden-cli -g
|
|
36
|
+
|
|
37
|
+
step patch aaden-cli patch
|
|
19
38
|
|
|
20
39
|
# 前端目录访问量上报(AppCenter 各应用 + 根目录老前端;只读 Apache 日志,20 小时内报过就空跑)。放在 light-update 前面,后端部署出问题也不影响统计
|
|
21
|
-
aaden-cli appcenter-usage
|
|
40
|
+
step usage aaden-cli appcenter-usage
|
|
22
41
|
|
|
23
42
|
# 后端也走 aaden-cli 通道自愈:light-update 自带 版本门/灰度门/活动单门,
|
|
24
43
|
# 已最新则空跑,营业时间被 @reboot 触发也不会打断收银(不 snap refresh 前端、不 apt)。
|
|
25
44
|
# 这条让"后端自动更新"重新依赖活着的 npm+S3 管线,而不是失效的 git token。
|
|
26
|
-
aaden-cli light-update
|
|
45
|
+
step lu aaden-cli light-update
|
|
27
46
|
|
|
28
47
|
# AppCenter 前端(Admin 等)单独同步:light-update 不发 AppCenter。灰度由 S3 manifest 的 rollout 控制,
|
|
29
48
|
# 不在灰度内 / 已最新时空跑(一次几 KB 的 manifest 请求);不碰 PHP 和数据库,营业时间触发也安全。
|
|
30
|
-
aaden-cli appcenter-sync
|
|
49
|
+
step sync aaden-cli appcenter-sync
|
package/dist/index.js
CHANGED
|
@@ -18577,7 +18577,7 @@ module.exports = JSON.parse('{"name":"axios","version":"0.19.2","description":"P
|
|
|
18577
18577
|
/***/ ((module) => {
|
|
18578
18578
|
|
|
18579
18579
|
"use strict";
|
|
18580
|
-
module.exports = {"i8":"1.6.
|
|
18580
|
+
module.exports = {"i8":"1.6.107"};
|
|
18581
18581
|
|
|
18582
18582
|
/***/ })
|
|
18583
18583
|
|
|
@@ -19254,7 +19254,9 @@ async function appCenterUsage(force) {
|
|
|
19254
19254
|
return
|
|
19255
19255
|
}
|
|
19256
19256
|
const deviceId = await getCurrentDeviceId()
|
|
19257
|
-
|
|
19257
|
+
// 开机时 @reboot 跑 auto-upgrade,本机 PHP 可能还没起来,拿到的是空串 / -1:这次跳过,不写 stamp,下次再报
|
|
19258
|
+
if (!(parseInt(deviceId) > 0)) {
|
|
19259
|
+
console.log('appcenter-usage: 取不到设备号(本机 PHP 可能还没起来),跳过')
|
|
19258
19260
|
return
|
|
19259
19261
|
}
|
|
19260
19262
|
const script = path.join(findMe(), '..', 'AadenDeploy', 'appCenterUsage.py')
|
|
@@ -19393,17 +19395,44 @@ async function autoUpgrade() {
|
|
|
19393
19395
|
if (!ngrokNewestVersion()) {
|
|
19394
19396
|
await fixNgrok()
|
|
19395
19397
|
}
|
|
19396
|
-
await upgrade()
|
|
19397
|
-
await logAction("自动执行了更新aaden-cli")
|
|
19398
|
+
const summary = await upgrade()
|
|
19399
|
+
await logAction("自动执行了更新aaden-cli" + summary)
|
|
19398
19400
|
}
|
|
19399
19401
|
|
|
19402
|
+
/**
|
|
19403
|
+
* upgrade.sh 每步把 `名字=退出码/耗时` 写进 AADEN_UPGRADE_STEPS 指向的文件,这里读出来拼进事件:
|
|
19404
|
+
* 全部成功是一串 `npm=0/1s patch=0/0s …`;有失败(或脚本根本没跑起来——前面 `sudo chmod`、`cd` 是 && 串起来的)
|
|
19405
|
+
* 时再带上运行用户、PATH、node/npm/aaden-cli 的位置。
|
|
19406
|
+
* 起因:2026-10 约 35 台在 cron 里 auto-upgrade 3 秒跑完、后端从不更新,SSH 进去手动跑却正常,日志又远程读不到。
|
|
19407
|
+
*/
|
|
19400
19408
|
async function upgrade() {
|
|
19409
|
+
const stepsFile = path.join(os.tmpdir(), `aaden-upgrade-steps-${process.pid}`)
|
|
19410
|
+
try { fs.writeFileSync(stepsFile, '') } catch (_) {}
|
|
19401
19411
|
const command = [
|
|
19402
19412
|
...getPrivilegeCMD('AadenDeploy/upgrade.sh'),
|
|
19403
19413
|
'cd AadenDeploy',
|
|
19404
|
-
|
|
19414
|
+
`AADEN_UPGRADE_STEPS=${stepsFile} ./upgrade.sh`
|
|
19405
19415
|
]
|
|
19406
|
-
await cli.executeInShell(command, program.debug)
|
|
19416
|
+
const {code} = await cli.executeInShell(command, program.debug)
|
|
19417
|
+
let steps = ''
|
|
19418
|
+
try {
|
|
19419
|
+
steps = fs.readFileSync(stepsFile, 'utf8').split('\n').filter(Boolean).join(' ')
|
|
19420
|
+
fs.unlinkSync(stepsFile)
|
|
19421
|
+
} catch (_) {}
|
|
19422
|
+
const failed = code !== 0 || !steps || /=[1-9]/.test(steps)
|
|
19423
|
+
return ' [' + (steps || 'upgrade.sh 没跑起来') + (code ? ' exit=' + code : '') + ']'
|
|
19424
|
+
+ (failed ? ' ' + upgradeEnvInfo() : '')
|
|
19425
|
+
}
|
|
19426
|
+
|
|
19427
|
+
function upgradeEnvInfo() {
|
|
19428
|
+
try {
|
|
19429
|
+
return execSync(
|
|
19430
|
+
'echo "user=$(id -un) PATH=$PATH node=$(command -v node) npm=$(command -v npm) cli=$(command -v aaden-cli)"',
|
|
19431
|
+
{encoding: 'utf-8', shell: '/bin/sh', timeout: 5000}
|
|
19432
|
+
).trim()
|
|
19433
|
+
} catch (e) {
|
|
19434
|
+
return ''
|
|
19435
|
+
}
|
|
19407
19436
|
}
|
|
19408
19437
|
|
|
19409
19438
|
function getStorageBackendFileVersion() {
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# 一次性修复:日结物化守护进程 aaden-gdpdu 以前不在装机脚本里(要手动 aaden-cli auto-write-gdpdu),
|
|
3
|
+
# 2025 下半年起漏装的店既没日结物化(DSFinV-K 导出缺日结)、每日数据库备份也从没跑过。
|
|
4
|
+
# 逻辑在 AadenDeploy/Utils/writeGdpduService.sh(已在跑跳过 / 有 systemd 装服务 / 没有 systemd 写 cron)。
|
|
5
|
+
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
|
|
6
|
+
bash "$ROOT/AadenDeploy/Utils/writeGdpduService.sh"
|
package/index.js
CHANGED
|
@@ -603,7 +603,9 @@ async function appCenterUsage(force) {
|
|
|
603
603
|
return
|
|
604
604
|
}
|
|
605
605
|
const deviceId = await getCurrentDeviceId()
|
|
606
|
-
|
|
606
|
+
// 开机时 @reboot 跑 auto-upgrade,本机 PHP 可能还没起来,拿到的是空串 / -1:这次跳过,不写 stamp,下次再报
|
|
607
|
+
if (!(parseInt(deviceId) > 0)) {
|
|
608
|
+
console.log('appcenter-usage: 取不到设备号(本机 PHP 可能还没起来),跳过')
|
|
607
609
|
return
|
|
608
610
|
}
|
|
609
611
|
const script = path.join(findMe(), '..', 'AadenDeploy', 'appCenterUsage.py')
|
|
@@ -742,17 +744,44 @@ async function autoUpgrade() {
|
|
|
742
744
|
if (!ngrokNewestVersion()) {
|
|
743
745
|
await fixNgrok()
|
|
744
746
|
}
|
|
745
|
-
await upgrade()
|
|
746
|
-
await logAction("自动执行了更新aaden-cli")
|
|
747
|
+
const summary = await upgrade()
|
|
748
|
+
await logAction("自动执行了更新aaden-cli" + summary)
|
|
747
749
|
}
|
|
748
750
|
|
|
751
|
+
/**
|
|
752
|
+
* upgrade.sh 每步把 `名字=退出码/耗时` 写进 AADEN_UPGRADE_STEPS 指向的文件,这里读出来拼进事件:
|
|
753
|
+
* 全部成功是一串 `npm=0/1s patch=0/0s …`;有失败(或脚本根本没跑起来——前面 `sudo chmod`、`cd` 是 && 串起来的)
|
|
754
|
+
* 时再带上运行用户、PATH、node/npm/aaden-cli 的位置。
|
|
755
|
+
* 起因:2026-10 约 35 台在 cron 里 auto-upgrade 3 秒跑完、后端从不更新,SSH 进去手动跑却正常,日志又远程读不到。
|
|
756
|
+
*/
|
|
749
757
|
async function upgrade() {
|
|
758
|
+
const stepsFile = path.join(os.tmpdir(), `aaden-upgrade-steps-${process.pid}`)
|
|
759
|
+
try { fs.writeFileSync(stepsFile, '') } catch (_) {}
|
|
750
760
|
const command = [
|
|
751
761
|
...getPrivilegeCMD('AadenDeploy/upgrade.sh'),
|
|
752
762
|
'cd AadenDeploy',
|
|
753
|
-
|
|
763
|
+
`AADEN_UPGRADE_STEPS=${stepsFile} ./upgrade.sh`
|
|
754
764
|
]
|
|
755
|
-
await cli.executeInShell(command, program.debug)
|
|
765
|
+
const {code} = await cli.executeInShell(command, program.debug)
|
|
766
|
+
let steps = ''
|
|
767
|
+
try {
|
|
768
|
+
steps = fs.readFileSync(stepsFile, 'utf8').split('\n').filter(Boolean).join(' ')
|
|
769
|
+
fs.unlinkSync(stepsFile)
|
|
770
|
+
} catch (_) {}
|
|
771
|
+
const failed = code !== 0 || !steps || /=[1-9]/.test(steps)
|
|
772
|
+
return ' [' + (steps || 'upgrade.sh 没跑起来') + (code ? ' exit=' + code : '') + ']'
|
|
773
|
+
+ (failed ? ' ' + upgradeEnvInfo() : '')
|
|
774
|
+
}
|
|
775
|
+
|
|
776
|
+
function upgradeEnvInfo() {
|
|
777
|
+
try {
|
|
778
|
+
return execSync(
|
|
779
|
+
'echo "user=$(id -un) PATH=$PATH node=$(command -v node) npm=$(command -v npm) cli=$(command -v aaden-cli)"',
|
|
780
|
+
{encoding: 'utf-8', shell: '/bin/sh', timeout: 5000}
|
|
781
|
+
).trim()
|
|
782
|
+
} catch (e) {
|
|
783
|
+
return ''
|
|
784
|
+
}
|
|
756
785
|
}
|
|
757
786
|
|
|
758
787
|
function getStorageBackendFileVersion() {
|
package/package.json
CHANGED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# 一次性修复:日结物化守护进程 aaden-gdpdu 以前不在装机脚本里(要手动 aaden-cli auto-write-gdpdu),
|
|
3
|
+
# 2025 下半年起漏装的店既没日结物化(DSFinV-K 导出缺日结)、每日数据库备份也从没跑过。
|
|
4
|
+
# 逻辑在 AadenDeploy/Utils/writeGdpduService.sh(已在跑跳过 / 有 systemd 装服务 / 没有 systemd 写 cron)。
|
|
5
|
+
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
|
|
6
|
+
bash "$ROOT/AadenDeploy/Utils/writeGdpduService.sh"
|