#!/bin/bash
# 一次性修复：aaden 的 crontab 里 do-log 不是每 5 分钟跑的，改成 */5。
# 起因：10-08 用诊断命令查 1541，发现它的 do-log 写成了 "59 4 * * *"——每天只在 04:59 上报一次，
# 云端看它一直「失联」，也领不到云端命令（命令和自动补跑都挂在 do-log 上）。
# 202610072130ensureDoLogCron.sh 只查了 do-log 那一行在不在、命令存不存在，没查频率，所以要再跑一遍。
# 只改那一行（@reboot 那行不动），其它行原样保留；改了就把原来那行报给云端。
sudoS() { echo "Innerken322." | sudo -S -p '' "$@"; }
CLI=/usr/local/bin/aaden-cli
WANT="*/5 * * * * $CLI do-log"

[ -x "$CLI" ] || { echo "没有 $CLI，跳过"; exit 0; }
# do-log 在 root 的 crontab 或 /etc/cron.d 里的老设备：不往 aaden 这边加，免得每 5 分钟报两次
if sudoS crontab -l -u root 2>/dev/null | grep -v '^[[:space:]]*#' | grep -q 'do-log' \
  || grep -rqs --exclude='*.dpkg-*' 'aaden-cli do-log' /etc/cron.d 2>/dev/null; then
  echo "do-log 在 root 的 crontab 或 /etc/cron.d 里，不动 aaden 的"; exit 0
fi
CUR=$(sudoS crontab -l -u aaden 2>/dev/null) || { echo "aaden 没有 crontab，跳过（整套定时任务缺失要 aaden-cli fix-cronjob）"; exit 0; }

# 定时的那一行（不算 @reboot）
LINE=$(printf '%s\n' "$CUR" | grep -v '^[[:space:]]*#' | grep -v '^[[:space:]]*@' | grep -m1 'do-log')
if [ -n "$LINE" ]; then
  SCHED=$(printf '%s' "$LINE" | awk '{print $1, $2, $3, $4, $5}')
  CMD=$(printf '%s' "$LINE" | awk '{print $6}')
  OK_CMD=0
  case "$CMD" in
    /*) [ -x "$CMD" ] && OK_CMD=1 ;;
    *) { [ -x "/usr/bin/$CMD" ] || [ -x "/bin/$CMD" ]; } && OK_CMD=1 ;;
  esac
  if [ "$SCHED" = "*/5 * * * *" ] && [ "$OK_CMD" = 1 ]; then
    echo "do-log 每 5 分钟、命令存在，不动"; exit 0
  fi
  # 经环境变量传给 awk：-v 会把行里的反斜杠当转义处理，匹配不上
  NEW=$(printf '%s\n' "$CUR" | LINE="$LINE" WANT="$WANT" awk '$0 == ENVIRON["LINE"] { print ENVIRON["WANT"]; next } { print }')
  WHAT="do-log 定时任务不对，已改成每 5 分钟。原来是：$LINE"
else
  NEW=$(printf '%s\n%s\n' "$CUR" "$WANT")
  WHAT="aaden 的 crontab 里没有定时的 do-log，已补上每 5 分钟一次"
fi

# 新内容先写临时文件再 crontab <文件>：不能 printf | sudoS crontab -，sudoS 自己用 echo 密码 | sudo -S 占了 stdin，
# 要密码的设备上 crontab 读到的是空 → 整份 crontab 被清空（免密的设备上读到密码那一行、格式不对拒收）。
# 写之前备份；写完读回来行数少了或没有 do-log 就还原。
TMP=$(mktemp) && BAK=$(mktemp) || { echo "建临时文件失败"; exit 1; }
printf '%s\n' "$CUR" > "$BAK"
printf '%s\n' "$NEW" > "$TMP"
chmod 644 "$TMP" "$BAK"
sudoS cp "$BAK" "/etc/aaden/config/crontab-aaden.bak.$(date +%Y%m%d%H%M%S)" 2>/dev/null
sudoS crontab -u aaden "$TMP" || { echo "写 crontab 失败"; rm -f "$TMP" "$BAK"; exit 1; }
AFTER=$(sudoS crontab -l -u aaden 2>/dev/null)
if ! printf '%s\n' "$AFTER" | grep -qxF "$WANT" || [ "$(printf '%s\n' "$AFTER" | grep -c .)" -lt "$(printf '%s\n' "$CUR" | grep -c .)" ]; then
  echo "改完读回来不对，还原原来的 crontab"
  sudoS crontab -u aaden "$BAK"
  rm -f "$TMP" "$BAK"
  exit 1
fi
rm -f "$TMP" "$BAK"
echo "$WHAT"
DEVICE_ID=$(grep -e DeviceId /var/www/html/Resource/config/config.ini 2>/dev/null | cut -d = -f 2 | tr -d '" \r')
[ -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
exit 0
