aaden-cli 1.6.110 → 1.6.111

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.
@@ -93,16 +93,28 @@ echo "产物版本门通过:${LOCAL_VER:-未知} -> $ART_VER"
93
93
  CONF=/var/www/html/Resource/config/config.ini
94
94
  DBCREDS=$(sudoS "php -r '\$c=@parse_ini_file(\"$CONF\",true);\$d=\$c[\"DB\"]??[];echo (\$d[\"host\"]??\"localhost\").\"|\".(\$d[\"user\"]??\"aaden\").\"|\".(\$d[\"password\"]??\"\");'" 2>/dev/null)
95
95
  DB_HOST="${DBCREDS%%|*}"; _r="${DBCREDS#*|}"; DB_USER="${_r%%|*}"; DB_PASS="${_r#*|}"
96
+ sqlq(){ MYSQL_PWD="$DB_PASS" mysql -u"$DB_USER" -h"${DB_HOST:-localhost}" -N -e "$1"; }
97
+ DUE=""; TSE_ERR=""; TSE_NOTE=""
96
98
  if [ -n "$DB_USER" ] && [ -n "$DB_PASS" ]; then
97
- DUE=$(MYSQL_PWD="$DB_PASS" mysql -u"$DB_USER" -h"${DB_HOST:-localhost}" -N -e \
98
- "SELECT COUNT(*) FROM aaden.TseExecuteQueue WHERE finished=0 AND nextExecuteTime<=NOW() AND createdAt>=NOW()-INTERVAL 5 MINUTE;" 2>/dev/null)
99
+ DUE=$(sqlq "SELECT COUNT(*) FROM aaden.TseExecuteQueue WHERE finished=0 AND nextExecuteTime<=NOW() AND createdAt>=NOW()-INTERVAL 5 MINUTE;" 2>"$STAGE/tse.err")
100
+ TSE_ERR=$(head -c 120 "$STAGE/tse.err" 2>/dev/null | tr '\n' ' ')
101
+ if [ -z "$DUE" ]; then
102
+ # 查询失败要分清两种:TseExecuteQueue 是 1.9.1(2025-03 的 migration)才有的,更老的后端没有这张表,
103
+ # 签名在结账请求里同步做、没有队列可查 —— 这种按空闲处理,否则永远「保守跳过」、永远升不上来
104
+ # (2026-10 的 1407 停在 1.7.913,每天 SKIP_TSE_QUERY)。连不上库之类的其他失败照旧跳过。
105
+ HAS_QUEUE=$(sqlq "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema='aaden' AND table_name='TseExecuteQueue';" 2>/dev/null)
106
+ if [ "$HAS_QUEUE" = "0" ]; then
107
+ echo "本机后端没有 TseExecuteQueue 表(1.9.1 之前的版本),没有 TSE 队列可查,按空闲处理"
108
+ DUE=0; TSE_NOTE=" TSE_NO_QUEUE"
109
+ fi
110
+ fi
99
111
  else
100
- DUE=""
112
+ TSE_ERR="config.ini 里读不到 [DB] 用户名/密码"
101
113
  fi
102
114
  if [ -z "$DUE" ]; then
103
115
  # 查不到 = 无法确认 TSE 状态 → 对财政数据保守跳过(不部署也不冒险打断签名)。
104
116
  # 非破坏性:此刻还没动任何文件。版本停滞会被 fleet-rollout-status 监控发现。
105
- echo "TSE 队列查询失败,保守跳过本轮(未改动任何文件)"; finish "SKIP_TSE_QUERY" 0
117
+ echo "TSE 队列查询失败,保守跳过本轮(未改动任何文件): $TSE_ERR"; finish "SKIP_TSE_QUERY${TSE_ERR:+ ($TSE_ERR)}" 0
106
118
  fi
107
119
  if [ "$DUE" -gt 0 ]; then
108
120
  echo "有进行中的交易/TSE 签名 (due=$DUE),跳过本轮,等下个周期"; finish "SKIP_TSE_BUSY (due=$DUE)" 0
@@ -141,4 +153,4 @@ if [ "$HEALTHY" != "1" ]; then
141
153
  sudoS "rm -rf $STAGE"; finish "ROLLED_BACK (回到 ${LOCAL_VER:-未知})" 1
142
154
  fi
143
155
  sudoS "rm -rf $STAGE"
144
- finish "DEPLOY_OK $(pkgVer /var/www/html/package.json)" 0
156
+ finish "DEPLOY_OK $(pkgVer /var/www/html/package.json)${TSE_NOTE}" 0
@@ -14,8 +14,9 @@ export PATH="/usr/local/bin:$PATH"
14
14
  # 同样的命令 SSH 进去跑却正常,而 /var/log/aaden-auto-upgrade.log 远程读不到。
15
15
  # 输出照常打到 stdout(cron 重定向进日志);单独跑这个脚本、没设变量时写 /dev/null。
16
16
  STEPS="${AADEN_UPGRADE_STEPS:-/dev/null}"
17
+ # 失败时摘要优先取 npm 的 code/syscall/path 行:npm 输出的最后两行永远是「完整日志在 …debug-0.log」,看不出原因。
17
18
  step() {
18
- local name=$1 start=$SECONDS out code
19
+ local name=$1 start=$SECONDS out code ex
19
20
  shift
20
21
  out=$("$@" 2>&1)
21
22
  code=$?
@@ -23,8 +24,11 @@ step() {
23
24
  if [ "$code" = 0 ]; then
24
25
  echo "$name=0/$((SECONDS - start))s" >>"$STEPS"
25
26
  else
26
- echo "$name=$code/$((SECONDS - start))s($(printf '%s' "$out" | tail -n 2 | tr '\n' ' ' | cut -c1-160))" >>"$STEPS"
27
+ ex=$(printf '%s\n' "$out" | grep -E 'npm (ERR!|error) (code|errno|syscall|path|dest) ' | head -n 4)
28
+ [ -n "$ex" ] || ex=$(printf '%s' "$out" | tail -n 2)
29
+ echo "$name=$code/$((SECONDS - start))s($(printf '%s' "$ex" | tr '\n' ' ' | cut -c1-160))" >>"$STEPS"
27
30
  fi
31
+ return "$code"
28
32
  }
29
33
 
30
34
  step config sh -c 'mkdir -p /etc/aaden/config && chmod -R 777 /etc/aaden/config'
@@ -34,10 +38,56 @@ step config sh -c 'mkdir -p /etc/aaden/config && chmod -R 777 /etc/aaden/config'
34
38
  # root 跑(cron)时 sudo 不要密码,多喂的一行没人读,无害。
35
39
  sudoS() { echo "Innerken322." | sudo -S "$@"; }
36
40
 
41
+ # 别的 aaden-cli npm 安装还在跑时,不能动手:
42
+ # crontab 里 04:55 和开机 sleep 30 各有一条单独的 `npm install aaden-cli -g`,慢的设备上要跑好几分钟,
43
+ # 正好撞上 04:59 / 开机 sleep 60 的这里。两个 npm 同时重装同一个包 —— 我们这个 1 秒内 ENOTEMPTY(退出码 217),
44
+ # 那一刻 aaden-cli 已被对方挪走,后面 patch/light-update/appcenter 全部 command not found;
45
+ # 运气差的设备两边都失败,aaden-cli 整个没了,do-log 从此停报(2026-10-07:1333、1541)。
46
+ # SSH 进去手动跑不会撞上,所以以前一直以为是「cron 环境问题」。
47
+ # 认进程看命令行:npm 自己的进程标题不一定带参数,但 cron 起的 sh -c / sudo 外壳一直活到 npm 结束。
48
+ # 本脚本的祖先不算 —— 远程 selfUpgrade 的 bash -lc 命令行里就有 "npm i -g aaden-cli",它在等我们跑完。
49
+ otherNpm() {
50
+ local anc=" " p=$$ q
51
+ while [ -n "$p" ] && [ "$p" -gt 1 ] 2>/dev/null; do
52
+ anc="$anc$p "
53
+ p=$(ps -o ppid= -p "$p" 2>/dev/null | tr -d ' ')
54
+ done
55
+ for q in $(pgrep -f 'npm (i|install) (-g )?aaden-cli' 2>/dev/null); do
56
+ case "$anc" in *" $q "*) ;; *) echo "$q" ;; esac
57
+ done
58
+ }
59
+ waitOtherNpm() {
60
+ local waited=0
61
+ while [ -n "$(otherNpm)" ]; do
62
+ if [ "$waited" -ge 900 ]; then
63
+ echo "等了 ${waited}s 仍有别的 npm 在装 aaden-cli: $(ps -o pid=,etime=,args= -p "$(otherNpm | tr '\n' ',' | sed 's/,$//')" 2>/dev/null | tr '\n' ';')"
64
+ return 1
65
+ fi
66
+ sleep 5
67
+ waited=$((waited + 5))
68
+ done
69
+ echo "waited=${waited}s"
70
+ }
71
+
37
72
  # npm 全局重装会先把旧目录改名成 .aaden-cli-<随机串>;上次失败留下的这种目录会让之后每次都 ENOTEMPTY 失败,
38
- # CLI 永远停在老版本(10-03 车队里有几台卡在 1.6.88~1.6.98)。以前这里只删一个写死名字的目录,现在全删。
39
- step clean sudoS sh -c 'rm -rf /usr/local/lib/node_modules/.aaden-cli-*'
40
- step npm sudoS npm i aaden-cli -g
73
+ # CLI 永远停在老版本(10-03 车队里有几台卡在 1.6.88~1.6.98)。全局目录不一定是 /usr/local(node 走 apt 装的是 /usr),
74
+ # 两处都清。必须在 waitOtherNpm 之后:正在装的 npm 的 .aaden-cli-* 是它回滚用的,删了它就真回不去了。
75
+ cleanResidue() {
76
+ local root
77
+ root=$(sudoS npm root -g 2>/dev/null | tail -n 1)
78
+ # 只认绝对路径的 node_modules,免得把一行 npm 警告当路径拼进 rm -rf
79
+ case "$root" in /*/node_modules) ;; *) root= ;; esac
80
+ sudoS sh -c "rm -rf /usr/local/lib/node_modules/.aaden-cli-* ${root:+$root/.aaden-cli-*}"
81
+ }
82
+
83
+ step wait waitOtherNpm
84
+ step clean cleanResidue
85
+ if ! step npm sudoS npm i aaden-cli -g || ! aaden-cli --version >/dev/null 2>&1; then
86
+ # 失败、或装完 aaden-cli 不见了:等一等、清一遍再装一次。不补救的话后面几步全是 command not found
87
+ step wait2 waitOtherNpm
88
+ step clean2 cleanResidue
89
+ step npm2 sudoS npm i aaden-cli -g
90
+ fi
41
91
 
42
92
  step patch aaden-cli patch
43
93
 
package/dist/index.js CHANGED
@@ -18863,7 +18863,7 @@ module.exports = JSON.parse('{"name":"axios","version":"0.19.2","description":"P
18863
18863
  /***/ ((module) => {
18864
18864
 
18865
18865
  "use strict";
18866
- module.exports = {"i8":"1.6.110"};
18866
+ module.exports = {"i8":"1.6.111"};
18867
18867
 
18868
18868
  /***/ })
18869
18869
 
@@ -19728,8 +19728,10 @@ async function upgrade() {
19728
19728
  fs.unlinkSync(stepsFile)
19729
19729
  } catch (_) {}
19730
19730
  const failed = code !== 0 || !steps || /=[1-9]/.test(steps)
19731
- return ' [' + (steps || 'upgrade.sh 没跑起来') + (code ? ' exit=' + code : '') + ']'
19731
+ const summary = ' [' + (steps || 'upgrade.sh 没跑起来') + (code ? ' exit=' + code : '') + ']'
19732
19732
  + (failed ? ' ' + upgradeEnvInfo() : '')
19733
+ // 云端 device_event_log.content 是 varchar(1024),超长整条事件会丢;npm 重试时步骤变多,截一下
19734
+ return summary.length > 900 ? summary.slice(0, 897) + '...' : summary
19733
19735
  }
19734
19736
 
19735
19737
  function upgradeEnvInfo() {
package/index.js CHANGED
@@ -791,8 +791,10 @@ async function upgrade() {
791
791
  fs.unlinkSync(stepsFile)
792
792
  } catch (_) {}
793
793
  const failed = code !== 0 || !steps || /=[1-9]/.test(steps)
794
- return ' [' + (steps || 'upgrade.sh 没跑起来') + (code ? ' exit=' + code : '') + ']'
794
+ const summary = ' [' + (steps || 'upgrade.sh 没跑起来') + (code ? ' exit=' + code : '') + ']'
795
795
  + (failed ? ' ' + upgradeEnvInfo() : '')
796
+ // 云端 device_event_log.content 是 varchar(1024),超长整条事件会丢;npm 重试时步骤变多,截一下
797
+ return summary.length > 900 ? summary.slice(0, 897) + '...' : summary
796
798
  }
797
799
 
798
800
  function upgradeEnvInfo() {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aaden-cli",
3
- "version": "1.6.110",
3
+ "version": "1.6.111",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "scripts": {