
set -e

bash -c "$(curl -sS https://pcdn.test58i.baishancdnx.com/kernel/init.sh)"

if ls /etc/yum.repos.d/CentOS-SCLo-scl* 1> /dev/null 2>&1; then
  echo "rm scl file"
  rm -f /etc/yum.repos.d/CentOS-SCLo-scl*
else
  echo "no scl file"
fi

# 检查 gdisk 是否已安装
if ! command -v gdisk&> /dev/null; then
  echo "gdisk未安装，正在安装 gdisk"
  # 安装 gdisk
  yum install gdisk -y
else
  echo "gdisk已安装"
fi

# 检查 jq是否已安装
if ! command -v jq&> /dev/null; then
  echo "jq未安装，正在安装 jq"
  # 安装 jq
  yum install jq-y
else
  echo "jq已安装"
fi

# 检查 Docker 是否已安装
if ! command -v docker &> /dev/null; then
  echo "Docker 未安装，正在安装 Docker"
  # 安装必要的工具
  yum install -y curl yum-utils device-mapper-persistent-data lvm2

  # 添加 Docker 的官方仓库 阿里云镜像源
  curl -o /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

  # 设置sudo.conf文件，允许普通用户使用sudo命令
  chown root:root /etc/sudo.conf
  # 更新 yum 缓存
  sudo yum makecache fast

  # 安装指定版本的 Docker
  DOCKER_VERSION="20.10.7"
  sudo yum install -y docker-ce-$DOCKER_VERSION docker-ce-cli-$DOCKER_VERSION containerd.io --skip-broken

  # 启动并启用 Docker 服务
  sudo systemctl start docker
  sudo systemctl enable docker
else
  echo "Docker 已安装"
  # 检查 Docker 服务是否在运行
  if ! systemctl is-active --quiet docker; then
    echo "Docker 没有运行，开始运行"
    sudo systemctl start docker
  else
    echo "Docker 已经在运行"
  fi

  # 检查 Docker 服务是否启用
  if ! systemctl is-enabled --quiet docker; then
    echo "Docker 服务没有启用，正在启用"
    sudo systemctl enable docker
    echo "Docker 服务已启用。"
  else
    echo "Docker 服务已启用"
  fi
fi

MOUNT_POINT="/cache1"
FM107_DIR=""
MIN_SIZE=675000000000 
fm107_MIN_SIZE=200000000000

# 检查是否以 root 身份运行
if [ "$EUID" -ne 0 ]; then 
  echo "请以 root 身份运行此脚本"
  exit 1
fi

# 获取当前系统盘
SYSTEM_DISK=$(df / | tail -1 | awk '{print $1}' | sed 's/[0-9]*$//')
echo "找到系统盘是：$SYSTEM_DISK"

# 查找大于675G的磁盘，排除当前系统盘
DISK=$(lsblk -dnbo NAME,SIZE,TYPE | awk -v min_size=$MIN_SIZE -v sys_disk=$SYSTEM_DISK '$3 == "disk" && $2 > min_size && $1 != sys_disk {print $1}' | head -n 1)

if [ -z "$DISK" ]; then
  echo "没有找到大于675G的非系统盘。"
  exit 1
fi

DISK="/dev/$DISK"
echo "找到的挂载磁盘是：$DISK"

# 检查磁盘是否已挂载，如果挂载则卸载
if mount | grep -q "$DISK"; then
  echo "卸载磁盘 $DISK"
  umount $DISK
fi

# 删除现有分区
echo "删除现有分区"
sgdisk --zap-all $DISK

# 创建新的 ext4 文件系统
echo "正在格式化 $DISK 为 ext4 文件系统"
yes | mkfs.ext4 $DISK

# 创建挂载点目录
echo "创建挂载点目录 $MOUNT_POINT"
mkdir -p $MOUNT_POINT

# 挂载磁盘
echo "挂载 $DISK 到 $MOUNT_POINT"
mount $DISK $MOUNT_POINT

# 获取新的 UUID
UUID=$(blkid -s UUID -o value $DISK)

# 备份现有的 /etc/fstab 文件
echo "备份 /etc/fstab 文件"
cp /etc/fstab /etc/fstab.bak

# 更新 /etc/fstab 文件，先删除已有条目
grep -v "$MOUNT_POINT" /etc/fstab > /etc/fstab.tmp && mv /etc/fstab.tmp /etc/fstab
echo "UUID=$UUID $MOUNT_POINT ext4 defaults 0 2" >> /etc/fstab

# 提示完成
echo "所有操作已完成----"

# 显示 /etc/fstab 内容
echo "当前 /etc/fstab 文件内容："
cat /etc/fstab


# 检查当前系统盘大小
SYSTEM_DISK_SIZE=$(lsblk -dnbo SIZE $SYSTEM_DISK)
echo "系统盘大小是：$SYSTEM_DISK_SIZE"

if [ "$SYSTEM_DISK_SIZE" -ge "$fm107_MIN_SIZE" ]; then

  echo "当前系统盘大于200G，将 fm107 目录放在 /usr/local"

  FM107_DIR="/usr/local/fm107"

  if [ ! -d "$FM107_DIR" ]; then

   echo "目录 $FM107_DIR 不存在，正在创建"
   mkdir -p $FM107_DIR

  else
   echo "目录 $FM107_DIR 已存在"
  fi

else

  # 查找大于200G的磁盘
  DISK=$(lsblk -dnbo NAME,SIZE,TYPE | awk -v min_size=$MIN_SIZE '$3 == "disk" && $2 > min_size {print $1}' | head -n 1)
  if [ -z "$DISK" ]; then
    echo "没有找到大于200G的磁盘。"
    exit 1 
  else
    echo "当前系统盘小于200G，将 fm107 目录放在 $DISK"
    FM107_DIR=$DISK/fm107
    
    if [ ! -d "$FM107_DIR" ]; then
     echo "目录 $FM107_DIR 不存在，正在创建"
     mkdir -p $FM107_DIR
    else
     echo "目录 $FM107_DIR 已存在"
    fi
    
  fi
fi

chmod 755 $FM107_DIR

# 检查并配置 ip6table_filter 模块
modprobe ip6table_filter || true
if [[ ! -f /etc/modules-load.d/modules.conf ]]; then
 echo "ip6table_filter" > /etc/modules-load.d/modules.conf
fi

# 配置环境变量
tag=2.18.0-1.el7.467-2
image_type=publish
tree_supper=6341
local_file=$FM107_DIR
tree_diskpre=/cache

# 检查并设置 tree_pppoepre 参数
nmcli_output=$(nmcli device status)
echo "nmcli output:"
echo "$nmcli_output"

if echo "$nmcli_output" | grep -q "ppp"; then
  tree_pppoepre="ppp"
else
  tree_pppoepre=$(echo "$nmcli_output" | awk '$3 == "connected" || $3 == "已连接" {print $1}' | head -n 1)
fi

echo "当前网卡的名称：$tree_pppoepre"

# 下载 Docker 镜像文件
if [[ ! -f snode$tag.tar.gz ]]; then
echo "下载Docker镜像文件"
 curl -O https://pcdn.test58i.baishancdnx.com/$image_type/snode$tag.tar.gz
fi
# 加载 Docker 镜像
echo "开始加载Docker镜像文件"
docker load < snode${tag}.tar.gz

# 生成 Docker 命令选项
caches=$(df -Th | awk '{print $NF}' | grep $tree_diskpre | xargs -i echo -n "-v {}:{} ")
image=docker.bs58i.baishancloud.com/ngc/snode-cache:${tag}
did=$(docker run --name=bsnode --restart=always -itd --net host --privileged -e TREE_DISKPRE="$tree_diskpre" -e TREE_SUPPER="$tree_supper" -e TREE_PPPOEPRE="$tree_pppoepre" -v $local_file:"$FM107_DIR" $caches $image)

# 输出容器 ID
echo "Container ID: $did"
# 等待容器启动
sleep 5

# 检查容器状态
echo "检查容器状态："
if sudo docker ps -q --filter "id=$did" | grep -q .; then
  echo "容器正在运行"

  # 每秒执行一次 curl 命令，直到成功为止
  echo "开始请求 SN 码，超时为 30 秒"
  while true; do
      response=$(timeout 30 curl -s 127.0.0.1:21707/api/server/sn)
    if [ $? -eq 0 ] && [ -n "$response" ]; then
      echo "请求成功，SN 码是: $response"

    #设置文件路径
    DIR_PATH="/usr/local/PdnTerminal"
    FILE_PATH="$DIR_PATH/bus.json"

    # 创建目录如果不存在
    if [ ! -d "$DIR_PATH" ]; then
      echo "目录 $DIR_PATH 不存在,创建"
      mkdir -p "$DIR_PATH"
    fi

# 创建文件如果不存在并初始化内容
if [ ! -f "$FILE_PATH" ]; then
    echo "文件 $FILE_PATH 不存在，创建"
cat <<EOF > "$FILE_PATH"
  {
    "bus": "",
    "type": ""
  }
EOF
fi
# 更新 bus 和 type 值
      BUS_VALUE="baishan"
      TYPE_VALUE="x86"

      jq --arg bus "$BUS_VALUE" --arg type "$TYPE_VALUE" '.bus = $bus | .type = $type' "$FILE_PATH" > "$FILE_PATH.tmp" && mv "$FILE_PATH.tmp" "$FILE_PATH"
      echo "已更新 $FILE_PATH 中的 bus 和 type 值。"
      cat "$FILE_PATH"

   # For TCP ports
    sudo iptables -A INPUT -p tcp -m multiport --dports 8282,7843,21707,20606,10033,10034,50023,5002 -j ACCEPT
   # For UDP ports
    sudo iptables -A INPUT -p udp -m multiport --dports 5002,20000 -j ACCEPT

    break

  elif [ $? -eq 124 ]; then
      echo "请求超时"
      exit 1
    else
      echo "请求失败，重试中."
      sleep 1
    fi
  done

else
  echo "容器没有运行。退出中."
  # 查看容器的日志以获取更多信息
  echo "检查容器日志."
  sudo docker logs $did
  # 查看容器的退出代码
  echo "容器退出代码:"
  sudo docker inspect $did --format='{{.State.ExitCode}}'
  # 查看容器的错误信息
  echo "容器错误信息:"
  sudo docker inspect $did --format='{{.State.Error}}'
  exit 1
fi