#!/bin/bash

# 定义作者
AUTHOR="豆包"

# 初始化关键变量
FRPC_DIR="/path/to/frpc/dir"  # 根据实际期望的默认路径修改这里
SECOND_FRPC_DIR="/path/to/second/frpc/dir"
DOWNLOAD_URL="https://example.com/frpc.tar.gz"  # 如果 DOWNLOAD_URL 也是固定或者有默认值情况，也进行初始化

# 检查系统类型
if [ -f /etc/os-release ]; then
  . /etc/os-release
    SYSTEM_TYPE="$ID"
else
    echo "无法确定系统类型，请检查后运行。"
    exit 1
fi

# 函数：检查并安装apt或yum命令（如果缺失）
function install_package_manager() {
    if [ "$SYSTEM_TYPE" == "ubuntu" ]; then
        # 检查并安装apt命令（如果缺失）
        if [! -x "$(command -v apt)" ]; then
            echo "apt命令未安装，尝试进行安装..."
            if [! -x "$(command -v wget)" ]; then
                # 如果wget也没有，先安装wget用于下载安装包
                echo "wget也未安装，先安装wget..."
                if [! -x "$(command -v curl)" ]; then
                    # 如果curl也没有，先尝试安装curl来下载wget安装包
                    echo "curl未安装，先安装curl用于下载wget安装包..."
                    if [! -x "$(command -v rpm)" ]; then
                        # 假设是基于Debian的系统（如Ubuntu），如果rpm不存在，使用合适的方法安装curl
                        echo "系统中似乎缺少必要的包管理工具，尝试使用dpkg方式安装curl（可能需要手动配置软件源等前置操作）"
                        sudo dpkg --install <(wget -qO- https://packages.debian.org/bullseye/curl_7.74.0-1.3+deb11u1_amd64.deb) 2>/dev/null || {
                            echo "安装curl失败，请检查系统配置及网络，手动安装好curl、wget和apt后再运行此脚本。"
                            exit 1
                        }
                    else
                        # 如果rpm存在，可能是其他类似系统，尝试用rpm安装curl（示例，可能不准确）
                        sudo rpm -ivh <(curl -s https://example.com/curl.rpm) 2>/dev/null || {
                            echo "安装curl失败，请检查系统配置及网络，手动安装好curl、wget和apt后再运行此脚本。"
                            exit 1
                        }
                    fi
                fi
                # 使用已安装的curl或者原本就有的curl来安装wget
                sudo apt-get update && sudo apt-get install -y wget || {
                    echo "安装wget失败，请检查系统配置及网络，手动安装好wget和apt后再运行此脚本。"
                    exit 1
                }
            fi
            # 使用已安装的wget来安装apt（示例，实际中根据系统具体情况调整，这里假设基于Debian的常规方式）
            sudo wget -qO- https://packages.debian.org/bullseye/apt_2.2.4_amd64.deb | sudo dpkg --install - 2>/dev/null || {
                echo "安装apt失败，请检查系统配置及网络，手动安装好apt后再运行此脚本。"
                exit 1
            }
        fi
    elif [ "$SYSTEM_TYPE" == "centos" ]; then
        # 检查并安装yum命令（如果缺失）
        if [! -x "$(command -v yum)" ]; then
            echo "yum命令未安装，尝试进行安装..."
            # 这里可补充yum安装逻辑，不同CentOS版本可能略有不同，暂未详细实现
            echo "请手动安装yum后再运行此脚本。"
            exit 1
        fi
    else
        echo "此脚本仅适用于Ubuntu或CentOS系统，请在相应环境下运行。"
        exit 1
    fi
}

# 函数：切换系统源为国内源（针对Ubuntu和CentOS）
function change_source() {
    if [ "$SYSTEM_TYPE" == "ubuntu" ]; then
        sudo sed -i's/archive.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list
        sudo apt-get update
        echo "已成功将Ubuntu源更改为清华大学源。"
    elif [ "$SYSTEM_TYPE" == "centos" ]; then
        # 备份原有的yum源配置文件
        sudo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
        # 使用清华大学的yum源配置文件
        sudo wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.tuna.tsinghua.edu.cn/help/centos/
        sudo yum makecache
        echo "已成功将CentOS源更改为清华大学源。"
    fi
}

# 函数：检查frpc相关进程是否存在
function check_frpc_process() {
    if pgrep -x "frpc" >/dev/null; then
        return 0
    else
        return 1
    fi
}

# 函数：检测外网连通性（简单通过ping外网地址示例，可按需完善）
function check_network_connectivity() {
    if ping -c 4 8.8.8.8 >/dev/null; then
        return 0
    else
        return 1
    fi
}

# 函数：帮助用户配置编辑frpc.ini文件
function configure_frpc_ini() {
    echo "请直接粘贴你的frpc配置文件内容（完整内容），脚本会帮你编辑保存："
    read -r config_content
    # 简单验证，这里只是示例，可根据frpc.ini实际格式要求完善
    if [[! "$config_content" =~ "\[common\]" ]]; then
        echo "输入的配置内容缺少必要的 [common] 节，请检查后重新输入。"
        return 1
    fi
    if [ -z "$FRPC_DIR" ]; then
        echo "FRPC_DIR 变量未正确初始化，请检查脚本配置。"
        return 1
    fi
    echo "$config_content" > ${FRPC_DIR}/frpc.ini
    echo "frpc.ini文件已配置完成。"
}

# 函数：启动frpc
function start_frpc() {
    if check_frpc_process; then
        echo "frpc已经在运行，若要重新启动请先停止当前运行的frpc进程。"
    else
        if check_network_connectivity; then
            nohup ${FRPC_DIR}/frpc -c ${FRPC_DIR}/frpc.ini &
            if [ $? -eq 0 ]; then
                echo "frpc启动成功。"
            else
                echo "frpc启动失败，请检查配置文件及相关依赖是否正确。"
            fi
        else
            echo -e "\033[31m外网无法连通，frpc启动可能会失败，请检查网络设置后再尝试启动。\033[0m"
        fi
    fi
}

# 函数：启动第二个frpc
function start_second_frpc() {
    if [ -d "${SECOND_FRPC_DIR}" ]; then
        if check_frpc_process; then
            echo "已有frpc在运行，若要启动第二个frpc请先停止当前运行的frpc进程或确保端口不冲突。"
        else
            if check_network_connectivity; then
                nohup ${SECOND_FRPC_DIR}/frpc -c ${SECOND_FRPC_DIR}/frpc.ini &
                if [ $? -eq 0 ]; then
                    echo "第二个frpc启动成功。"
                else
                    echo "第二个frpc启动失败，请检查配置文件及相关依赖是否正确。"
                fi
            else
                echo -e "\033[31m外网无法连通，第二个frpc启动可能会失败，请检查网络设置后再尝试启动。"
            fi
        fi
    else
        echo "第二个frpc未安装，请先安装。"
    fi
}

# 函数：卸载frpc并清除系统垃圾
function uninstall_frpc() {
    if [ -d "${FRPC_DIR}" ]; then
        sudo rm -rf ${FRPC_DIR}
        echo "frpc已卸载。"
    else
        echo "frpc未安装或已被卸载过，无需重复操作。"
    fi
    # 简单清理系统垃圾示例，可按需完善清理逻辑
    if [ "$SYSTEM_TYPE" == "ubuntu" ]; then
        sudo apt-get clean
        sudo apt-get autoremove -y
    elif [ "$SYSTEM_TYPE" == "centos" ]; then
        sudo yum clean all
        sudo yum autoremove -y
    fi
    echo "系统垃圾清理完成。"
}

# 函数：安装宝塔面板
function install_bt_panel() {
    if [ "$SYSTEM_TYPE" == "ubuntu" ]; then
        curl -sSO https://download.bt.cn/install/install-ubuntu_6.0.sh && sudo bash install-ubuntu_6.0.sh
    elif [ "$SYSTEM_TYPE" == "centos" ]; then
        curl -sSO https://download.bt.cn/install/install-centos_6.0.sh && sudo bash install-centos_6.0.sh
    fi
    if [ $? -eq 0 ]; then
        echo "宝塔面板安装完成。"
        read -p "是否一键更改用户名密码和端口？(y/n)" change_bt_credential
        if [ "$change_bt_credential" == "y" ]; then
            # 更改宝塔用户名和密码指令
            sudo bt 5
            sudo bt 6
        fi
        read -p "是否取消面板安全入口？(y/n)" remove_security_entry
        if [ "$remove_security_entry" == "y" ]; then
            # 关闭宝塔安全入口操作
            sudo rm -f /www/server/panel/data/admin_path.pl
            echo "宝塔安全入口已关闭。"
        fi
    else
        echo "宝塔面板安装失败，请检查网络及服务器环境后重新尝试。"
    fi
}

# 函数：安装1panel面板
function install_1panel() {
    # 安装docker
    if [! -x "$(command -v docker)" ]; then
        install_docker
    fi
    # 安装1panel（示例，需根据实际完善版本等细节）
    curl -sSL https://resource.fit2cloud.com/1panel/package/quick_start.sh | bash
    if [ $? -eq 0 ]; then
        echo "1panel面板安装完成。"
        read -p "是否关闭安全入口？(y/n)" close_security_entry
        if [ "$close_security_entry" == "y" ]; then
            # 1panel关闭入口指令
            sudo 1pctl reset entrance
        fi
        read -p "是否更改用户名密码？(y/n)" change_1panel_credential
        if [ "$change_1panel_credential" == "y" ]; {
            # 这里需补充实际更改用户名密码的操作逻辑，暂未详细实现
            echo "请手动在1panel面板中进行相关操作。"
        }
    else
        echo "1panel面板安装失败，请检查网络及服务器环境后重新尝试。"
    fi
}

# 函数：安装docker
function install_docker() {
    if [ "$SYSTEM_TYPE" == "ubuntu" ]; then
        # 先卸载旧版本docker（如果存在）
        sudo apt-get remove -y docker docker-engine docker.io containerd runc
        # 安装docker依赖包
        sudo apt-get update && sudo apt-get install -y ca-certificates curl gnupg lsb-release
        # 添加docker官方GPG密钥
        curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
        # 设置稳定版docker仓库
        echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
        # 安装docker引擎
        sudo apt-get update && sudo apt-get install -y docker-ce docker-ce-cli containerd.io
    elif [ "$SYSTEM_TYPE" == "centos" ]; then
        # 先卸载旧版本docker（如果存在）
        sudo yum remove -y docker docker-client
