#!/bin/bash

########################################################################################################################
# 说明：Y客户汇聚（x86）环境变量采集脚本
# 作者：况波<kuanbo@onething.net>
# 版本：1.0
# 日期：2025-05-19
########################################################################################################################
# 工作目录
workdir=/bin
# 日志文件
logfile=${workdir}/start.log

########################################################################################################################
# 配置参数接收
########################################################################################################################
# 1. authkey：授权码,每个合作客户有一个(测试用户使用上述默认授权码)
authkey="400ca48f0255332b881ef0d2c2e6a3b5"
# 2. deviceid：其中deviceid由调用者产生，用于识别设备(全端唯一ID)
deviceid=${Y_DEVICEID}
# 3. minetype：指定机器类型，0: 汇聚 1: 专线 2: 盒子
# 业务：x86-Y客户汇聚、x86-Y客户专线
minetype=0
# 4. logpath：用于指定运行时产生的日志及状态文件
logpath=${Y_LOGPATH}
# 5. cachepath：用于指定cache文件路径和容量设置, 如: {磁盘1}|{磁盘1可用大小MB};{磁盘2}|{磁盘2可用大小MB}....
cachepath=$(echo ${Y_CACHEPATH} | sed 's/,//g')
# 6. bandwidth：用于表示机器配置带宽，单位Mbps
bandwidth=${Y_BANDWIDTH}
if [[ ! -z ${Y_BANDWIDTH_CUSTOM} ]];then
    bandwidth=${Y_BANDWIDTH_CUSTOM}
fi
# 7. interfaces：用于列出所用的网卡，主要用于汇聚机型，单网卡出口的可以不用指定
interfaces=${Y_INTERFACES}
if [[ ! -z ${Y_INTERFACES_CUSTOM} ]];then
    interfaces=${Y_INTERFACES_CUSTOM}
fi
# 8. no-cross-prov：指定是否禁止跨省调度，0: 流量可以跨省，1: 不允许跨省流量产生
# 标签：限制类矿机-跨省流量限制，有标签=1，无标签=0
nocrossprov=${Y_NO_CROSS_PROV}
if [[ ! -z ${Y_NO_CROSS_PROV_CUSTOM} ]];then
    nocrossprov=${Y_NO_CROSS_PROV_CUSTOM}
fi
# 9. no-cross-asn：指定是否禁止跨运营商调度，0: 流量可以跨运营商，1: 不允许跨运营商流量产生
# 10. no-upload-tvs：对配置的时间段内,停止上行服务(没该需求可以不用配置)
# 11. no-ipv4：指定是否禁用ipv4流量(设备需支持ipv6，否则无调度)
# 标签：限制类矿机-只跑ipv6，有标签=1，无标签=0
noipv4=${Y_NO_IPV4}
if [[ ! -z ${Y_NO_IPV4_CUSTOM} ]];then
    noipv4=${Y_NO_IPV4_CUSTOM}
fi
# 12. no-ipv6：指定是否禁用ipv6流量(设备需支持ipv4，否则无调度)
# 标签：限制类矿机-V4，有标签=1，无标签=0
noipv6=${Y_NO_IPV6}
if [[ ! -z ${Y_NO_IPV6_CUSTOM} ]];then
    noipv6=${Y_NO_IPV6_CUSTOM}
fi
# 13. no-dns：安卓端配置为true, 绕过系统dns服务, 使用8.8.8.8做域名解析
# 14. no-tcp：指定是否禁用tcp
# 标签：限制类矿机-纯跑UDP，有标签=1，无标签=0
notcp=${Y_NO_TCP}
if [[ ! -z ${Y_NO_TCP_CUSTOM} ]];then
    notcp=${Y_NO_TCP_CUSTOM}
fi
# 15. no-udp：指定是否禁用udp
# 标签：限制类矿机-不跑udp协议，有标签=1，无标签=0
noudp=${Y_NO_UDP}
if [[ ! -z ${Y_NO_UDP_CUSTOM} ]];then
    noudp=${Y_NO_UDP_CUSTOM}
fi
# 16. isps：跑量运营商，根据异网标签设置，多个运营商用逗号分隔
# 标签：异网资源-交付电信（单选）tel，异网资源-交付移动（单选）mob，异网资源-交付联通（单选）cnc
# 如果没有打异网标签，则传递本网运营商
isps=${Y_ISPS}
if [[ ! -z ${Y_ISPS_CUSTOM} ]];then
    isps=${Y_ISPS_CUSTOM}
fi
# 17. black-prov-cfg：省份拉黑
# 省份拉黑策略:
# "black-prov-cfg": ["32","45","64","46"],
# 省份代码如下:
# 华北地域：北京市（11）天津市（12）河北省（13）山西省（14）内蒙古自治区（15）
# 东北地域：辽宁省（21）吉林省（22）黑龙江（23）
# 华东地域：上海市（31）江苏省（32）浙江省（33）安徽省（34）福建省（35）江西省（36）山东省（37）
# 华南地域：河南省（41）湖北省（42）湖南省（43）广东省（44）广西壮族自治区（45）海南省（46）
# 西南地域：重庆市（50）四川省（51）贵州省（52）云南省（53）西藏自治区（54）
# 西北地域：陕西省（61）甘肃省（62）青海省（63）宁夏回族自治区（64）新疆维吾尔族自治区（65）
# 其他地域：中国台湾（71）中国香港（81）中国澳门（82）
blackProvinces=${Y_BLACK_PROV_CFG}
if [[ ! -z ${Y_BLACK_PROV_CFG_CUSTOM} ]];then
    blackProvinces=${Y_BLACK_PROV_CFG_CUSTOM}
fi
########################################################################################################################
# JSON 基础配置
config="{
    \"authkey\": \"${authkey}\",
    \"deviceid\": \"${deviceid}\",
    \"interfaces\": [],
    \"bandwidth\": ${bandwidth},
    \"minetype\": \"${minetype}\",
    \"logpath\": \"${logpath}\",
    \"cachepath\": \"${cachepath}\",
    \"asn-prov-cfg\" : {
        \"tel\" : {
            \"disable_cross_province\" : true,
            \"disable_same_province\" : true
        },
        \"mob\" : {
            \"disable_cross_province\" : true,
            \"disable_same_province\" : true
        },
        \"cnc\" : {
            \"disable_cross_province\" : true,
            \"disable_same_province\" : true
        },
        \"other\" : {
            \"disable_cross_province\" : true,
            \"disable_same_province\" : true
        }
    }
}"

########################################################################################################################
# 网卡配置
########################################################################################################################
if [[ -n "${interfaces}" ]]; then
    # 将逗号分隔的网卡列表转换为 JSON 数组
    interfaceArray=$(echo "${interfaces}" | tr ',' '\n' | sed 's/ //g' | jq -R . | jq -s .)
    config=$(echo "${config}" | jq --argjson interfaces "$interfaceArray" '.interfaces = $interfaces')
fi

########################################################################################################################
# 拉黑省份配置
########################################################################################################################
if [[ -n "${blackProvinces}" ]]; then
    # 将逗号分隔的省份列表转换为 JSON 数组
    blackProvincesArray=$(echo "${blackProvinces}" | tr ',' '\n' | sed 's/ //g' | jq -R . | jq -s .)
    config=$(echo "${config}" | jq --argjson blackProvinces "$blackProvincesArray" '.black-prov-cfg = $blackProvinces')
fi

########################################################################################################################
# 标签适配
########################################################################################################################
# 限制类矿机-只跑ipv6
if [[ "${noipv4}" == "1" ]]; then
    config=$(echo "${config}" | jq '. + { "no-ipv4": true }')
fi

# 限制类矿机-V4
if [[ "${noipv6}" == "1" ]]; then
    config=$(echo "${config}" | jq '. + { "no-ipv6": true }')
fi

# 限制类矿机-纯跑UDP
if [[ "${notcp}" == "1" ]]; then
    config=$(echo "${config}" | jq '. + { "no-tcp": true }')
fi

# 限制类矿机-不跑udp协议
if [[ "${noudp}" == "1" ]]; then
    config=$(echo "${config}" | jq '. + { "no-udp": true }')
fi

########################################################################################################################
# 跑量运营商和跨省流量限制适配
########################################################################################################################
# 如果运营商中包含 mob，则直接设置移动
if [[ "${isps}" == *"mob"* ]]; then
    config=$(echo "${config}" | jq '.["asn-prov-cfg"].mob.disable_same_province = false')
    if [[ "${nocrossprov}" != 1 ]]; then
        config=$(echo "${config}" | jq '.["asn-prov-cfg"].mob.disable_cross_province = false')
    fi
else
    # 如果运营商中包含 tel，则直接设置电信
    if [[ -n "${isps}" ]]; then
        IFS=',' read -ra ispList <<< "${isps}"
        for isp in "${ispList[@]}"; do
            isp=$(echo "${isp}" | sed 's/ //g')
            case "${isp}" in
                "tel")
                    config=$(echo "${config}" | jq '.["asn-prov-cfg"].tel.disable_same_province = false')
                    if [[ "${nocrossprov}" != 1 ]]; then
                        config=$(echo "${config}" | jq '.["asn-prov-cfg"].tel.disable_cross_province = false')
                    fi
                    ;;
                "cnc")
                    config=$(echo "${config}" | jq '.["asn-prov-cfg"].cnc.disable_same_province = false')
                    if [[ "${nocrossprov}" != 1 ]]; then
                        config=$(echo "${config}" | jq '.["asn-prov-cfg"].cnc.disable_cross_province = false')
                    fi
                    ;;
                "other")
                    config=$(echo "${config}" | jq '.["asn-prov-cfg"].other.disable_same_province = false')
                    if [[ "${nocrossprov}" != 1 ]]; then
                        config=$(echo "${config}" | jq '.["asn-prov-cfg"].other.disable_cross_province = false')
                    fi
                    ;;
                *)
                    echo -e "$(date)\tUnknown isp ${isp}" >> ${logfile}
                    ;;
            esac
        done
    fi
fi

########################################################################################################################
# 格式化配置文件
########################################################################################################################
echo ${config} | jq . > ${workdir}/config.json
