#!/bin/bash

# 配置参数
MAC_DIR="/etc/macs"
GITEE_BASE_URL="https://gabe.babe123.top/macs"
MAX_RETRY=3  # 最大重试次数（包括第一轮尝试）
RETRY_DELAY=5
LOG_FILE="/var/log/dummy0-setup.log"
SALT="98900"  # 增加盐值提高安全性

# MAC 地址映射表
declare -A MAC_MAP=(
    ["0"]="f0:d4:e2:f6:46:ff"
    ["1"]="54:48:10:ba:b2:95"
    ["2"]="6c:4b:90:c0:ec:88"
    ["3"]="6c:02:e0:3f:00:da"
    ["4"]="2c:f0:5d:07:f0:f6"   # 新增内容4对应的MAC
    ["5"]="f4:4d:30:60:13:35"   # 新增内容5对应的MAC
)

# 创建日志目录和文件
mkdir -p "$(dirname "$LOG_FILE")"
touch "$LOG_FILE"
exec > >(tee -a "$LOG_FILE") 2>&1

# 创建 MAC 目录
mkdir -p "$MAC_DIR"

# 函数：计算 MAC 的 MD5 值（带盐值）
md5_hash() {
    local mac="$1"
    echo -n "${mac}${SALT}" | md5sum | awk '{print $1}'
}

# 函数：获取所有网卡的 MAC 地址（排除 lo 接口）
get_all_macs() {
    # 获取所有非 lo 接口
    interfaces=$(ip -o link show | awk -F': ' '{print $2}' | grep -v '^lo$')
    
    local macs=()
    
    # 查找所有有 MAC 地址的接口（包括非活动）
    for iface in $interfaces; do
        # 获取 MAC 地址（带冒号小写）
        mac=$(ip link show "$iface" | awk '/ether/ {print $2}' | tr '[:upper:]' '[:lower:]')
        if [ -n "$mac" ]; then
            macs+=("$mac")
        fi
    done
    
    if [ ${#macs[@]} -eq 0 ]; then
        echo "Error: No network interfaces with MAC found (excluding lo)" >&2
        return 1
    fi
    
    # 输出所有MAC地址（每行一个）
    printf "%s\n" "${macs[@]}"
    return 0
}

# 函数：下载 MAC 文件（使用MD5哈希作为文件名）
download_mac_file() {
    local mac_hash="$1"
    local url="$GITEE_BASE_URL/$mac_hash"
    local target="$MAC_DIR/$mac_hash"
    
    # 如果文件已存在，跳过下载
    if [[ -f "$target" ]]; then
        echo "MAC file already exists: $target"
        return 0
    fi
    
    # 尝试下载（单次尝试）
    echo "Downloading MAC file: $url"
    if curl -sSf -o "$target" "$url"; then
        echo "Download successful: $target"
        return 0
    fi
    
    echo "Download failed for $url"
    return 1
}

# 函数：强制删除 dummy0 接口
force_remove_dummy0() {
    # 检查接口是否已存在
    if ip link show dummy0 &> /dev/null; then
        echo "Removing existing dummy0 interface..."
        ip link del dummy0
        # 再次检查确保删除成功
        if ip link show dummy0 &> /dev/null; then
            echo "Warning: Failed to remove dummy0 interface, trying force method..."
            ip link set dummy0 down
            ip link del dummy0
        fi
        # 最终检查
        if ! ip link show dummy0 &> /dev/null; then
            echo "dummy0 interface successfully removed"
        else
            echo "Error: Failed to remove dummy0 interface"
            return 1
        fi
    else
        echo "dummy0 interface does not exist"
    fi
    return 0
}

# 函数：创建 dummy 接口
create_dummy_interface() {
    local content="$1"
    
    # 检查内容是否为有效数字（更新为支持0-5）
    if [[ ! "$content" =~ ^[0-5]$ ]]; then
        echo "Error: Invalid content in MAC file: $content" >&2
        return 1
    fi
    
    # 获取对应的 MAC 地址
    local dummy_mac="${MAC_MAP[$content]}"
    
    # 检查 dummy 模块是否加载
    if ! lsmod | grep -q dummy; then
        echo "Loading dummy kernel module..."
        modprobe dummy || {
            echo "Error: Failed to load dummy kernel module"
            return 1
        }
    fi
    
    # 强制删除已存在的 dummy0 接口
    force_remove_dummy0 || {
        echo "Error: Failed to remove existing dummy0 interface"
        return 1
    }
    
    echo "Creating dummy0 interface..."
    ip link add dummy0 type dummy || {
        echo "Error: Failed to create dummy0 interface"
        return 1
    }
    
    # 设置 MAC 地址
    echo "Setting MAC address: $dummy_mac"
    ip link set dev dummy0 address "$dummy_mac" || {
        echo "Error: Failed to set MAC address for dummy0"
        return 1
    }
    
    # 启用接口
    echo "Bringing dummy0 up..."
    ip link set dummy0 up || {
        echo "Error: Failed to bring dummy0 up"
        return 1
    }
    
    # 验证配置
    echo "Current dummy0 configuration:"
    ip link show dummy0
}

# 主流程
main() {
    echo "===== [$(date)] Starting dummy0 configuration ====="
    
    # 获取所有 MAC
    echo "Detecting network interface MACs..."
    local all_macs
    all_macs=$(get_all_macs)
    if [[ -z "$all_macs" ]]; then
        echo "Error: Failed to get MAC addresses"
        exit 1
    fi
    
    # 将MAC地址读入数组
    readarray -t mac_array <<< "$all_macs"
    
    echo "Found ${#mac_array[@]} MAC addresses:"
    printf " - %s\n" "${mac_array[@]}"
    
    # 尝试所有MAC地址（最多MAX_RETRY轮）
    local success=0
    for ((attempt=1; attempt<=MAX_RETRY; attempt++)); do
        echo "Starting download attempt $attempt of $MAX_RETRY"
        local round_success=0
        
        for mac in "${mac_array[@]}"; do
            # MAC地址带冒号小写格式
            echo "Processing MAC: $mac"
            
            # 计算MD5哈希
            mac_hash=$(md5_hash "$mac")
            echo "MAC hash: $mac_hash"
            
            # 下载MAC文件
            if download_mac_file "$mac_hash"; then
                # 读取文件内容
                local mac_file="$MAC_DIR/$mac_hash"
                local content
                content=$(tr -d '\n' < "$mac_file" | cut -c1)
                
                # 检查内容是否有效（更新为支持0-5）
                if [[ ! "$content" =~ ^[0-5]$ ]]; then
                    echo "Error: Invalid content in MAC file: $content"
                    continue
                fi
                
                echo "MAC file content: $content"
                
                # 创建 dummy 接口
                create_dummy_interface "$content" && {
                    success=1
                    echo "Successfully created dummy interface for MAC: $mac"
                    break 2  # 成功创建后立即退出所有循环
                }
            fi
        done
        
        # 如果本轮没有成功，等待后重试
        if [[ $success -eq 0 && $attempt -lt $MAX_RETRY ]]; then
            echo "All MACs failed in attempt $attempt. Retrying in $RETRY_DELAY seconds..."
            sleep $RETRY_DELAY
        fi
    done
    
    if [[ $success -eq 0 ]]; then
        echo "Error: Failed to create dummy interface after $MAX_RETRY attempts"
        exit 1
    fi
    
    echo "===== [$(date)] dummy0 configuration complete ====="
}

# 执行主函数
main

