#!/bin/bash
set -e  # 遇到错误立即退出，避免后续无效操作

# ===================== 第一步：获取并验证外网IP =====================
echo "【1/4】正在获取外网公网IP..."
# 多API兜底，提高获取成功率
PUBLIC_IP=$(curl -s --connect-timeout 5 icanhazip.com || 
            curl -s --connect-timeout 5 ipinfo.io/ip || 
            curl -s --connect-timeout 5 myip.ipip.net | awk -F'[： ]' '{print $2}')

# 验证IP是否合法（排除空值/非IPv4格式）
if [ -z "$PUBLIC_IP" ] || ! echo "$PUBLIC_IP" | grep -E '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$' > /dev/null; then
    echo "❌ 错误：获取外网IP失败！请检查网络连接或API可用性"
    exit 1
fi
echo "✅ 成功获取外网IP：$PUBLIC_IP"

# ===================== 第二步：备份关键文件 =====================
echo -e "\n【2/4】正在备份关键文件..."
# 备份hosts（带时间戳）
HOSTS_BACKUP="/etc/hosts.bak.$(date +%Y%m%d%H%M%S)"
sudo cp /etc/hosts "$HOSTS_BACKUP"
# 备份rc.local（防止追加内容出错）
RC_LOCAL_BACKUP="/etc/rc.d/rc.local.bak.$(date +%Y%m%d%H%M%S)"
sudo cp /etc/rc.d/rc.local "$RC_LOCAL_BACKUP"

echo "✅ 备份完成："
echo "  - hosts备份：$HOSTS_BACKUP"
echo "  - rc.local备份：$RC_LOCAL_BACKUP"

# ===================== 第三步：替换hosts里的127.0.0.1 =====================
echo -e "\n【3/4】正在替换/etc/hosts中的127.0.0.1为外网IP..."
# 可选：按需选择「全量替换」或「精准替换」，注释掉其中一行即可
sudo sed -i "s/127.0.0.1/$PUBLIC_IP/g" /etc/hosts  # 全量替换（谨慎，会改localhost）
# sudo sed -i "/目标域名/s/127.0.0.1/$PUBLIC_IP/g" /etc/hosts  # 精准替换（推荐，替换指定域名行）

# ===================== 第四步：配置主机名（临时+永久） =====================
echo -e "\n【4/4】正在配置主机名为外网IP..."
# 1. 临时修改主机名（立即生效，重启失效）
sudo echo "$PUBLIC_IP" > /proc/sys/kernel/hostname
# 2. 写入rc.local（开机自动设置，需确保rc.local有执行权限）
sudo chmod +x /etc/rc.d/rc.local  # 先保证rc.local可执行
sudo grep -qxF "echo \"$PUBLIC_IP\" > /proc/sys/kernel/hostname" /etc/rc.d/rc.local || 
sudo echo "echo \"$PUBLIC_IP\" > /proc/sys/kernel/hostname" >> /etc/rc.d/rc.local
# 3. 通过hostnamectl永久设置主机名（CentOS 7推荐方式）
sudo hostnamectl set-hostname "$PUBLIC_IP"

# ===================== 验证结果 =====================
echo -e "\n🎉 所有操作执行完成！验证结果如下："
echo "1. 当前外网IP：$PUBLIC_IP"
echo "2. /etc/hosts中替换结果："
grep "$PUBLIC_IP" /etc/hosts || echo "  未找到替换后的IP（若为精准替换，需检查目标域名是否存在）"
echo "3. 当前主机名：$(hostname)"
echo "4. rc.local中开机配置："
grep "$PUBLIC_IP" /etc/rc.d/rc.local

echo -e "\n⚠️  恢复说明："
echo "  - 恢复hosts：sudo cp $HOSTS_BACKUP /etc/hosts"
echo "  - 恢复rc.local：sudo cp $RC_LOCAL_BACKUP /etc/rc.d/rc.local"
echo "  - 恢复主机名：sudo hostnamectl set-hostname 原主机名"
