#!/bin/bash

# 定义作者
AUTHOR="dong dongmanger2023@qq.com"

# 检查系统类型
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
    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启动可能会失败，请检查网络设置后再尝试启动。\033[0m"
            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 docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
        # 安装docker依赖包
        sudo yum install -y yum-utils device-mapper-persistent-data lvm2
        # 设置稳定版docker仓库
        sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
        # 安装docker引擎
        sudo yum install -y docker-ce docker-ce-cli containerd.io
    fi
    if [ $? -ne 0 ]; then
        echo "使用默认方式安装docker失败，尝试其他方式安装..."
        # 这里可补充其他安装docker的方式，暂未详细实现
        echo "请手动检查并安装docker后再运行此脚本。"
        exit 1
    fi
}

# 函数：清理系统垃圾（使用开源软件或清理本地缓存等）
function clean_system_trash() {
    read -p "是否使用开源清理软件？(y/n)" use_open_source_tool
    if [ "$use_open_source_tool" == "y" ]; then
        # 这里可补充具体开源清理软件的安装及使用逻辑，暂未详细实现
        echo "请选择合适的开源清理软件并按照其文档进行操作。"
    else
        # 简单清理本地缓存等示例，可按需完善清理逻辑
        if [ "$SYSTEM_TYPE" == "ubuntu" ]; then
            sudo apt-get clean
            sudo find /var/cache -type f -delete
        elif [ "$SYSTEM_TYPE" == "centos" ]; then
            sudo yum clean all
            sudo find /var/cache/yum -type f -delete
        fi
        echo "系统垃圾清理完成。"
    fi
}

# 函数：重新安装frpc
function reinstall_frpc() {
    if [ -d "${FRPC_DIR}" ]; then
        sudo rm -rf ${FRPC_DIR}
    fi
    wget ${DOWNLOAD_URL}
    if [ $? -ne 0 ]; then
        echo "下载frpc失败，请检查网络或下载链接是否正确"
        exit 1
    fi
    tar -zxvf frpc_0.51.3_linux_amd64.tar.gz
    if [ $? -ne 0 ]; then
        echo "解压frpc失败"
        exit 1
    fi
    echo "frpc重新安装完成，文件位于当前目录下的${FRPC_DIR}目录中。"
}

# 函数：安装第二个frpc
function install_second_frpc() {
    echo "请输入要安装的frpc版本号："
    read -r frpc_version
    echo "请输入下载地址（gitee或github）："
    read -r download_source
    # 根据用户输入构建下载链接，示例，可能需要根据实际情况调整
    DOWNLOAD_URL_SECOND="https://${download_source}/fatedier/frp/releases/download/v${frpc_version}/frpc_${frpc_version}_linux_amd64.tar.gz"
    SECOND_FRPC_DIR="frp_${frpc_version}_linux_amd64"
    # 下载frpc
    wget ${DOWNLOAD_URL_SECOND}
    if [ $? -ne 0 ]; then
        echo "下载第二个frpc失败，请检查网络或下载链接是否正确"
        exit 1
    fi
    # 解压frpc
    tar -zxvf frpc_${frpc_version}_linux_amd64.tar.gz
    if [ $? -ne 0 ]; then
        echo "解压第二个frpc失败"
        exit 1
    fi
    # 配置frpc.ini文件
    configure_frpc_ini
    echo "第二个frpc安装完成，文件位于当前目录下的${SECOND_FRPC_DIR}目录中。"
}

# 函数：测试服务器网络工具（简单示例，可按需完善测速等逻辑）
function test_server_network() {
    if check_network_connectivity; then
        # 这里可添加更详细的带宽测试、线路检测等逻辑，暂未详细实现
        echo "服务器网络可连通，可进一步进行带宽等相关测试（暂未详细实现）。"
    else
        echo "服务器网络不通，请检查网络设置后再进行测试。"
    fi
}

# 主菜单显示与交互函数
function show_menu() {
    echo "----------------------"
    echo "1.配置frpc"
    echo "2.启动frpc"
    echo "3.安装宝塔面板"
    echo "4.安装1panel面板"
    echo "5.清理系统垃圾"
    echo "6.更换此Ubuntu源为清华大学源"
    echo "7.使用moe2脚本操作"
    echo "8.更改ssh端口"
    echo "9.重新安装frpc"
    echo "10.测试服务器网络工具"
    echo "11.退出脚本"
    echo "12.安装第二个frpc"
    echo "13.启动第二个frpc"
    echo "----------------------"
    read -p "请输入你的选择：" choice
    case $choice in
        1)
            configure_frpc_ini
            ;;
        2)
            start_frpc
            ;;
        3)
            install_bt_panel
            ;;
        4)
            install_1panel
            ;;
        5)
            clean_system_trash
            ;;
        6)
            change_source
            ;;
        7)
            read -p "是否要退出此脚本并使用moe脚本？(y/n)" use_moe_script
            if [ "$use_moe_script" == "y" ]; then
                bash -c "$(curl -Lv gitee.com/mo2/linux/raw/master/debian.sh)"
            else
                show_menu
            fi
            ;;
        8)
            echo "
