#!/bin/bash
# 一次性修复：aaden 的 crontab 里 do-log（每 5 分钟上报 + 领云端命令 + 自动补跑）那一行
# 缺了、或者指向的 aaden-cli 不存在时，改成标准写法 /usr/local/bin/aaden-cli do-log。
# 起因：10-07 1541 在 npm 并发重装之后 CLI 已经修好、远程更新也都成功，do-log 却再没上报过；
# 老设备上这一行有写裸 aaden-cli（cron 的 PATH 只有 /usr/bin:/bin）或 /usr/bin/aaden-cli 的。
# 只动这一行，其他行原样保留；改了的话把原来那行报给云端，方便事后看是哪种情况。
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; }

LINE=$(printf '%s\n' "$CUR" | grep -v '^[[:space:]]*#' | grep -m1 'do-log')
if [ -n "$LINE" ]; then
  # 第 6 个字段起是命令；@reboot 之类的特殊写法只占 1 个字段
  case "$LINE" in
    @*) CMD=$(printf '%s' "$LINE" | awk '{print $2}') ;;
    *) CMD=$(printf '%s' "$LINE" | awk '{print $6}') ;;
  esac
  case "$CMD" in
    "$CLI") echo "do-log 已是标准写法，不动"; exit 0 ;;
    /*) [ -x "$CMD" ] && { echo "do-log 指向 $CMD，存在，不动"; exit 0; } ;;
    *) [ -x "/usr/bin/$CMD" ] || [ -x "/bin/$CMD" ] && { echo "do-log 用 $CMD，cron 的 PATH 里找得到，不动"; exit 0; } ;;
  esac
  # 经环境变量传给 awk：-v 会把行里的反斜杠当转义处理，匹配不上
  NEW=$(printf '%s\n' "$CUR" | LINE="$LINE" WANT="$WANT" awk '$0 == ENVIRON["LINE"] { print ENVIRON["WANT"]; next } { print }')
  WHAT="do-log 那一行指向的命令不存在，已改成标准写法。原来是：$LINE"
else
  NEW=$(printf '%s\n%s\n' "$CUR" "$WANT")
  WHAT="aaden 的 crontab 里没有 do-log，已补上"
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 ensureDoLogCron"}).encode(), {"Content-Type": "application/json"}), timeout=10)' "$DEVICE_ID" "$WHAT" 2>/dev/null
exit 0
