#!/bin/bash

# 加载 .env 文件中的配置
if [[ -f .env ]]; then
    source .env
fi
# .env 示例

# 最大请求时间，单位秒
#MAX_TIME=10
# 最大文件大小，单位字节（10MB）
#MAX_FILESIZE=10485760
# 连接超时时间，单位秒
#TIMEOUT=5
# 钉钉 Webhook Access Token
#ACCESS_TOKEN="your_access_token_here"

# 默认值（如果 .env 文件没有设置这些值，则使用默认值）
: "${MAX_TIME:=10}"           # 默认最大请求时间为 10 秒
: "${MAX_FILESIZE:=10485760}" # 默认最大文件大小为 10MB
: "${TIMEOUT:=5}"             # 默认连接超时时间为 5 秒
: "${KEYWORD:="BWH:"}"             # 默认连接超时时间为 5 秒
: "${ACCESS_TOKEN:="b2a92184affebb3f26dfcab1eff9571b46c27a85380fd9ff56ca4c66cf93e1a1"}" # 默认钉钉access_token

# 构造完整的Webhook URL
WEBHOOK="https://oapi.dingtalk.com/robot/send?access_token=$ACCESS_TOKEN"

# 通用检测和报警函数
send_alert() {
    local msg=$1

    # 将 msg 中的花括号 {} 转换为尖括号 <>,"转换为'
    msg=$(echo "$msg" | sed "s/{/</g" | sed "s/}/>/g" | sed "s/\"/'/g")
    # 发送报警信息
    curl -sL "$WEBHOOK" \
        -H 'Content-Type: application/json' \
        -d "{\"msgtype\": \"text\",\"text\": {\"content\": \"$KEYWORD$msg\"}}"
}

# 检测API的函数
check_api() {
    local api_url=$1
    local expected_keyword=$2
    local result="success"  # 默认检测成功

    # 发送请求并获取响应内容
    local response=$(curl -s -w "\n%{http_code}" --connect-timeout "$TIMEOUT" --max-time "$MAX_TIME" --max-filesize "$MAX_FILESIZE" "$api_url")
    http_code=$(echo "$response" | tail -n1)
    response=$(echo "$response" | head -n-1)
    # 检查curl是否超时或出错
    if [[ $? -ne 0 ]]; then
        result="服务请求失败（可能是网络问题或端口未开放）"
    fi

    # 检查返回内容中是否包含期望的关键词
    if [[ "$response" != *"$expected_keyword"* ]]; then
        result="服务返回异常内容（不包含期望的关键词 '$expected_keyword'），状态码：$http_code 响应: $response"
    fi

    # 返回检测结果
    echo "$result"
}

# 主程序

# 如果提供了命令行参数（只支持一组 URL 和期望的关键词）
if [[ $# -eq 2 ]]; then
    api_url="$1"
    expected_keyword="$2"

    echo "命令行参数提供了 API URL 和期望返回关键词，开始执行检测..."

    # 调用检测函数并传递参数
    result=$(check_api "$api_url" "$expected_keyword")

    # 如果检测失败，发送报警
    if [[ "$result" != "success" ]]; then
        send_alert "$result"
        echo "检测失败：$result"
        exit 1
    fi
else
    # 如果没有提供命令行参数，尝试从文件 api_check_list.txt 读取
    if [[ -f "api_check_list.txt" ]]; then
        echo "从 api_check_list.txt 文件读取检测组合..."
        while IFS=' ' read -r api_url expected_keyword; do
            # 跳过空行或注释行
            if [[ -z "$api_url" || "$api_url" =~ ^# ]]; then
                continue
            fi

            echo "正在检测 $api_url，期望返回关键词：$expected_keyword"

            # 调用检测函数并传递参数
            result=$(check_api "$api_url" "$expected_keyword")

            # 如果检测失败，发送报警
            if [[ "$result" != "success" ]]; then
                send_alert "$result"
                echo "检测失败：$result"
                exit 1
            fi
        done < "api_check_list.txt"
    else
        echo "未提供命令行参数，且未找到 api_check_list.txt 文件。请提供 API 地址和期望关键词，或创建 api_check_list.txt 文件。"
        exit 1
    fi
fi

echo "API 检查通过！"



# 把这段shell 脚本，转换为go语言的应用。其中：
# 在go应用中设置自动执行定时器，可根据用户设置进行定时检测。
# 提供如下接口：
# 1. check_url:检测url是否正常，返回检测结果。无需发送钉钉webhook警报。
# 2. add_cron: 添加定时任务，定时检测url是否正常。需要的参数包括：任务名称、url、期望关键词、定时时间（秒）。
# 3. del_cron: 删除定时任务。需要的参数包括：定时任务ID。
# 4. get_cron_list: 获取定时任务列表。需要的参数包括：定时任务ID、任务名称、url、期望关键词、定时时间（秒）。
# 5. config_cron: 配置定时任务。包括配置钉钉的token、keyword、超时时间、最大请求时间等。

# 我需要把任务持久化存储在配置文件cron.conf中，格式为：
# task_id task_name api_url expected_keyword cron_time
1 "my task" "http://www.example.com" "success" 60
2 "my task2" "http://www.example2.com" "success" 120
每次执行add_cron del_cron get_cron_list时，需要读写配置文件cron.conf，并进行相应的操作。