Files

57 lines
2.9 KiB
Bash
Executable File

#!/bin/bash
# run_monitor_nas.sh — NAS 监控 v2 runner(spec §20.15 NAS 侧; sanguo-vps-mirror 16:00 班尾挂接)
#
# 模式: 同 03:00 链家族(宿主 bash+scp 不进容器); 纯逻辑在 nas_monitor_check.py
# (宿主 /usr/bin/python3.8 stdlib). 产物 out/*.json → scp VPS inbox
# (C:/sanguo_vnpy_v2/data/monitor/inbox/), VPS data_monitor 班次摄取落 alerts.db.
# 幂等: events 文件按 HHMM 命名 + .pushed_<day>_<HHMM> marker 防重推;
# 零事件也写(带 generated_at, VPS 靠它做 NAS 静默检测).
# rc 隔离: 恒 exit 0, 不拖垮 vps-mirror 聚合 rc(失败只记 cron.log).
# 部署位: /volume1/stock/monitor_nas/(宿主文件, CI 不覆盖; 改 repo 副本后
# scp -O 手动同步——同 corpus/dmsk/vps-mirror runner 纪律).
set -u
# P3 长尾(硬编码 IP/私钥): env 可覆盖, 缺省=现网值(行为零变化)。
KEY=${SANGUO_MONITOR_SSH_KEY:-/var/services/homes/admin/.ssh/id_ed25519_nas}
VPS=${SANGUO_MONITOR_VPS:-Administrator@49.232.102.198}
VPS_INBOX=C:/sanguo_vnpy_v2/data/monitor/inbox
ROOT=/volume1/stock/monitor_nas
PY=/usr/bin/python3
# P3 长尾(StrictHostKeyChecking=no 全裸奔): accept-new=TOFU——首连即录
# $ROOT/known_hosts, 之后主机键变更即拒(MITM 可见); 零部署摩擦(首跑自动建档)。
SCP_OPTS=(-i "$KEY" -o StrictHostKeyChecking=accept-new
-o UserKnownHostsFile="$ROOT/known_hosts" -o ConnectTimeout=20)
mkdir -p "$ROOT/out"
{
echo "=== $(date '+%F %T') nas monitor start ==="
"$PY" "$ROOT/nas_monitor_check.py"
rc_nas=$?
# N-1(10-05): rc 先存后拼——旧版 $(date) 在同一 echo 词内先展开把 $? 重置
# 为 0, exit= 恒 0; rc 隔离下这是 NAS 体检崩溃在 cron.log 的唯一现场线索
echo "=== $(date '+%F %T') nas monitor exit=$rc_nas ==="
# 远端 inbox 目录幂等建好; ssh 必带 -n(vps-mirror 坑: 不带会吃 stdin)
ssh -n "${SCP_OPTS[@]}" "$VPS" \
"powershell -Command \"New-Item -ItemType Directory -Force -Path '$VPS_INBOX' | Out-Null\"" \
|| echo "[$(date '+%T')] WARN inbox mkdir fail"
for f in "$ROOT"/out/nas_events_*.json; do
[ -f "$f" ] || continue
base=$(basename "$f" .json) # nas_events_YYYYMMDD_HHMM
day=${base#nas_events_}; day=${day%%_*}
stamp=${base##*_}
[ -f "$ROOT/out/.pushed_${day}_${stamp}" ] && continue
if scp "${SCP_OPTS[@]}" "$f" "$VPS:$VPS_INBOX/${base}.json" >>"$ROOT/cron.log" 2>&1; then
touch "$ROOT/out/.pushed_${day}_${stamp}"
echo "=== $(date '+%T') push ok: $base ==="
else
echo "=== $(date '+%T') push FAIL: $base(下次班重试) ==="
fi
done
# out/ 保洁(P3 长尾: 产物无清理只增不减): health/events/pushed marker
# 只留 14 天(VPS migration_logs 侧已在 b954b02 保洁, 本处=NAS 半边)。
find "$ROOT/out" -maxdepth 1 -type f \( -name 'nas_health_*.json' \
-o -name 'nas_events_*.json' -o -name '.pushed_*' \) -mtime +14 -delete \
2>/dev/null || true
} >> "$ROOT/cron.log" 2>&1
exit 0