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.
@@ -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
- ServiceFileName=/etc/systemd/system/aaden-gdpdu.service
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
- sudo touch $ServiceFileName
6
- sudo chmod 777 $ServiceFileName
7
- echo -e "
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 /var/www/html/PHP/autoWriteGdpdu.php
35
+ ExecStart=/usr/bin/php $PHP_SCRIPT
17
36
 
18
37
  [Install]
19
38
  WantedBy=multi-user.target
20
- " > $ServiceFileName
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
- sudo systemctl start aaden-gdpdu.service
23
- sudo systemctl enable aaden-gdpdu.service
24
- echo 'gdpdu auto write start'
25
- sudo service aaden-gdpdu start
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
@@ -9,22 +9,41 @@
9
9
  # 写死 /usr/local/bin/aaden-cli 在那种设备上会失败,而保留 "$PATH" 两者都能命中。
10
10
  export PATH="/usr/local/bin:$PATH"
11
11
 
12
- mkdir -p /etc/aaden/config
13
- chmod -R 777 /etc/aaden/config
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
- sudo rm -rf /usr/local/lib/node_modules/.aaden-cli-P0eVNKj8
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 patch
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.104"};
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
- if (parseInt(deviceId) === -1) {
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
- `./upgrade.sh`
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
- if (parseInt(deviceId) === -1) {
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
- `./upgrade.sh`
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aaden-cli",
3
- "version": "1.6.104",
3
+ "version": "1.6.107",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "scripts": {
@@ -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"