aaden-cli 1.6.112 → 1.6.114
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/appCenterUsage.py +15 -6
- package/AadenDeploy/lightUpdate.sh +22 -2
- package/AadenDeploy/restartNgrok.sh +25 -11
- package/AadenDeploy/upgrade.sh +5 -0
- package/dist/index.js +6 -2
- package/dist/patch/202610072130ensureDoLogCron.sh +4 -1
- package/dist/patch/202610080800fixDoLogSchedule.sh +46 -0
- package/modules/device-commands.js +5 -1
- package/package.json +1 -1
- package/patch/202610072130ensureDoLogCron.sh +4 -1
- package/patch/202610080800fixDoLogSchedule.sh +46 -0
|
@@ -47,11 +47,18 @@ def source_of(ref_host):
|
|
|
47
47
|
return 'lan'
|
|
48
48
|
|
|
49
49
|
|
|
50
|
+
TS = re.compile(r'^(\d{2})/([A-Z][a-z]{2})/(\d{4}):(\d{2}:\d{2}:\d{2})')
|
|
51
|
+
|
|
52
|
+
|
|
50
53
|
def parse_ts(ts):
|
|
51
|
-
"""'03/Oct/2026:12:20:40 +0200' → ('2026-10-03', '2026-10-03T12:20:40'),比 strptime
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
54
|
+
"""'03/Oct/2026:12:20:40 +0200' → ('2026-10-03', '2026-10-03T12:20:40'),比 strptime 快得多。
|
|
55
|
+
格式不对返回 (None, None):日志里有乱码行(扫描器发的二进制请求),以前照样切片,
|
|
56
|
+
切出 '��-00-�T…' 这种时间,还因为按字符串比较排到最大成了 logTo,云端解析失败、整份上报被拒。"""
|
|
57
|
+
m = TS.match(ts)
|
|
58
|
+
if not m or m.group(2) not in MONTHS:
|
|
59
|
+
return None, None
|
|
60
|
+
d, mon, year, hms = m.groups()
|
|
61
|
+
day = f'{year}-{MONTHS[mon]:02d}-{d}'
|
|
55
62
|
return day, f'{day}T{hms}'
|
|
56
63
|
|
|
57
64
|
|
|
@@ -86,8 +93,8 @@ def main():
|
|
|
86
93
|
total += 1
|
|
87
94
|
# 时间范围按所有行算,统计只看和 AppCenter 有关的行
|
|
88
95
|
lb = line.find('[')
|
|
89
|
-
if lb > 0
|
|
90
|
-
|
|
96
|
+
at = parse_ts(line[lb + 1:lb + 21])[1] if lb > 0 else None
|
|
97
|
+
if at:
|
|
91
98
|
if log_from is None or at < log_from:
|
|
92
99
|
log_from = at
|
|
93
100
|
if log_to is None or at > log_to:
|
|
@@ -110,6 +117,8 @@ def main():
|
|
|
110
117
|
if not app:
|
|
111
118
|
continue
|
|
112
119
|
day, at = parse_ts(m['ts'])
|
|
120
|
+
if not day:
|
|
121
|
+
continue
|
|
113
122
|
s = stats[(app, day)]
|
|
114
123
|
s['requests'] += 1
|
|
115
124
|
bare = path.split('?')[0].split('#')[0]
|
|
@@ -63,8 +63,28 @@ sudoS "rm -rf $STAGE && mkdir -p $STAGE && chown $(id -un):$(id -gn) $STAGE"
|
|
|
63
63
|
# 用 curl 而非 axel:axel 在设备上是 snap 包,受限写不进 /var/tmp。
|
|
64
64
|
# code.zip 仅 ~1MB,curl 瞬间完成;latest.zip 全量走 curl 稍慢但那是罕见 fallback。
|
|
65
65
|
ZIP="$STAGE/$ARTIFACT"
|
|
66
|
-
|
|
67
|
-
|
|
66
|
+
# 断点续传:网慢的设备 20 分钟下不完 500MB 的 latest.zip(10-07/08 的 9002 每天 1200 秒超时、白下一遍)。
|
|
67
|
+
# 半截文件放在 STAGE 外面跨次保留,下次 curl -C - 接着下;远端 ETag 变了(发了新版)就作废重下。
|
|
68
|
+
# root(cron)和 aaden(补跑 / 云端命令)都会跑,目录 777、文件归当前用户。
|
|
69
|
+
DL=/var/tmp/aaden-lu-dl
|
|
70
|
+
PART="$DL/$ARTIFACT.part"
|
|
71
|
+
sudoS "mkdir -p $DL && chmod 777 $DL && { chown -f $(id -un):$(id -gn) $DL/* 2>/dev/null; true; }"
|
|
72
|
+
HEAD=$(curl -sfI "$S3/$ARTIFACT" --max-time 30 | tr -d '\r')
|
|
73
|
+
ETAG=$(printf '%s\n' "$HEAD" | awk 'tolower($1)=="etag:"{print $2}' | tr -d '"')
|
|
74
|
+
SIZE=$(printf '%s\n' "$HEAD" | awk 'tolower($1)=="content-length:"{print $2}')
|
|
75
|
+
if [ -f "$PART" ] && [ "$(cat "$DL/$ARTIFACT.etag" 2>/dev/null)" != "$ETAG" ]; then
|
|
76
|
+
echo "远端 $ARTIFACT 换了(ETag 变化),丢掉上次下了一半的"; rm -f "$PART"
|
|
77
|
+
fi
|
|
78
|
+
echo "$ETAG" > "$DL/$ARTIFACT.etag"
|
|
79
|
+
[ -f "$PART" ] && echo "接着上次续传:已有 $(( $(stat -c %s "$PART") / 1048576 )) MB"
|
|
80
|
+
curl -fsSL -C - "$S3/$ARTIFACT" -o "$PART" --max-time 1200
|
|
81
|
+
GOT=$(stat -c %s "$PART" 2>/dev/null || echo 0)
|
|
82
|
+
if [ -n "$SIZE" ] && [ "$GOT" -lt "$SIZE" ]; then
|
|
83
|
+
# 没下完:半截留着下次接着下,这次什么都不动
|
|
84
|
+
finish "SKIP_DOWNLOAD_PARTIAL ($ARTIFACT 已下 $((GOT / 1048576))/$((SIZE / 1048576)) MB,下次续传)" 0
|
|
85
|
+
fi
|
|
86
|
+
if [ ! -s "$PART" ]; then echo "下载失败或为空: $ARTIFACT"; finish "ABORT_DOWNLOAD ($ARTIFACT)" 1; fi
|
|
87
|
+
mv -f "$PART" "$ZIP" && rm -f "$DL/$ARTIFACT.etag"
|
|
68
88
|
unzip -q -o "$ZIP" -d "$STAGE" && rm -f "$ZIP"
|
|
69
89
|
|
|
70
90
|
# ---- 关键:破坏任何东西之前,先确认源 PHP 代码确实在 ----
|
|
@@ -22,16 +22,30 @@ else
|
|
|
22
22
|
aaden-cli fix-ngrok
|
|
23
23
|
fi
|
|
24
24
|
|
|
25
|
+
report() {
|
|
26
|
+
echo "--- 状态"
|
|
27
|
+
[ -d /run/systemd/system ] && echo "systemd: $(systemctl is-active "$SVC" 2>&1)"
|
|
28
|
+
echo "--- ngrok 配置"
|
|
29
|
+
sudoS grep -E "server_addr|remote_port|hostname|subdomain" "$CONF" 2>/dev/null
|
|
30
|
+
echo "--- $LOG 最后 15 行"
|
|
31
|
+
sudoS tail -n 15 "$LOG" 2>/dev/null
|
|
32
|
+
if [ -d /run/systemd/system ]; then
|
|
33
|
+
echo "--- 服务日志"
|
|
34
|
+
sudoS journalctl -u "$SVC" -n 15 --no-pager -q 2>/dev/null
|
|
35
|
+
fi
|
|
36
|
+
echo "--- 进程"
|
|
37
|
+
pgrep -a -f "$NGROK "
|
|
38
|
+
}
|
|
39
|
+
|
|
25
40
|
sleep 20
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
echo
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
echo "ngrok 进程不在"
|
|
41
|
+
report && exit 0
|
|
42
|
+
|
|
43
|
+
# 重启了还起不来(10-08 的 1233:systemd 一直 activating、进程不在)多半是二进制或服务文件坏了:
|
|
44
|
+
# 跑一次完整修复(重新下载 ngrok、重写服务),再看一次
|
|
45
|
+
echo
|
|
46
|
+
echo "ngrok 进程不在,跑完整修复 fix-ngrok"
|
|
47
|
+
aaden-cli fix-ngrok
|
|
48
|
+
sleep 20
|
|
49
|
+
report && exit 0
|
|
50
|
+
echo "ngrok 进程仍然不在"
|
|
37
51
|
exit 1
|
package/AadenDeploy/upgrade.sh
CHANGED
|
@@ -9,6 +9,11 @@
|
|
|
9
9
|
# 写死 /usr/local/bin/aaden-cli 在那种设备上会失败,而保留 "$PATH" 两者都能命中。
|
|
10
10
|
export PATH="/usr/local/bin:$PATH"
|
|
11
11
|
|
|
12
|
+
# 当前目录切到 /:auto-upgrade 是在包目录(.../node_modules/aaden-cli/AadenDeploy)里起的本脚本,
|
|
13
|
+
# 而 npm 重装会把整个包目录换掉——当前目录没了,之后的 npm 一启动就 ENOENT uv_cwd(10-08 的 1541/1333/1171:
|
|
14
|
+
# npm=1 npm2=1 "syscall: 'uv_cwd'")。下面所有步骤都不依赖当前目录。
|
|
15
|
+
cd / || true
|
|
16
|
+
|
|
12
17
|
# 每一步的退出码和耗时写进 $AADEN_UPGRADE_STEPS(auto-upgrade 读出来随「自动执行了更新aaden-cli」事件上报),
|
|
13
18
|
# 失败的那步再带上输出末尾。起因:2026-10 约 35 台在 cron 里 auto-upgrade 3 秒跑完、后端从不更新,
|
|
14
19
|
# 同样的命令 SSH 进去跑却正常,而 /var/log/aaden-auto-upgrade.log 远程读不到。
|
package/dist/index.js
CHANGED
|
@@ -113,6 +113,9 @@ const COMMANDS = {
|
|
|
113
113
|
APPCENTER_SYNC: () => 'aaden-cli appcenter-sync',
|
|
114
114
|
PATCH: () => 'aaden-cli patch',
|
|
115
115
|
RESTART_NGROK: root => 'bash ' + JSON.stringify(path.join(root, 'AadenDeploy/restartNgrok.sh')),
|
|
116
|
+
// 诊断脚本在门店后端里(≥ 1.9.80):do-log 坏了的设备由云端经 ngrok 触发同一个脚本
|
|
117
|
+
DIAGNOSE: () => 'S=/var/www/html/PHP/scripts/diagnose.sh; if [ -f "$S" ]; then bash "$S"; ' +
|
|
118
|
+
'else echo "后端低于 1.9.80,没有诊断脚本:先下发「只更新后端」"; exit 2; fi',
|
|
116
119
|
}
|
|
117
120
|
|
|
118
121
|
/** 每条命令最多跑多久;latest.zip 全量在慢网络上要 20 分钟 */
|
|
@@ -269,7 +272,8 @@ function runOne(id, deviceId, shellCmd) {
|
|
|
269
272
|
const child = spawn('bash', ['-lc', 'export PATH="/usr/local/bin:$PATH"; ' + shellCmd], {
|
|
270
273
|
detached: true,
|
|
271
274
|
stdio: ['ignore', 'pipe', 'pipe'],
|
|
272
|
-
|
|
275
|
+
// AADEN_PW 给诊断脚本用 sudo(它在公网可读的 docroot 下,不能写密码);输出回传前会打码
|
|
276
|
+
env: Object.assign({}, process.env, {AADEN_UPGRADE_TRIGGER: '命令 #' + id, AADEN_PW: SECRETS[0]}),
|
|
273
277
|
})
|
|
274
278
|
child.stdout.on('data', append)
|
|
275
279
|
child.stderr.on('data', append)
|
|
@@ -19175,7 +19179,7 @@ module.exports = JSON.parse('{"name":"axios","version":"0.19.2","description":"P
|
|
|
19175
19179
|
/***/ ((module) => {
|
|
19176
19180
|
|
|
19177
19181
|
"use strict";
|
|
19178
|
-
module.exports = {"i8":"1.6.
|
|
19182
|
+
module.exports = {"i8":"1.6.114"};
|
|
19179
19183
|
|
|
19180
19184
|
/***/ })
|
|
19181
19185
|
|
|
@@ -28,7 +28,8 @@ if [ -n "$LINE" ]; then
|
|
|
28
28
|
/*) [ -x "$CMD" ] && { echo "do-log 指向 $CMD,存在,不动"; exit 0; } ;;
|
|
29
29
|
*) [ -x "/usr/bin/$CMD" ] || [ -x "/bin/$CMD" ] && { echo "do-log 用 $CMD,cron 的 PATH 里找得到,不动"; exit 0; } ;;
|
|
30
30
|
esac
|
|
31
|
-
|
|
31
|
+
# 经环境变量传给 awk:-v 会把行里的反斜杠当转义处理,匹配不上
|
|
32
|
+
NEW=$(printf '%s\n' "$CUR" | LINE="$LINE" WANT="$WANT" awk '$0 == ENVIRON["LINE"] { print ENVIRON["WANT"]; next } { print }')
|
|
32
33
|
WHAT="do-log 那一行指向的命令不存在,已改成标准写法。原来是:$LINE"
|
|
33
34
|
else
|
|
34
35
|
NEW=$(printf '%s\n%s\n' "$CUR" "$WANT")
|
|
@@ -36,6 +37,8 @@ else
|
|
|
36
37
|
fi
|
|
37
38
|
|
|
38
39
|
printf '%s\n' "$NEW" | sudoS crontab -u aaden - || { echo "写 crontab 失败"; exit 1; }
|
|
40
|
+
# 读回来确认真的改上了
|
|
41
|
+
sudoS crontab -l -u aaden 2>/dev/null | grep -qxF "$WANT" || { echo "改完读回来没有标准的 do-log 行,原样:$LINE"; exit 1; }
|
|
39
42
|
echo "$WHAT"
|
|
40
43
|
DEVICE_ID=$(grep -e DeviceId /var/www/html/Resource/config/config.ini 2>/dev/null | cut -d = -f 2 | tr -d '" \r')
|
|
41
44
|
[ -n "$DEVICE_ID" ] && python3 -c 'import json, sys, urllib.request; urllib.request.urlopen(urllib.request.Request("https://cloud-v2.aaden.io/deviceLog/createEvent", json.dumps({"deviceId": sys.argv[1], "content": sys.argv[2] + " result:0", "type": "系统生成", "operator": "patch ensureDoLogCron"}).encode(), {"Content-Type": "application/json"}), timeout=10)' "$DEVICE_ID" "$WHAT" 2>/dev/null
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# 一次性修复:aaden 的 crontab 里 do-log 不是每 5 分钟跑的,改成 */5。
|
|
3
|
+
# 起因:10-08 用诊断命令查 1541,发现它的 do-log 写成了 "59 4 * * *"——每天只在 04:59 上报一次,
|
|
4
|
+
# 云端看它一直「失联」,也领不到云端命令(命令和自动补跑都挂在 do-log 上)。
|
|
5
|
+
# 202610072130ensureDoLogCron.sh 只查了 do-log 那一行在不在、命令存不存在,没查频率,所以要再跑一遍。
|
|
6
|
+
# 只改那一行(@reboot 那行不动),其它行原样保留;改了就把原来那行报给云端。
|
|
7
|
+
sudoS() { echo "Innerken322." | sudo -S -p '' "$@"; }
|
|
8
|
+
CLI=/usr/local/bin/aaden-cli
|
|
9
|
+
WANT="*/5 * * * * $CLI do-log"
|
|
10
|
+
|
|
11
|
+
[ -x "$CLI" ] || { echo "没有 $CLI,跳过"; exit 0; }
|
|
12
|
+
# do-log 在 root 的 crontab 或 /etc/cron.d 里的老设备:不往 aaden 这边加,免得每 5 分钟报两次
|
|
13
|
+
if sudoS crontab -l -u root 2>/dev/null | grep -v '^[[:space:]]*#' | grep -q 'do-log' \
|
|
14
|
+
|| grep -rqs --exclude='*.dpkg-*' 'aaden-cli do-log' /etc/cron.d 2>/dev/null; then
|
|
15
|
+
echo "do-log 在 root 的 crontab 或 /etc/cron.d 里,不动 aaden 的"; exit 0
|
|
16
|
+
fi
|
|
17
|
+
CUR=$(sudoS crontab -l -u aaden 2>/dev/null) || { echo "aaden 没有 crontab,跳过(整套定时任务缺失要 aaden-cli fix-cronjob)"; exit 0; }
|
|
18
|
+
|
|
19
|
+
# 定时的那一行(不算 @reboot)
|
|
20
|
+
LINE=$(printf '%s\n' "$CUR" | grep -v '^[[:space:]]*#' | grep -v '^[[:space:]]*@' | grep -m1 'do-log')
|
|
21
|
+
if [ -n "$LINE" ]; then
|
|
22
|
+
SCHED=$(printf '%s' "$LINE" | awk '{print $1, $2, $3, $4, $5}')
|
|
23
|
+
CMD=$(printf '%s' "$LINE" | awk '{print $6}')
|
|
24
|
+
OK_CMD=0
|
|
25
|
+
case "$CMD" in
|
|
26
|
+
/*) [ -x "$CMD" ] && OK_CMD=1 ;;
|
|
27
|
+
*) { [ -x "/usr/bin/$CMD" ] || [ -x "/bin/$CMD" ]; } && OK_CMD=1 ;;
|
|
28
|
+
esac
|
|
29
|
+
if [ "$SCHED" = "*/5 * * * *" ] && [ "$OK_CMD" = 1 ]; then
|
|
30
|
+
echo "do-log 每 5 分钟、命令存在,不动"; exit 0
|
|
31
|
+
fi
|
|
32
|
+
# 经环境变量传给 awk:-v 会把行里的反斜杠当转义处理,匹配不上
|
|
33
|
+
NEW=$(printf '%s\n' "$CUR" | LINE="$LINE" WANT="$WANT" awk '$0 == ENVIRON["LINE"] { print ENVIRON["WANT"]; next } { print }')
|
|
34
|
+
WHAT="do-log 定时任务不对,已改成每 5 分钟。原来是:$LINE"
|
|
35
|
+
else
|
|
36
|
+
NEW=$(printf '%s\n%s\n' "$CUR" "$WANT")
|
|
37
|
+
WHAT="aaden 的 crontab 里没有定时的 do-log,已补上每 5 分钟一次"
|
|
38
|
+
fi
|
|
39
|
+
|
|
40
|
+
printf '%s\n' "$NEW" | sudoS crontab -u aaden - || { echo "写 crontab 失败"; exit 1; }
|
|
41
|
+
# 读回来确认真的改上了
|
|
42
|
+
sudoS crontab -l -u aaden 2>/dev/null | grep -qxF "$WANT" || { echo "改完读回来没有标准的 do-log 行,原样:$LINE"; exit 1; }
|
|
43
|
+
echo "$WHAT"
|
|
44
|
+
DEVICE_ID=$(grep -e DeviceId /var/www/html/Resource/config/config.ini 2>/dev/null | cut -d = -f 2 | tr -d '" \r')
|
|
45
|
+
[ -n "$DEVICE_ID" ] && python3 -c 'import json, sys, urllib.request; urllib.request.urlopen(urllib.request.Request("https://cloud-v2.aaden.io/deviceLog/createEvent", json.dumps({"deviceId": sys.argv[1], "content": sys.argv[2] + " result:0", "type": "系统生成", "operator": "patch fixDoLogSchedule"}).encode(), {"Content-Type": "application/json"}), timeout=10)' "$DEVICE_ID" "$WHAT" 2>/dev/null
|
|
46
|
+
exit 0
|
|
@@ -26,6 +26,9 @@ const COMMANDS = {
|
|
|
26
26
|
APPCENTER_SYNC: () => 'aaden-cli appcenter-sync',
|
|
27
27
|
PATCH: () => 'aaden-cli patch',
|
|
28
28
|
RESTART_NGROK: root => 'bash ' + JSON.stringify(path.join(root, 'AadenDeploy/restartNgrok.sh')),
|
|
29
|
+
// 诊断脚本在门店后端里(≥ 1.9.80):do-log 坏了的设备由云端经 ngrok 触发同一个脚本
|
|
30
|
+
DIAGNOSE: () => 'S=/var/www/html/PHP/scripts/diagnose.sh; if [ -f "$S" ]; then bash "$S"; ' +
|
|
31
|
+
'else echo "后端低于 1.9.80,没有诊断脚本:先下发「只更新后端」"; exit 2; fi',
|
|
29
32
|
}
|
|
30
33
|
|
|
31
34
|
/** 每条命令最多跑多久;latest.zip 全量在慢网络上要 20 分钟 */
|
|
@@ -182,7 +185,8 @@ function runOne(id, deviceId, shellCmd) {
|
|
|
182
185
|
const child = spawn('bash', ['-lc', 'export PATH="/usr/local/bin:$PATH"; ' + shellCmd], {
|
|
183
186
|
detached: true,
|
|
184
187
|
stdio: ['ignore', 'pipe', 'pipe'],
|
|
185
|
-
|
|
188
|
+
// AADEN_PW 给诊断脚本用 sudo(它在公网可读的 docroot 下,不能写密码);输出回传前会打码
|
|
189
|
+
env: Object.assign({}, process.env, {AADEN_UPGRADE_TRIGGER: '命令 #' + id, AADEN_PW: SECRETS[0]}),
|
|
186
190
|
})
|
|
187
191
|
child.stdout.on('data', append)
|
|
188
192
|
child.stderr.on('data', append)
|
package/package.json
CHANGED
|
@@ -28,7 +28,8 @@ if [ -n "$LINE" ]; then
|
|
|
28
28
|
/*) [ -x "$CMD" ] && { echo "do-log 指向 $CMD,存在,不动"; exit 0; } ;;
|
|
29
29
|
*) [ -x "/usr/bin/$CMD" ] || [ -x "/bin/$CMD" ] && { echo "do-log 用 $CMD,cron 的 PATH 里找得到,不动"; exit 0; } ;;
|
|
30
30
|
esac
|
|
31
|
-
|
|
31
|
+
# 经环境变量传给 awk:-v 会把行里的反斜杠当转义处理,匹配不上
|
|
32
|
+
NEW=$(printf '%s\n' "$CUR" | LINE="$LINE" WANT="$WANT" awk '$0 == ENVIRON["LINE"] { print ENVIRON["WANT"]; next } { print }')
|
|
32
33
|
WHAT="do-log 那一行指向的命令不存在,已改成标准写法。原来是:$LINE"
|
|
33
34
|
else
|
|
34
35
|
NEW=$(printf '%s\n%s\n' "$CUR" "$WANT")
|
|
@@ -36,6 +37,8 @@ else
|
|
|
36
37
|
fi
|
|
37
38
|
|
|
38
39
|
printf '%s\n' "$NEW" | sudoS crontab -u aaden - || { echo "写 crontab 失败"; exit 1; }
|
|
40
|
+
# 读回来确认真的改上了
|
|
41
|
+
sudoS crontab -l -u aaden 2>/dev/null | grep -qxF "$WANT" || { echo "改完读回来没有标准的 do-log 行,原样:$LINE"; exit 1; }
|
|
39
42
|
echo "$WHAT"
|
|
40
43
|
DEVICE_ID=$(grep -e DeviceId /var/www/html/Resource/config/config.ini 2>/dev/null | cut -d = -f 2 | tr -d '" \r')
|
|
41
44
|
[ -n "$DEVICE_ID" ] && python3 -c 'import json, sys, urllib.request; urllib.request.urlopen(urllib.request.Request("https://cloud-v2.aaden.io/deviceLog/createEvent", json.dumps({"deviceId": sys.argv[1], "content": sys.argv[2] + " result:0", "type": "系统生成", "operator": "patch ensureDoLogCron"}).encode(), {"Content-Type": "application/json"}), timeout=10)' "$DEVICE_ID" "$WHAT" 2>/dev/null
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# 一次性修复:aaden 的 crontab 里 do-log 不是每 5 分钟跑的,改成 */5。
|
|
3
|
+
# 起因:10-08 用诊断命令查 1541,发现它的 do-log 写成了 "59 4 * * *"——每天只在 04:59 上报一次,
|
|
4
|
+
# 云端看它一直「失联」,也领不到云端命令(命令和自动补跑都挂在 do-log 上)。
|
|
5
|
+
# 202610072130ensureDoLogCron.sh 只查了 do-log 那一行在不在、命令存不存在,没查频率,所以要再跑一遍。
|
|
6
|
+
# 只改那一行(@reboot 那行不动),其它行原样保留;改了就把原来那行报给云端。
|
|
7
|
+
sudoS() { echo "Innerken322." | sudo -S -p '' "$@"; }
|
|
8
|
+
CLI=/usr/local/bin/aaden-cli
|
|
9
|
+
WANT="*/5 * * * * $CLI do-log"
|
|
10
|
+
|
|
11
|
+
[ -x "$CLI" ] || { echo "没有 $CLI,跳过"; exit 0; }
|
|
12
|
+
# do-log 在 root 的 crontab 或 /etc/cron.d 里的老设备:不往 aaden 这边加,免得每 5 分钟报两次
|
|
13
|
+
if sudoS crontab -l -u root 2>/dev/null | grep -v '^[[:space:]]*#' | grep -q 'do-log' \
|
|
14
|
+
|| grep -rqs --exclude='*.dpkg-*' 'aaden-cli do-log' /etc/cron.d 2>/dev/null; then
|
|
15
|
+
echo "do-log 在 root 的 crontab 或 /etc/cron.d 里,不动 aaden 的"; exit 0
|
|
16
|
+
fi
|
|
17
|
+
CUR=$(sudoS crontab -l -u aaden 2>/dev/null) || { echo "aaden 没有 crontab,跳过(整套定时任务缺失要 aaden-cli fix-cronjob)"; exit 0; }
|
|
18
|
+
|
|
19
|
+
# 定时的那一行(不算 @reboot)
|
|
20
|
+
LINE=$(printf '%s\n' "$CUR" | grep -v '^[[:space:]]*#' | grep -v '^[[:space:]]*@' | grep -m1 'do-log')
|
|
21
|
+
if [ -n "$LINE" ]; then
|
|
22
|
+
SCHED=$(printf '%s' "$LINE" | awk '{print $1, $2, $3, $4, $5}')
|
|
23
|
+
CMD=$(printf '%s' "$LINE" | awk '{print $6}')
|
|
24
|
+
OK_CMD=0
|
|
25
|
+
case "$CMD" in
|
|
26
|
+
/*) [ -x "$CMD" ] && OK_CMD=1 ;;
|
|
27
|
+
*) { [ -x "/usr/bin/$CMD" ] || [ -x "/bin/$CMD" ]; } && OK_CMD=1 ;;
|
|
28
|
+
esac
|
|
29
|
+
if [ "$SCHED" = "*/5 * * * *" ] && [ "$OK_CMD" = 1 ]; then
|
|
30
|
+
echo "do-log 每 5 分钟、命令存在,不动"; exit 0
|
|
31
|
+
fi
|
|
32
|
+
# 经环境变量传给 awk:-v 会把行里的反斜杠当转义处理,匹配不上
|
|
33
|
+
NEW=$(printf '%s\n' "$CUR" | LINE="$LINE" WANT="$WANT" awk '$0 == ENVIRON["LINE"] { print ENVIRON["WANT"]; next } { print }')
|
|
34
|
+
WHAT="do-log 定时任务不对,已改成每 5 分钟。原来是:$LINE"
|
|
35
|
+
else
|
|
36
|
+
NEW=$(printf '%s\n%s\n' "$CUR" "$WANT")
|
|
37
|
+
WHAT="aaden 的 crontab 里没有定时的 do-log,已补上每 5 分钟一次"
|
|
38
|
+
fi
|
|
39
|
+
|
|
40
|
+
printf '%s\n' "$NEW" | sudoS crontab -u aaden - || { echo "写 crontab 失败"; exit 1; }
|
|
41
|
+
# 读回来确认真的改上了
|
|
42
|
+
sudoS crontab -l -u aaden 2>/dev/null | grep -qxF "$WANT" || { echo "改完读回来没有标准的 do-log 行,原样:$LINE"; exit 1; }
|
|
43
|
+
echo "$WHAT"
|
|
44
|
+
DEVICE_ID=$(grep -e DeviceId /var/www/html/Resource/config/config.ini 2>/dev/null | cut -d = -f 2 | tr -d '" \r')
|
|
45
|
+
[ -n "$DEVICE_ID" ] && python3 -c 'import json, sys, urllib.request; urllib.request.urlopen(urllib.request.Request("https://cloud-v2.aaden.io/deviceLog/createEvent", json.dumps({"deviceId": sys.argv[1], "content": sys.argv[2] + " result:0", "type": "系统生成", "operator": "patch fixDoLogSchedule"}).encode(), {"Content-Type": "application/json"}), timeout=10)' "$DEVICE_ID" "$WHAT" 2>/dev/null
|
|
46
|
+
exit 0
|