#!/bin/bash

# 配置参数（可根据需要修改）
SCRIPT_URL="http://116.205.97.109/scripts/set_ip.sh"  # 脚本下载地址
DEST_PATH="/opt/set_ip.sh"                           # 脚本保存路径
UDEV_RULES_PATTERN="/etc/udev/rules.d/70-persistent-*"  # 匹配所有70-persistent-开头的文件
DEST_UDEV_DIR="/opt/"                                # udev规则文件的目标目录
NETPLAN_CONFIG="/etc/netplan/00-installer-config.yaml"  # netplan配置文件

# 函数：错误处理
error_exit() {
    echo "$1" 1>&2
    exit 1
}

# 函数：检查是否以root权限运行
check_root() {
    if [ "$(id -u)" -ne 0 ]; then
        error_exit "错误：请使用root权限运行此脚本（sudo）"
    fi
}

# 函数：下载配置脚本
download_script() {
    echo "正在下载脚本到$DEST_PATH..."
    if command -v wget &> /dev/null; then
        wget -q -O "$DEST_PATH" "$SCRIPT_URL" || error_exit "下载脚本失败（wget）"
    elif command -v curl &> /dev/null; then
        curl -s -o "$DEST_PATH" "$SCRIPT_URL" || error_exit "下载脚本失败（curl）"
    else
        error_exit "错误：未找到wget或curl，请先安装其中一个工具"
    fi

    # 验证下载结果
    [ -f "$DEST_PATH" ] || error_exit "错误：脚本下载后文件不存在"
}

# 函数：设置脚本权限
set_script_permissions() {
    echo "设置脚本权限..."
    chmod +x "$DEST_PATH" || error_exit "设置脚本可执行权限失败"
}

# 函数：处理所有70-persistent-开头的udev规则文件
handle_udev_rules() {
    echo "处理所有70-persistent-开头的udev规则文件..."
    
    # 检查是否存在匹配的文件
    shopt -s nullglob  # 避免无匹配时返回通配符本身
    local udev_files=($UDEV_RULES_PATTERN)
    shopt -u nullglob  # 恢复默认行为
    
    if [ ${#udev_files[@]} -eq 0 ]; then
        error_exit "错误：未找到任何以70-persistent-开头的udev规则文件（路径：/etc/udev/rules.d/）"
    fi

    # 确保目标目录存在
    [ -d "$DEST_UDEV_DIR" ] || mkdir -p "$DEST_UDEV_DIR" || error_exit "创建目标目录$DEST_UDEV_DIR失败"

    # 拷贝所有匹配的文件到目标目录
    cp "${udev_files[@]}" "$DEST_UDEV_DIR" || error_exit "拷贝udev规则文件失败"

    # 为所有拷贝的文件设置权限
    chmod 644 "$DEST_UDEV_DIR"70-persistent-* || error_exit "设置udev规则文件权限失败"
    
    echo "成功拷贝${#udev_files[@]}个udev规则文件到$DEST_UDEV_DIR"
}

# 函数：添加计划任务
add_cron_job() {
    echo "添加计划任务..."
    # 先检查是否已存在相同任务，避免重复添加
    if ! crontab -l | grep -q "$DEST_PATH"; then
        (crontab -l 2>/dev/null; echo "@reboot bash $DEST_PATH > /tmp/ip_tmp.log 2>&1") | crontab - || error_exit "添加计划任务失败"
    fi

    # 验证计划任务
    crontab -l | grep -q "$DEST_PATH" || error_exit "错误：计划任务添加后未生效"
    echo "计划任务添加成功"
}

# 函数：修改netplan网络配置
modify_netplan_config() {
    echo "修改网络配置文件..."
    # 备份配置
    cp "$NETPLAN_CONFIG" "${NETPLAN_CONFIG}.bak2" || error_exit "备份netplan配置失败"

    # 修改IP地址
    sed -i '/^      addresses:$/,/^      interfaces:/ s/^      - [0-9.]\+\/[0-9]\+/      - 0.0.0.0\/0/' "$NETPLAN_CONFIG" || error_exit "修改IP地址失败"

    # 修改网关
    sed -i '/^      - to: default$/!b;n;s/^        via: [0-9.]\+/        via: 0.0.0.0/' "$NETPLAN_CONFIG" || error_exit "修改网关失败"
}

# 主函数：串联所有操作
main() {
    echo "开始执行配置脚本..."
    
    # 按顺序执行各步骤
    check_root
    download_script
    set_script_permissions
    handle_udev_rules
    add_cron_job
    modify_netplan_config

    echo "所有操作执行完成！"
    exit 0
}

# 启动主函数
main
