#!/bin/bash

#心跳文件路径：/data/homeassistant/SoftWDT
#心跳文件命名：服务名.hb
#心跳周期：10S/次
#心跳检测周期：15S/次

#脚本部署于路径/usr/bin/  通过appWatchdog.service系统服务调用
#TODO：后续增加一直启动失败，则启用出厂程序功能

# 配置参数
HB_DIR="/data/homeassistant/SoftWDT"  # 存放 .hb 文件的目录
HB_FILE_PATTERN="*.hb"             # 心跳文件匹配模式（如 app.hb）
SERVICE_NAME="X"                   # 要重启的服务名
MAX_MISSING_COUNT=10               # 最大允许的连续丢失次数
LOG_FILE="/var/log/heartbeat_monitor.log"  # 日志文件路径

file_count=0

# 初始化计数器
declare -A missing_count  # 记录每个文件的丢失次数（关联数组）
# 创建日志目录（如果不存在）
mkdir -p $HB_DIR

# 日志函数
log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >&2
}

# 检查并重启服务
check_and_restart() {
    local file="$1"
    local current_count="${missing_count[$file]:-0}"
    #log "file is $file"
    # 读取 .hb 文件的值（如果文件不存在或读取失败，视为 0）
    local value
    if [ -f "$file" ]; then
        value=$(cat $file)  # 读取并去除空格/换行
    else
        value="0"
    fi

    # 检测心跳值
    if [ -z "$value" ] || [ "$value" = "0" ]; then
        ((missing_count[$file]++))
        log "心跳丢失: $(basename "$file") (连续 ${missing_count[$file]} 次)"
        
        # 达到最大丢失次数时重启服务
        if [ "${missing_count[$file]}" -ge "$MAX_MISSING_COUNT" ]; then
            SERVICE_NAME=$(basename "$file" | awk -F'.' '{print $1}')
            log "警告: $file 心跳连续丢失 $MAX_MISSING_COUNT 次，正在重启 $SERVICE_NAME..."
            systemctl restart "$SERVICE_NAME" && {             
                log "服务 $SERVICE_NAME 重启成功"                 
                missing_count[$file]=0                         
            } || {                                              
                log "错误: 服务 $SERVICE_NAME 重启失败"             
            }                                                  
        fi
    else
        missing_count[$file]=0  # 心跳正常，重置计数器
        echo "0" > $file
    fi
}

# 主循环
log "启动心跳监控服务，目录: $HB_DIR"
#清空文件
rm "$HB_DIR"/$HB_FILE_PATTERN

while true; do
        count=$(ls "$HB_DIR"/ | wc -l)

        if [ $count -eq 0 ]; then
                file_count=$(($file_count + 1))
                log "file empty count is $file_count"
        fi

        for file in "$HB_DIR"/$HB_FILE_PATTERN; do
                [ -e "$file" ] || continue  # 跳过不存在的文件
                check_and_restart "$file"
        done
        sleep 15  # 15秒检查一次
done