#!/bin/bash
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

ctwx_file="/tmp/ctwx_qos.sh"
# 日志初始化
LOG_FILE="/tmp/start_qos.log"
{
    echo "========================================"
    echo "开始执行批量 QoS 设置 - $(date '+%Y-%m-%d %H:%M:%S')"
    echo "========================================"
} >> "$LOG_FILE"

# 将后续所有输出追加到日志文件
exec >> "$LOG_FILE" 2>&1

# ================= 配置区域 =================
# 设置限速百分比
LIMIT_PERCENT=40

# 在此处定义需要搜索的容器关键词列表（空格分隔）
# 脚本会逐个搜索包含这些关键词的容器，提取其 AppID 并进行限速
SEARCH_KEYWORDS="16913 42639"

# 参数1：必须是 1~100 的整数
if [[ $# -ge 1 && -n "$1" ]]; then
  if [[ "$1" =~ ^[0-9]+$ ]] && (( 10#$1 >= 1 && 10#$1 <= 100 )); then
    LIMIT_PERCENT="$1"
  else
    echo "错误：参数1必须是1~100的整数，当前是：$1"
    exit 1
  fi
fi

# 参数2：字符串且长度 > 5（含空格需用引号传入）
if [[ $# -ge 2 ]]; then
  arg2="$2"
  if (( ${#arg2} > 5 )); then
    SEARCH_KEYWORDS="$arg2"
  else
    echo "错误：参数2必须是长度>5的字符串，当前是：$2"
    exit 1
  fi
fi

# ===========================================

# -------------------------------------------
# 1. 准备工作：获取全局网络信息 (带宽 & 网卡)
# -------------------------------------------

echo ">> [全局] 正在读取网络配置..."

# 提取矫正带宽 (correct_speed)
RAW_BW=$(cat /tmp/net_link_prober.json 2>/dev/null | python -m json.tool 2>/dev/null | awk '/"correct_speed":/ {gsub(/,/, "", $2); print $2}' | head -n 1)

# 去除可能存在的浮点数小数点（取整）
RAW_BW=$(echo "$RAW_BW" | awk -F. '{print $1}')

if [ -z "$RAW_BW" ] || [ "$RAW_BW" -eq 0 ]; then
    echo "错误：无法提取到有效的 correct_speed，获取到的值为: '$RAW_BW'"
    exit 1
fi

echo ">> [全局] 获取到的矫正带宽 (correct_speed): ${RAW_BW} Mbps"

# 计算限速目标值
PRO_CNT=$(echo "$SEARCH_KEYWORDS" | awk  '{print NF}')
TARGET_RATE=$(( RAW_BW * LIMIT_PERCENT / 100 / PRO_CNT ))
TARGET_RATE=$(echo "$TARGET_RATE" | awk -F. '{print $1}')

if [ "$TARGET_RATE" -le 1 ]; then
    TARGET_RATE=1
fi

TARGET_RATE_STR="${TARGET_RATE}mbit"
echo ">> [全局] 设置限速比例: ${LIMIT_PERCENT}%"
echo ">> [全局] 计算限速结果: ${TARGET_RATE_STR}"

# 提取网卡列表
nic_list=$(cat /tmp/net_link_prober.json 2>/dev/null | python -m json.tool 2>/dev/null | grep 'phynic' | awk -F'"' '{print $4}')

if [ -z "$nic_list" ]; then
    echo "错误：未能从 JSON 文件中找到任何网卡 (phynic)。"
    exit 1
fi

echo ">> [全局] 目标网卡列表: $(echo $nic_list | tr '\n' ' ')"
echo "========================================"

# -------------------------------------------
# 2. 循环处理每个关键词
# -------------------------------------------

for keyword in $SEARCH_KEYWORDS; do
    echo ""
    echo ">> [任务开始] 正在处理关键词: $keyword"

    # 根据关键词提取 AppID
    # 逻辑：查找包含关键词的容器名 -> 提取第3段 -> 去除点号后缀
    target_appid=$(docker ps --format "{{.Names}}" | grep "$keyword" | head -n 1 | awk -F "_" '{if (NF >= 3) print $3}' | awk -F "." '{print $1}')

    # 检查是否获取到 ID
    if [ -z "$target_appid" ]; then
        echo "   警告：未找到包含 '$keyword' 的容器，或无法提取 AppID。跳过此任务。"
        continue
    fi

    # 检查 ID 长度
    if [ ${#target_appid} -lt 8 ]; then
        echo "   警告：提取到的 AppID ($target_appid) 长度不足8位，可能存在异常。"
    fi

    echo "   -> 识别到 AppID: ${target_appid}"

    # -------------------------------------------
    # 3. 对该 AppID 执行网卡限速
    # -------------------------------------------
    for nic in $nic_list; do
        echo "   正在对网卡 [$nic] 执行限速..."

        # 执行外部脚本
        sh "$ctwx_file" -t set -i "$nic" -r "$TARGET_RATE_STR" -a "$target_appid"

        if [ $? -eq 0 ]; then
            echo "   [成功] 网卡 [$nic] -> AppID [$target_appid] 限速已设置。"
        else
            echo "   [失败] 网卡 [$nic] -> AppID [$target_appid] 设置失败！"
        fi
    done
done

echo ""
echo "========================================"
echo "所有任务执行完毕。"
