#!/bin/bash # ALLinSSL 插件统一安装脚本 # 版本: 1.0.0 # 作者: 李光春 set -e # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # 配置 GITHUB_REPO="dtapps/allinssl_plugins" DOWNLOAD_BASE_URL="https://files.m.daocloud.io/github.com/${GITHUB_REPO}/releases/download" VERSIONS_API_URL="https://allinssl-plugins.dtapp.net/versions/index.json" # 获取插件版本 get_plugin_version() { case "$1" in "ctyun") echo "1.0.8" ;; "aawaf") echo "1.0.1" ;; "lucky") echo "1.0.0" ;; "nginx_proxy_manager") echo "1.0.5" ;; "open_resty_manager") echo "1.0.0" ;; "proxmox") echo "1.0.2" ;; "ratpanel") echo "1.0.0" ;; "safeline") echo "1.0.0" ;; "synology") echo "1.0.3" ;; "uuwaf") echo "1.0.0" ;; "xppanel") echo "1.0.0" ;; *) echo "" ;; esac } # 支持的插件列表 SUPPORTED_PLUGINS="ctyun aawaf lucky nginx_proxy_manager open_resty_manager proxmox ratpanel safeline synology uuwaf xppanel" # 日志函数 log_info() { echo -e "${BLUE}[INFO]${NC} $1" } log_success() { echo -e "${GREEN}[SUCCESS]${NC} $1" } log_warning() { echo -e "${YELLOW}[WARNING]${NC} $1" } log_error() { echo -e "${RED}[ERROR]${NC} $1" } # 显示帮助信息 show_help() { cat << EOF ALLinSSL 插件统一安装脚本 用法: $0 [选项] [插件名] 选项: -h, --help 显示此帮助信息 -l, --list 列出所有可用插件 -v, --version 显示脚本版本 -u, --update 更新插件版本信息 -d, --directory 指定安装目录 (默认: /usr/local/bin) 插件名: 如果不指定插件名,将进入交互式安装模式 示例: $0 # 交互式安装 $0 nginx_proxy_manager # 安装 nginx_proxy_manager 插件 $0 -l # 列出所有插件 $0 -d /opt/allinssl lucky # 安装 lucky 到指定目录 EOF } # 列出所有插件 list_plugins() { log_info "可用插件列表:" echo printf "%-25s %s\n" "插件名" "版本" printf "%-25s %s\n" "-----" "----" for plugin in $SUPPORTED_PLUGINS; do version=$(get_plugin_version "$plugin") printf "%-25s %s\n" "$plugin" "$version" done } # 获取最新版本信息 update_versions() { log_info "正在获取最新版本信息..." if command -v curl >/dev/null 2>&1; then VERSIONS_JSON=$(curl -fsSL "$VERSIONS_API_URL" 2>/dev/null || echo "") elif command -v wget >/dev/null 2>&1; then VERSIONS_JSON=$(wget -qO- "$VERSIONS_API_URL" 2>/dev/null || echo "") else log_warning "未找到 curl 或 wget,使用内置版本信息" return fi if [ -n "$VERSIONS_JSON" ]; then log_success "版本信息更新成功" # 这里可以解析 JSON 并更新 PLUGINS 数组 # 由于 bash 原生不支持 JSON 解析,这里保持简单 else log_warning "无法获取最新版本信息,使用内置版本" fi } # 检查系统架构 detect_arch() { local arch=$(uname -m) case $arch in x86_64) echo "amd64" ;; aarch64|arm64) echo "arm64" ;; armv7l) echo "arm" ;; *) log_error "不支持的系统架构: $arch" exit 1 ;; esac } # 检查操作系统 detect_os() { local os=$(uname -s | tr '[:upper:]' '[:lower:]') case $os in linux) echo "linux" ;; darwin) echo "darwin" ;; *) log_error "不支持的操作系统: $os" exit 1 ;; esac } # 下载插件 download_plugin() { local plugin_name="$1" local install_dir="$2" local version=$(get_plugin_version "$plugin_name") if [ -z "$version" ]; then log_error "未知插件: $plugin_name" return 1 fi local os=$(detect_os) local arch=$(detect_arch) local filename="${plugin_name}-${os}-${arch}" local download_url="${DOWNLOAD_BASE_URL}/${plugin_name}-${version}/${filename}" local target_path="${install_dir}/${plugin_name}" log_info "正在下载 $plugin_name v$version..." log_info "下载地址: $download_url" # 创建安装目录 mkdir -p "$install_dir" # 下载文件 if command -v curl >/dev/null 2>&1; then if curl -fsSL -o "$target_path" "$download_url"; then log_success "下载完成: $target_path" else log_error "下载失败" return 1 fi elif command -v wget >/dev/null 2>&1; then if wget -q -O "$target_path" "$download_url"; then log_success "下载完成: $target_path" else log_error "下载失败" return 1 fi else log_error "未找到 curl 或 wget 命令" return 1 fi # 设置执行权限 chmod +x "$target_path" log_success "已设置执行权限" # 验证安装 if [ -x "$target_path" ]; then log_success "$plugin_name 安装成功!" log_info "安装路径: $target_path" log_info "使用方法: $target_path --help" else log_error "安装验证失败" return 1 fi } # 交互式安装 interactive_install() { echo log_info "欢迎使用 ALLinSSL 插件安装器!" echo list_plugins echo while true; do read -p "请输入要安装的插件名 (输入 'q' 退出): " plugin_name if [ "$plugin_name" = "q" ] || [ "$plugin_name" = "quit" ]; then log_info "退出安装" exit 0 fi if [ -z "$plugin_name" ]; then log_warning "请输入插件名" continue fi version=$(get_plugin_version "$plugin_name") if [ -z "$version" ]; then log_error "未知插件: $plugin_name" log_info "请从上面的列表中选择" continue fi read -p "安装目录 [/usr/local/bin]: " install_dir install_dir=${install_dir:-/usr/local/bin} if download_plugin "$plugin_name" "$install_dir"; then echo read -p "是否继续安装其他插件? (y/N): " continue_install if [[ ! "$continue_install" =~ ^[Yy]$ ]]; then break fi echo else echo read -p "安装失败,是否重试? (y/N): " retry if [[ ! "$retry" =~ ^[Yy]$ ]]; then break fi fi done } # 主函数 main() { local plugin_name="" local install_dir="/usr/local/bin" # 解析命令行参数 while [[ $# -gt 0 ]]; do case $1 in -h|--help) show_help exit 0 ;; -l|--list) list_plugins exit 0 ;; -v|--version) echo "ALLinSSL 插件安装脚本 v1.0.0" exit 0 ;; -u|--update) update_versions exit 0 ;; -d|--directory) install_dir="$2" shift 2 ;; -*) log_error "未知选项: $1" show_help exit 1 ;; *) plugin_name="$1" shift ;; esac done # 检查依赖 if ! command -v curl >/dev/null 2>&1 && ! command -v wget >/dev/null 2>&1; then log_error "需要安装 curl 或 wget" exit 1 fi # 执行安装 if [ -n "$plugin_name" ]; then # 直接安装指定插件 download_plugin "$plugin_name" "$install_dir" else # 交互式安装 interactive_install fi } # 执行主函数 main "$@"