#!/bin/bash
# ============================================================
# TDSQL 10.3 节点初始化脚本（交付级 · 磁盘必挂载 · 时间同步兜底）
# 用法: ./init_tdsql_node.sh tdsql03
# ============================================================

set -euo pipefail

HOSTNAME="$1"
if [[ -z "${HOSTNAME}" ]]; then
    echo "用法: $0 <hostname>"
    exit 1
fi

echo "[$(date '+%F %T')] 开始初始化 TDSQL 节点: ${HOSTNAME}"

run() {
    echo "+ $*"
    eval "$*"
}

# ---------- 1. YUM 源 ----------
echo ">>> 替换 CentOS 7 YUM 源（腾讯云 Vault）"
run "curl -fsSL -o /etc/yum.repos.d/CentOS-Base.repo.tmp http://mirrors.cloud.tencent.com/repo/centos7_base.repo && mv /etc/yum.repos.d/CentOS-Base.repo.tmp /etc/yum.repos.d/CentOS-Base.repo"
run "yum clean all"
run "yum makecache"

# ---------- 2. 基础工具 ----------
echo ">>> 安装基础工具"
run "yum install -y vim unzip lrzsz net-tools ntpdate rsync chrony"

# ---------- 3. SELinux ----------
echo ">>> 关闭 SELinux"
run "setenforce 0 || true"
run "sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config"

# ---------- 4. Locale ----------
echo ">>> 设置 Locale 为 en_US.utf8"
grep -q 'export LANG=' /etc/profile || echo 'export LANG=en_US.utf8' >> /etc/profile
grep -q 'export LC_ALL=' /etc/profile || echo 'export LC_ALL=en_US.utf8' >> /etc/profile

export LANG=en_US.utf8
export LC_ALL=en_US.utf8
export COLORTERM="${COLORTERM:-}"
locale -a | grep -q '^en_US.utf8$' || localedef -i en_US -f UTF-8 en_US.utf8

echo "当前 LANG=${LANG}"
echo "当前 LC_ALL=${LC_ALL}"

# ---------- 5. 时间同步（chrony 主同步 + ntpdate 兜底） ----------
echo ">>> 配置时间同步（chrony + ntpdate 兜底）"

# 启用 chronyd 作为主同步服务
run "systemctl enable chronyd --now"

# 配置腾讯云内网 NTP
run "sed -i 's/^server/#server/' /etc/chrony.conf"
run "grep -q 'time1.tencentyun.com' /etc/chrony.conf || echo 'server time1.tencentyun.com iburst' >> /etc/chrony.conf"

# 时区
run "/usr/bin/timedatectl set-timezone Asia/Shanghai"

# 立即同步
run "chronyc makestep"

# 验证
run "chronyc sources -v"

# 删除旧的 ntpdate crontab
(crontab -l 2>/dev/null | grep -v "ntpdate" || true) | crontab -

# 添加 ntpdate 兜底任务（每 20 分钟执行一次）
run "echo '*/20 * * * * /usr/sbin/ntpdate time1.tencentyun.com >/dev/null 2>&1' | crontab -"

# ---------- 6. 防火墙 ----------
echo ">>> 关闭 firewalld"
run "systemctl stop firewalld || true"
run "systemctl disable firewalld || true"

# ---------- 7. 主机名 ----------
echo ">>> 设置主机名: ${HOSTNAME}"
run "hostnamectl set-hostname ${HOSTNAME}"
echo "${HOSTNAME}" > /etc/hostname
export HOSTNAME="${HOSTNAME}"

if [[ -f /etc/cloud/cloud.cfg ]]; then
    run "sed -i 's/^preserve_hostname:.*/preserve_hostname: true/' /etc/cloud/cloud.cfg || echo 'preserve_hostname: true' >> /etc/cloud/cloud.cfg"
fi

# ---------- 8. 数据盘（核心修复段） ----------
echo ">>> 识别数据盘"
MOUNT_DIR="/data"

DISK="/dev/$(lsblk -ndo NAME,SIZE,TYPE | \
awk -v r="$(lsblk -no PKNAME "$(df / | tail -1 | awk '{print $1}')")" \
'$3=="disk" && $1!=r {s=$2; gsub(/G/,"",s); if(s>m){m=s;d=$1}} END{print d}')"

if [[ -z "${DISK}" || "${DISK}" == "/dev/" ]]; then
    echo "ERROR: 未找到数据盘，无法继续"
    exit 1
fi

echo "识别到数据盘: ${DISK}"

# 如果未挂载，则格式化
if ! mount | grep -q "${DISK}"; then
    echo "将对 ${DISK} 执行 mkfs.xfs，数据将被清空！"
    read -rp "确认请输入 yes: " CONFIRM
    if [[ "${CONFIRM}" != "yes" ]]; then
        echo "用户取消，脚本退出"
        exit 1
    fi
    run "mkfs.xfs -f ${DISK}"
    run "mkdir -p ${MOUNT_DIR}"
fi

# 写入 fstab（精确匹配）
if ! grep -q "${DISK} ${MOUNT_DIR}" /etc/fstab; then
    echo "${DISK} ${MOUNT_DIR} xfs defaults 0 0" >> /etc/fstab
    echo "已写入 fstab: ${DISK} ${MOUNT_DIR}"
fi

# 挂载（失败直接退出）
if ! df -h "${MOUNT_DIR}" | grep -q "${DISK}"; then
    run "mount -a"
fi

# 最终确认
if ! df -h "${MOUNT_DIR}" | grep -q "${DISK}"; then
    echo "ERROR: /data 挂载失败"
    exit 1
fi

echo "磁盘挂载完成: $(df -h ${MOUNT_DIR} | tail -1)"

# ---------- 9. 内核三板斧 ----------
echo ">>> 关闭透明大页（THP）"
run "echo never > /sys/kernel/mm/transparent_hugepage/enabled"
run "echo never > /sys/kernel/mm/transparent_hugepage/defrag"
grep -q transparent_hugepage /etc/rc.d/rc.local || echo 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' >> /etc/rc.d/rc.local
grep -q transparent_hugepage /etc/rc.d/rc.local || echo 'echo never > /sys/kernel/mm/transparent_hugepage/defrag' >> /etc/rc.d/rc.local
run "chmod +x /etc/rc.d/rc.local"

echo ">>> 设置 limits.conf"
cat >> /etc/security/limits.conf << EOF
* soft nofile 655360
* hard nofile 655360
* soft nproc 655360
* hard nproc 655360
EOF

echo ">>> 设置 sysctl"
cat >> /etc/sysctl.conf << EOF
vm.swappiness = 1
vm.dirty_ratio = 20
vm.dirty_background_ratio = 10
net.core.somaxconn = 1024
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_tw_reuse = 1
fs.file-max = 655360
EOF
run "sysctl -p"

# ---------- 10. 重启前自检 ----------
echo ""
echo "====== 初始化完成，请确认以下项 ======"
echo "Hostname:      $(hostname)"
echo "SELinux:       $(getenforce)"
echo "LANG:          $(echo $LANG)"
echo "LC_ALL:        $(echo $LC_ALL)"
echo "Timezone:      $(/usr/bin/timedatectl | grep 'Time zone')"
echo "Firewalld:     $(systemctl is-active firewalld)"
echo "Data Disk:     $(df -h /data | tail -1)"
echo "======================================"

# ---------- 11. 重启 ----------
echo ""
read -rp "是否立即重启以使配置完全生效？(yes/no): " REBOOT_CONFIRM
if [[ "${REBOOT_CONFIRM}" == "yes" ]]; then
    echo "系统将在 5 秒后重启..."
    sleep 5
    run "reboot"
else
    echo "请稍后手动执行 reboot"
fi