#!/bin/bash
# Rocky Linux 8/9 网卡重命名脚本
# 功能：将指定网卡重命名为传统命名格式（如eth0）
# 作者：基于多篇技术文档整合:cite[1]:cite[4]:cite[8]

# 定义颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
NC='\033[0m'

# 检查root权限
if [ "$EUID" -ne 0 ]; then
    echo -e "${RED}错误：本脚本需要root权限执行${NC}"
    exit 1
fi

# 输入参数处理
read -p "请输入当前网卡名称（如ens160）: " OLD_IFACE
read -p "请输入目标网卡名称（如eth0）: " NEW_IFACE

# 获取MAC地址
MAC=$(ip link show $OLD_IFACE | awk '/link\/ether/ {print $2}')
if [ -z "$MAC" ]; then
    echo -e "${RED}错误：无法获取$OLD_IFACE的MAC地址${NC}"
    exit 1
fi

# 1. 修改GRUB配置
echo -e "${YELLOW}[1/6] 修改GRUB配置...${NC}"
GRUB_FILE="/etc/default/grub"
sed -i '/GRUB_CMDLINE_LINUX/s/"$/ net.ifnames=0 biosdevname=0"/' $GRUB_FILE
grub2-mkconfig -o /boot/grub2/grub.cfg

# 2. 创建udev规则
echo -e "${YELLOW}[2/6] 配置udev规则...${NC}"
UDEV_RULE="SUBSYSTEM==\"net\", ACTION==\"add\", ATTR{address}==\"$MAC\", NAME=\"$NEW_IFACE\""
echo $UDEV_RULE > /etc/udev/rules.d/70-persistent-net.rules

# 3. 处理NetworkManager配置（Rocky 9专用）
if [ -d "/etc/NetworkManager/system-connections/" ]; then
    echo -e "${YELLOW}[3/6] 更新NetworkManager配置...${NC}"
    CONN_FILE=$(grep -l "interface-name=$OLD_IFACE" /etc/NetworkManager/system-connections/*)
    if [ -n "$CONN_FILE" ]; then
        nmcli con mod "$(basename $CONN_FILE .nmconnection)" connection.interface-name ""
        nmcli con reload
    fi
fi

# 4. 修改网络配置文件
echo -e "${YELLOW}[4/6] 修改网络配置...${NC}"
OLD_CFG="/etc/sysconfig/network-scripts/ifcfg-$OLD_IFACE"
NEW_CFG="/etc/sysconfig/network-scripts/ifcfg-$NEW_IFACE"

if [ -f "$OLD_CFG" ]; then
    sed -i "s/^NAME=.*/NAME=$NEW_IFACE/" $OLD_CFG
    sed -i "s/^DEVICE=.*/DEVICE=$NEW_IFACE/" $OLD_CFG
    mv $OLD_CFG $NEW_CFG
else
    echo -e "${RED}警告：未找到配置文件$OLD_CFG，可能需手动创建${NC}"
fi

# 5. 生成initramfs（仅Rocky 9需要）
if grep -q "9" /etc/redhat-release; then
    echo -e "${YELLOW}[5/6] 重新生成initramfs...${NC}"
    dracut -f
fi

# 6. 完成提示
echo -e "${YELLOW}[6/6] 操作完成！${NC}"
echo -e "${GREEN}请执行以下命令使配置生效："
echo -e "1. 重启系统：${NC}reboot"
echo -e "${GREEN}2. 重启后验证：${NC}ip link show $NEW_IFACE"

# 记录日志
LOGFILE="/var/log/network_rename_$(date +%Y%m%d).log"
echo "$(date) - Renamed $OLD_IFACE($MAC) to $NEW_IFACE" >> $LOGFILE